<Spring JPA> 1.14 양방향 연관관계와 연관관계의 주인1
앞서 단방향 연관관계를 지정해주면서 외래키를 통해 지정해주는 방법을 보았다.
우리가 두 개의 테이블을 조인할 때 인지하는 방법과 비슷하다. 연관되어 있는 외래키를 가지고 연관을 지어서 조회하는 방식을 사용해왔다.
헌데 다시 생각해보면, 우리는 테이블을 조인해서 조회할때 단방향, 양방향이라는 걸 생각해왔던가?
그런 생각은 해오지 않았다.
그럼 갑자기 왜 단방향, 양방향을 이야기하고 있는 것일까?
위 그림을 보면 우리가 사용하던 테이블의 연관관계는 단방향, 양방향의 개념이 없는 것을 알 수 있다. 그냥 1:1 이냐 1:n n:1 이냐 정도의 개념이다. 하지만 객체 간의 관계에서는 단방향과 양방향이 존재한다.
양방향 매핑을 하면서 주의할 점은 n:1 중, n 인 부분에 연관관계의 주인을 설정해야 한다는 것이다.
(뭐야 갑자기 뭔소리야... 할 것 같다. 일단 쭉 읽어보시길)
Member Entity 에 단방향 연관관계 매핑을 했던 것과 동일하게 (그냥 같은거다)
Team 이라는 필드에 아래와 같이 어노테이션으로 지정을 해준다.
@ManyToOne
@JoinColumn(name= "TEAM_ID")
단방향 매핑을 해준다. 그리고
Team Entity 에 아래와 같이 어노테이션으로 지정을 해준다.
@OneToMany(mappedBy= "team")
대충이 느낌이 올 것이다. 사실 내가 생각하기에 이건 양방향 매핑이라는 이름을 붙여도 되는가? 라고 싶을 정도다.
단방향 매핑을 하고, 그걸 참조한다 정도의 참조를 추가한 것이다.
JoinColumn 을 통해서 매핑을 선언하고, mappedBy 를 통해서 그 매핑을 참고할게라고 말하는 것이다.
이래서 앞서 연관관계의 주인이 멤버 쪽에 있다고 한 것이다.
오해하지 말아야 할 것이 무조건 n:1 관계에서 n 이 연관관계의 주인이 되는 것은 아니다. 설정하기 나름이다.
현재의 회원과 팀 관계에서 이러한 형태가 어울리는 것이고, 다른 형태면 달라질 수 있다. 다만 거의 다 이런 형태이므로 1:n 일때 n 쪽을 연관계 매핑의 주인이라고 생각해도 된다.
연관관계 매핑의 주인이 아닌 쪽에서는 읽기만 가능하다. 무슨 소리이냐면 Team 객체에서 Members 를 추가해 넣는다고 해도 데이터의 변화가 생기지 않는 다는 것이다.