본문 바로가기

JPA9

[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] 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.
[JPA] DB의 data가 update 되는 플로우 정리 유져가 회원가입을 완료한 후에 마이페이지 같은 곳에서 자신의 정보를 바꾼다고 가정 JPA는 이러한 update 에서 어떠한 과정을 거치는가에 대해 정리해보려 한다 예시 코드 @Service @Transactional(readOnly = true) @RequiredArgsConstructor // final에 해당되는 필드에 대한 constructor 자동 생성 어노테이션 public class UserService{ private final UserRepository userRepository; @Autowired // constructor injection public UserService(UserRepository userRepository){ this.userRepository = userRepos.. 2022. 2. 18.