연관 관계(Relationships)
연관관계 매핑
-
객체(Object)와 관계형 데이터베이스(Relational DataBase) 테이블(Table)을 서로 매핑하는 것을 말한다.
-
연관관계를 매핑할 때 생각해야할 3가지가 존재한다.
방향
- 단방향, 양방향(객체 간의 참조)인지를 생각한다.
다중성
-
일대일(OneToOne), 일대다(OneToMany), 다대일(ManyToOne), 다대다(ManyToMany) 관계를 파악한다.
-
연관관계의 주인은 양방향일 때 연관관계에서 관리의 주체가 되는 곳이다.
단방향(unidirectional), 양방향(bidirectional)
-
데이터베이스(DataBase)에서 테이블(Table)들은 외래 키(Foreign Key) 하나를 가지로 양 쪽 테이블(Table) JOIN이 가능하다.
-
따라서 데이터베이스(DataBase)에서는 단방향이니 양방향이니 나눌 필요가 없다.
-
하지만 객체(Object)는 참조용 필드(열(Column))가 있는 객체(Object)만이 다른 객체(Object)를 참조하는 것이 가능하다.
-
따라서 두 객체(Object) 사이에 하나의 참조용 필드만을 가지고 참고하게 되면 단방향 관계이고, 두 객체(Object) 모두가 참조용 피드를 갖고 참조하면 양방향 관계가 된다.
-
정확히 말하면 단방향 관계 하나만 가지냐 or 단방향 관계 두개를 가지냐의 차이이다.
-
이러한 단방향, 양방향의 선택은 정해져있는게 아니라 비즈니스 로직(Business Logic)에 맞게 개발자가 선택해서 정해야한다.
-
예를 들어 member.getReservations() 처럼 예약목록에 대한 참조가 필요하면 Member -> Reservation 단방향 참조이다.
-
reservation.getMember() 처럼 예약자에 대한 참조가 필요하면 Reservation -> Member 단방향 참조이다.
-
이런식으로 필요한 참조마다 설계를 해주면 된다.
-
위에서 두개 다 필요하다면 양방향이 되고 회원이 예약을 한개 이상 가질 수 있다면 다대일(ManyToOne) 양방향이 되는 것이다.
주인
-
두 객체(Object) 연관관계 중 외래 키(Foreign Key)를 관리하는 쪽을 주인이라 한다.
-
즉, 다대일(ManyToOne)이 연관관계의 주인이다.
-
외래 키(Foreign Key)를 가진 테이블(Table)과 매핑한 엔티티(Entity)를 보통 연관관계의 주인으로 선택한다.
-
주인이 아닌 방향은 외래 키(Foreign Key) 변경 불가, 읽기만 가능하다.