본문 바로가기
❤️‍🔥TIL (Today I Learned)

[TIL] 2022-12-21(38day)

by elicho91 2022. 12. 21.

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

댓글