JPA 연관관계 매핑
👉 연관관계 매핑이란?
- 객체의 참조와 테이블의 외래 키를 매핑하는 것을 의미
- JPA에서는 연관 관계에 있는 상대 테이블의 PK를 멤버 변수로 갖지 않고, 엔티티 객체 자체를 통째로 참조
👉 연관관계를 이해하기 위한 3가지 키워드
1. 방향
- 단방향 관계 : 두 Entity가 관계를 맺을 때, 한쪽의 Entity만 참조
- 양방향 관계 : 두 Entity가 관계를 맺을 때, 양 쪽이 서로 참조
2. 다중성
@ManyToOne : 다대일 ( N : 1 )
ex) Member는 여러 구성원이 하나의 Team을 갖고 있으므로 Member 입장에서는 Team과 다대일 관계
@OneToMany : 일대다 ( 1 : N )
ex) Team은 여러 Member를 구성원으로 갖고 있으므로 Team 입장에서는 Member와 일대다 관계
@OneToOne : 일대일 ( 1 : 1 )
@ManyToMany : 다대다 ( N : N )
3. 연관관계의 주인(Owner)
- 객체를 양방향 연관관계로 만들면 연관관계의 주인을 정해야함.
- 외래키를 갖는 테이블이 연관관계의 주인이 됨.
- 주인만이 외래키를 관리 할 수 있고, 주인이 아닌 Entity는 읽기만 가능.
👉 @ManyToOne - 단방향
@Entity
@Getter @Setter
public class Member { //자신을 기준으로 다중성을 생각해야함
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String username;
@ManyToOne //Member 입장에선 Team과 다대일 관계이므로 @ManyToOne
@JoinColumn(name = "TEAM_ID")
//외래 키(FK)를 매핑할 때 사용. name 속성에는 매핑 할 외래 키 이름을 지정.
//Member 엔티티의 경우 Team 엔티티의 id 필드를 외래 키로 가지므로, TEAM_ID로 작성.
private Team team;
}
//=====================================================================
@Entity
@Getter @Setter
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
}
👉 @OneToMany - 양방향
@Entity
@Getter @Setter
public class Team {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@OneToMany(mappedBy = "team")
//연관관계의 주인을 정하기 위해 @OneToMany에 mappedBy 속성을 추가
//주인은 mappedBy 속성을 사용하지 않고, @JoinColumn을 사용
//주인이 아닌 엔티티 클래스는 mappedBy 속성을 사용해 주인을 정할 수 있다.
private List<Member> members = new ArrayList<>(); //Team은 Member를 List로 가진다.
}
//주인은 mappedBy 속성을 사용할 수 없으므로 연관관계의 주인이 아닌 Team Entity에서 members 필드에
//mappedBy의 속성으로 Member 테이블의 Team 필드 이름을 명시.
//(Team DB에 members FK 컬럼을 만들지 않게 하기 위해)
🙋♂️ 소감 :
JPA는 우리가 작성한 코드를 기준으로 DB의 구조를 유추하는 것이다. (명확하게 DB구조를 알지는 못한다.)
그래서 어노테이션을 통해서 우리가 '적어줘야' JPA가 DB구조를 올바르게 유추할 수 있다.
(그래서 @ManyToOne, @JoinColumn과 같은 것들로 DB구조 가이드를 해준다.)
편리한 기능이지만 제대로 알고 써야한다.
😈 아는 내용이라고 그냥 넘어가지 않기! 😈
'❤️🔥TIL (Today I Learned)' 카테고리의 다른 글
[TIL] 2022-12-23(40day) (0) | 2022.12.26 |
---|---|
[TIL] 2022-12-22(39day) (0) | 2022.12.22 |
[TIL] 2022-12-20(37day) (0) | 2022.12.20 |
[TIL] 2022-12-19(36day) (0) | 2022.12.19 |
[TIL] 2022-12-15(35day) (0) | 2022.12.18 |
댓글