연관관계 매핑
연관관계 매핑 종류와 방향
- OneToOne : 일대일
- OneToMany : 일대다
- ManyToOne : 다대일
- MantToMany : 다대다
DB에서는 두 테이블의 연관관계를 설정하면 외래키를 통해 서로 조인해서 참조하는 구조로 생성되지만 JPA를 사용하는 개체지향 모델링에선 엔티티 간 참조 방향을 설정할 수 있다. DB와 관계를 일치시키기 위해 양방향으로 설정해도 무관하지만 비지니스 로직의 관점에서 봤을 때 단방향 관계만 설정해도 해결되는 경우가 많다.
- 단방향 : 두 엔티티의 관계에서 한쪽의 엔티티만 참조하는 형식
- 양방향 : 두 엔티티의 관계에서 각 엔티티가 서로의 엔티티를 참조하는 형식
연관관계가 설정되면 한 테이블에서 다른 테이블의 기본값을 외래키로 갖게 되는데 이런 관계에서는 주인이라는 개념이 생긴다. 일반적으로 외래키를 가진 테이블이 그 관계의 주인이 되며, 주인은 외래키를 사용할 수 있으나 상대 엔티티는 읽는 작업만 수행할 수 있다.
일대일 매핑
@OneToOne
@JoinColumn(name = "product_number")
private Product product;
@OneToOne 어노테이션은 다른 엔티티 객체를 필드로 정의했을 때 일대일 연관관계로 매핑하기 위해 사용되고 @JoinColumn 어노테이션을 사용해 매핑할 외래키를 설정한다.
@JoinColumn은 기본값이 설정되어있어 자동으로 이름을 매핑하지만 의도한 이름이 들어가지 않기 때문에 name 속성을 사용해 원하는 칼럼명을 지정하는 것이 좋다.
일대다 양방향 매핑
@OneToMany(mappedBy = "provider")
@ToString.Exclude
private List<Product> productList = new ArrayList<>();
양방향 연관관계로 매핑을 하면 사실 양방향이 아니라 두개의 단방향으로 이루어 진다 엔티티를 양방향으로 매핑하면 객체 참조는 둘인데, 테이블은 하나의 외래키만을 사용하게 된다. 만약 provider가 product의 이름을 바꾸고 product가 provider의 이름을 바꾼다면 내가 예상하지 못한 일이 생길 수도 있다 그래서 JPA가 내린 규칙이 한쪽에서만 테이블의 외래키를 바꿀 수 있도록 하는 것인데, 그것을 연관관계 주인이라고 한다.
OneToMany어노테이션 안에 mappedBy는 어떤 객체가 주인인지 표시하는 어노테이션이다 보통 외래키를 가진쪽이 연관관계 주인이 되며 연관관계 주인이 아닌쪽은 읽기만 가능하다.
'스프링' 카테고리의 다른 글
JPA N + 1 문제와 해결 방법 (0) | 2023.11.14 |
---|---|
DTO매핑을 해야하는 이유 (0) | 2023.11.13 |
스프링 부트 핵심 가이드 5장 (0) | 2023.04.04 |
스프링 부트 핵심 가이드 2장 (0) | 2023.04.04 |
스프링 부트 핵심 가이드 (0) | 2023.04.04 |