본문 바로가기

개발/Spring

[JPA] 연관관계 매핑

연관관계 매핑이란?

JPA를 통해 객체의 참조와 테이블의 외래 키를 매핑

 

용어 이해

  • 방향: 단방향, 양방향
  • 다중성: 다대일, 일대다, 일대일, 다대다
  • 연관관계의 주인: 객체 양방향 연관관계는 주인이 필요(이게 제일 어려움)

 

간단한 예시와 함께 알아 보겠다.

 

위와 같은 시나리오에서, 테이블 간에 관계를 먼저 생각해야 한다.
팀과 회원 간에 관계를 생각했을 때, 팀(1):회원(N)으로 이루어질 것이다.

이것을 객체가 테이블에 맞추어 모델링 한다면

이러한 구조로 만들어 질 것이다.

 

이러한 테이블이 있다는 가정하에, insert를 한다면

Team을 만들고, 멤버를 만든다.

그리고 이 멤버에는 Team의 Id값을 저장하여 insert한다.

+ 근데 궁금한 점이,, 만약 저렇게 create하면, 디비에도 테이블이 외래 키를 사용할까?

 

물론 이렇게 할 수도 있지만, 이 코드는 객체지향적이지 않다.

+ 근데 조영호님 강의에서는 연관관계를 필요하지 않다면 최대한 줄이라고 하던데,,
필요없는 부분을 잘라내고 사이클이 돌면 끊어내라는 뜻으로 이해했었다.
근데 위 테이블이 어떤 식으로 활용 될지에 따라 다르겠지만, 뭔가 팀과 멤버의 생성되는 사이클이 다르기 때문에, 연관관계를 안맺어 주는게 더 좋을 것 같긴한데,,, 궁금증이 생긴다.

 

아무튼 그래서 저러한 상황에서, 객체 연관관계를 사용하여 객체 지향 모델링을 할 수 있다.

이러한 연관 관계 매핑을 하기 전에, 먼저 생각을 해야한다.

이 둘의 관계가 일대다인지, 다대일인지 등등,,

 

위 예시에서는 Member(n):Team(1)이기 떄문에, Member클래스에서는 ManyOne으로 매핑해줘야 한다.

 

그런데 여기서 또 문제가 생긴다.

 

디비에서는 테이블끼리 외래 키로 관계를 맺는데, 객체에서는 외래 키라는 개념이 없다.

 

위 다이어그램에서 보이듯이, 팀에서는 멤버를 찾을 수 없고, 멤버에서는 찾을 수 있지만

실제 디비에서는 어느 쪽에서는 외래 키를 이용하여 찾을 수가 있다.

 

이렇게 둘의 패러다임의 불일치가 일어난다.

 

이러한 패러다임의 불일치를 해결하기 위해 양방향 객체 연관관계라는 개념이 나오게 된다.

이것을 코드로 구현한다면,

이러한 코드가 나오게 된다.

 

각 클래스에서 연관 관계를 맽어주는 필드에는, 그에 맞는 어노테이션이 사용된다.

 

그럼 @OneToMany에서 mappedBy는 무엇일까?

아마 이 부분이 가장 어렵지 않을까 싶다.

 

테이블은 외래 키 하나로 두 테이블의 연관관계를 관리하는데 엔티티는 단방향으로 매핑하면 참조를 하나만 사용하고, 양방향 관계로 설정하면 객체의 참조는 양쪽에서 하나씩 둘이 생기기 때문에

외래 키는 하나이므로 두 엔티티 중 하나를 정해서 테이블의 외래키를 관리해야 한다.

이를 해결하기 위해 탄생된 것이다.

 

그래서 둘 중 하나로만 관리하기 위해, 둘 중 주인을 정해서 관리한다.

이게 바로 연관관계의 주인 개념이다.

 

연관관계의 주인만이 외래 키를 관리(등록, 수정)할 수 있고, 주인이 아닌 쪽은 읽기만 가능하다.

주인은 mappedBy를 사용하면 안된다.(mappedBy뜻이 약간 내가 저것에 의해 매핑이 되었어 라는 느낌이다.)

 

그래서 주인이 아니면, 이런 식으로 mappedBy로 주인을 정해주는 것이다.

 

그럼 주인인지는 어떻게 판단하고 적용하는가?

 

주인은 외래 키가 있는 곳으로 정해야 한다.

여기서 꿀팁은 외래키가 있는 곳을 주인으로 정하면 얼추 맞을 것이다!!

디비 입장에서 보면, 주인쪽이 N이고 주인이 아닌 쪽이 1이다.

 

+ 궁금증

근데 단방향 말고 양방향으로 하는 이유는 패러다임의 불일치를 해결하기 위해서 인데,

패러다임의 불일치가 발생하면 왜 안되는걸까?

 

출처: https://www.inflearn.com/course/ORM-JPA-Basic/lecture/21697?speed=1&tab=curriculum

'개발 > Spring' 카테고리의 다른 글

[JPA] 영속성 컨텍스트  (0) 2021.07.23
JPA란  (0) 2021.07.22
[Spring] MockMvc  (0) 2021.07.20
[프로그래머스] Level2_오픈채팅방  (0) 2021.07.08
[Spring] Spring MVC 전체 구조  (0) 2021.06.14