[Spring] JPA 연관관계 매핑 해보기 😎
지난 시간에 이어 이번에는 실제 코드를 통해 연관관계 매핑을 심도있게(?) 알아보는 시간을 가지겠다😎
추울~발~ㅎ
🏷 다대일(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)
다대다 매핑은 저번 포스팅에서 말했 듯, 중간 테이블이 숨겨져 있어 자기도 모르는 복잡한 조인 쿼리가 발생할 수 있기 때문에 실무에서 사용하지 않는 것을 권장한다!
Author And Source
이 문제에 관하여([Spring] JPA 연관관계 매핑 해보기 😎), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sorzzzzy/Spring-JPA-연관관계-매핑-해보기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)