패스잇
백엔드 개발 · 심화

JPA에서 @OneToOne 관계의 지연 로딩이 동작하지 않는 경우와 해결 방법은?

힌트 · 프록시 생성 조건과 외래 키 위치를 생각해보세요.

FetchType.EAGER프록시 객체JPA 구현체영속성 컨텍스트JOIN

모범답안

JPA에서 @OneToOne 관계의 지연 로딩이 기대대로 동작하지 않는 경우가 종종 있습니다. 주로 두 가지 이유 때문인데요.

첫째, JPA 구현체(Hibernate 등)가 프록시 객체를 생성할 수 없는 상황일 수 있습니다. 예를 들어, 연관 관계를 가진 엔티티가 이미 영속성 컨텍스트에 로딩되어 있다면, 프록시 대신 실제 객체를 바로 반환하게 됩니다.

둘째, 외래 키의 위치 문제입니다. @OneToOne 관계에서 외래 키가 주인 엔티티에 있는 경우, JPA는 연관된 엔티티를 로딩하기 위해 JOIN 쿼리를 사용할 수밖에 없습니다. 이 경우 FetchType.LAZY로 설정해도 즉시 로딩이 발생합니다.

해결 방법은 다음과 같습니다.

  • @OneToOne 관계에서 외래 키를 소유하지 않은 엔티티가 주인이 되도록 설정합니다.
  • @JoinColumn을 사용하여 외래 키 매핑을 명시적으로 지정하고, 필요하다면 @Fetch(FetchMode.SELECT)를 사용하여 N+1 문제를 방지합니다.
  • 정말 필요한 경우에만 FetchType.EAGER를 사용하고, 그렇지 않다면 FetchType.LAZY를 유지하는 것이 좋습니다.

읽었다면, 이제 직접 답해볼 차례예요

패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.

함께 보는 JPA / ORM 면접 질문

← JPA / ORM 면접 질문 전체 보기