[Spring] @OneToMany 단방향에 관하여

Jake·2022년 7월 7일
0

김영한님의 JPA 강의에 따르면

스프링에서 일대다 단방향 매핑은 지양해야 하고,
가급적이면 일대다 양방향 매핑을 사용해야 한다.

고 하십니다.
이 글에서는 그 이유에 대해 확실히 정리해보고자 합니다.

1. @ManyToOne이 없으면, 일(One)은 다(Many)를 모른다

1-1. JoinTable

우리는 보통 양방향 1:N의 관계에서 N쪽을 연관관계의 주인으로 만듭니다.
이번에는 단방향을 가정하고 있음으로, 연관관계의 주인을 별도로 지정하지 않았음을 가정하겠습니다. 이 경우

  • 양방향 매핑을 명시해주지 않으면 두 엔티티를 연결하는 조인테이블이 새로 생깁니다.
  • 그러나 JoinTable은 1:N에서 N이 커질 수록 더 심각한 문제를 야기합니다.

JoinTable에서 삭제 이벤트에서 발생할 수 있는 불상사에 대해서는 링크의 블로그에서 굉장히 잘 설명해주고 계십니다.

간단히 요약하자면

  • 일대다 단방향 매핑에서는 다(Many) 쪽의 하나의 컬럼만을 삭제하는 것이 불가능하고
  • 일(One)쪽의 id에 해당하는 모든 레코드를 delete한 후, 삭제하려는 것 이외의 행들을 다시 insert
    -> N이 커질 수록 문제가 심각해짐을 알 수 있습니다.

1-2. JoinColumn

이 방식을 사용하면 JoinTable에서 발생한 문제는 사라지지만,
새로운 문제가 생깁니다.
이번에도 자세한 사항은 여기를 참고해주세요(JPA-일대다-단방향-매핑-잘못-사용하면-벌어지는-일).

요약

  • 다(Many)가 일(One)의 존재를 모른다.
  • 그래서 일(One)의 외래 키 값을 비워둔 채로 개별 행 단위로 insert가 된 후에
  • 다시 일(One)에 해당하는 외래 키를 update해준다.
    -> 불필요한 update문이 실행되는 문제가 발생

2. 양방향을 쓰면, 이 문제들을 걱정할 필요가 없다

그러니 일대다 관계는 최대한 양방향 매핑을 쓰자.
다만 순환 참조는 항상 주의할 것!

profile
Java/Spring Back-End Developer

0개의 댓글