백엔드 개발 · 심화
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 2차 캐시(Second Level Cache)란 무엇이며, 1차 캐시와의 차이점은 무엇인가요?
- OSIV(Open Session In View)란 무엇이며, 장단점은 무엇인가요?
- JPA 성능 최적화를 위한 전략들에 대해 종합적으로 설명해주세요.
- 프로젝트에서 JPA를 사용하면서 겪었던 성능 이슈와 해결 경험을 공유해주세요.
- 대규모 트래픽 환경에서 JPA의 N+1 문제를 근본적으로 해결하기 위한 다양한 전략들을 설명하고, 각 전략의 장단점 및 적절한 사용 시나리오를 비교하여 설명해 주십시오. 단순히 FetchType 변경을 넘어선 심층적인 접근 방식들을 포함해야 합니다.