일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- 서브쿼리
- querydsl
- 스프링 데이터 JPA
- Spring data JPA
- 오라클
- Spring
- SQL
- JPA
- 친절한 SQL 튜닝
- TCP/IP
- 페치조인
- 그룹함수
- 엔티티
- 정렬
- 페이징
- 컬렉션 조회 최적화
- 자바의 정석
- 데이터모델링
- 스프링 컨테이너
- JPQL
- 데이터베이스
- INDEX SCAN
- 스프링
- 성능최적화
- 값 타입
- SQL 튜닝
- index
- @MappedSuperclass
- DTO
- fetch join
- Today
- Total
목록분류 전체보기 (123)
nu_s

OSIV(Open Session In View) 하이버네이트에서는 Open Session In View JPA에서는 Open EntityManager In View라고 한다. 애플리케이션을 실행하면 로그에 항상 WARN이 발생했다. 이것은 OSIV가 켜져있다는 뜻이며, 데이터베이스 커넥션이 뷰가 랜더링되는 동안 유지된다는 뜻의 경고이다. application.yml에서 설정할 수 있으며 기본값은 true이다. application.yml spring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create pro..

V6. 컬렉션 조회 최적화 - 플랫 데이터 최적화 지난번에 V5를 최적화해서 쿼리 단 한 번으로 해결할 수 있는 방법이 있다. @RestController @RequiredArgsConstructor public class OrderApiController { private final OrderQueryRepository orderQueryRepository; @GetMapping("/api/v6/orders") public List orderV6() { return orderQueryRepository.findAllByDto_flat(); } } jpabook.jpashop.repository.order.query.OrderFlatDto @Data public class OrderFlatDto { pr..
V4. JPA에서 DTO 직접 조회하기 앞에서는 엔티티를 DTO로 변환해서 컬렉션으로 반환했다. 이번에는 DTO를 그대로 반환해서 JPA가 DTO를 직접 조회하게 만들어 보겠다. @RestController @RequiredArgsConstructor public class OrderApiController { private final OrderQueryRepository orderQueryRepository; @GetMapping("/api/v4/orders") public List orderV4() { return orderQueryRepository.findOrderQueryDtos(); } } jpabook.jpashop.repository.order.query.OrderQueryDto @Data..

V3. 엔티티를 DTO로 변환 - 페치 조인 최적화 @RestController @RequiredArgsConstructor public class OrderApiController { private final OrderRepository orderRepository; @GetMapping("/api/v3/orders") public List orderV3() { List orders = orderRepository.findAllWithItem(); //새로운 메서드 생성 List collect = orders.stream() .map(o -> new OrderDto(o)) .collect(Collectors.toList()); return collect; } } OrderRepository public..
컬렉션 조회 최적화 이전에는 XXXToOne 관계를 다뤘다면 이번엔 컬렉션인 일대다 관계 (OneToMany)를 조회하고 최적화 해보자 V1. 엔티티 직접 노출 @RestController @RequiredArgsConstructor public class OrderApiController { private final OrderRepository orderRepository; @GetMapping("/api/v1/orders") public List orderV1() { List all = orderRepository.findAllByString(new OrderSearch()); for (Order order : all) { order.getMember().getName(); order.getDeliv..
V4. JPA에서 DTO로 바로 조회하기 쿼리 한 번 호출 select 절에서 원하는 데이터만 선택해서 조회 @RestController @RequiredArgsConstructor public class OrderSimpleApiController { private final OrderSimpleQueryRepository orderSimpleQueryRepository; @GetMapping("/api/v4/simple-orders") public List ordersV4() { return orderSimpleQueryRepository.findOrderDtos(); } } OrderSimpleQueryRepository (조회 전용 리포지토리) @Repository @RequiredArgsCons..

V2. 엔티티를 DTO로 변환 @RestController @RequiredArgsConstructor public class OrderSimpleApiController { private final OrderRepository orderRepository; @GetMapping("/api/v2/simple-orders") public List ordersV2() { List orders = orderRepository.findAllByString(new OrderSearch()); List result = orders.stream() .map(o -> new SimpleOrderDto(o)) // Order를 SimpleOrderDto로 변환 .collect(Collectors.toList()); re..

지연 로딩과 조회 성능 최적화 지연 로딩 때문에 발생하는 성능 문제를 단계적으로 해결하기 컬렉션타입을 반환하는 XXXToMany 관계는 다음으로 미루고 XXXToOne (OneToOne, ManyToOne) 관계를 최적화 해보자 V1. 엔티티를 직접 노출 문제점 1 @RestController @RequiredArgsConstructor public class OrderSimpleApiController { private final OrderRepository orderRepository; @GetMapping("/api/v1/simple-orders") public List ordersV1() { List all = orderRepository.findAllByString(new OrderSearch(..