** 자기 공부용 및 암기용으로 포스팅하는 글 입니다.
** 정확한 정보는 보장 할 수 없으니, 참고용으로만 봐주시면 감사하겠습니다.
** 제 개인적인 생각 및 자기 암시목적으로 작성되기에 이점 양해 부탁드립니다.
들어가기에 앞서..
엔티티 간의 연관 관계를 매핑하는 방법은 OneToMany, ManyToOne, OneToOne 등이 있다.
ManyToMany도 존재는 하나 실무에서는 사용하지 않는 것을 추천한다.
중간 테이블을 생성하고 기본키와 외래키를 매핑해주는 것은 문제가 되지 않으나, 실무 레벨에서는 이러한 테이블 매핑에 필수적인 정보들 외에 중간 테이블이 가져야하는 여러 컬럼들이 있을 수 있다.
Hibernate에 의하여 생성된 중간 테이블은 관계설정에 필수적인 정보만 담겨 있을 뿐, 비즈니스 로직상 필요한 정보가 담기지 않기 때문. 우리가 원하는 중간 테이블의 칼럼을 따로 추가 할 수 없기에 사용하지 말아야한다.
고로 이 포스팅에서는 OneToMany와 ManyToOne, OneToOne 만 다루도록 하겠다.
** 참고 포스팅 : https://codeung.tistory.com/254
★ 알아볼 내용
- 단방향 연관 관계
- 양방향 연관 관계
- 일대다 연관 관계 OneToMany
- 다대일 연관 관계 ManyToOne
- 일대일 연관 관계 OneToOne
내용 설명
1. 단방향 연관 관계
두 개의 클래스에서 연관 관계가 설정되어 있으나,
한 클래스에서만 자신과 연관 관계가 설정되어 있는 다른 클래스의 객체를 가지고 있는 상태를 의미한다.
아래와 같이 단방향으로 연관 관계가 설정된 경우, Member 클래스에서 Order 정보를 확인할 수 있지만, Order 클래스에서 Member 정보를 확인할 수 없다.
2. 양방향 연관 관계
두 개의 클래스에서 연관 관계가 설정되어 있고,
양 쪽의 클래스에서 자신과 연관 관계가 설정되어 있는 다른 객체(참조 정보)를 가지고 있는 상태를 의미한다.
단방향 연관 관계와는 다르게 서로가 서로의 정보를 확인 할 수 있다.
Spring Data JDBC에선 단방향 연관 관계만 지원한다.
3. 일대다(1:N) 연관 관계 @OneToMany
일대다 연관 관계는 하나의 클래스가 다른 클래스의 객체 여러개의 정보를 가지는 구조일 때를 의미한다.
아래 그럼과 같이 일대다 구조에서 "1" 쪽에 속하는 클래스에서 "다" 에 해당하는 클래스 객체를 여러 정보를 담아두고 있다.
이 상태로만 따져서 말하자면은 현재는 단방향 연관 관계이다. 이를 양방향 연관 관계로 전환 시켜 주기 위해서는 다른 테이블에서 다대일(N:1) 연관 관계를 어노테이션으로 선언해 줘야한다.
4. 다대일(N:1) 연관 관계 @ManyToOne
다대일 연관 관계는 하나의 클래스의 객체가 다른 클래스에게 여러번 속할 수 있는 구조일 때를 의미한다.
일대다(1:N) 와 다대일(N:1)를 모두 사용하여 양방향 연관 관계를 설정하게 될 경우 아래의 그림과 같이 구조가 만들어진다.
소스로 구현하자면은 아래와 같다.
@Getter
@Setter
@Entity(name = "MEMBER")
@NoArgsConstructor
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long memberId;
@Column(nullable = false, length = 30)
private String name;
@Column(nullable = false,updatable = false,length = 100)
private String email;
//... 다른 엔티티들 생략 ... //
@JsonManagedReference
@OneToMany(mappedBy = "member") // <--
private List<Order> orders = new ArrayList<>();
}
@Getter
@Setter
@Entity
public class Order extends Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long orderId;
//... 다른 엔티티들 생략...//
@ManyToOne <---
@JsonBackReference
@JoinColumn(name = "MEMBER_ID")
private Member member;
}
mappedBy
- 관계를 소유하고 있는 필드 지정.
@JoinColumn
- 해당 클래스에서 외래키에 해당하는 열 이름 명시
@JsonManagedReference & @JsonBackReference
- 포스팅 글 참조 : 해당_어노테이션_정보_보기
5. 일대일(1:1) 연관 관계
일대일 연관 관계 매핑방식은 다대일 단방향 연관 관계 매핑과 동일하다.
@ManyToOne이 아닌 @OneToOne 어노테이션을 사용한다는 차이만 존재한다.
'Spring 지식 및 공부' 카테고리의 다른 글
[Spring] Spring JPA - 직렬화 순환 참조 @Jsonbackreference & @Jsonmanagedreference (0) | 2024.07.13 |
---|---|
[Spring] Spring JPA - 영속성 컨텍스트 ( Persistence Context ) (0) | 2024.07.11 |
[Spring] Spring JPA - 기본개념 (0) | 2024.07.09 |
[Spring] Spring MVC (0) | 2024.07.08 |
[Spring] 자주 사용하는 어노테이션(Annotation) 정리 (0) | 2024.07.06 |