1\. spring boot initializrhttps://start.spring.io/이후 IDE에서 import인텔리제이의 경우 import할 때 build.gradle 바로 선택2\. build.gradle3\. 동작 확인기본 테이스케이스 실행스프링부트
1\. 요구사항 분석기능 목록회원 기능회원 등록회원 조회상품 기능상품 등록상품 수정상품 조회주문 기능상품 주문주문 내역 조회주문 취소기타 요구사항상품은 재고 관리가 필요하다.상품의 종류는 도서, 음반, 영화가 있다.상품을 카테고리로 구분할 수 있다.상품 주문시 배송 정
1\. @Getter, @Setter이론적으로는 Setter는 닫아두는 것을 권장데이터가 어디서 변경되었는지 추적하기가 힘들어지기 때문변경 지점이 명확해지도록 비즈니스 메소드를 별도로 제공(유지보수 고려)2\. 엔티티의 식별자엔티티의 식별자는 "id"를 사용하고, PK
1\. 엔티티에서는 가급적 Setter 사용 지양변경 포인트가 너무 많아져서 유지보수가 어려움2\. 모든 연관관계는 지연로딩(LAZY)으로 설정즉시로딩(EAGER)의 경우 예측이 어렵고 어떤 SQL이 실행될지 추적하기 어려움특히 JPQL 실행시 N+1 문제가 자주 발생
아키텍처필요시 controller에서 바로 repository 불러오도록 유연하게 설계계층형 구조 사용controller, web: 웹 계층service: 비즈니스 로직, 트랜잭션 처리repository: JPA를 직접 사용하는 계층, 엔티티 매니저 사용domain:
1\. 준영속 엔티티영속성 컨텍스트가 더 이상 관리하지 않는 엔티티수정을 시도하는 Book 객체의 경우, DB에 이미 한 번 저장되어서 식별자를 갖고 있음 new를 통해 임의로 만들어낸 엔티티더라도 기존 식별자를 갖고 있으면 준영속 엔티티!!!JPA가 관리하지 않으므로
주문조회 예시(1) ver1: 엔티티를 직접 노출📌 엔티티를 직접 노출할 경우 양방향 연관관계가 걸린 곳은 꼭! 한곳을 @JsonIgnore 처리 안그러면 양쪽을 서로 호출하면서 무한 루프 발생📌 엔티티의 외부노출은 가급적 지양 => DTO로 변환하여 반환📌 지연
양방향 연관관계일 경우 무한루프를 방지하기 위해 필드 레벨에서 어노테이션 추가Order 엔티티에서 Member 엔티티 다대일 연관관계Member엔티티에서는 Order 정보를 또 찾지 않도록 @JsonIgnore 처리
주문조회 예시(1) ver1: 엔티티를 직접 노출 📌 엔티티의 외부 노출은 지양(2) ver2: 엔티티를 DTO로 변환 📌 연관관계의 경우 마찬가지로 별도의 DTO로 변환 필요 \- 엔티티를 껍데기 DTO로 감싸는 형태도 X 📌 N+1 문제가 발생(지
1\. 엔티티 조회엔티티를 조회해서 그대로 반환: ver1엔티티 조회 후 DTO로 변환: ver2페치조인으로 쿼리 수 최적화: ver3컬렉션 페이징과 한계 돌파: ver3.1컬렉션 페치 조인시 페이징이 불가능하다는 한계가 존재그렇다면 어떻게 해결? (실무에서는 페이징
1\. 기본개념Open Session In View: 하이버네이트Open EntityManager In View: JPA관례상 OSIV라고 명명 2\. OSIV ON\- spring.jpa.open-in-view: true (default)기본값을 뿌리면서 애플리케이션
N+1 문제(1) 즉시로딩em.find() 메소드로 조회외부조인을 사용해서 한 번의 SQL 실행JPQL 사용시board 조회 => board 수만큼 즉시로딩이 걸려있는 boardReply 조회하기 위해 추가 SQL 실행
1\. 성능 최적화의 필요성영속성 컨텍스트에서 엔티티가 관리될 경우장점: 1차 캐시, 변경감지 등단점: 메모리 사용 증가(변경감지를 위해 스냅샷 인스턴스를 보관)단순 조회성인 경우 읽기 전용으로 엔티티 조회하여 메모리 사용량 최적화2\. 쿼리 최적화 방법1) 스칼라 타
많은 데이터의 배치처리가 필요한 상황인 경우, 일반적인 방식으로 엔티티를 계속 조회하면 영속성 컨텍스트에 많은 엔티티가 쌓이면서 메모리 부족 오류가 발생따라서 이런 배치 처리는 적절한 단위로 영속성 컨텍스트 초기화가 필요1) JPA 등록 배치데이터 등록데이터 수정페이징
1\. SQL 쿼리 힌트 사용JPA는 데이터베이스 SQL 힌트 기능을 미제공 => 하이버네이트 직접 사용하이버네이트 쿼리가 제공하는 addQueryHint() 메소드 사용2\. 트랜잭션을 지원하는 쓰기 지연SQL 실행시마다 네트워크 호출할 경우 많은 비용이 소모 =>