winnercold
수강평 작성수
7
평균평점
5.0
블로그
전체 8#카테고리
- 백엔드
#태그
- 백엔드

2024. 10. 28.
0
워밍업 클럽 스터디 - Day4
해당 글은 [인프런 워밍업 클럽 2기 클린 코드 & 테스트 코드]에 참가하여 박우빈님의 강의를 듣고 작성한 글입니다. 미션 2-1AS-ISpublic boolean validateOrder(Order order){ if(order.getItems().size() == 0) { log.info("주문 항목이 없습니다."); return false; }else{ if(order.getTotalPrice() > 0){ if(!order.hasCustomerInfo()){ log.info("사용자 정보가 없습니다."); return false; }else{ return true; } }else if(!(order.getTotalPrice() > 0)) { log.info("올바르지 않은 총 가격입니다."); return false; } } return true; } validateOrder가 하는 일 파악하기주문 항목이 있는지 체크가격이 0보다 큰지 체크사용자 정보가 있는지 체크1. early return 적용하기early return을 적용함으로써 else의 사용을 지양한다.public boolean validateOrder(Order order){ if(order.getItems().size() == 0) { log.info("주문 항목이 없습니다."); return false; } if(!order.getTotalPrice() > 0){ log.info("올바르지 않은 총 가격입니다."); return false; } if(!order.hasCustomerInfo()){ log.info("사용자 정보가 없습니다."); return false; } return true; }2. 부정어를 대하는 자세부정어구를 쓰지 않아도 되는 상황인지 체크부정의 의미를 담은 다른 단어 존재하는지 체크3. getter 사용 자제객체에 직접 메세지를 보내 확인 하는 것이 무례하지 않다.4. 예외처리OrderException 클래스 생성public class OrderException extends RuntimeException{ public OrderException(String message) { super(message); } } TO-BEpublic boolean validateOrder(Order order){ if(order.isItemEmpty()) { throw new OrderException("주문 항목이 없습니다."); } if(order.isTotalPriceLessThanZero()){ throw new OrderException("올바르지 않은 총 가격입니다."); } if(order.isCustomerInfoMissing()){ throw new OrderException("사용자 정보가 없습니다."); } return true; } // Order private boolean isItemEmpty() { return this.items.isEmpty(); } private boolean isTotalPriceLessThanZero() { return this.items.stream() .mapToInt(Item::getPrice).sum() 미션 2-2. SOLID 에 대해 자기만의 언어로 적어보기 1. SRP : 단일 책임 원칙레스토랑에서 일하는 사람들에 비유해 적어보고자 한다. 레스토랑에 주방장, 웨이터, 청소부 가 있다고 생각해 보면, 주방장은 요리만, 웨이터는 주문과 서빙만, 청소부는 청소만 해야 한다. 만약 주방장이 서빙까지 맡게 된다면 주방 일이 제대로 안 될 수 있다. 이와 같이 모든 역할이 각자 하나의 책임만 맡고, 그 일을 잘하는 것이 단일 책임 원칙이라고 생각한다.2. OCP : 개방 폐쇄 원칙레스토랑에 새로운 메뉴를 추가할 때, 기존 주방의 동선 이나 도구 배치를 크게 바꾸지 않고 새로운 메뉴를 준비할 수 있어야 한다. 주방의 구조나 기존 메뉴는 그대로 두고, 필요한 추가 장비나 재료만 추가하는 식이다. 새로운 요구사항에 맞게 확장(새로운 메뉴 추가)은 쉽게 가능하지만, 기존 시스템 (기존 메뉴 및 도구 배치)은 유지하는 것이 이 원칙이라고 생각한다.3. LSP : 리스코프 치환 원칙예를 들어 새로운 웨이터가 채용 되더라도 기존 웨이터가 하던 일을 동일하게 할 수 있어야 한다. 만 약 새로 온 웨이터가 “서빙은 할 수 있지만 손님과의 소통은 못 한다”라고 하면 문제가 생긴다. 따라 서 기존 역할을 무리 없이 수행할 수 있도록 상호 대체 가능해야 하는 원칙이라고 생각한다.4. ISP : 인터페이스 분리 원칙모든 직원이 모든 일을 다 할 수 있도록 하는 대신, 각자의 역할에 맞는 것만 하도록 하는 것이 더 효율적이다. 웨이터는 서빙과 주문만 받고, 주방장은 요리와 재료 준비만, 청소부는 청소만 할 수 있게 역할 별로 필요한 업무만 하는 것이 인터페이스 분리 원칙이라고 생각한다.5. DIP : 의존성 역전 원칙레스토랑에서 업주 마음대로 직원에게 지시하는 것보다, 문서로 만들어 일관된 방식으로 전달하는 것이다. 이렇게 하면 업주나 직원이 바뀌더라도 직원들은 동일한 업무 지침에 따라 일할 수 있다. 즉, 업주가 아닌 지침서에 의존하도록 하는 것이다. 이 원칙을 통해 레스토랑 운영이 특정 사람의 방식에 좌우되지 않고, 유연하게 유지 될 수 있도록 한다.

