- [JPA] 11. 단방향, 양방향 매핑에 대한 이해2024년 09월 30일
- Song hyun
- 작성자
- 2024.09.30.: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반응형'JPA' 카테고리의 다른 글
[JPA] 13. 단방향과 양방향 참조의 특징 (0) 2024.09.30 [JPA] 12. @Entity를 사용하여 엔티티 만들기 (0) 2024.09.30 [JPA] *Springboot Starter Project - 프로젝트 설정하기 (1) 2024.09.30 [JPA] 10. 영속성 컨텍스트 (0) 2024.09.30 [JPA] 9. 엔티티 매니저와 영속성 컨텍스트 (0) 2024.09.30 다음글이전글이전 글이 없습니다.댓글
스킨 업데이트 안내
현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)