5. API 개발 고급 - 실무 필수 최적화
·
Spring/JPA 2
OSIV : Open Session In View - 현재 JPA에서의 EntityManager와 같은 역할을 과거 Hibernate 에서 Session을 사용하였다. @Transactional → setAutoCommit() DB 커넥션을 획득하는 시점은 일반적으로 트랜잭션을 시작할 때 이다. 그럼 DB 커넥션의 반환 시점은 언제가 될까? 위 시점을 OSIV 설정을 통해 결정한다. if OSIV = True 트랜잭션이 끝나도 'DB 커넥션'과 영속성 컨텍스트가 유지되게끔 한다. 따라서 (API) Controller 나 View Template에서의 지연 로딩이 가능해진다. 사용자에게 반응되기 전까지 오랫동안 DB 커넥션 리소스를 사용한다. if OSIV = False 트랜잭션이 끝날 때, 'DB 커넥션..
4. API 개발 고급 - 컬렉션 조회 최적화
·
Spring/JPA 2
목표. OneToMany 관계 최적화 하기 Order를 조회할 때, OneToMany 관계인 OrderItem(컬렉션)을 조회할 때 성능을 최적화하는 방법 정리. 컬렉션 페이징 조회 최적화 1. ToOne 관계를 모두 fetch join 한다. 2. 컬렉션은 지연 로딩으로 조회한다. (fetch join X) 3. 지연 로딩 최적화를 위해서 hibernate.default_batch_fetch_size / @BatchSize 를 적용한다. - hibernate.default_batch_fetch_size : 글로벌 설정(application.yml) - @BatchSize : 개별 설정 → 컬렉션이나 프록시 객체를 설정한 size만큼, 한번에 IN Query로 조회한다. 1. V1 : 엔티티 직접 노출 ..
3. API 개발 고급 - 지연 로딩과 조회 성능 최적화
·
Spring/JPA 2
목표. xToOne 관계 최적화 하기 Order를 조회할 때, 지연 로딩이면서 xToOne 관계인 Member와 Delivery를 조회할 때 성능을 최적화하는 방법 정리. 쿼리 방식 선택 권장 순서 1. 우선 엔티티를 DTO로 변환한다. 2. 필요하면 "fetch join"으로 성능을 최적화 한다. 3. 높은 성능이 요구되면 DTO로 직접 조회한다. 4. 마지막으로는 JPA가 제공하는 네이티브 SQL / JDBC Template에서 SQL 직접 사용하자. 1. V1 : 엔티티 직접 노출 문제 1) API 스펙이 변함 : Entity가 변하면 API 스펙이 변한다. 문제 2) '무한 루프' 발생 : 양방향 연관관계인 Member, Order 사이에서 루프에 빠진다. → 한 쪽에 @JsonIgnore 해주어..
2. API 개발 고급 - 준비
·
Spring/JPA 2
- 앞으로 배울 내용 정리 1) 조회용 샘플 데이터 입력 (섹션 2.) - InitDB 생성 - DB 초기 데이터 구축 (Member, Book, OrderItem, Delivery, Order - persist) 2) 지연 로딩과 조회 성능 최적화 3) 컬렉션 조회 최적화 4) 페이징과 한계 돌파 5) OSIV와 성능 최적화
1. API 개발 기본
·
Spring/JPA 2
1. 진행하면서 맞닥뜨린 문제 (@ResponseBody), 검증 1) Post 요청으로 클라이언트의 데이터를 CreateMemberRequest(DTO) 타입의 request 객체에 매핑을 해준다. 2) 이 때, HTTP 요청의 본문(Member)과 request가 매핑이 되는데, 이 때 반드시 필드의 이름이 일치해야 한다. public class Member { private String username; } @RestController @RequiredArgsConstructor public class MemberApiController { @PostMapping("/api/v2/members") public CreateMemberResponse saveMemberV2(@RequestBody @Va..