연관관계의 주인
테이블은 외래 키 하나로 두 테이블의 연관관계를 관리한다.
그러나 객체는 양방향으로 사용시 각 개체가 서로를 참조해야 한다. 즉, 참조가 두번 필요하다.
객체를 테이블에 매핑할 때에 두 객체중 어떤 객체로 외래 키를 관리해야 하는지에 대한 고민이 생긴다.
여기서 외래 키를 관리하게 되는 객체를 연관관계의 주인이라 부른다.
연관관계의 주인을 정하는 법
연관관계의 주인을 정할 때는, 테이블의 외래 키가 있는 곳으로 정해야 합니다.
그리고 데이터베이스 테이블의 다대 일, 일대 다 관계에서는 항상 다 쪽이 외래 키를 가집니다.
데이터베이스는 컬렉션을 담을 수 없기에, 일 쪽에서 외래 키를 가지는 것이 불가능합니다.
양방향 매핑 시 주의할 점
양방향 매핑 시 연관관계의 주인을 지정해주어야 합니다.
지정된 연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리할 수 있습니다.
즉 연관관계의 주인만이 외래 키를 등록, 수정, 삭제할 수 있으며, 주인이 아닌 쪽은 오직 외래 키를 읽기만 가능합니다.
이것이 정말 중요한데, 아무리 주인이 아닌 곳에서 객체를 변경해 보아봤자 데이터베이스에는 적용이 안되기 때문입니다.
따라서 꼭 연관관계의 주인에 값을 세팅해 주어야 하며, 가급적 두 객체 모두에게 값을 세팅해주도록 하는 것이 좋습니다.
그렇지 않으면 또 다른 문제가 발생합니다.

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

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

양방향 연관관계 테이블은 다음과 같다.
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
'🍀Spring > JPA' 카테고리의 다른 글
[JPA] 다양한 연관관계 매핑 (0) | 2024.07.18 |
---|---|
[JPA] 연관관계 매핑 - 단방향 연관관계 (0) | 2024.07.06 |
[JPA] 기본 키 (Primary Key) 매핑 - (@Id, @GeneratedValue) (0) | 2024.07.04 |
[JPA] 필드와 컬럼 매핑 (@Column) (0) | 2024.07.04 |
[JPA] 엔티티 매핑 (@Entity, @Table) (0) | 2024.07.04 |
연관관계의 주인
테이블은 외래 키 하나로 두 테이블의 연관관계를 관리한다.
그러나 객체는 양방향으로 사용시 각 개체가 서로를 참조해야 한다. 즉, 참조가 두번 필요하다.
객체를 테이블에 매핑할 때에 두 객체중 어떤 객체로 외래 키를 관리해야 하는지에 대한 고민이 생긴다.
여기서 외래 키를 관리하게 되는 객체를 연관관계의 주인이라 부른다.
연관관계의 주인을 정하는 법
연관관계의 주인을 정할 때는, 테이블의 외래 키가 있는 곳으로 정해야 합니다.
그리고 데이터베이스 테이블의 다대 일, 일대 다 관계에서는 항상 다 쪽이 외래 키를 가집니다.
데이터베이스는 컬렉션을 담을 수 없기에, 일 쪽에서 외래 키를 가지는 것이 불가능합니다.
양방향 매핑 시 주의할 점
양방향 매핑 시 연관관계의 주인을 지정해주어야 합니다.
지정된 연관관계의 주인만이 데이터베이스 연관관계와 매핑되고 외래 키를 관리할 수 있습니다.
즉 연관관계의 주인만이 외래 키를 등록, 수정, 삭제할 수 있으며, 주인이 아닌 쪽은 오직 외래 키를 읽기만 가능합니다.
이것이 정말 중요한데, 아무리 주인이 아닌 곳에서 객체를 변경해 보아봤자 데이터베이스에는 적용이 안되기 때문입니다.
따라서 꼭 연관관계의 주인에 값을 세팅해 주어야 하며, 가급적 두 객체 모두에게 값을 세팅해주도록 하는 것이 좋습니다.
그렇지 않으면 또 다른 문제가 발생합니다.

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

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

양방향 연관관계 테이블은 다음과 같다.
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
'🍀Spring > JPA' 카테고리의 다른 글
[JPA] 다양한 연관관계 매핑 (0) | 2024.07.18 |
---|---|
[JPA] 연관관계 매핑 - 단방향 연관관계 (0) | 2024.07.06 |
[JPA] 기본 키 (Primary Key) 매핑 - (@Id, @GeneratedValue) (0) | 2024.07.04 |
[JPA] 필드와 컬럼 매핑 (@Column) (0) | 2024.07.04 |
[JPA] 엔티티 매핑 (@Entity, @Table) (0) | 2024.07.04 |