테이블에서 양방향 연관관계 매핑하려면?
그냥 외래 키(Foreign Key)로 튜플을 연결하면 된다. 테이블에서는 따로 양방향 매핑이라는 개념이 없다.
여기서 객체의 참조와 테이블의 연관관계 간의 패러다임 불일치를 알 수 있다.
객체에서 양방향 연관관계 매핑하려면?
객체의 참조관계에서 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단방향 관계가 2개 있는 것이다.
❓ 양방향 관계에 있는 객체에서 외래 키 데이터를 수정하고 싶다면 어느쪽 객체를 수정해야할까?

여기서 나오는 개념이 연관관계의 주인(Owner)라는 개념이다.
양방향 매핑 규칙
- 서로 양방향 연관관계에 있는 두 객체 중 하나를 연관관계의 주인으로 지정해주어야 한다.
- 연관관계의 주인만이 외래키를 관리할 수 있다.(등록과 수정)
- 연관관계의 주인이 아닌쪽은 읽기(read)만 가능하다.
- 주인은 mappedBy 속성을 사용하지 않고 주인이 아닌 객체에 mappedBy 속성을 사용해 주인이 누구인지 알려준다.
양방향 연관관계의 주인은 어떻게 정해야할까?
외래키가 있는 곳을 주인으로 정하면 된다. (강의자 김영한님의 기준)
🚨 양방향 매핑시 주의해야할 점
- 연관관계 주인에 값을 꼭 입력해주어야 한다!
- 연관관계 주인이 아닌 객체에만 값을 입력했을 경우 테이블에 null 값을 들어간다.
- 연관관계의 주인에만 값 입력해도 문제는 없지만 객체지향적 관점에서 봤을 때 양방향 관계에 있는 객체 둘 다에 값을 넣어주는게 맞다.
- 연관관계 편의 메소드는 둘 중 하나에만 넣어주면 된다. 무한 루프에 빠지지 않게 주의!
무한 루프가 돌지 않게 주의할 점
- Entity를 Controller에 반환하지 않기
- lombok에서 toString() 쓰지 않기
양방향 매핑에 대해 정리하자면...
- 단방향 매핑만으로 연관관계 매핑이 완료되어야 한다.(설계시에 단방향매핑으로 설계를 완료해야 한다.)
- 양방향 매핑은 앞에서 말했다시피 단방향매핑이 2개인 것이고 다시 말해 서로 반대 방향의 객체를 조회할 수 있는 기능이 추가된 것이다.
- 처음에 단방향매핑으로 매핑을 완료해 놓고 양방향 매핑은 필요할 시 추가하면 됨.
- 객체지향적으로 볼 때 양방향 매핑은 그렇게 좋은 설계는 아니다.