[Hibernate] 2. Hibernate(하이버네이트) 테이블 관계 맵핑-단방향/양방향
Hibernate 테이블 관계 맵핑
관계 맵핑은 관계의 종속성이 있고 또한 관계가 많지 않을 때 사용하는 것이 좋다. 예를 들어 OneToMany에서 Many가 진짜 많다면 select에 대해서 엄청난 부하가 발생할 것이다. 관계가 많지 않거나 조건(where)을 통해서 관계가 적은 경우. 부하가 많이 발생하지 않고 해당 관계가 자주 쓰이는 경우에만 관계 맵핑을 하는 것이 좋다.
Unidirectional,Bi-directional (단방향,양방향)
단방향, 양방향에 대해 알아보자. 일단 밑의 관계 맵핑을 보고 나서 본다면 더 쉽게 이해할 것이다.
단방향
관계 맵핑에서 단방향은 한쪽에서만의 관계 맵핑이 된 경우이다. A->B 이런 관계이다.
A에서 B로의 관계 맵핑만 되어 있어서 A에서는 B를 얻을 수 있는데 그 역은 안되는 경우이다.
보통 단방향시 A->B라면 A에 B에 대한 참조 컬럼이 있다고 판단한다. Cascade가 설정되어 있는 경우 A 저장시 관계에 따라 행동한다.
예를 들어 OneToOne 관계의 경우 A가 B의 참조를 가지기 때문에
Cascade가 설정된 상태에서 A를 저장시 B가 먼저 저장되고 그다음 A가 저장된다.
다른 예로 OneToMany의 관계의 경우 B가 A의 참조를 가진다. 이때는 B가 A의 참조를 가지므로 A가 먼저 저장되고 그다음 B가 저장된다. 이때 B에 존재하는 A로의 참조값은 Update 를 통해 갱신된다. 왜냐면 B에서 A로의 관계맵핑이 없으므로 B는 A를 모르기 때문에 A가 B를 Update 하는 방식으로 진행되는 듯하다.
양방향
양방향은 A<=>B 의 관계이다. 어노테이션 설정만 보더라도 B의 변수에 관계맵핑을 해주면 A에서는 B의 관계맵핑 변수명만 가지면 된다. 왜냐면 한쪽의 관계의 역이 결국 반대쪽의 관계이기 때문이다.
양방향 관계에서 주의할 점은 서로가 서로를 지켜보고 있기 때문에 서로가 서로를 설정해주어야 한다. 한쪽에서만 설정하고 한쪽은 설정하지 않는다면 원하는 동작을 얻지 못한다.
서로가 서로를 알고 있으므로 단방향과 다르게 참조를 Update한다던지 참조값을 모른다던지 하는 문제는 없다.
- 글쓴이의 생각에서는 관계가 무조건 존재하는 즉 참조 컬럼이 Not Null일 경우( 1~N:N 관계)는 양방향을 쓰는 것이 좋고,
- 관계가 존재하지 않을 수도 있는 즉 참조 컬럼이 Null이 될 수 있는 경우( 0~N:N )는 단방향을 쓰는 것이 좋다.