Back-End/JPA

JPA - 연관관계 매핑 기초

Meluu_ 2024. 7. 5. 19:27

 

객체와 테이블의 연관관계는 매우 다르다.

 

객체참조 하여 연관된 객체를 찾지만

테이블외래 키를 매핑(조인)하여 연관된 테이블을 찾는다.

 

 

✔️ 단방향 연관관계


Member class가 Team 객체를 갖는다.

 

@Entity
public class Member {

	// 기본 id 및 정보 생략
    
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;

}

Member 가 Team을 단방향으로만 알고 있는 상태

 

 

✔️ 양방향 연관관계 


@Entity
public class Member {
	// 기본 id 및 정보 생략
    
    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;

}

 

@Entity
public class Team {
	// 기본 id 및 정보 생략
    
    @OneToMany(mappedBy = "team")
    private List<Member> members =  new ArrayList<>();

}

 

객체의 연관관계는 2개

회원 → 팀      참조(연관관계)  1개 (단방향)

팀     → 회원  참조(연관관계)  1개 (단방향)

 

테이블 연관관계

회원 ↔ 팀의 연관관계 1개 (양방향)

외래키 하나로 매핑 (연관관계 관리)

 

객체의 양방향은 사실 서로 다른 단방향 관계 2개이다.

 

 

 

✔️ 연관관계의 주인(Owner)

💠 양방향 매핑 규칙

  • 객체의 두 관계중 하나를 연관관계의 주인으로 지정
  • 연관관계의 주인만이 외래 키를 관리(등록, 수정)
  • 주인이 아닌 쪽은 읽기만 가능
  • 주인아니면 mappedBy 속성으로 주인 지정

 

 

 

양방향 연관관계 주의

  • 순수 객체 상태를 고려해서 항상 양쪽에 값을 설정
  • 연관관계 편의 메소드를 생성
  • 양방향 매핑시 무한루프를 조심
    • toString(), lombok, JSON 생성 라이브러리

 

❓ 어느쪽을 연관관계 주인으로 설정해야 할까 ❓

Team을 연관관계 주인으로 설정 후 특정 멤버의 team 변경시

  • Team을 통해서 member의 team 변경요청
  • member에 update 쿼리를 날려 teamID 변경
  • 주인은 Team인데 정작 쿼리는 member에 날라가고 있다..

Member를 연관관계 주인으로 하고 특정 멤버의 team 변경시

  • Member에 update 쿼리를 날려 team 변경

다(N)쪽이(FK) 연관관계 주인이 되는게 맞다.

즉, 외래키가 있는 곳을 연관관계 주인으로 설정한다.

 

 

 

✔️ 정리


  • 단방향 매핑만으로도 이미 연관관계 매핑은 완료
  • 단방향 매핑을 잘하고 양방향은 필요시 추가해도 늦지 않음 (테이블 영향 X)
  • 데이터 베이스에서 1 : N 관계는 항상 N 쪽이 FK를 가진다.

연관관계의 주인을 정하는 기준

외래 키의 위치를 기준으로 정해야 함

 

 

 

 

🔖 학습내용 출처


자바 ORM 표준 JPA 프로그래밍 - 기본편 / 김영한

'Back-End > JPA' 카테고리의 다른 글

JPA - 1:N 단방향과 양방향에 대해서  (0) 2024.07.09
JPA - 다양한 연관관계 매핑  (0) 2024.07.09
JPA - 엔티티 매핑  (0) 2024.07.05
JPA - 영속성 관리  (0) 2024.07.01
JPA 소개  (0) 2024.07.01