OSIV는 Open Session in View(하이버네이트) 이다. Open EntityManager in View는 JPA라 하지만 관례상 OSIV라고 한다. OSIV ON spring.jpa.open-in-view : true 기본값 OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때 까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. 그래서 지금까지 View Template이나 API 컨트롤러에서 지연 로딩이 가능했던 것이다. 또, 엔티티를 적극활용해서 LAZY Loading 같은 기술을 Controller 나 View에서도 사용 가능하다. 즉, 지연 로딩은 영속성 컨텍스트가 살아있어야 가능하고, 영속성 컨텍스는 기본적으로 데이터베이스 커넥션을 유지..
Spring JPA 공부/실전! 스프링 부트와 JPA 활용2
지금까지 내용 정리 엔티티 조회 엔티티를 조회해서 그대로 반환: V1 엔티티 조회 후 DTO로 변환: V2 페치 조인으로 쿼리 수 최적화: V3 컬렉션 페이징과 한계 돌파: V3.1 -> 컬렉션은 페치 조인 시 페이징이 불가하다. ToOne 관계는 페치 조인으로 쿼리수를 최적화하고 컬렉션은 패치 조인 대신에 지연 로딩을 유지한다. hibernate.default_batch_fetch_size , @BatchSize로 최적화한다 DTO 직접 조회 JPA에서 DTO를 직접 조회: V4 컬렉션 조회 최적화 - 일대다 관계인 컬렉션은 IN 절을 활용해서 메모리에 미리 조회해서 최적화: V5 플랫 데이터 최적화 - JOIN 결과를 그대로 조회 후 애플리케이션에서 원하는 모양으로 직접 변환: V6 강사님의 추천 순..
주문내역에서 추가로 주문한 상품 정보를 추가로 조회하는 코드를 구현하자. Order 기준으로 컬렉션인 OrderItem과 Item이 필요하다. 이번에는 컬렉션 관계가 있기 때문에 OneToMany 관계가 존재한다. 주문 조회 V1(엔티티 직접 노출) @GetMapping("/api/v1/orders") public List ordersV1(){ List all = orderRepository.findAll(new OrderSearch()); for (Order order : all) { order.getMember().getName(); order.getDelivery().getAddress(); List orderItems = order.getOrderItems(); orderItems.stream()..
이번 강의 목표는 주문 + 배송정보 + 회원을 조회하는 API를 만드는 것이다. 지연 로딩 때문에 발생하는 성능 문제를 단계적으로 해결해 나가는 것이다. 간단한 주문 조회V1(엔티티를 직접 노출) 에러 1 @RestController @RequiredArgsConstructor public class OrderSimpleApiController { private final OrderRepository orderRepository; @GetMapping("/api/v1/simple-orders") public List orderV1() { List all = orderRepository.findAll(new OrderSearch()); return all; } } 이렇게 할 경우 Order가 Member를..
회원 등록 API 회원을 등록하기 위한 API를 만드는 단계이다. 버전 1 @RestController @RequiredArgsConstructor public class MemberApiController { private final MemberService memberService; @PostMapping("/api/v1/members") public CreateMemberResponse saveMemberV1(@RequestBody @Valid Member member){ Long id = memberService.join(member); return new CreateMemberResponse(id); } @Data static class CreateMemberResponse { private L..