연관관계 매핑 시 고려사항 3가지
1. 다중성
- 다대일: @ManyToOne
- 일대다: @OneToMany
- 일대일: @OneToOne
- 다대다: @ManyToMany
2. 단방향, 양방향
테이블은 외래키 하나로 양쪽 조인이 가능하므로 방향의 개념이 없다.
객체는 참조용 필드가 있는 쪽으로만 참조할 수 있다.
예를 들어, Member에서 Team을 참조하고 싶으면 참조 필드 Member.team이 필요하다.
한쪽만 참조하면 단방향이고, 양쪽이 서로를 참조하면 양방향이다.
사실 객체 입장에서는 양방향이 아니라 단방향 2개이다.
3. 연관관계의 주인
테이블은 외래키 하나로 두 테이블이 연관관계를 맺는다.
객체 양방향 관계는 A->B, B->A로 참조가 2개이다.
두 참조 중에 테이블 외래키를 관리할 참조를 지정해야 한다.
예를 들어, Member.team이 바뀌었을 때 외래키 값을 바꿀지
Team.members가 바뀌었을 때 외래키 값을 바꿀지 정해야 한다.
이때, 외래키를 관리하는 참조를 연관관계의 주인이라고 한다.
주인의 반대편은 외래키에 영향을 주지 않고, 단순 조회만 가능하다.
여러 연관관계 중 다대일 연관관계를 먼저 살펴보자.
다대일
다대일 단방향
가장 많이 사용하는 연관관계이다.
다대일 중에 다쪽에 외래키가 위치한다.
Member.team 참조를 추가해 Member에서 Team을 참조하게 한다.
Team에는 참조가 없으므로 Member를 참조하지 못한다.
@ManyToOne 어노테이션을 사용해 다대일 관계를 매핑한다.
@JoinColumn은 외래 키를 매핑할 때 사용하며, name 속성으로 매핑할 외래키 이름을 지정한다.
//Member.java
@ManyToOne
@JoinColumn(name = "TEAM_ID")
private Team team;
다대일 양방향
Team.members를 추가해 Team에서 Member를 참조할 수 있도록 했다.
다대일 단방향과 달리, 두 객체가 서로를 참조할 수 있다.
외래키가 있는 Member쪽이 연관관계의 주인이다.
연관관계 주인 반대편에 추가한 참조는 객체 조회만 가능하므로 테이블에 영향을 주지 않는다.
@OneToMany를 사용하고, mappedBy 속성으로 연관 관계 주인을 지정한다.
//Team.java
@OneToMany(mappedBy = "team")
private List<Member> members = new ArrayList<>();
Reference
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
초급자를 위해 준비한 [웹 개발, 백엔드] 강의입니다. JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자
www.inflearn.com