본문 바로가기

JPA/양방향연관관계

DB와 객체의 양방향 연관관계 차이 알아보기

이번 시간에는 양방향 연관관계에 대해 알아보겠다!!!! (좀 빡센 거 같다...)

단방향 연관관계에 대해서 알아볼 때 이런 테이블과 Entity들을 만들었었다. (대충 재활용하겠다는 소리)

Club과 Student Table
Student Entity와 Club Entity 


객체에서 말하는 양방향 연관관계는 무엇일까?

먼저 지금 Entity를 살펴보자!!! Student객체에서 Club을 얻어오고 싶으면 'student.getClub();'으로 얻어올 수 있다.

하지만 Club에서 Student를 얻어오고 싶으면 가능할까???? (불가능하다)

즉, Student Entity에서 Club Entity를 참조할 수 있지만, 그 반대는 불가능하다. Student → Club으로 향하는 단방향 연관관계라고 할 수 있다.

그러면 현 상황에서 우리는 Student↔Club이 성립하게 되면 양방향이라고 말할 수 있을 것이다.

그래서 Club에서 Student를 참조할 수 있게 하기 위해 Club Entity를 다음과 같이 수정했다.

 

students가 추가됐고, List<Student> 타입이다.

타입이 List인 이유는 천천히 알아가도록 하고, List의 Generic Type으로 Student를 지정했으므로,

Club에서 Student를 참조할 수 있게 됐다. 즉 양방향 관계가 성립된 것이다.

 

 

 

 

 

 

 

하지만 객체에서 말하는 양방향 관계에는 약간(?)의 함정이 있다. 지금 객체 구조를 보면 사실 단방향 관계가 2개 있는 것이다.

Student → Club과 Club → Student로 가는 단방향 관계가 말이다.

최종적으로 양방향이 성립되지만, 이 과정 속에는 단방향 연관관계 2개가 합쳐져있다는 것을 간과해서는 안 된다.


DB에서의 양방향 연관관계

DB에서 양방향 연관관계는 외래키(FK)만 있으면 성립된다. Student Table과 Club Table을 통해 살펴보도록 하자!!!!

Student → Club을 어떻게 할 수 있을까? 간단하다. 아래 SQL문을 참고하자!!!

SELECT * FROM STUDENT S JOIN CLUB C ON S.CLUB = C.ID;

 

이번에는 Club → Student를 알아보자!!! 

SELECT * FROM CLUB C JOIN STUDENT S ON S.CLUB = C.ID;

 

정말 쉽다... CLUB과 STUDENT의 순서만 바꿔주면 끝이다!!!

DB는 단방향이고 뭐고 외래키만 있으면 게임 끝난다. 그냥 외래키 == 양방향이 성립한다는 것이다.