2024. 10. 26.
0
워밍업 클럽 스터디 - 2기 4주차 발자국
해당 글은 [인프런 워밍업 클럽 2기 클린 코드 & 테스트 코드]에 참가하여 박우빈님의 강의를 듣고 작성한 글입니다. 강의를 통해 배운것Test Double한 문단에는 한 주제를 1. Test DoubleDummy : 아무것도 하지 않는 깡통 객체Fake : 단순한 형태로 동일한 기능은 수행하나, 프로덕션에서 쓰기에는 부족한 객체Stub : 테스트에서 요청한 것에 대해 미리 준비한 결과를 제공하는 객체Spy : Stub이면서 호출된 내용을 기록하여 보여줄 수 있는 객체, 일부는 객체처럼 동작 시키고 일부만 Stubbing 할 수도 있다.Mock : 행위에 대한 기대를 명세하고, 그에 따라 동작하도록 만들어진 객체Mock 은 Stub이 아니다. Stub을 상태를 검증, Mock 은 행위를 검증2. 한 문단에는 한 주제테스트 환경의 독립성을 보장테스트 간 독립성을 보장 (공유자원 관리)Test Fixture 구성테스트를 위해 원하는 상태로 고정시킨 일련의 객체테스트 수행도 비용이다.환경 통합, @DataJPATest 보다는 @SpringBootTest 사용 권장private 메서드는 테스트할 필요가 없다. 테스트가 꼭 필요하다고 생각이 된다면 추상화가 잘 되었는지 다시 생각해보고 리팩토링하기 회고이번 강의를 끝으로 워밍업 클럽 스터디가 끝났다. 개발자라면 누구나 클린 코드와 테스트 코드를 잘 작성하고 싶을 것이다. 나 또한 그런 바램으로 이 스터디에 참여하게 되었는데 이 두 강의를 모두 자기 것으로 만든다면 나도 5년 후에는 좀더 나은 환경에서 개발자로 일하고 있지 않을까 기대해본다. 그렇게 하기 위해서는 다시 이 두강의를 복습하러 가야겠다.
백엔드

2024. 10. 26.
0
워밍업 클럽 스터디 - 2기 3주차 발자국
해당 글은 [인프런 워밍업 클럽 2기 클린 코드 & 테스트 코드]에 참가하여 박우빈님의 강의를 듣고 작성한 글입니다. 강의를 통해 배운것테스트 왜 작성해야 할까?TDD테스트는 문서다 1. 테스트 왜 작성해야 할까? 테스트는 정말 귀찮지만 해야한다.내가 작성한 코드가 의도대로 잘 작동 하는지 확인 할 수 있다.테스트 코드를 작성하지 않으면 소프트웨어의 안정성을 보장할 수 없다. 올바른 테스트 코드를 작성한다면 빠르게 버그를 발견 할 수 있고, 수동 테스트 비용을 절약할 수 있다. 2. TDD (테스트 주도 개발)TDD는 테스트를 먼저 작성 하고 그 테스트가 Red-Green-Refactor 주기로 통과 하는 것이다.먼저 실패하는 테스트를 작성한다테스트를 통과하기 위한 최소한의 코드를 작성한다코드를 개선하면서 테스트가 통과 되도록 유지한다. 이렇게 테스트를 작성함으로써 엣지 케이스를 놓치지 않고, 유지보수가 쉬운 코드로 작성할 수 있게 한다.3. 테스트는 문서다다양한 테스트 케이스를 통해 프로덕션 코드를 이해하는 시각과 관점을 보완할 수 있게 한다.한 사람이 고민했던 결과물이 팀 차원으로 승격시켜 모두의 자산으로 공유할 수 있다. 회고테스트코드 작성은 정말 필수적이라고 할 수 있을만큼 중요한데, 어디서 부터 어떻게 시작해야 될지 몰랐던 것 같아 쉽게 도전해보지 못했는데 이번 강의를 통해 한 클래스에서 하나의 테스트라도 작성을 해야겠다고 생각이 들었다.
백엔드
・
백엔드

