경주장
연관관계 매핑 기초 본문
목표
- 객체와 테이블 연관관계의 차이를 이해
- 객체의 참조와 테이블의 외래 키를 매핑
- 용어
- 방향: 단방향, 양방향
- 다중성 : 다대일, 일대다, 일대일, 다대다
- 연관관계의 주인
시나리오
회원,팀
객체를 테이블에 맞추어 모델링(외래 키 식별자를 직접 다룸)
@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 |