@OneToOne
- 연관관계 주인인 경우
- 조회할 때 참조하는 컬럼을 보고 값이 있으면 프록시 객체, 없으면 null 할당
- 실제 조회할 때 쿼리쏴서 프록시 객체에 가져오기
- 주인이 아닌 경우 (양방향)
- 프록시 객체 or null을 넣어줄 판단 기준이 없음(table에 참조 컬럼이 없기 때문)
- 그래서 optional = false면 LazyLoading가능(다른 조건도 있긴함)
- 무조건 프록시 객체로 넣을 경우, 값이 없을 때 값이 없다는걸 나타낼 방법이 없음
@OneToMany는 왜 LazyLoading 가능??
- @OneToMany인 경우는 연관관계에 주인이 아닌 경우밖에 없는데 왜 가능하지?
- 무조건 프록시 객체를 넣어주면 되기 때문에 LazyLoading 가능
- OneToOne인 경우엔 무조건 프록시 객체를 넣어줄 수 없는게 값이 없을 땐 값이 없다는 걸 나타낼 방법이 없기 때문이지만 OneToMany는 List나 Set에 값을 담기때문에 값이 없을 땐 empty(size == 0)으로 나타낼 수 있다.
@OneToOne 양방향 관계에 대한 생각
@OneToOne 양방향 관계를 해결하기 위한 방법은 있다. LazyLoading이 필요한 쪽을 연관관계 주인으로 설정하기 등등 여러 방법이 있을 수 있다.
하지만 그런 기이한 구조를 만들어내면서까지 이걸 해결해야한다면 차라리 양방향 관계를 끊어 버리거나 그냥 EagerLoading 하는게 낫다고 생각한다.
웬만하면 양방향으로 하지말고 양방향으로 설계가 되었다면 설계를 다시하자. 양방향 관계가 진짜 꼭 필요하다면 EagerLoading이 되어도 이슈가 없을만한 객체인지(얼마나 조회하는지,얼마나 호출하는지, 데이터양은 어떠한지)를 고려해서 이슈가 없을거고 앞으로 이슈가 없을 예정이라고 판단되면 그냥 EagerLoading 하는게 낫다고 생각한다.
'Spring' 카테고리의 다른 글
Restdocs 빌드파일 위치 못찾는 에러, Unresolved directive in (0) | 2021.11.01 |
---|---|
STS Maven java.lang.ClassNotFoundException (0) | 2021.03.17 |
Objects.isNull과 Validation (0) | 2020.11.20 |
HttpMessageNotReadableException, LocalDateTime (3) | 2020.11.18 |
DDD에서는 왜 간접 참조를 더 권장할까? (0) | 2020.10.10 |