Jpa 연관관계 세션이나 기술매니저님께 개인적으로 질문했을 때도 @ManyToMany는 잘 사용하지 않는다고 하셨다. JAVA ORM 표준 JPA 책에서도 실무에서는 잘 사용하지 않는다는 말을 접하게 되니 내심 안도했던 것 같다. 배울거리가 하나 줄었으니 말이다. 바보같은 생각이었다 @ManyToMany 를 사용하지 않는 것이지 현실에서는 다대다 관계를 풀어내야 할 때가 많은 것 같다. 그것이 이번 주차 Test Member 엔티티와 Book 엔티티 관계이다. Member 1명은 N개의 Book 을 가질 수 있고 Book 1개는 N개의 Member를 가질 수 있다.
N:N 관계를 풀어내기 위한 방법은 3가지ㄱ
- @ManyToMany
- 연결 엔티티
- New PK
결론적으로 나는 New PK 방법을 사용하였다. 왜나하면 가장 직관적이게 구현할 수 있다.
테이블 관계는 아래와 같이 구현된다.
1. @ManyToMany
두 엔티티의 연결테이블을 만든다. @JoinTable과 함께 사용해야 한다.
하지만 연결테이블을 만드는 방식은 한계점이 존재한다. 예를 들면 주문테이블에서만 필요한 데이터를 만들어낼 수 없다. 예를 들면 주문 시간이 있을 것이다. 그래서 연결 엔티티를 활용한다.
2. 연결 엔티티
연결 엔티티에서는 복합키를 사용하게 된다.
- 복합키는 별도의 식별자 클래스로 만들어야 함
- equals and hashcode 구현
- Serializable 구현
이외에도 몇 가지 제약이 있다. 그리고 3번 방식에 비해 어떠한 장점이 있는지도 모르겠다.일단, 구현 난이도는 대폭 올라간다. 성능상의 이점이 있는걸까?
3. New PK간단하다. 책에서는 1번 방법이 간단하다고 했는데 내가 생각하기엔 이게 제일 간단하고 직관적이다.
// Order Entity
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
@ManyToOne
@JoinColumn(name = "book_id")
private Book book;
Order 가 PK를 가져야 하기 때문에 일반적인 엔티티처럼 PK를 만든다.
글고 연관관계를 설정해주면 된다. 주문과 member, book은 N:1 관계이기에 @ManyToOne 을 설정하고 외래키를 부여하면 된다.
'항해99' 카테고리의 다른 글
항해99 29일차 TIL1 - 직렬화와 HTTP 메시지 컨버터 (0) | 2023.01.07 |
---|---|
항해99 28일차 TIL1 - TIL 한 달 후기, 장단점 및 앞으로의 방향성 (0) | 2023.01.06 |
항해99 26일차 TIL1 - JPA 무한 루프의 원인과 해결 방법 (1) | 2023.01.04 |
항해99 4주차 WIL - IOC, DI (0) | 2023.01.02 |
항해99 24일차 TIL1 - 물리 삭제(hard delete)/논리 삭제(soft delete) (0) | 2022.12.31 |