개요 JPA는 엔티티 간의 관계를 설정할 때 다양한 페치 전략을 제공하며, 그 중 지연 로딩(Lazy Loading) 은 성능 최적화를 위해 자주 사용된다. 지연 로딩은 실제로 연관된 데이터가 필요할 때만 데이터베이스에서 로딩하는 방식으로, 초기 로딩 시 불필요한 데이터를 가져오는 것을 방지하여 애플리케이션의 응답성을 향상시킨다. 이번 글에서는 JPA에서 지연 로딩이 왜 사용되는지, 연관 관계의 주인이 무엇인지, 지연 로딩 시 프록시와 null이 어떻게 할당되는지, 그리고 특히 OneToOne 양방향 관계에서 지연 로딩이 정상적으로 동작하지 않는 이유에 대해 생각해보겠다. 연관 관계의 주인 JPA에서 연관 관계의 주인(Owner) 이란, 두 엔티티 간의 관계에서 실제로 데이터베이스의 외래 키(Forei..
개요이전 글에서 살펴보았듯 JPA로 OneToOne이나 ManyToOne 관계를 조회할 때는 비교적 단순한 방식으로 성능을 개선할 수 있다. 예를 들어, 페치 조인(fetch join) 을 적용하면 여러 쿼리를 한 번으로 줄일 수 있다. JPA 연관 관계 조회 성능 최적화 (feat: One To One, Many To One, 지연 로딩, 패치 조인)개요 JPA를 실무에서 사용하다 보면 대표적으로 거론되는 문제 중 하나가 바로 N+1 문제이다. 필자 또한 JPA를 이용해 직접 쿼리를 짜지 않고도 객체 지향적으로 매핑할 수 있다는 점에서 큰 생산wise-dev-seop.tistory.com 하지만 OneToMany 같은 컬렉션 관계를 다룰 때는, 조인으로 인해 데이터가 중복 조회(일명 ‘뻥튀기’)될 ..
개요 JPA를 실무에서 사용하다 보면 대표적으로 거론되는 문제 중 하나가 바로 N+1 문제이다. 필자 또한 JPA를 이용해 직접 쿼리를 짜지 않고도 객체 지향적으로 매핑할 수 있다는 점에서 큰 생산성 향상을 느꼈다. 하지만 여러 개발자들의 코드를 리뷰하면서, 실무에서 성능 최적화를 충분히 고민하지 않는 경우가 의외로 많다는 사실을 알게 되었다.이 글에서는 JPA로 개발할 때 명심해야 할 성능 최적화 포인트들을 중심으로 설명하고자 한다. 내용Order 엔티티를 직접 노출할 때JPA에서는 엔티티 간 연관관계를 설정할 때, 지연 로딩(Lazy)과 즉시 로딩(Eager) 중 하나를 선택하게 된다. 예를 들어 Order 테이블이 있고, 여기서 Delivery(OneToOne), Member(ManyToOne) 관..
영속성 컨텍스트란?JPA를 이해하는 데 가장 중요한 용어는 영속성 컨텍스트(persistence context)이다. 우리말로 번역하자면 "엔티티를 영구 저장하는 환경"이라는 뜻이다. 엔티티 매니저를 이용하여 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다. JPA는 단순히 엔티티를 저장한다고 표현하면 안된다. 정확히 이야기하면 persist() 메소드를 엔티티 매니저를 사용해서 회원 엔티티들을 영속성 컨텍스트에 저장한다. 엔티티가 영속성 컨텍스트에 처음 진입할 때는em.persist(member);와 같이 사용한다. 영속성 컨텍스트는 엔티티 매니저를 생성할 때 함께 만들어진다. 그리고 엔티티 매니저를 통해서 영속성 컨텍스트에 접근할 수 있다. 영속성 컨텍스트를 ..