2024. 10. 26.
0
워밍업 클럽 스터디 - 2기 2주차 발자국
해당 글은 [인프런 워밍업 클럽 2기 클린 코드 & 테스트 코드]에 참가하여 박우빈님의 강의를 듣고 작성한 글입니다. 강의를 통해 배운것객체 지향 적용하기코드 다듬기 1. 객체 지향 적용결합도가 높은 상속보다는 조합과 인터페이스를 활용하자상속을 통한 코드의 중복 제거가 주는 이점 보다, 중복이 생기더라도 유연한 구조로 설계해보기Enum의 특성을 활용하자Enum은 상태와 행위를 한 곳에서 관리할 수 있는 추상화된 객체로 특정 도메인 개념에 대해 종류와 기능을 명시적으로 표현해 줄 수 있다.다형성 활용변하는 것과 변하지 않는 것을 분리하여 추상화 하자숨겨져 있는 도메인 개념을 도출하자도메인 지식은 만드는 것이 아니라 발견하는 것이다.2. 코드 다듬기주석을 작성해보자무분별한 주석은 독이 된다. 코드를 통해 최대한 의도를 드러내고, 그렇게 해도 드러내지 못한 정보들을 주석에 작성해보자.변수와 메서드의 나열 순서 만으로도 의도와 정보를 전달할 수 있다.패키지를 나누자패키지는 문맥으로써의 정보를 제공할 수 있다ide의 도움을 받아 보자 ex) sonarlint회고객체 지향 섹션을 들으면서 강의는 이해가 되었지만 이것을 내것으로 체화 시키는 것이 정말 어려웠다. 아직도 이것을 일급 컬렉션으로 빼서 관리하는 것이 좋을지, 또는 인터페이스로 분리할지, 또 다형성을 어떻게 활용하면 좋을지 이해를 제대로 하지 못한 것 같다. 반복적으로 들으면서 내것으로 만들어야겠다고 생각했다.
백엔드

2024. 10. 26.
0
워밍업 클럽 스터디 - 2기 1주차 발자국
해당 글은 [인프런 워밍업 클럽 2기 클린 코드 & 테스트 코드]에 참가하여 박우빈님의 강의를 듣고 작성한 글입니다. 강의를 통해 배운것추상과 구체논리 사고의 흐름SOLID 1. 추상과 구체리팩토링의 첫 단계는 추상화를 잘해야 한다고 배웠다. 그렇다면 추상화를 잘해야 하려면 어떻게 해야할까?추상화의 첫 단계는 이름을 잘 짓는 것으로 부터 기인한다.이름을 짓는다는 것은 추상적 사고를 기반으로 한다.추상적 사고란 : 표현하고자 하는 구체에서 정말 중요한 핵심 개념만을 추출하여 잘 드러내게 표현하는 것변수의 이름을 잘 짓는 것 뿐 아니라 메서드 그리고 객체에도 잘 지어 그 의미를 전달해야 한다.추상화 레벨을 동등하게 만들어 코드를 읽는 사람으로 하여금 의문점이 없게 만들어야 한다.2. 논리 사고의 흐름early return 으로 (if-else 지양) 코드의 가독성을 높일 수 있다.중첩 분기문, 반복문을 줄임으로써 사고의 깊이를 줄여야 한다.사용할 변수는 가깝게 선언함으로써 코드의 가독성을 높인다.복잡한 로직은 의미 단위로 나누어 공백라인을 줌으로 가독성을 높인다.부정어구 사용을 지양함으로 코드의 가독성을 높인다.3. SOLID리팩토링 할 때는 SOLID원칙에 근거하여 작성하도록 한다.한 객체에 너무 많은 책임이 있진 않는지, 요구사항이 늘어나서 코드를 고쳐야 할 때 너무 많은 변경비용이 들진 않는지 생각하며 코드를 작성해야 한다.회고리팩토링의 첫 발걸음은 추상이라는 것을 이번 강의를 통해 깨닫게 되었다. 항상 리팩토링이 필요한 코드를 보면 어디서부터 고쳐야할지 막막했는데, 우빈님 강의를 통해 우선 이름을 잘 지어보고, 메서드로 분리하며, 추상화 레벨을 맞추는 것부터 해야겠다고 생각이 들었다.
백엔드

