[Spring] JPA 연관관계 매핑 해보기 😎

sorzzzzy·2021년 11월 26일
0

TIL

목록 보기
12/36
post-thumbnail

지난 시간에 이어 이번에는 실제 코드를 통해 연관관계 매핑을 심도있게(?) 알아보는 시간을 가지겠다😎


추울~발~ㅎ


🏷 다대일(N:1)

1. 다대일 단방향

다대일 단반향에서는 '다' 쪽에서 @ManyToOne 어노테이션을 추가해준다.
반대인 '일' 쪽에서는 참조하지 않는다.


2. 다대일 양방향

다대일 양방향은 '일' 쪽에 @OneToMany 어노테이션을 추가하고,
mappedBy 을 사용해 연관관계의 주인을 지정해준다.

📌 mappedBy로 지정할 때 값은 대상이 되는 변수명을 따라 지정하면 된다.


🏷 일대다(1:N)

일대다는 다대일에서 연관관계의 주인이 다 -> 일 로 바뀐 것이다.
따라서 '일' 쪽에 똑같이 @OneToMany 어노테이션을 추가하고,
mappedBy 대신 @JoinColumn 을 사용해 조인을 한다.

그러나 일대다 매핑에는 치명적인 단점이 존재한다🤔

  • 하나만 수정해도 다른 수정이 추가로 발생해 쿼리가 발생한다.
  • 따라서 일대다 단방향 연관 관계 매핑이 필요한 경우는 그냥 다대일 양방향 연관 관계를 매핑해버리는게 추후에 유지보수에 훨씬 수월하기 때문에 이 방식을 채택하는 것을 추천한다!

👀 다대일, 일대다 코드로 보기

Order.java

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id") // foreign key 는 '다'인 order 가 가짐
    private Member member;

Member.java

    // 연관관계의 주인이 아닌 쪽에는 'mappedBy' 사용
    // 여기서 member는 'Order 테이블에 있는 member 필드에 의해 mapped 됐다' 는 의미
    @OneToMany(mappedBy = "member")
    private List<Order> orders = new ArrayList<>();

🏷 일대일(1:1)

주 테이블에 외래키를 넣어도 되고, 대상 테이블에 외래키를 넣어도 된다.
다대일과 비슷하게, 외래키가 있는 쪽에 @OneToMany 어노테이션을 추가한다.
만약 일대일 양방향인 경우에는 mappedBy 설정을 추가해준다.

📌 일대일 단방향인 경우, 되도록 주 테이벌에 외래 키를 두는 것이 좋다.


👀 일대일 코드로 보기

Order.java

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "delivery_id") // 일대일인 경우, FK는 아무곳에나 있어도 되는데 여기서는 접근을 더 많이 하는 order 에 둠
    private Delivery delivery;

Delivery.java

    @OneToOne(mappedBy = "delivery", fetch = FetchType.LAZY)
    private Order order;

🏷 다대다(N:N)

다대다 매핑은 저번 포스팅에서 말했 듯, 중간 테이블이 숨겨져 있어 자기도 모르는 복잡한 조인 쿼리가 발생할 수 있기 때문에 실무에서 사용하지 않는 것을 권장한다!

profile
Backend Developer

0개의 댓글