경주장

연관관계 매핑 기초 본문

JPA

연관관계 매핑 기초

달리는치타 2022. 1. 4. 18:25

목표

  • 객체와 테이블 연관관계의 차이를 이해
  • 객체의 참조와 테이블의 외래 키를 매핑
  • 용어
    • 방향: 단방향, 양방향
    • 다중성 : 다대일, 일대다, 일대일, 다대다
    • 연관관계의 주인

시나리오

회원,팀

 

객체를 테이블에 맞추어 모델링(외래 키 식별자를 직접 다룸)

 

@Entity
 public class Member {
 @Id @GeneratedValue
 private Long id;
 @Column(name = "USERNAME")
 private String name;
 @Column(name = "TEAM_ID")
 private Long teamId;
 …
 }
 @Entity
 public class Team {
 @Id @GeneratedValue
 private Long id;
 private String name;
 …
 }

 

문제점

객체지향 스럽지않다!

  • MemberA를 생성해 Team에 소속시키고 DB에 저장하는 시나리오를 생각해보자!
  • member를 하나 조회하고 멤버의 소속 팀 객체를 찾는 시나리오를 생각해보자

즉, 협력 관계를 만들 수 없다!

 


단방향 연관관계

@Entity
 public class Member {
 @Id @GeneratedValue
 private Long id;
 @Column(name = "USERNAME")
 private String name;
 private int age;
// @Column(name = "TEAM_ID")
// private Long teamId;
 @ManyToOne
 @JoinColumn(name = "TEAM_ID")
 private Team team;
 …

문제점 해결?!

  • MemberA를 생성해 Team에 소속시키고 DB에 저장하는 시나리오를 생각해보자!
  • member를 하나 조회하고 멤버의 소속 팀 객체를 찾는 시나리오를 생각해보자

양방향 연관관계와 연관관계의 주인

Note! 테이블은 그대로다!

@Entity
 public class Team {
 @Id @GeneratedValue
 private Long id;
 private String name;
 @OneToMany(mappedBy = "team")
 List<Member> members = new ArrayList<Member>();
 …
 }

객체의 양방향 관계

  • 객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단 뱡향 관계 2개다.
  • 객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어 야 한다.

 

테이블의 양방향 연관관계

  • 테이블은 외래 키 하나로 두 테이블의 연관관계를 관리
  • MEMBER.TEAM_ID 외래 키 하나로 양방향 연관관계 가짐 (양쪽으로 조인할 수 있다.)
SELECT *
FROM MEMBER M
JOIN TEAM T ON M.TEAM_ID = T.TEAM_ID

SELECT *
FROM TEAM T
JOIN MEMBER M ON T.TEAM_ID = M.TEAM_ID

둘다 가능!

 

둘 중 하나로 외래 키를 관리해야 한다.

 

연관관계의 주인(Owner)

 

양방향 매핑 규칙

  • 객체의 두 관계중 하나를 연관관계의 주인으로 지정
  • 연관관계의 주인만이 외래 키를 관리(등록, 수정)
  • 주인이 아닌쪽은 읽기만 가능
  • 주인은 mappedBy 속성 사용X
  • 주인이 아니면 mappedBy 속성으로 주인 지정
  • 외래 키가 있는 있는 곳을 주인으로 정하자
  • 여기서는 Member.team이 연관관계의 주인

 

주의

그냥 양쪽을 다 고려해라

연관관계 편의 메소드

무한루프 조심 (toString, entity-> JSON 생성)

 

정리

그냥 단방향으로 설계

정말 필요할때 양방향 도입 (테이블에 영향을 주지 않음)

 

기준 

연관관계의 주인은 외래 키의 위치를 기준으로 정해야함

외래키 있다 -> @joinColumn, 없다 ->@mappedBy

'JPA' 카테고리의 다른 글

값 타입  (0) 2022.01.05
프록시와 연관관계 관리  (0) 2022.01.04
고급 매핑  (0) 2022.01.04
다양한 연관관계 매핑  (0) 2022.01.04
엔티티 매핑  (0) 2022.01.04