작성
·
923
3
안녕하세요, 고퀄리티 강의 감사합니다 영한님.
onetoone과 lazy에 관련해서 궁금한점이 있어 질문 남깁니다.
※ table구조
- member (1) - (1) phone (onetoone)
- fk는 phone에 member_id로 존재하는 형태
- member에 phone_id소유 X
1. 위 테이블 구조일때 jpa입장에서 onetoone에서는 proxy객체를 생성할 수 없기때문에 lazy로 설정해도 쿼리가 나간다는 부분에대해 이해했습니다.
2. 그런데 모든 연관관계는 lazy로 설정해야된다고 말씀하셨는데 onetoone을 lazy로 설정해버리면 복수건을 find했을때 바로 N+1이 발생하는것 같습니다.
onetoone일 경우 lazy로 어떻게 동작하게 할 수 있는지 궁금합니다~!
불가능하다면 이런 경우 어떻게 해결할 수 있는지도 말씀해주시면 감사하겠습니다~!
답변 2
7
2020. 07. 09. 00:43
안녕하세요. cobi님
이게 참 골치아픈 문제이지요.
그래서 구글에 hibernate onetoone nullable 같은 키워드로 검색해보시면 여러가지 시도와 결과가 있습니다. 그런데 깔끔한 방법이 사실 없습니다.
결국 구조를 바꾸어서 해결하는 방법은 다음과 같습니다.
1. 부모 엔티티에 FK 고려
2. OneToOne -> OneToMany, ManyToOne 관계로 변경
3. member -> phone로의 연관관계 끊기 그래서 phone -> member로의 연관관계만 남기기
구조를 유지한채 해결하는 방법은 다음과 같습니다.
주로 활용2편에서 설명한 최적화 방법과 동일합니다.
1. member를 조회할 때 fetch join으로 phone을 같이 조회한다. toOne 관계이기 때문에 편하게 fetch join 할 수 있다.
2. hibernate.default_batch_fetch_size를 사용한다. 그러면 N+1을 1+1로 줄일 수 있다.
저는 방금 설명드린 총 5가지 정도 안에서 해결합니다^^
도움이 되셨기를 바라며, 감사합니다.
2023. 06. 30. 13:31
안녕하세요. jo0hee님
@OneToOne 관계라도 해도 N+1 문제가 발생합니다.
왜냐하면 A -> B의 관계라고 할 때, A를 조회할 때 하나를 조회하면 1+1로 종결될 수 있지만, A를 컬렉션으로 여러건 한번에 조회하게 되면 그 수만큼 연관된 B를 조회하면서 N+1 문제가 발생하겠지요^^?
감사합니다.
1
2023. 06. 28. 15:16
답변 감사합니다!
저도 @OneToOne관계를 구현하면서 추가 고민해봤는데, @OneToOne의 경우 결국 1:1 연관관계를 지니게되니, N+1 문제로 보이더라도 결과적으론 항상 1+1로 종결되는것이 아닌가요?