2024. 05. 19.
0
인프런 워밍업 클럽 BE 1기 - 3주차 발자국
학습한 내용영속성 컨텍스트(Persistence Context)테이블과 매핑된 Entity 객체를 관리/보관하는 역할을 한다.스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생성되고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료된다.영속성 컨텍스트의 특성들을 통해, 데이터의 일관성을 유지하고, 데이터베이스와의 통신 효율을 높일 수 있다. 기능변경 감지(Dirty Check)영속성 컨텍스트 안에서 불러와진 Entity 객체는 명시적으로 save하지 않더라도, 변경을 감지를 통해 자동으로 저장된다.쓰기 지연DB의 INSERT/UPDATE/DELETE에 대한 SQL을 즉시 보내는 것이 아니라, 트랜잭션이 COMMIT될 때 모아서 한 번만 날린다. 이렇게 하면 네트워크 비용과 데이터베이스 리소스 사용을 최소화하여 성능을 개선할 수 있다. 1차 캐싱영속성 컨텍스트는 조회된 Entity를 내부 캐시에 저장한다.같은 트랜잭션 내에서 동일한 Entity를 다시 조회할 때는 데이터베이스에 추가적인 쿼리를 실행하지 않고, 1차 캐시에서 직접 객체를 반환한다.이렇게 되면 데이터베이스 접근 횟수를 줄여 성능을 향상된다.캐싱된 객체는 완전히 동일하다. 지연 로딩(Lazy Loading)연결되어 있는 객체를 꼭 필요한 순간에만 가져온다. 연관관계(Association)두 개 이상의 테이블 또는 객체 간의 연결을 의미한다. 1:1 관계@OnnToOne 한 테이블의 레코드가 다른 테이블의 단 하나의 레코드와만 관련@JoinColumn 연관관계의 주인이 활용할 수 있는 어노테이션필드의 이름이나 null 여부, 유일성 여부, 업데이트 여부 등을 지정N:1 관계@ManyToOne 한 테이블의 한 레코드가 다른 테이블의 여러 레코드와 관련N쪽(Many)에 @ManyToOne을 설정하고 1쪽(One)에 @OneToMany를 설정하여 양방향 매핑을 구성양방향이 아닌 단방향으로 사용할 수 있다.연관관계의 주인은 @ManyToOne을 사용한 쪽으로 설정N:M 관계@ManyToMany한 테이블의 여러 레코드가 다른 테이블의 여러 레코드와 관련구조가 복잡하고, 테이블이 직관적으로 매핑되지 않아 사용하지 않는 것을 추천중간 엔티티(Join Table)를 두고 @OneToMany, @ManyToOne으로 해결하는 방법을 권장 연관관계의 주인JPA에서는 연관관계의 주인을 정해 FK를 관리한다.연관관계의 주인이 외래 키를 관리(등록, 수정)하며, 주인이 아닌 쪽은 읽기만 가능하다.연관관계의 주인이 아닌 쪽에 mappedBy 옵션을 통해 소유자를 지정한다. 효과객체 간의 관계를 명확히 정의하여 응집성을 높일 수 있다.연관관계의 주인을 기준으로 객체 간의 연결이 이루어지며, 이를 통해 엔티티 간의 관계를 보다 명확하게 이해할 수 있다.mappedBy 옵션을 사용하여 양방향 연관관계를 설정하면, 객체 간의 관계가 더욱 명시적으로 표현할 수 있다.연관관계의 주인의 setter 메서드를 사용하여 테이블 간의 연결이 이루어지므로, 데이터의 일관성을 보장할 수 있다.새로운 개발자가 코드를 이해하기 쉽고, 테스트 코드 작성이 용이해진다. 주의사항양방향 연관관계를 설정할 때에는 양쪽 엔티티 모두에게 관계를 설정해 주는게 좋다.연관관계의 주인을 올바르게 설정하지 않으면 데이터 일관성 문제가 발생할 수 있다.데이터 직렬화 시, 엔티티 간의 순환 참조가 발생할 수 있다.연관관계를 지나치게 사용하면 성능 저하가 발생할 수 있다.도메인 간의 복잡한 연결로 인해 시스템을 이해하기 어렵고, 영향도 파악에 어려움이 생겨 시스템의 유지보수가 어려워질 수 있다. cascade 옵션한 객체가 저장되거나 삭제될 때, 그 변경이 폭포처럼 흘러 연결되어 있는 객체도 함께 저장되거나 삭제되는 기능데이터가 삭제될 때 연결된 데이터까지 한 번에 삭제 된다. orphanRemoval 옵션orphan(고아): 관계가 끊어진 데이터removal: 제거객체간의 관계가 끊어진 데이터를 자동으로 제거하는 옵션 배포(Deploy)최종 사용자에게 SW를 전달하는 과정소프트웨어를 서버 같은 전용 컴퓨터에 설치하고 실행시키는 것을 포함한다.AWS(Amazon Web Service)같은 클라우드 서비스를 사용하면, 다양한 사양의 서버를 빌려 사용할 수 있다.개발 환경에서는 개발자의 로컬 컴퓨터에서 MySQL과 같은 데이터베이스를 사용할 수 있고, 배포 환경에서는 서버에 설치된 MySQL을 사용할 수 있다. Profile소프트웨어를 실행할 때 환경에 따라 다른 설정을 적용하고 싶을 때 사용한다. 데이터베이스 설정, 외부 API 키 등의 환경 구성을 다르게 할 수 있다. 똑같은 서버 코드를 실행시키지만, local 이라는 profile을 입력하면, H2 DB를 사용하고, dev 라는 profile을 입력하면 MySQL DB를 사용하도록 구성할 수 있다. H2 Database - 경량 Database로, 개발 단계에서 많이 사용한다. - 디스크가 아닌 메모리에 데이터를 저장할 수 있다. - 메모리 모드에서 실행할 경우, 서버를 재시작할 때마다 데이터가 초기화되므로, ddl-auto 옵션을 create로 설정하면 테이블에 대해 신경쓰지 않고 코드에만 집중할 수 있다. Git코드를 쉽게 관리할 수 있도록 해주는 버전 관리 프로그램 버전 관리파일 변경 이력을 저장하여, 특정 시점의 버전으로 쉽게 돌아갈 수 있다.브랜치동일한 소스 코드에서 여러 개발자가 동시에 다른 작업을 할 수 있도록 지원한다. 기능별로 코드를 분리하고, 완성된 기능을 병합할 수 있다.협업여러 개발자가 동일한 프로젝트에 동시에 참여할 수 있고, 작업을 병합하는 과정에서 발생할 수 있는 충돌을 관리하고 해결할 수 있다. GithubGit 으로 관리되는 프로젝트의 코드가 저장되는 저장소 사용 이유로컬 시스템에 문제가 발생하더라도 온라인 저장소에 코드를 관리할 수 있다.인터넷이 연결된 어디서나 코드에 접근할 수 있다.배포 할 때 활용할 수 있다.코드 관리 뿐만 아니라 Github Actions 같은 툴을 사용하면 변경사항을 자동으로 테스트하고 배포할 수 있다. 명령어git add 파일 이름 지정된 파일을 스테이징 영역(staging area)에 추가하여 Git이 관리하도록 한다. 모든 변경된 파일을 추가하려면 git add . 명령을 사용할 수 있다.git status 현재 워킹 디렉토리의 상태를 표시한다.어떤 파일이 수정되었거나 스테이징 영역에 추가되었는지, 아직 추적되지 않고 있는 파일이 있는지 확인할 수 있다.수정된 파일은 빨간색으로, 스테이징 영역에 추가된 파일은 초록색으로 표시된다.git commit -m "메시지"스테이징 영역에 추가된 변경 사항들을 로컬 저장소에 저장한다.커밋 메시지는 변경 사항을 설명하는 데 사용된다.git push로컬 저장소의 커밋을 원격 저장소에 업로드한다. 리눅스 명령어 mkdir: 폴더를 만드는 명령어ls: 현재 위치에서 폴더나 파일을 확인하는 명령어더 자세한 정보를 확인하려면 ls -l 명령을 사용할 수 있다.cd(change directory): 폴더 안으로 들어가는 명령어상위 폴더로 이동하려면 cd .. 명령을 사용할 수 있다. pwd(print working directory): 현재 위치 확인하는 명령어 rmdir: 특정 폴더(디렉토리) 제거하는 명령어 회고이번 주에는 JPA의 영속성 컨텍스트와 연관관계, 배포, Git/Github, 리눅스에 대해 학습했다. Git과 Github 같은 경우에는 이전부터 계속 사용해왔기 때문에 개념을 되짚고 넘어가는 데 큰 어려움은 없었다. 그러나 배포는 항상 조금 두렵게 느껴졌는데, 그 이유는 결과만 생각했기 때문이라는 것을 알 수 있었다. 이번 강의를 통해서 결국 하나의 클라우드 서비스일 뿐이고, 정확한 개념과 동작 원리를 이해한다면, 이런 문제들을 해결할 수 있다는 것을 깨달았다. 처음에는 Git, Github도 어려웠지만, 계속 사용하면서 조금씩 익숙해졌던 것 처럼 아직까지 어색한 클라우드 서비스, 리눅스 등 기술들을 지속적으로 학습하고 사용해보면서 익숙해지려고 노력해야겠다. 이번 주에는 작성한 미니 프로젝트에 대해 코드 리뷰를 받을 수 있었다. 코드 리뷰를 통해 테스트 코드 작성 시 다양한 기법을 고려하고, 로직을 구현할 때 데이터 양과 쿼리 수 등을 고려하는 것이 중요하다는 것을 배울 수 있었다. 스터디를 통해 지금까지 알고 있던 내용을 되짚어보고, 이해도를 높일 수 있었다. 또한, 개발자로서 코드를 작성할 때 고려해야 할 부분에 대해 배울 수 있는 시간이었다. 스터디는 이제 마무리되었지만, 배운 내용을 복습하고, 피드백을 바탕으로 미션을 수정할 예정이다. 또한, 미니 프로젝트를 4단계까지 진행하여 배포까지 완료해 봐야겠다.
백엔드

