본문 바로가기
개발/JPA

[JPA] 연관관계 매핑 기초

by devhooney 2022. 7. 13.
728x90

김영한님의 자바 ORM 표준 JPA 프로그래밍 - 기본편 정리

 

1. 단방향 연관관계

- 객체를 테이블에 맞춰 모델링(연관관계가 없는 객체)

- 객체를 테이블에 맞춰 데이터 중심으로 모델링하면, 협력 관계를 만들 수 없음

(1)테이블은 외래키로 조인하여 연관된 테이블을 찾는다.

(2) 객체는 참조를 사용해서 연관된 객체를 갖는다.

 

- 객체 지향 모델링(객체 연관 관계 사용)

- 객체와 테이블의 차이는 이렇게 해결 가능

// Member와 Team 클래스가 Entity 애노테이션을 붙였다고 가정

@Entity
public class Member {    
    // 다른 필드 생략

    /* 
    @Column(name="TEAM_ID")
    private Long teamId;
    위는 객체를 테이블에 맞추어 모델링 한 것인데
    협력 관계를 만들 수 없다.
    */
 
    @ManyToOne // 항상 자기 자신을 기준으로
    @JoinColumn(name="TEAM_ID")
    private Team team;
}

- @ManyToOne 어노테이션으로 테이블의 연관관계를 지정

- @JoinColumn 생략해도 One의 PK가 Many의 FK로 매핑

- 양방향 관계에서는 mappedBy를 사용해 연관관계의 주인을 지정해주기 때문에 굳이 @JoinColumn를 사용할 필요가 없지만 name 속성을 사용하면 FK 이름을 지정이 가능하다.

 

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

- 양방향 매핑

 

@Entity
public class Team {
    @id
    @GeneratedValue
    private Long id;

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
}

- Team과 Member는 일대다 관계이므로 @OneToMany 애노테이션을 사용

- 연관관계의 주인은 FK를 관리하는 쪽

- 양방향 연관관계에서는 mappedBy가 연관관계의 주인을 지정하는 어노테이션

 

3. 객체와 테이블이 관계를 맺는 차이

- 객체 연관관계 = 2개

회원 -> 팀 연관관계 1개(단방향)

팀 -> 회원 연관관계 1개(단방향)

- 테이블 연관관계 1개

회원 <-> 팀의 연관관계 1개(양방향)

 

- 객체의 양방향 관계

객체의 양방향 관계는 사실 양방향 관계가 아니라 서로 다른 단방향 관계 2개다.

객체를 양방향으로 참조하려면 단방향 연관관계를 2개 만들어야 한다.

A -> B (a.getB())

B -> A (b.getA())

 

- 테이블의 양방향 관계

테이블은 외래 키 하나로 두 테이블의 연관관계를 관리

MEMBER.TEAM_ID 외래 키 하나로 양방향 연관관계를 가짐(양쪽으로 조인할 수 있다.)

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

 

4. 연관관계의 주인

- 양방향 매핑 규칙

(1) 객체의 두 관계중 하나를 연관관계의 주인으로 지정

(2) 연관관계의 주인만이 외래키를 관리(등록, 수정)

(3) 주인이 아닌쪽은 읽기만 가능

(4) 주인은 mappedBy 속성 사용 X

(5) 주인이 아니면 mappedBy 속성으로 주인 지정

- 연관관계의 주인은 FK를 관리하는 쪽

- 양방향 연관관계 N:1에서 주인을 N으로 만들면 된다. -> N:1에서 1에다가 mappedby 사용

 

5. 양방향 연관관계 주의

- 순수 객체 상태를 고려해서 항상 양쪽에 값을 설정하자

- 연관관계 편의 메소드를 생성하자

- 양방향 매핑시에 무한 루프를 조심하자(toString, lombok, JSON 생성 라이브러리에서 무한 루프를 주의해야 한다.)

양방형 매핑 시 연관관계의 주인에 값을 입력해야 한다.(순수한 객체 관계를 고려하면 항상 양쪽 다 값을 입력해야 한다.)

 

 

 

 

728x90

'개발 > JPA' 카테고리의 다른 글

[JPA] 프록시와 연관관계 관리  (0) 2022.07.19
[JPA] 고급 매핑  (0) 2022.07.18
[JPA] 다양한 연관관계 매핑  (0) 2022.07.14
[JPA] 기본 엔티티 매핑  (0) 2022.07.12
[JPA] 기본 영속성 관리 - 내부 동작 방식  (0) 2022.07.11