[Spring boot] 연관관계 매핑 기초

어정윤·2021년 7월 16일
0

Spring boot 스터디

목록 보기
4/15
post-thumbnail

[Spring boot] 연관관계 매핑 기초

객체 연관관계 vs 테이블 연관관계

객체는 양방향 관계가 아니라 서로 다른 단방향 관계 2개다. 반면에 테이블은 외래 키 하나로 양방향으로 조인할 수 있다.

  • 객체는 참조(주소)로 연관관계를 맺는다.
  • 테이블은 외래 키로 연관관계를 맺는다.

단방향 연관관계

회원과 팀의 관계를 통해 다대일 단방향 관계를 알아보자.

  • 회원과 팀이 있다.
  • 회원은 하나의 팀에만 소속될 수 있다.
  • 회원과 팀은 다대일 관계다.

객체 관계 매핑

  • 객체 연관관계 : 회원 객체의 Member.team 필드 사용
  • 테이블 연관관계 : 회원 테이블의 MEMBER.TEAM_ID 외래 키 컬럼을 사용

연관관계 매핑을 위한 어노테이션

  • @ManyToOne : 다대일(N:1) 관계라는 매핑 정보
  • @JoinColumn : 외래 키를 매핑할 때 사용. name 속성에 매핑할 외래 키 이름을 지정하여 같이 사용 한다.

양방향 연관관계

데이터베이스 테이블은 외래 키 하나로 양방향으로 조회할 수 있다. 하지만 객체는 양방향 조회가 불가능 하기 때문에 다대다(N:M)을 다대일(N:1)과 일대다(1:N)로 나누어 매핑한다.

회원 객체에 다대일로 팀에 매핑을 했다면 팀 객체에 일대다로 매핑을 하면 양방향으로 매핑이 된다.

연관관계 매핑을 위한 어노테이션

  • @OneToMany : 일대다(1:N) 관계라는 매핑 정보. 양방향 매핑일 때 mappedBy 속성을 사용해주고 속성 값은 매핑되는 변수명이다.

연관관계의 주인

테이블은 외래 키 하나로 두 테이블의 연관관계를 관리한다.
엔터티를 단방향으로 매핑하면 참조를 하나만 사용하므로 이 참조로 외래 키를 관리하면 된다. 그런데 엔터티를 양방향으로 매핑하면 두 곳에서 서로를 참조하기 때문에 객체의 연관관계를 관리하는 포인트는 2곳으로 늘어난다.
엔터티를 양방향 연관관계로 설정하면 객체의 참조는 둘인데 외래 키는 하나다. 따라 둘 사이에 차이가 발생한다. 이러한 차이로 인해 JPA에서는 두 객체 연관관계 중 하나를 정해서 테이블의 외래키를 관리해야 하는데 이것을 연관관계의 주인(Owner)이라고 한다.

  • 연관관계의 주인은 mappedBy 속성을 사용하지 않는다.

  • 연관관계의 주인이 아니면 mappedBy 속성을 사용해서 속성의 값으로 연관관계의 주인을 지정해야 한다.

    연관관계의 주인을 정하는 것은 사실 외래 키 관리자를 선택하는 것이다. 연관관계의 주인은 외래 키가 있는 곳으로 정해야 한다. 여기서는 회원 테이블이 외래 키를 가지고 잇으므로 Member.team이 주인이 된다. 주인이 아닌 Team.members에는 mappedBy="team" 속성을 사용해서 주인이 아님을 설정한다.

profile
성장ing

0개의 댓글