| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 |
- 알고리즘
- python
- stop the world
- AWS SAA-C03 합격후기
- 어플리케이션 클래스 로더
- 스프링
- 파이썬 리스트 메서드
- java
- 딕셔너리
- 백준
- 플랫폼 클래스 로더
- 컴포넌트 스캔
- aws saa-c03
- 자바
- BFS
- 심볼릭 레퍼런스
- 코딩테스트
- 스프링 컨테이너
- 자료구조
- dfs
- 클래스 로더 계층
- 2026 AWS SAA-C03
- getreference
- Spring
- 부트스트랩 클래스 로더
- 파이썬
- 다이렉트 레퍼런스
- 객체지향
- python list method
- 파이썬 문자열 메서드
- Today
- Total
클라우드 낚시꾼
[JPA] @JoinColumn과 mappedBy: 연관관계의 주인은? 본문
1. Overview
JPA에서 관계의 방향은 단방향 또는 양방향으로 나뉜다. 양방향 관계의 경우에는 일반적으로 연관관계의 주인, 참조 측을 정의한다.
- 연관관계의 주인(소유 측, owning side)
- 참조 측(referencing side)
연관관계의 주인과 참조 측은 어떻게 지정해야 할까? 이제부터 차근 차근 알아보자
2. 초기 상황

위 관계를 분석해보면, 2가지 결과를 도출할 수 있다.
- Employee는 구글 Email, 네이버 Email 등등 여러 Email을 가질 수 있다. 이러한 관계를 one-to-many, 즉, 일대다 관계라고 한다.
- Email 엔티티는 Employee 엔티티의 id(PK)를 참조하는 employee_id(FK)를 가지고 있다.
3. @JoinColumn (+ name에 관하여...)
1:N 관계에서 연관관계의 주인은 N쪽에 정의된다. 즉, 외래키를 소유한 쪽에 연관관계의 주인이 정의된다고 보면 된다. 연관관계의 주인을 정의하기 위해 N쪽에 @JoinColumn을 사용한다.
@Entity
public class Email {
// 생략
@JoinColumn(name = "employee_id")
private Employee employee;
}
Employee와 Email의 1:N 관계에서 FK가 정의된 N쪽인 Email에 @JoinColumn을 사용하여 연관관계의 주인을 명시하였다.
@JoinColumn의 name, referencedColumnName 속성의 의미
@JoinColumn의 name 속성 값은 대상 엔티티와 매핑될 테이블의 외래 키 필드명을 지정해주는 값이다. 그리고@JoinColumn의referencedColumnName 속성은 조인할 컬럼명, 즉, 외래 키가 참조하는 테이블의 컬럼명을 지정해주는 속성이다.
referencedColumnName의 default 값은 참조하는 테이블의 기본 키(PK)를 알아서 조인하도록 동작한다.
4. mappedBy Attribute
연관관계의 주인을 정의했다면, Hibernate는 이미 데이터베이스에서 그 관계를 매핑하는 데 필요한 모든 정보를 가지고 있다. 이 관계를 양방향으로 만들려면 참조 측을 정의하기만 하면 된다. mappedBy 속성을 이용하여 참조 측을 연관관계의 주인 쪽으로 매핑시켜 보자.
@Entity
public class Employee {
@Id @GeneratedValue
@Column(name = "employee_id")
private Long id;
@OneToMany(mappedBy = "employee")
private List<Email> emails = new ArrayList<>();
}
여기서 mappedBy의 값은 연관관계 주인 측 속성의 이름이다. 이렇게 함으로써 Employee와 Email 엔티티 간에 이제 양방향 관계를 설정되었다.
5. 양방향 매핑 규칙
- 연관관계의 주인만이 외래키를 관리한다.
- 주인이 아닌 쪽은 읽기만 가능하다.
'BE Framework > JPA' 카테고리의 다른 글
| [JPA] JPA 프록시 개념 (getReference) (0) | 2024.05.07 |
|---|---|
| [JPA] 일대다 관계 VS 다대일 관계 (단방향, 양방향, 연관관계의 주인) (0) | 2024.05.03 |