JPA에서는 다양한 연관관계를 매핑하는 방법을 제공합니다. 각각의 연관관계는 엔티티 간의 관계를 표현하고 데이터베이스 스키마에 매핑됩니다. 다음은 다양한 연관관계와 그에 따른 매핑 방법에 대한 간략한 설명입니다.
연관관계 매핑 시 고려사항 😰
연관관계를 매핑할 때 고려해야 하는 주요한 사항은 다음과 같습니다
- 다중성(Multiplicity)
- 다중성은 한 엔티티가 다른 엔티티와의 관계를 얼마나 가질 수 있는지를 나타냅니다.
- 다중성에는 일대일(1:1), 다대일(N:1), 일대다(1:N), 다대다(N:N)(다대다는 실무에서 절대 사용X) 등이 있습니다.
- 어떤 엔티티가 다른 엔티티와의 관계를 어떤 방식으로 가질지를 결정해야 합니다.
- 단방향 또는 양방향 관계
- 테이블은 외래 키 하나로 양쪽으로 조인이 가능하기때문에 방향이라는 개념은 없습니다. 그런데 객체는 참조용 필드가 있어야지 필드가 있는 쪽으로 참조가 가능합니다. ex)예를 들어, Member엔티티와 Team엔티티가 존재하면 Member에서 Team으로 이동하고 싶다면 Member안의 Team참조가 있어야지 이동이 가능합니다.
- 단방향 관계는 한 엔티티가 다른 엔티티를 참조하지만, 그 역은 성립하지 않는 관계입니다.
- 양방향 관계는 두 엔티티가 서로를 참조하는 관계로, 양쪽으로 조회가 가능합니다.
- 단방향과 양방향 중 어떤 관계를 선택할지, 양방향 관계일 경우 두 엔티티 중 어떤 엔티티가 연관관계의 주인인지 결정해야 합니다.
- 연관관계의 주인(Owner)
- 양방향 연관관계에서 연관관계의 주인을 정해야 합니다.
- 연관관계의 주인은 외래키를 관리하는 역할을 합니다.
- 주인이 아닌 쪽은 읽기만 가능하며, 외래키를 수정할 수 없습니다.
- 연관관계의 주인은 데이터베이스 테이블의 외래키 컬럼을 가지고 있는 엔티티입니다.
연관관계를 매핑할 때는 데이터베이스의 스키마와 객체 모델 간의 일관성을 유지하면서 어플리케이션의 요구사항을 충족시키도록 설계해야 합니다. 또한 연관관계의 유형에 따라 필요한 매핑 어노테이션을 사용하여 매핑을 정확하게 설정해야 합니다.
✍️ 다대일(N:1) 관계
다대일(N:1) 관계는 여러 개의 엔티티가 하나의 엔티티를 참조하는 관계를 말합니다. 가장 많이 사용되는 연관관계입니다. 이러한 관계는 주로 부모-자식 관계를 표현할 때 사용되며, 다른 말로 "다(N) 쪽이 연관관계의 주인"이라고도 표현합니다.
@Entity
public class Member {
@Id
@GeneratedValue
private Long id;
private String username;
// 다대일(N:1) 관계 설정
**@ManyToOne //Member가 N , Team은 1 (1개의 팀에 여러 member가 소속)**
**@JoinColumn(name = "team_id") //어떤 컬럼과 조인할 지 (Team과 Member 테이블의 TEAM_ID(FK)를 매핑)**
private Team team;
// Getter, Setter, Constructors...
}
@Entity
public class Team {
@Id
@GeneratedValue
private Long id;
private String name;
// Getter, Setter, Constructors...
}
위의 코드에서 @ManyToOne 어노테이션은 다대일(N:1) 관계를 설정하기 위해 사용되었습니다. @JoinColumn 어노테이션은 외래키 컬럼을 지정하는데 사용되며, 이 컬럼은 Member 테이블에 있는 team_id 컬럼과 연결됩니다.
✅ 다대일(N:1) 관계의 특징
여러 개의 다(N) 엔티티가 하나의 일(1) 엔티티를 참조합니다. 다(N) 쪽 엔티티에 외래키가 저장됩니다. JPA에서 다(N) 쪽 엔티티에 @ManyToOne 어노테이션을 사용하여 매핑합니다. 주로 부모-자식 관계를 표현하는데 사용됩니다.
이러한 다대일(N:1) 관계를 활용하면 부모-자식 관계를 효과적으로 모델링하고, 관련된 데이터를 쉽게 조회할 수 있습니다.
✍️ 일대다(1:N) 관계
일대다(1:N) 관계는 한 엔티티가 여러 개의 다른 엔티티를 참조하는 관계입니다. 이 관계는 "하나의 엔티티가 여러 개의 다른 엔티티를 가질 수 있다"는 개념을 나타냅니다. 대표적인 예시로 한 회원이 여러 개의 주문을 가질 수 있는 경우를 들 수 있습니다.
✍️ 일대일(1:1) 관계
일대일(1:1) 관계는 두 개의 엔티티 사이의 관계 중 하나의 엔티티가 다른 엔티티 하나와 1:1로 관계를 가지는 것을 말합니다. 이러한 관계는 주로 두 엔티티 사이에 강한 관계가 있을 때 사용됩니다. 예를 들어, 회원(Member)과 회원의 프로필(Profile) 엔티티가 1:1 관계를 가질 수 있습니다.
일대일(1:1) 관계의 주요 특징은 다음과 같습니다:
- 하나의 엔티티가 다른 엔티티와 1:1 관계를 가짐
- 일대일 관계에서는 한 엔티티가 다른 엔티티와 1:1 관계를 가지게 됩니다. 이는 두 엔티티 사이에 강한 관계를 나타내는 경우에 사용됩니다. 외래 키에 데이터 베이스 유니크(UNI) 제약조건을 추가하여 일대일 매핑이 가능합니다.
- 두 엔티티 중 하나만 외래키를 가짐:
- 일대일 관계에서는 두 엔티티 중 하나만 외래키를 가지며, 다른 엔티티는 mappedBy 속성을 사용하여 매핑합니다. 이로써 한 쪽 엔티티의 외래키가 다른 쪽 엔티티의 주요 식별자가 되는 구조를 가집니다. 주 테이블이나 대상 테이블 중에 외래 키 선택이 가능합니다.
- 강한 관계를 표현:
- 일대일 관계는 두 엔티티 사이에 강한 관계를 나타내는데 사용됩니다. 예를 들어, 회원과 회원의 프로필, 주문과 주문의 배송 정보 등이 일대일 관계로 표현될 수 있습니다.
- 일반적으로 양방향 관계로 설정됨:
- 일대일 관계는 양방향으로 설정하는 것이 일반적입니다. 이때 연관관계의 주인은 한 쪽 엔티티가 됩니다. 두 엔티티 사이의 양방향 관계를 설정하면 두 엔티티 모두 상호 참조할 수 있게 됩니다.
- 대칭성 없음:
- 일대일 관계는 보통 한 쪽 엔티티가 다른 쪽 엔티티를 소유하는 경우가 많습니다. 이러한 구조로 인해 대칭성이 없으며, 두 엔티티 간의 역방향 조회는 불가능합니다.
일대일 관계는 주로 강한 관계를 표현하는데 사용되며, 두 엔티티 사이에 어떤 엔티티가 주인이 되고 어떤 엔티티가 mappedBy를 사용하여 매핑할지 결정하는 것이 중요합니다.
다대일 단방향 매핑과 유사하며, 다대일 양팡향 매핑처럼 외래 키가 있는 곳이 연관관계의 주인이 됩니다.
'[ BACKEND] > Spring' 카테고리의 다른 글
[SPRING] 연관관계 고급 매핑 (0) | 2023.08.15 |
---|---|
[SPRING] 객체 참조 및 연관 관계 ✍️ (0) | 2023.08.13 |
[SPRING] 양방향 연관관계 (0) | 2023.08.09 |
[SPRING] 연관 관계 매핑 (단방향) (0) | 2023.08.08 |
[SPRING] Entity Mapping (엔티티 매핑) (0) | 2023.08.07 |