본문 바로가기

ORM12

[JPA] 컬렉션 조회 최적화 [김영한님의 실전! 스프링 부트와 JPA 활용2 강의 학습 후 정리한 내용입니다.] 서론 OneToMany관계에서 엔티티를 조회하는 방법을 통해 성능 최적화를 해보자. 여기에서는 Order에서 Member, Delivery에 추가로 OrderItems을 조회하는 API를 예시로 든다. 참고로, Order와 OrderItems가 OneToMany관계이다. 순서 주문 조회 V2 (엔티티를 DTO로 변환) 주문 조회 V3 (엔티티를 DTO로 변환 - 페치 조인 최적화) 주문 조회 V3.1 (엔티티를 DTO로 변환 - 페이징과 한계 돌파) 1. 주문 조회 V2(엔티티를 DTO로 변환) 엔티티를 DTO로 변환하는 일반적인 방법이다. @GetMapping("/api/v2/orders") public List ord.. 2023. 4. 17.
[JPA] 지연 로딩과 조회 성능 최적화 [김영한님의 실전! 스프링 부트와 JPA 활용2 강의 학습 후 정리한 내용입니다.] 서론 xToOne(ManyToOne, OneToOne)관계에서 성능 최적화를 해보자. 여기에서는 Orders를 조회하는 API를 예시로 든다. 참고로, Order와 Member가 ManyToOne관계이며, Delivery와는 OneToOne관계이다. 순서 주문 조회 V2 (엔티티를 DTO로 변환) 주문 조회 V3 (엔티티를 DTO로 변환 - Fetch join 최적화) 주문 조회 V4 (JPA에서 DTO로 바로 조회) 1. 주문조회 V2(엔티티를 DTO로 변환) 엔티티를 DTO로 변환하는 일반적인 방법이다. @GetMapping("/api/v2/simple-orders") public List ordersV2(){ Lis.. 2023. 4. 16.
[JPA] 더티 체킹(dirty checking) 정리 더티 체킹이란? JPA에서 더티 체킹(dirty checking)이란 영속성 컨테이너가 관리하는 엔티티의 상태를 감지해서, 변경된 부분이 있다면 자동으로 트랜잭션이 끝나는 시점에 데이터베이스에 반영하는 기능이다. 따라서 여기서 말하는 dirty는 “엔티티 데이터의 변경된 부분”을 뜻하며 dirty checking은 변경된 부분을 감지한다는 의미이다. 따라서 개발자가 update에 관련된 쿼리를 작성하지 않아도 되기 때문에, 코드의 복잡성을 줄일 수 있다는 특징이 있다. 그렇다면 어느 상황에서 더티 체킹이 일어나는 지 알아보자. 더티 체킹 조건 영속성 컨텍스트에서 관리되는 엔티티 영속성 컨텍스트는 엔티티를 처음 조회할 때 시작되며, 이후 변경을 감지한다. 준영속/비영속 상태의 엔티티는 더티 체킹의 대상이 .. 2023. 4. 16.
[JPA] JPA Auditing 정리 및 구현 서론 JPA를 사용하여 도메인을 관계형 데이터베이스 테이블에 매핑할 때 공통적으로 도메인들이 가지고 있는 필드나 컬럼들이 존재한다. ex) 생성 일자, 수정 일자, 생성자, 수정자... 도메인마다 공통으로 존재한다는 의미는 결국 코드가 중복된다는 것을 의미한다. 그래서 JPA에서는 Audit이라는 기능을 제공한다 Audit은 Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능이다. 도메인을 영속성 컨텍스트에 저장하거나 조회를 수행한 후에 update를 하는 경우 매번 시간 데이터를 입력하여 주어야 하는데, Audit을 이용하면 자동으로 시간을 매핑하여 데이터베이스의 테이블에 넣어주게 된다. JPA Audit은 데이터의 변경 기록을 추적하고 데이터 변화에 대한 이력을 기록하는 것을 .. 2023. 4. 10.
[JPA] 연관관계 매핑 참고 Spring Jpa 연관관계에 대해 설명된 블로그 참고 https://victorydntmd.tistory.com/208 [Spring JPA] 연관관계 매핑 연관관계 매핑엔티티( Entity )들은 대부분 서로 관계를 맺고 있습니다.예를들어 Category 엔티티와 Book 엔티티가 있을 때, Category에는 많은 Book을 갖는 관계를 갖고 있습니다.이렇게 엔티티들이 서로 victorydntmd.tistory.com 2023. 1. 3.
[JPA] 에러 could not initialize proxy - no Session 문제상황 시큐리티를 커스터마이징해서 로그인과정을 진행중에 could not initialize proxy - no Session http code 500 에러가 발생했다. UserDetailsService와 UserDetails에 대한 구현체를 작성하고, Controller에서 @AuthenticationPrincipal로 사용자 세션을 제대로 가져오나 확인하는 과정에서 문제발생. @GetMapping("/user/{id}/update") public String update(@PathVariable int id, @AuthenticationPrincipal PrincipalDetail principalDetail) { log.info("======================="); log.info(p.. 2022. 11. 19.