🍀Spring/JPA

[JPA] 연관관계 매핑 - 양방향 연관관계와 연관관계의 주인

말동말동현 2024. 7. 6. 14:13

연관관계의 주인

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

 

그러나 객체는 양방향으로 사용시 각 개체가 서로를 참조해야 한다. 즉, 참조가 두번 필요하다.

 

객체를 테이블에 매핑할 때에 두 객체중 어떤 객체로 외래 키를 관리해야 하는지에 대한 고민이 생긴다.

 

여기서 외래 키를 관리하게 되는 객체연관관계의 주인이라 부른다.

 

 

 

연관관계의 주인을 정하는 법

연관관계의 주인을 정할 때는, 테이블의 외래 키가 있는 곳으로 정해야 합니다.

그리고 데이터베이스 테이블의 , 관계에서는 항상 쪽이 외래 키를 가집니다.

데이터베이스는 컬렉션을 담을 수 없기에, 쪽에서 외래 키를 가지는 것이 불가능합니다.

 

 

양방향 매핑 시 주의할 점

양방향 매핑 시 연관관계의 주인을 지정해주어야 합니다.

 

지정된 연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리할 수 있습니다.

 

연관관계의 주인만이 외래 키를 등록, 수정, 삭제할 수 있으며, 주인이 아닌 쪽은 오직 외래 키를 읽기만 가능합니다.

 

이것이 정말 중요한데, 아무리 주인이 아닌 곳에서 객체를 변경해 보아봤자 데이터베이스에는 적용이 안되기 때문입니다.

 

따라서 꼭 연관관계의 주인에 값을 세팅해 주어야 하며, 가급적 두 객체 모두에게 값을 세팅해주도록 하는 것이 좋습니다.

그렇지 않으면 또 다른 문제가 발생합니다.

 

연관관계의 주인에 값을 입력하지 않음

 

 

순수한 객체 관계를 고려하면 항상 양쪽다 값을 입력해야 한다.

 

 

양방향 연관관계 테이블은 다음과 같다.

 

 

 

mappedBy

연관관계의 주인을 지정해주는 속성

 

 

 

특징

  • 연관관계의 주인은 mappedBy 속성을 사용하지 않는다.
  • 주인이 아니라면 mappedBy 속성을 사용해서 주인이 아님을 설정한다. 속성의 값으로는 연관관계의 주인을 지정
  • mappedBy 속성에 들어올 이름은, 연관관계 주인의 해당 속성의 필드명과 일치해야 한다.

 

class Member {
    @ManyToOne//연관관계의 주인
    @JoinColumn(name = "TEAM_ID")
    private Team team;//team대신 kkk라면
}

class Team {
    @OneToMany(mappedBy="team")//"team" 대신 "kkk"
    private List<Member> members = new ArrayList<>();
}
출처: https://ttl-blog.tistory.com/126#mappedBy-1 [Shin._.Mallang:티스토리]

 

 

참고

 

데이터베이스 테이블의 다대일, 일대다 관계에서는 항상 다 쪽이 외래키를 가진다.

따라서 항상 다(N)쪽이 연관관계의 주인이 되므로 @ManyToOne에는 mappedBy 속성이 없다.

 

 

 

Reference

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 | 김영한 - 인프런

김영한 | JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 실무에서도

www.inflearn.com

[JPA] - @JoinColumn과 연관관계의 주인 (mappedBy) — Shin._.Mallang (tistory.com)

 

[JPA] - @JoinColumn과 연관관계의 주인 (mappedBy)

@JoinColumn 외래 키를 매핑할 때 사용합니다. name 속성에는 매핑할 외래 키 컬럼명(이름)을 지정합니다. 속성 기능 기본값 name 매핑할 외래 키 컬럼명 필드명_[참조하는 테이블의 기본 키 컬럼명] ref

ttl-blog.tistory.com