2024. 05. 12.
0
인프런 워밍업 클럽 BE 1기 - 2주차 발자국
학습한 내용 스프링 컨테이너서버가 시작될 때, 함께 시작되는 클래스들을 담는 거대한 공간스프링 빈을 등록하고 관리하는 역할을 한다.이를 통해 객체의 생성, 의존성 관리, 라이프사이클 관리 등을 처리한다.build.gradle 파일에 설정한 의존성들도 함께 스프링 빈으로 등록된다.스프링 빈을 등록하는 과정에서 필요한 의존성을 함께 설정해준다. 의존성(Dependency)하나의 요소가 다른 요소에게 영향을 받는 관계소프트웨어의 유연성과 유지보수성에 영향을 준다. 스프링 빈(Spring Bean)컨테이너 안에 다양한 클래스가 들어가게 된다.이때 다양한 정보도 함께 들어있고, 인스턴스화도 이루어진다.스프링 컨테이너 안으로 들어간 클래스를 스프링 빈이라고 한다. 등록 방법@Configuration: 클래스에 붙이는 어노테이션@Bean을 사용할 때 함께 사용해 주어야 한다.@Bean:메서드에 붙는 어노테이션메서드에서 반환되는 객체를 스프링 빈으로 등록한다.@Component: 주어진 클래스를 컴포넌트로 간주한다.컴포넌트로 간주된 클래스들은 스프링 서버가 뜰 때 자동으로 감지된다.@RestController, @Service, @Repository, @Configuration 어노테이션은 모두 @Component 어노테이션을 가지고 있다. 스프링 빈을 주입 받는 방법생성자를 이용해 주입받는 방식 가장 권장하는 방식이다. setter를 통해 주입받는 방식 필드에 직접 주입하는 방법기본적으로 권장되지 않는다.setter를 통해 다른 인스턴스로 교체해 동작에 문제가 생길 수 있다.필드에 바로 주입하게 되면 테스트가 어렵다. 제어의 역전(IoC, Inversion of Control)객체를 생성하는 과정에서 스프링 컨테이너가 필요한 의존성을 자동으로 선택해서 주입해준다.스프링 컨테이너가 필요한 의존성을 설정해주는 과정을 의존성 주입(DI, Dependency Injection) 이라고 한다.이렇게 하면 코드의 수정 없이 의존성을 변경할 수 있고, 애플리케이션의 유연성을 높인다.JPA(Java Persistence API)데이터를 영구적으로 보관하기 위해 Java 진영에서 정해진 규칙자바 진영에서 제공하는 ORM(Object-Relational Mapping) 기술의 표준 API영속성(Persistence): 서버가 재시작 되어도 **데이터는 영구적으로 저장**되는 속성API: 정해진 규칙 ORM(Object-Relational Mapping) - Object: 자바에서의 객체를 의미한다. - Relational: 관계형 데이터베이스의 테이블을 의미한다. - Mapping: 객체와 데이터를 매핑하는 작업을 의미한다.JPA는 단순히 API일 뿐이므로, 실제 동작을 위해서는 JPA 구현체가 필요하다.대표적으로 Hibernate가 있고, Hibernate는 내부적으로 JDBC를 사용하여 데이터베이스와 통신한다.영속성 컨텍스트(Persistence Context)테이블과 매핑된 Entity 객체를 관리/보관하는 역할을 한다.스프링에서는 트랜잭션을 사용하면 영속성 컨텍스트가 생성되고, 트랜잭션이 종료되면 영속성 컨텍스트가 종료된다.영속성 컨텍스트의 특성들을 통해, 데이터의 일관성을 유지하고, 데이터베이스와의 통신 효율을 높일 수 있다. 기능변경 감지(Dirty Check)영속성 컨텍스트 안에서 불러와진 Entity 객체는 명시적으로 save하지 않더라도, 변경을 감지를 통해 자동으로 저장된다.쓰기 지연DB의 INSERT/UPDATE/DELETE에 대한 SQL을 즉시 보내는 것이 아니라, 트랜잭션이 COMMIT될 때 모아서 한 번만 날린다.이렇게 하면 네트워크 비용과 데이터베이스 리소스 사용을 최소화하여 성능을 개선할 수 있다.1차 캐싱영속성 컨텍스트는 조회된 Entity를 내부 캐시에 저장한다.같은 트랜잭션 내에서 동일한 Entity를 다시 조회할 때는 데이터베이스에 추가적인 쿼리를 실행하지 않고, 1차 캐시에서 직접 객체를 반환한다.이렇게 되면 데이터베이스 접근 횟수를 줄여 성능을 향상된다.캐싱된 객체는 완전히 동일하다.Spring Data JPA복잡한 JPA 코드를 쉽게 사용할 수 있도록 도와주는 스프링 프레임워크의 모듈스프링은 JpaRepository를 구현 받는 Repository에 대해 자동으로 SimpleJpaRepository 기능을 사용할 수 있게도 해 준다.save: 주어지는 객체를 저장하거나 업데이트 시켜준다.findAll: 주어지는 객체가 매핑된 테이블의 모든 데이터를 가져온다.findById: id를 기준으로 특정한 1개의 데이터를 가져온다.delete: 주어진 객체를 삭제한다.함수 이름만 작성하면, 알아서 SQL을 만들어 준다. 구절By 앞에 사용되는 구절find반환 타입은 객체가 될 수도 있고,Optional이 될 수도 있다.findAll쿼리의 결과물이 N개인 경우 사용한다.반환 타입 Listexist쿼리 결과가 존재하는지 확인한다.반환 타입 booleancountSQL의 결과 개수를 센다.반환 타입 longBy 뒤에 사용되는 구절필드 이름이 들어간다.필드들은 And 또는 Or로 조합될 수 있다.필드 이름만 작성하면 동등 조건(=)으로 쿼리가 생성된다.외에 다양한 조건을 활용할 수 있다.GreaterThan : 초과GreaterThanEqual : 이상LessThan : 미만LessThanEqual : 이하Between : 사이에StartsWith : ~로 시작하는EndsWith : ~로 끝나는 회고이번주에는 스프링 컨테이너와 빈, 그리고 JPA에 대해 학습했다. 스프링은 기능을 쉽게 구현할 수 있도록 IoC와 DI 같이 기능을 제공한다. 그동안은 사용하는데 그쳤다면 이번에는 스프링 빈은 무엇이며 어떻게 등록하고, 어떻게 스프링에서 의존성 주입을 해 주는지 알 수 있었다. 이를 통해 스프링의 핵심 개념을 이해할 수 있었다. 또한, JDBC를 사용하면서 오타로 인해 런타임시에 예외가 발생한 적이 종종 있었지만 이번 JPA를 사용하면서 이런 예외를 줄일 수 있었다. Java 진영에서 어떤 목적을 가지고, JPA가 만들어 진건지, 어떻게 사용하고 실제 구현체는 무엇이면 어떻게 동작할 수 있는지 배울 수 있던 한 주였다.강의 내용처럼 앞으로도 공부하는데 있어서 기술의 사용법에 그치지 않고 기술의 등장 배경과 원리를 함께 이해한다면 한단계 더 성장 할 수 있을 것 같다.
백엔드

