스프링부트 이론/JPA

[다양한 연관관계 매핑] 실전 예제

hyun2371 2023. 5. 23. 20:50

실전예제는 이전 글과 이어집니다.

 

연관관계 매핑 - 실전 예제

테이블 구조 객체 구조 단방향 매핑 Order가 N이기 때문에 Order에서 Member를 참조한다. Order에 memberId 대신 Member 객체를 넣어 단방향 연관관계 매핑을 해준다. // Order.java @ManyToOne @JoinColumn(name = "MEMBER_

hyun-keepdeving.tistory.com


테이블

이전 예제에서 추가로 배송과 카테고리 테이블을 넣었다.

주문과 배송은 일대일, 상품과 카테고리는 다대다 관계이다.

다대다 관계를 예시 들었지만, 실제로는 지양하는 것이 좋다.

카테고리와 상품은 일대다와 다대일로 풀어냈다. 

 

엔티티

Delivery와 Order는 일대일 양방향 관계이다.

 

객체는 다대다 매핑이 가능하기 때문에, Category와 Item 사이에 중간 엔티티가 없다.

Category.items, Item.categories로 서로를 참조하므로 다대다 양방향 관계이다.

 

코드

배송 엔티티를 추가하자

@Entity
public class Delivery{
    @Id @GeneratedValue
    private Long id;
    ..
    private DeliveryStatus status;
}

 

주문과 배송에 각각 참조를 추가해 일대일 양방향 매핑을 하자

//Order.java
@OneToOne
@JoinColumn(name = "DELIVERY_ID")
private Delivery delivery;

//Delivery.java
@OneToOne(mappedBy = "delivery")
private Order order;

 

카테고리 엔티티를 추가한다.

Category와 Item을 다대다 양방향 매핑을 해주자. 연관관계의 주인은 Category이다.

@Entity
public class Category {
    ...
    @ManyToOne
    @JoinColumn(name = "PARENT_ID")
    private Category parent;
    
    @OneToMany(mappedBy = "parent")
    private List<Category> child = new ArrayList<>(); 
    
    @ManyToMany
    private List<Item> items = new ArrayList<>();
}

 

 

@JoinTable을 사용해서 중간 테이블 CATEGORY_ITEM을 생성해준다.

Category는 Category_ID로 조인하고, Item은 ITEM_ID로 조인한다.

//Category.java
@ManyToMany
@JoinTable(name = "CATEGORY_ITEM",
        joinColumns = @JoinColumn(name = "CATEGORY_ID"),
        inverseJoinColumns = @JoinColumn(name = "ITEM_ID"))
 private List<Items> items = new ArrayList<>();
 
 
 //Item.java
 @ManyToMany(mappedBy = "items")
 private List<Category> categories = new ArrayList<>();

 

정리

테이블의 다대다 관계는 중간 테이블을 이용해서 일대다, 다대일 관계로 매핑하자

실전에서는 다대다를 사용하면 중간 테이블에 매핑할 컬럼 외의 컬럼을 추가할 수 없다.

 

 

연관관계 매핑 어노테이션

@JoinColumn

외래키를 매핑할 때 사용한다.

속성 설명 기본값
name 매핑할 외래 키 이름 필드명+_+참조하는 테이블 기본 키 컬럼명
referencedColumnName 외래 키가 참조하는 대상 테이블의 컬럼명 참조하는 테이블의 기본 키 컬럼명
unique                    nullable
updatable              insertable
columnDefinition   table
@Column 속성과 동일  

 

 

@ManyToOne

다대일 관계를 매핑할 때 사용한다.

속성 설명 기본값
optional false로 설정하면 연관된 엔티티가 항상 있어야 함 True
fetch 글로벌 페치 전략을 설정한다 @ManyToOne = FetchType.EAGER
@OneToMany = FetchType.LAZY
cascade 영속성 전이 기능을 사용한다  

 

 

@OneToMany

일대다는 mappedby가 존재하는데, 다대일은 mappedby가 없다.

다대일에서는 반드시 참조가 연관관계의 주인이 되어야 하기 때문이다.

속성 설명 기본값
mappedBy 연관관계의 주인 필드를 선택한다.  
fetch 글로벌 페치 전략을 설정한다. @ManyToOne = FetchType.EAGER
@OneToMany = FetchType.LAZY
cascade  영속성 전이 기능을 사용한다.  

 

 

 

 


Reference

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com