JPA/2편- 실전! 스프링 부트와 JPA 활용
OSIV와 성능 최적화
OSIV와 성능 최적화 Open Session In VIew: 하이버네이트 Open EntityManager In View: JPA (관례상 OSIV라 한다.) 하이버네이트에선 EntityManeger를 Session이라고 칭한다. JPA는 하이버네이트 이후에 표준화를 위해 생겼기 때문에 이런 용어 차이가 발생했다. OSIV ON spring.jpa.open-in-view : true 기본값 → 이 기본값을 뿌리면서 애플리케이션 시작 시점에 warnning 로그를 남기는 것은 이유가 있다. 기본적으로 JPA 는 언제 DB 커넥션을 가져오고 반환할까? JPA 즉, 영속성 컨텍스트는 DB 커넥션을 내부적으로 사용해야 지연 로딩 같은 작업이 가능하다. 이 말은 곧 영속성 컨텍스트와 DB 커넥션은 밀접하게 매칭..
API 개발 고급 - 컬렉션 조회 최적화
주문내역에서 추가로 주문한 상품 정보를 추가로 조회하자. Order기준으로 컬렉션인 OrderItem 와 Item 이 필요하다. 앞선 예제에서는 xxxToOne(OneToOne, ManyToOne)관계만 있었다. 이번에는 컬렉션인 일대다 관계(OneToMany)를 조회하고 최적화 하는 방법을 알아보자. 주문 조회 V1: 엔티티 직접 노출 package jpabook.jpashop.api; import java.util.List; import jpabook.jpashop.domain.Order; import jpabook.jpashop.domain.OrderItem; import jpabook.jpashop.repository.OrderRepository; import jpabook.jpashop.repo..
API 개발 고급 - 지연 로딩과 조회 성능 최적화
사전 준비 - 조회용 샘플 데이터 입력 jpabook::jpashop::InitDb /** * 총 주문 2개 * userA * JPA1 BOOK * JPA2 BOOK * userB * SPRING1 BOOK * SPRING2 BOOK */ @Component @RequiredArgsConstructor public class InitDb { private final InitService initService; @PostConstruct public void init() { initService.dbInit1(); initService.dbInit2(); } @Component @Transactional @RequiredArgsConstructor static class InitService { priva..
API 개발 기본
회원 등록 API ※ 참고 패키지 분리 일반적으로 템플릿 엔진을 사용하여 랜더링하는 Controller와 API 스타일의 Controller를 분리한다. 왜냐하면 공통으로 예외처리를 할 때 패키지나 구성단위를 기준으로 공통 처리를 하는데 api와 화면의 공통 처리 요소가 다르다. 예를 들어 화면의 경우 에러가 발생하면 공통 에러 html 페이지를 반환하고 API의 경우 공통 에러 JSON을 반환한다. 회원 등록 API - V1 package jpabook.jpashop.api; import javax.validation.Valid; import jpabook.jpashop.domain.Member; import jpabook.jpashop.service.MemberService; import lombok..