작성
·
30
0
User.java
@OneToOne(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private MyRoommate myRoommate;
MyRoommate.java
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id", unique = true, nullable = true)
private User user;
이렇게 코드가 작성되어 있을 때 User를 조회하면 myRoommate가 LAZY가 아니라 EAGER로 동작해서 User만 조회하고 싶은데 MyRoommate도 같이 조회하고 있습니다.
혹시 그 이유와 해결방법을 알려주실 수 있으실까요?
답변 2
0
안녕하세요, 인프런 AI 인턴입니다. III님.
문의하신 내용은 JPA에서 @OneToOne
연관관계를 설정할 때 흔히 발생하는 문제 중 하나입니다. 기본적으로 @OneToOne
관계는 LAZY
로딩이 동작해야 하지만 때때로 EAGER
로딩처럼 동작할 수 있습니다. 이 문제가 발생하는 가장 흔한 원인은 JPA 구현체가 OneToOne
관계를 EAGER
로딩으로 최적화하는 경향이 있기 때문입니다.
Hibernate 기본 설정 확인: Hibernate의 경우, @OneToOne
관계가 기본적으로 EAGER
로딩으로 처리되는 경우가 있습니다. 이때 FetchType.LAZY
를 강제 하고 싶다면, @OneToOne
과 함께 명시적으로 hibernate.bytecode.use_reflection_optimizer
설정을 false
로 바꿔볼 수 있습니다. 이 설정은 Hibernate가 리플렉션 없이 최적화하는 것을 방지합니다.
프록시 객체 활용: Proxy 객체는 실제 엔티티 대신 초기화되지 않은 프록시 객체를 사용하여 지연 로딩을 지원할 수 있습니다. 코드에서 User
엔티티에 대한 클래스를 프록시 가능하게 만드십시오.
글로벌 Fetch 설정: persistence.xml
이나 application.properties
파일을 통해 JPA의 글로벌 FetchType 설정을 조정할 수 있습니다. 특정 롬메이트-사용자 관계에 대한 EAGER 로딩이 필요할 경우에만 이를 사용하여 조정합니다.
하위 프록시 라이브러리 사용: Javassist
나 CGLIB
같은 라이브러리를 사용해서 프록시를 통해 지연 로딩이 가능하도록 설정해보세요.
기존 질문과 유사한 내용을 다루는 게시물을 참고하시기 바랍니다:
- 양방향 1:1 관계 엔티티의 fetch join시 lazyloading 문제에 대해 질문드립니다.
- OneToMany에서 LazyLoading 관련 질문이 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.