본문 바로가기

FastCampus - 한번에 끝내는 Java|Spring 웹 개발/04 JPA

JPA Ch 6 릴레이션 M:N - 패스트캠퍼스 챌린지 28일차

남은 건 M:N 이죠. 이번엔 실습을 할 필요조차 없었습니다.

몇 가지만 기억하면 됩니다.

@ManyToMany

예상하시는 대로 @ManyToMany 를 선언해주면 됩니다. 서로 M:N 으로 참조할 두 개의 엔티티에 정의해주시면 되구요, 리스트 타입으로 정의하고 초기화를 해준다 정도면 되겠습니다. 이전 강의에서 배웠던 @OneToMany 와 사용방법에 있어서는 차이가 없습니다.

다만 중요한 건 이번에는 매핑 테이블이 생긴다는 점입니다. 강의에서는 Book 과 Author 간의 관계로 실습을 진행했는데 author_books 라는 테이블이 생겼습니다. 두 개의 테이블만으로는 M:N 관계를 나타낼 수 없으니 당연한 거겠죠.


아직 영속성을 배우지 않았으므로 오류가 나는데, 이의 해결방법으로 @Transactional 을 붙이는 것과 @ToString.Exclude 를 붙이는 것으로 해결을 보셨습니다. 이거 다음 강의인데... 물론 후자는 아니구요.

강의에서 Lists.newArrayList 라는 함수가 나왔는데, 이전 강의에서 나왔던 거 같기도 하고 아닌 거 같기도 해서 검색을 해봤는데 Google 의 Guava 에 있다는 모양이네요? 근데 그 패키지가 아니었던 거 같은데... 뭐 양 쪽에 다 있는 거겠죠. 한 쪽에서 include & reexport 를 했다던가요.

@ManyToMany 를 @ManyToOne, @OneToMany 로 분리하자

두 번째 M2M 강의는 이것을 ManyToOne, OneToMany 로 쪼개는 작업이 진행되었습니다. 왜 그랬냐면... 현업에서는 잘 쓰이지 않는대요.

  • ManyToMany 는 복잡해서 관리하기가 어렵습니다.
  • 실제로는 ManyToMany 에 해당하는 다른 엔티티가 존재하는 것일 수도 있습니다.
    • 강의에서 예시로 나온 걸로는 "고객"과 "상품" 사이의 "주문" 이 있었습니다. 이렇게 말로 써놓으니까 주문이라는 엔티티가 눈에 보이지만, 만약 만드는 도중에 그걸 눈치채지 못하고 @ManyToMany 를 썼다면  "고객_상품" 이라는 이상한 테이블이 만들어졌겟죠.
  • 베이스 엔티티의 수혜를 볼 수 없습니다. (*강의 끝부분의 SQL 확인 과정에서 나옴)
    • 이번 강의 시리즈에서는 BaseAuditingEntity 라는 부모 클래스를 만들어, 모든 엔티티의 생성시간과 변경시간을 추적할 수 있게 되었습니다. 하지만 @ManyToMany 에서 만들어지는 매핑 테이블은 JPA 에서 만드는 것이므로 이렇게 베이스클래스에 추가한 내용이 반영되지 않습니다.

방법은 뻔합니다. UserByAuthorInfo (강의에서는 UserAndAuthor 였음) 같은 적당한 이름의 엔티티를 만들어서 @ManyToOne 을 두 개 붙인뒤, 참조의 대상이 되는 User와 Author 쪽에는 @OneToMany 를 하나씩 넣어서 UserByAuthorInfo 를 가리키게 해주면 됩니다.


본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스: https://bit.ly/37BpXiC

#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는JavaSpring웹개발마스터초격차패키지Online

이번 강의는 저번 강의에서 이어지는 내용이 많아서 실습을 해볼 필요조차 없었네요. 그러다보니 반복해서 엔티티를 만드는 과정 같은 게 오히려... ㅎㅎ...

어제같은 트러블슈팅을 또 하게 된다면 몇 시간 훌쩍 가버릴텐데 하고 피곤함을 느끼고 있었는데, 빨리 끝나니까 뭔가 공강이 된 거 같은 기분이네요.