ggoggo

[JPA] 다대다관계 본문

Spring/JPA

[JPA] 다대다관계

chchae01 2023. 11. 29. 00:55

 

다대다(M:N) 관계란

두 개의 테이블이 서로의 행에 대해서 여러개로 연관되어 있는 상태를 다대다(M:N)관계라 한다.

 

예를 들어 하나의 상품이 여러 구성성분들로 이루어져 있고,

한 구성 성분들은 여러 상품들에 구성되어지는 관계를 말한다.

 

구현은?

객체는 컬렉션을 사용해서 객체 2개로 다대다 관계가 가능하다.

예시

위의 예시처럼 JPA의 @ManyToMany 어노테이션을 사용해 객체의 다대다 관계를 구현하고 테이블 상에서 연결 테이블이 존재하면 된다. 하지만 이 방식을 지양되어져야 한다.

  • 조인 테이블 자체에 주문시간, 수량 같은 추가 정보를 넣을 수 없다.
  • 개발 상에서 연결 테이블이 엔티티로 보이지 않기 때문에 예상하지 못하는 쿼리들이 나간다.

따라서 연결 테이블을 엔티티로 승격 시켜야 한다.

@ManyToMany를 @ManyToOne, @OneToMany로 풀어 표현하면 유연한 개발이 가능한 다대다 매핑이 완성된다.

 

실제 프로젝트에 적용한 내용이다.

상품과 성분 엔티티에 대한 다대다 매핑

 

Ingredient

@Entity
public class Ingredient {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String description;
    @OneToMany(mappedBy = "ingredient")
    private List<ProductIngredient> products = new ArrayList<>();
}

ProductIngredient

@Entity
public class ProductIngredient {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "product_id")
    private Product product;
    
    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "ingredient_id")
    private Ingredient ingredient;
}

Product

@Entity
public class Product {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    
    ...
    
    @OneToMany(mappedBy = "product")
    private List<ProductIngredient> ingredients = new ArrayList<>();
}

 

참고 블로그

'Spring > JPA' 카테고리의 다른 글

[SpringDataJPA] SpringDataJPA란?  (0) 2023.11.27
[JPA] 연관관계 매핑  (0) 2023.11.26