[Spring] JPA 연관관계(1:N, N:M ..)

윤성철·2024년 4월 24일

Back-End

목록 보기
2/22
post-thumbnail

이번 포스팅은 김영한님의 실전! 스프링부트와 JPA 활용1을 기반으로 작성되었습니다.

연관관계와 단방향, 양방향 참조를 이해하고 넘어가고, 잊어버리고 다시 찾아보고 이런 현상이 계속 반복되어서, 정리한다.

먼저 1: N, 단방향 참조관계인 Order, Orderitem

  • 한 개의 주문에 N개의 주문 상품이 존재

  • 사람의 입장에서 접근하면, 주문이 있어야 주문 상품이 있다고 생각할 수 있다.
    -> 연관관계의 주인은 단순히 외래키 관리의 문제이지, 비즈니스상의 우위 관계로 접근하려고 하면 안된다!

  • 연관관계의 주인을 주문으로 정하면, 주문이 관리하지 않는 상품까지 외래키 값이 업데이트된다 -> 유지보수, 관리의 어려움

  • 이러한 이유로, Orders의 외래키를 ORDER_ITEM 테이블에서 관리한다.

JoinColumn 내부의 mappedBy는 연관관계의 주인이 아님을 나타낸다는 것만 기억하자!

실무에서 @ManyToMany 사용을 지양하자

편해보이지만, 중간테이블(CATEGORY_ITEM)에 컬럼을 추가할 수 없고, 세밀하게 쿼리를 실행하기 어렵기 때문에
실무에서 사용하기에는 한계가 있다.
-> 중간 엔티티(CategoryItem)을 만들고 @ManyToOne, @OneToMany로 매핑해서 사용하자

XXToOne 관계에서 반드시 지연 로딩으로 설정하자

  • ex) 주문테이블을 조회할 때, JPQL : select o From Order o -> SQL : select * from Order
    로 변환되어서 쿼리문이 나간다
  • 해당 쿼리문은 Order테이블을 조회하면서 Member 테이블까지 조회해, N + 1 트러블을 야기한다.

CASECADE 옵션의 범위

OrderItem, Delivery 테이블은 Order 테이블을 참조하지만, 다른 테이블로부터 참조 당하지 않는다.

  • 이러한 관계에서 Order 테이블의 변경이 발생했을 때, CASECADE 옵션을 적용해도 무방하다.
profile
내 기억보단 내가 작성한 기록을 보자..

0개의 댓글