자바 ORM 표준 JPA 프로그래밍(인프런)

Ch06. 다양한 연관관계 매핑 - 다대다 [N:M]

webmaster 2021. 12. 13. 10:46
728x90

관계형 데이터베이스는 정규화된 테이블 2개로 다대다 관계를 표현할 수 없음 

연결 테이블을 추가해서 일대다, 다대일 관계로 풀어내야 함

다대다 -> 일대다, 다대일로 풀어서 사용한다

  • 중간 테이블을 만들어서 풀어주어야 한다.

다대다 매핑

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

다대다  연관관계 매핑

  • 객체는 컬렉션을 사용해서 객체 2개로 다대다 관계 가능
  • @ManyToMany 사용
  • @JoinTable로 연결 테이블 지정
  • 다대다 매핑: 단방향, 양방향 가능

Member Entity의 product 속성(@Jointable을 통해 매핑테이블로 연관관계 매핑)

  • JoinTable로 중간 테이블을 지정하면 자동으로 중간 테이블이 생성되고, 중간 테이블을 명도 지정해줄 수 있다.

Product Entity의 members 속성, mappedBy 속성으로 연관관계 주인이 아님을 표기

  • 읽기 전용으로 mappedBy를 해준다.

다대다 매핑의 한계

  • 편리해 보이지만 실무에서 사용 X
  • 연결 테이블이 단순히 연결만 하고 끝나지 않음
  • 주문시간, 수량 같은 데이터가 들어올 수 있음

다대다 한계 극복

다대다 매핑의 한계 : 추가 정보를 넣어줄 수가 없다

  • 연결 테이블용 엔티티 추가(연결 테이블을 엔티티로 승격)
  • @ManyToMany -> @OneToMany, @ManyToOne

MemberProduct Entity

@Entity
public class MemberProduct {
    @Id
    @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name = "MEMBER_ID")
    private Member member;

    @ManyToOne
    @JoinColumn(name = "PRODUCT_ID")
    private Product product;

    private int count;

    private int price;

    private LocalDateTime orderDateTime;
}

Member Entity의 Product속성을 일대다로 변경

    • MemberProduct를 엔티티로 승화했기 때문에 일대다로 풀어준다.
    • MemberProduct로 중간 테이블을 엔티티로 승화한 뒤, 여러 칼럼들을 추가해 줄 수 있다.

product Entity의 member 속성을 일대다로 변경

  •  MemberProduct를 엔티티로 승화했기 때문에 일대다로 풀어준다.
  • 중간 테이블 pk값을 전통적인 방식에서는 Member_id , Product_id를 PK로 설정하였지만, 유연성이 없어진다.
    • id가 다른 것에 종속되어 있다면, 애플리케이션이 계속 발전하면, 변경하기가 쉽지가 않다.
  • 따라서 대체키를 하나 만들어 PK로 사용하고(@GeneratedValue) 해당 pk를 그냥 외래키로 사용하는 것을 추천한다.

 

728x90