본문 바로가기

Spring/JPA8

[JPA] OSIV (Open Session In View)를 사용하여 JPA 성능 최적화 JPA에서의 Entity manager == Hibernate에서의 Session 즉, 사실상 JPA에서는 Open Entity Manager In View라고 생각하면 된다 JPA가 언제 DB Connection을 얻는가? DB Transaction을 시작할 때 JPA persistence context가 connection 가져온다 JPA가 언제 DB Connection을 돌려주는가? open-session-in-view가 켜져있는 경우 Service @Transactional 걸린 메소드를 벗어나도, client에게 값이 반환될 때까지 돌려주지 않는다 view template의 경우 html과 data 모두 랜더링 후 API의 경우 json으로 값이 client에게 tansfer된 후 지연 로딩 때.. 2022. 3. 11.
[JPA] Entity가 아닌 DTO로 DB에서 data 가져오기 n:1 관계에 있는 entity의 요소 DTO로 가져오기 JPQL 일반 join을 통해 DTO 객체를 생성해주면서 가져온다 order Repository public List findAllByDto(){ List em.createQuery("select new app.repository.order.dto.OrderDto(o.id, o.order_date, o.status, u.name, u.email)" + " from Order o" + " join o.user u", OrderDto.class).getResultList(); } 처음에 왜 fetch join을 쓰지 않고도 DTO로 가져올 때는 지연로딩 없이 가져올 수 있을까? 에 대해 생각했었는데 JPQL 안에 new 생성자를 통해 하나씩 값을 찍어.. 2022. 3. 10.
[JPA] 1:N / N:1 상황에서의 N+1 문제 해결 (Fetch Join ~ 지연로딩/Batch Size) DB의 테이블이 아래와 같은 관계를 가지고 있는 경우 N+1 문제 고려하지 않은 코드 ( DB n:1의 관계 ) data 가정 Order가 2개 존재 각각의 order와 연결된 member는 모두 다른 사람 모든 entity fetchType 은 LAZY -> 지연 로딩 controller @GetMapping("/orders") public List getOrder(){ List result = orderRepository.findAll().stream().map(OrderDto::new).collect(toList()); return result } @Data @RequiredArgsConstructor static class OrderDto{ private Long orderId; private S.. 2022. 3. 9.
[JPA] Hibernate Batch Size 설정 Batch Size? 1:N 관계 ( 여기서는 Order : OrderItem 이라고 가정 )에서의 지연 로딩 시에 SQL 문이 각각의 N개의 객체에 대해서 select orderItem0_.order_item_id as order_item_id5_5_1_, orderItem0_.order_id as order_id_it1_5_1_, orderItem0_.item_id as item_id_it1_5_0, orderItem0_.order_price as order_price_id5_5_0, orderItem0_.count as count_id5_3_0 from orderItem orderItem0_ where orderitem0_.order_id = ? where 절에 = 이 들어가서 N개의 SQL이 나가.. 2022. 3. 9.