2024. 05. 04.
0
인프런 워밍업 클럽 BE 1기 - 1주차 발자국
학습한 내용Java컴파일: 인간이 이해하기 쉬운 언어를 기계어(바이트 코드)로 번역하는 과정컴파일러: 컴파일을 하는 프로그램바이트 코드: 0과 1로 이루어진 코드, 컴퓨터가 이해할 수 있다.자바의 JVM은 다양한 운영체제에서 바이트 코드를 실행할 수 있도록 중간 단계 역할을 한다.따라서 JVM만 운영체제별로 존재한다면, 하나의 바이트 코드로 각각의 운영체제에서 실행 할 수 있다.JVM자바 바이트 코드를 실행하는 가상머신바이트 코드를 읽고 검증 및 실행한다.Java 외에 다른 언어에서도 사용된다. JRE자바 애플리케이션 실행 환경JVM의 실행환경 구현 JDK컴파일러, 디버그 등을 포함하는 자바 개발 도구 Build소스 코드 파일을 컴퓨터에서 실행할 수 있는 독립 SW 가공물로 변환시키는 과정 빌드 과정소스 코드를 컴파일한다.테스트 코드를 컴파일 한다.테스트 코드를 실행한다.테스트 코드 리포트를 작성한다.기타 추가 설정한 작업들을 진행한다.패키징을 수행한다.최종 SW 결과물(Artifact)을 만들어 낸다.실행작성한 코드(혹은 테스트 코드)를 컴파일 후 실행해 보는 과정독립 SW 가공물이 생성될 수도 있고, 생성되지 않을 수도 있다.인터프리터 언어의 경우, 컴파일 과정이 필요 없다.빌드 툴(Build Tool)빌드 과정을 자동으로 처리 해주는 프로그램외부 소스 코드(외부 라이브러리) 자동 추가, 관리빌드란 단순히 실행하는 것과 다르다.빌드 과정 자동화와 외부 라이브러리 관리를 위해 빌드 툴이 사용된다.네트워크(Network)여러 컴퓨터나 장치들이 서로 데이터를 주고받을 수 있도록 연결된 시스템IP: 네트워크 상에서 각 장치를 구별하기 위해 사용되는 고유의 식별 번호도메인 이름: 외우기 어려운 IP 주소 대신, 사람이 읽을 수 있는 이름으로 대체할 수 있는 별칭포트: 하나의 IP 주소 내에서 특정 프로그램이나 서비스를 식별하기 위해 사용되는 숫자HTTP(Hypertext Transfer Protocol)인터넷에서 데이터를 주고받기 위한 표준 프로토콜프로토콜(Protocol): 통신을 위한 규칙과 약속규칙HTTP Method: 요청을 받는 컴퓨터에게 요구하는 행위GET: 데이터 요청(쿼리 사용)POST: 데이터 전송(바디 사용)PUT: 데이터 수정(바디 사용)DELETE: 데이터 삭제(쿼리 사용)Host: 요청을 받는 컴퓨터의 정보를Path: 요청하는 자원의 경로 데이터 전달 방법쿼리(Query) URL에 포함되어 데이터를 전달?를 통해 쿼리와 Path를 구분한다.쿼리 사이에는 &를 통해 구분한다.본문(Body) 별도의 본문을 통해 데이터를 전달API(Application Programming Interface)클라이언트와 서버 간의 HTTP 통신을 통해 정해진 약속에 따라 특정 기능을 수행인터페이스(Interface): 규약, 규칙JSON(JavaScript Object Notation)객체를 표현하기 위한 형식(객체 표기법)용법중괄호(`{}`)로 묶여 있다.중괄호 안에, "key": value로 표기한다.키("key")와 값("value")은 :로 구분된다.속성(키-값)은 ,로 구분한다.데이터베이스(Database)데이터를 구조화 시켜 저장하고, 관리하는 시스템RDB(Relational Database)는 데이터를 표(table) 형식으로 구조화하여 관리한다. SQL(Structured Query Language)표 형식으로 구조화된 데이터를 조회, 삽입, 수정, 삭제하는 언어SQL을 통해 데이터베이스와 상호작용DDL(Data Definition Language)데이터를 정의하기 위한 SQL데이터베이스 생성CREATE DATABASE [데이터베이스 이름];데이터베이스 목록 조회SHOW DATABASES;데이터베이스 삭제DROP DATABASE [데이터베이스 이름];데이터베이스 선택USE [데이터베이스 이름];테이블 생성 CREATE TABLE [테이블 이름] ( [필드1 이름] [타입] [부가조건], [필드2 이름] [타입] [부가조건], ... PRIMARY KEY ([필드 이름]) );테이블 목록 조회SHOW TABLES;테이블 삭제DROP TABLE [테이블 이름];DML(Data Manipulation Language)데이터 조작을 위한 SQL데이터 삽입 (생성 - Create)INSERT INTO [테이블 이름] (필드1이름, 필드2이름, ...) VALUES (값1, 값2, ...)데이터 조회 (읽기 - Retrieve or Read)SELECT * FROM [테이블 이름] WHERE [조건];데이터 수정 (업데이트 - Update)UPDATE [테이블 이름] SET 필드1이름=값1, 필드2이름=값2, ... WHERE [조건];데이터 삭제 (제거 - Delete)DELETE FROM [테이블 이름] WHERE [조건];수정과 삭제 시, 조건을 지정해주지 않는다면 모든 데이터에 적용되기 때문에 주의해야 한다.클린 코드(Clean Code)코드(Code)는 요구사항을 표현하는 언어다.개발자는 이러한 요구사항을 구현하기 위해 코드를 읽고 작성한다.코드를 읽는 것은 소프트웨어 개발에서 필수적이며 피할 수 없다.작성 원칙함수는 작고 명확하게 작성되어야 한다.클래스는 하나의 책임만을 가져야 한다.이유협업 과정에서 다수의 개발자가 동시에 수정할 수 없다.코드를 읽고, 이해하기 어렵다.함수의 일부분을 수정하더라도, 수정된 코드가 다른 부분에 영향을 미칠 수 있기 때문에 함부로 수정할 수 없게 된다.코드의 기능이 커서 테스트가 어렵다.이로인해 유지보수성이 떨어진다.회고지금까지는 Java의 다양한 기능을 사용하는 과정에서 그저 기능들을 활용하는 데 그쳤던 것 같다. 그러나 이번 스터디를 통해 강의를 듣고 미션을 수행하면서 해당 기능들이 등장한 배경과 목적을 공부할 수 있었고, 앞으로 어떻게 공부해야 하는지 배울 수 있었던 1주차 였다.
백엔드




