[JPA] 성능 최적화를 위한 연관관계 매핑 조회 전략
·
스프링/JPA
xToOne 단건 조회 최적화지연 로딩을 피하기 위해서 즉시로딩으로 설정할 경우 아예 성능 최적화의 여지조차 남지 않게 된다.왜냐하면 연관관계로 매핑되어있는 경우 원치 않는 데이터 또한 즉시 조회하기 때문에 N+1 문제가 발생할 확률이 높기 때문이다. 즉시 로딩으로 설정할 경우 성능 튜닝이 매우 어려워 진다. 항상 지연 로딩을 기본으로 하고, 성능 최적화가 필요한 경우에는 FETCH JOIN을 사용하면 된다. 결론xToOne에서 조회 쿼리를 진행할 경우 그냥 컨트롤러 레이어에서 단일 엔티티를 조회 후 DTO로 변환하는 방법을 선택한다.그런데 만약 단일로 끌고 오는 엔티티가 다른 엔티티와 연관관계로 매핑되어있는 경우, FETCH JOIN으로 끌고온다. 그래도 성능 최적화가 되지 않는다면 New Operat..
[트러블 슈팅] JPA - LazyInitializationException과 N+1
·
프로젝트 트러블 슈팅 및 몰랐던점 정리/CommunityAPI
LazyLoding의 기본 동작LazyInitializationException은 영속성 컨텍스트가 종료된 상태에서 LAZY 전략을 사용하려고 할 때 발생한다. @OneToMany 혹은 @ManyToMany (xToMany) 연관관계 매핑 시 기본 전략은 LAZY 전략이다. 이는 실제 데이터에 접근할 때 까지 연관관계의 매핑된 데이터를 로드하지 않는다. 이로 인해 연관관계로 매핑된 엔티티에 대해서 초기화 되지 않은 프록시 객체로 유지되다가 연관관계로 매핑된 엔티티 필드(데이터가 실제로 필요할 때)에 접근하면 데이터베이스에서 실제 데이터를 조회하려고 시도한다. 이 때 JPA는 영속성 컨텍스트가 활성화된 상태에서 프록시를 초기화하고 데이터베이스와 상호작용을 하게되는데, Spring 에서는 트랜잭션의 범위가..
cheolhyeon
'fetch join' 태그의 글 목록