본문 바로가기

Spring

@OneToOne은 LazyLoading이 안되는데 @OneToMany는 왜 될까

@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 하는게 낫다고 생각한다.