김영한님의 JPA 강의에 따르면
스프링에서 일대다 단방향 매핑은 지양해야 하고,
가급적이면 일대다 양방향 매핑을 사용해야 한다.
고 하십니다.
이 글에서는 그 이유에 대해 확실히 정리해보고자 합니다.
우리는 보통 양방향 1:N의 관계에서 N쪽을 연관관계의 주인으로 만듭니다.
이번에는 단방향을 가정하고 있음으로, 연관관계의 주인을 별도로 지정하지 않았음을 가정하겠습니다. 이 경우
JoinTable에서 삭제 이벤트에서 발생할 수 있는 불상사에 대해서는 링크의 블로그에서 굉장히 잘 설명해주고 계십니다.
간단히 요약하자면
- 일대다 단방향 매핑에서는 다(Many) 쪽의 하나의 컬럼만을 삭제하는 것이 불가능하고
- 일(One)쪽의 id에 해당하는 모든 레코드를 delete한 후, 삭제하려는 것 이외의 행들을 다시 insert
-> N이 커질 수록 문제가 심각해짐을 알 수 있습니다.
이 방식을 사용하면 JoinTable에서 발생한 문제는 사라지지만,
새로운 문제가 생깁니다.
이번에도 자세한 사항은 여기를 참고해주세요(JPA-일대다-단방향-매핑-잘못-사용하면-벌어지는-일).
요약
- 다(Many)가 일(One)의 존재를 모른다.
- 그래서 일(One)의 외래 키 값을 비워둔 채로 개별 행 단위로 insert가 된 후에
- 다시 일(One)에 해당하는 외래 키를 update해준다.
-> 불필요한 update문이 실행되는 문제가 발생
그러니 일대다 관계는 최대한 양방향 매핑을 쓰자.
다만 순환 참조는 항상 주의할 것!