ManyToOne
객체 간의 관계에서 하나의 쪽이 다수의 객체를 참조할 수 있는 관계입니다. 이런 관계에서 연관관계의 주인은 항상 Many(다) 쪽입니다.
주의 사항 - ManyToOne은 기본형이 EAGER 로 되어 있기 때문에 LAZY 사용!!
데이터 베이스 테이블의 1:N관계
외래키는 항상 다 쪽에 테이블에 존재하며, 객체 간의 매핑 시에도 이 원칙을 따릅니다.
객체 양방향 관계에서 연관관계의 주인
다대일 관계에서 연관관계의 주인(외래키)은 다 쪽에서 위치하게 됩니다.
객체 간의 다대일 관계에서 연관관계를 설정할 때, 이런 원칙을 고려하여 주인을 설정하고 관계를 매핑해야 합니다.
OneToMany
- 다대일 관계의 반대 방향으로, 여러 객체가 하나의 객체를 참조(자바 컬렉션인 Collection, List, Set, Map) 할 수 있는 관계입니다.
- 일대다 관계에서는 일이 연관관계의 주인입니다. 따라서 JPA에서는 일쪽이 다를 관리하는 구조입니다.
- 객체 지향 모델링에서는 일 쪽이 다 쪽을 참조하게 되지만, 데이터베이스 테이블 구조에서는 외래키가 다 쪽에 위치합니다.
- JPA에서는 JoinColumn을 사용하여 일 쪽에 엔티티에 외래키를 명시적으로 지정해야 합니다. 이를 통해 데이터베이스의 외래키 설정을 객체 간의 관계로 매핑할 수 있습니다.
- JoinColumn을 사용하지 않으면 JPA는 기본적으로 조인 테이블 방식을 사용하며 중간에 조인 테이블을 추가하는 방식으로 매핑합니다. 따라서 명시적으로 외래키를 지정해 주어야 데이터베이스의 구조와 객체 간의 관계를 일치시킬 수 있습니다.
mappedBy
JPA에서 양방향 관계를 매핑할 때 사용되는 속성입니다. 엔티티 간의 양방향 관계를 설정할 때 반드시 필요한 것은 아니지만, 두 엔티티 사이의 연관관계를 어떻게 매핑할지 JPA에게 알려주는 역할을 합니다.
양방향 관계에서는 한 엔티티는 다른 엔티티를 참조하고 있으며 mappedBy는 이 관계의 주인을 가리키며, 관계를 관리하는 측에 대한 정보를 제공하며 주인 측에서만 데이터베이스 연관관계를 실제로 매핑하고 관리합니다.
@Entity
public class Author {
@Id
private Long id;
@OneToMany(mappedBy = "author")
private List<Book> books;
}
@Entity
public class Book {
@Id
private Long id;
@ManyToOne
private Author author;
}
JPA 일대다 관계 매핑 두 가지 전략
@JoinColumn 사용
JoinColumn 어노테이션을 사용하여 외래 키를 가진 쪽이 연관관계를 맺는 것입니다. 이 경우에는 one(일) 엔티티에 외래키가 저장됩니다.
Join 테이블 전략
JoinColumn을 명시하지 않으면 JPA는 조인 테이블을 생성하여 관계를 관리합니다. 이 경우 별도의 테이블이 생성되어 두 엔티티의 관계를 나타내는데, 해당 테이블은 각 엔티티의 기본 키를 외래 키로 가집니다.
일대다 단방향 매핑의 단점
객체지향적으로 볼 때, 다대일 양방향 관계가 더 적절한 경우가 많기 때문에 단방향 관계는 한쪽에서만 다른 쪽을 참조할 수 있어서 객체 간의 관계를 완전히 표현하기 어려울 수 있으며 일대다 단방향 매핑을 사용 시에 엔티티 매핑한 테이블이 아닌 다른 테이블의 외래키를 관리까지 해야 한다. 일대다 단방향 매핑은 성능 문제도 있지만 관리 또한 부담스러워지기 때문에 일대다 보단 다대일 양방향 매핑을 사용한다
'Spring(Boot & FrameWork)' 카테고리의 다른 글
@OneToOne/ @ManyToMany (0) | 2023.12.21 |
---|---|
JUnit5 Basic (0) | 2023.12.18 |
엔티티 매핑 (0) | 2023.12.13 |