JPA
[JPA] 11. 단방향, 양방향 매핑에 대한 이해
Song hyun
2024. 9. 30. 11:43
728x90
반응형
[JPA] 11. 단방향, 양방향 매핑에 대한 이해
*JPA는 객체지향적 접근 방식임을 잊지 말자!!
1. 참조 방향성과 엔티티간 관계
(1) 참조 방향성
- 단방향 매핑(Unidirectional Mapping): 한쪽에서만 참조하는 관계
- 양방향 매핑(Bidirectional Mapping): 양쪽에서 서로 참조하는 관계
(2) 엔티티 간 관계
- 일대일 매핑(One-to-One mapping)
- 일대다 매핑(One-to-Many mapping)
- 다대일 매핑(Many-to-One mapping)
- 다대다 매핑(Many-to-Many mapping)
2. 시나리오 코드: 고객과 주소
-고객 클래스에 고객-주소가 1:1 관계를 가지게끔 코드를 작성해보자.
=> 아래와 같이 코드를 작성하면, USER_TB에 FK로 address_id가 생성된 것을 알 수 있다!!


package com.example.demo.model;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.OneToOne;
@Entity(name = "tb_user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int id;
private String name;
// 고객과 주소가 1:1 관계라고 생각해보자.
// @OneToOne(fetch = FetchType.LAZY)
// OneToOne - User, Address 엔티티간의 1:1 관계를 매핑한다.
// FetchType.LAZY : 지연 로딩 전략을 사용한다. (getAddress())
@OneToOne(fetch = FetchType.LAZY)
// @JoinColumn : 외래키 (FK)를 설정하는 어노테이션이다.
// 즉, address_id라는 이름이 외래키 컬럼이 된다!
@JoinColumn(name = "address_id")
private Address address;
}
*연관관계의 주인
1. 참조의 방향성과 연관관계의 주인
- 단방향 매핑에서는 하나의 엔티티만 다른 엔티티를 참조하기 때문에, 외래 키를 누가 가지는 지가 명확하다. 한쪽이 다른 쪽을 참조하고, 참조하는 엔티티가 외래 키를 가진다.
- 양방향에서는 두 엔티티가 서로를 참조한다. 이 때, DB에서는 한 쪽만이 실제로 외래키를 가지고 있어야 하므로, 어느 한 쪽이 연관관계의 주인이 된다!
2. 연관관계의 주인 = FK를 관리하는 엔티티
- 연관관계의 주인은 DB 테이블에서 FK를 직접 관리하는 클래스이다!
- 반면, 연관관계의 비주인(Non-Owner)는 외래 키를 직접 관리하지 않고, 주로 매핑된 관게를 반영할 뿐이다.
- 비주인은 외래 키를 설정하거나 수정하지 않고, 단순히 주인의 관계를 조회한다.
Example: Post, Comment 엔티티 만들기
- Post 객체는 여러개의 Comment 객체를 참조할 수 있다. 이는 List<Comment>를 통해 구현되고, 이를 통해 Post 객체는 자신과 연결된 여러 댓글을 관리한다. 댓글은 하나의 게시글에 속한 것이다.
- 이 때, FK를 가지게 되는 것은 Comment 테이블이 되고 (=댓글), 연관관계의 주인은 Post 테이블이 된다!
- Post-Comment 테이블의 관계는 단방향/양방향 모두 설계가 가능하며, 각각의 장단점이 있다!
728x90
반응형