Spring-Boot/실전! 스프링 부트와 JPA활용2 - API개발과 성능 최적화
-
5. API 개발 고급 - 실무 필수 최적화 & 6. 다음으로Spring-Boot/실전! 스프링 부트와 JPA활용2 - API개발과 성능 최적화 2023. 2. 15. 10:28
1. OSIV와 성능 최적화 - Open Session In View : 하이버네이트 - Open EntityManager In View : JPA ㆍ(관례상 OSIV라 한다) OSIV ON - spring.jpa.open-in-view : true 기본값 - 이 기본값을 뿌리면서 애플리케이션 시작 시점에 warn 로그를 남기는 것은 이유가 있다. - OSIV 전략은 트랜잭션 시작처럼 최초 데이터베이스 커넥션 시작 시점부터 API 응답이 끝날 때까지 영속성 컨텍스트와 데이터베이스 커넥션을 유지한다. - 그래서 지금까지 View Template 이나 API 컨트롤러에서 지연 로딩이 가능했던 것이다. - 지연 로딩은 영속성 컨텍스트가 살아있어야 가능하고, 영속성 컨텍스트는 기본저긍로 데이터베이스 커넥션을 유..
-
4. API 개발 고급 - 컬렉션 조회 최적화Spring-Boot/실전! 스프링 부트와 JPA활용2 - API개발과 성능 최적화 2023. 2. 13. 18:05
- 앞의 예제에서는 toOne(OneToOne, ManyToOne) 관계만 있었다. 이번에는 컬렉션인 일대다 관계(OneToMany)를 조회하고, 최적화하는 방법을 알아보자. 1. 주문 조회 V1 : 엔티티 직접 노출 @GetMapping("/api/v1/orders") public List ordersV1() { List all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getName(); order.getDelivery().getAddress(); List orderItems = order.getOrderItems(); orderItems.stream().forEach(..
-
3. API 개발 고급 - 지연 로딩과 조회 성능 최적화Spring-Boot/실전! 스프링 부트와 JPA활용2 - API개발과 성능 최적화 2023. 2. 13. 15:06
1. 간단한 주문 조회 V1 : 엔티티를 직접 노출 @GetMapping("/api/v1/simple-orders") public List ordersV1() { List all = orderRepository.findAllByString(new OrderSearch()); return all; // 무한루프 - 양방향 연관관계 발생 } 1. 무한루프 발생 ㆍ양방향 연관관계일 경우 한쪽을 @JsonIgnore을 해야한다. 2. bytebuddy.ByteBuddyInterceptor 에러 발생 ㆍLAZY 지연로딩은 디비에서 값을 가져오는게 아니라 Proxy 객체를 가져온다. @Entity @Table(name = "orders") @Getter @Setter @NoArgsConstructor(access ..
-
1. API 개발 기본Spring-Boot/실전! 스프링 부트와 JPA활용2 - API개발과 성능 최적화 2023. 2. 9. 18:43
1. 회원 등록 API @PostMapping("/api/v2/members") public CreateMemberResponse saveMemberV2(@RequestBody @Valid CreateMemberRequest request) { Member member =new Member(); member.setName(request.getName()); Long id = memberService.join(member); return new CreateMemberResponse(id); } - 엔티티와 프레젠테이션 로직을 분리 - 엔티티는 엔티티 용도로만 프레젠테이션은 validate 등등 - 엔티티와 api 스펙을 분리 - 엔티티가 변해도 api 스펙은 변하지 않는다는 장점 - 실무에서는 엔티티를 외..