김영한님이 지음, [자바 ORM 표준 JPA 프로그래밍] 책을 읽고 정리한 필기입니다.📢
다양한 연관관계 매핑
엔티티의 연관관계 매핑 시 고려할 3가지
- 다중성
- 단방향, 양방향
- 연관관계의 주인
다중성
- 다대일(
@ManyToOne
) - 일대다(
@OneToMany
) - 일대일(
@OneToOne
) - 다대다(
@ManyToMany
)
💡Tip. 다대다 관계를 실무에서 사용하지 않는 이유
다대다 관계는 테이블을 구성할 때 사용할 수는 있지만 거의 절대적으로 피하는 것이 좋다.
Why? 이유는 다대다 관계를 사용하면 필연적으로 데이터의 무결성을 위반하게 되며, 데이터의 삭제와 추가, 수정을 할 때 많은 문제가 발생하기 때문이다. 예를 들어 학생과 선생의 다대다 관계를 생각해보면, 한명의 학생은 여러 선생에게 수업을 들을 수 있고, 한명의 선생은 여러 학생을 가르칠 수 있다. 학생과 선생을 서로 연결해서 수업의 시작일과 종료일을 기록해야 한다고 가정했을 때 수업의 시작일과 종료일을 학생 테이블에 넣을 지, 아니면 선생 테이블에 넣을 지 혼돈이 발생한다. 어느 테이블에 넣더라도 데이터의 무결성을 해치게 되고, 위에서 언급했듯이 데이터를 수정해야 할 경우에도 많은 문제가 발생하게 된다.
단방향, 양방향
- 테이블은 외래 키 하나로 조인을 사용해서 양방향으로 쿼리가 가능하므로 사실상 방향이라는 개념이 없음
- 반면 객체는 참조용 필드를 가지고 있는 객체만 연관된 객체를 조회하므로 방향 개념이 있음
- 때문에 양방향의 필요성은 객체를 사용함에 있어의 필요성과 같다.
연관관계의 주인
- 외래 키를 가진 테이블과 매핑한 엔티티가 외래 키를 관리하는게 효율적이므로 보통 이곳을 연관관계의 주인으로 선택함
- 주인이 아닌 방향은 외래 키를 변경할 수 없고 읽기만 가능
- 연관관계의 주인은
mappedBy
속성을 사용하지 않음 - 연관관계의 주인이 아니면
mappedBy
속성을 사용하고 연관관계의 주인 필드 이름을 값으로 입력해야 함
다중성과 단뱡향, 양방향을 고려한 가능한 모든 연관관계
- 다대일 : 단방향, 양방향
- 일대다 : 단방향, 양방향
- 일대일 : 주 테이블 단방향, 양방향
- 일대일 : 대상 테이블 단방향, 양방향
- 다대다 : 단방향, 양방향
댓글남기기