BackEnd/JPA
[Spring Data JPA] 연관관계 매핑 & 테이블 설계
이수밈
2024. 3. 1. 15:33
- 일대다, 다대일의 양방향 관계에서 연관관계의 주인을 정할 때 : 외래 키가 있는 주문을 연관관계의 주인으로 정하자
package jpabook.jpashop.domain;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
@Entity
@Table(name="orders")
@Getter @Setter
public class Order {
@Id
@GeneratedValue
@Column(name = "order_id")
private Long id;
//연관관계 주인이 되었다!
@ManyToOne
@JoinColumn(name = "member_id")
private Member member;
@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems = new ArrayList<>();
// 연관관계의 주인
@OneToOne
@JoinColumn(name = "delivery_id")
private Delivery delivery;
private LocalDateTime orderDate; //주문시간
@Enumerated(EnumType.STRING)
private OrderStatus status; //주문상태 [ORDER, CANCEL]
}
✨ EnumType은 Ordinal이 아닌 STRING으로 설정해주는 것이 미래를 위해 좋을 것..ㅋㅋ (ordinal은 숫자 0,1,2..)
package jpabook.jpashop.domain;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
@Entity
@Getter @Setter
public class Member {
@Id
@GeneratedValue
@Column (name = "member_id")
private Long id;
private String name;
@Embedded
private Address address;
//order테이블에 있는 member 필드에 의해 연관됨 (연관관계 주인 아님) - 매핑된 거울일 뿐..
@OneToMany(mappedBy = "member")
private List<Order> orders = new ArrayList<>();
}
- @Getter는 모두 열어두는 것이 편리하나, Setter는 호출하면 데이터가 변하기 때문에 모두 열어두면 안된다.
- 필요할 때만 열어둘 것!
- getter는 조회할 일이 많으므로 모두 열어두는 것이 좋지만, setter는 변경된 값을 추적하기 어려워짐!
- 다대다 매핑(@ManyToMany) 설계는 되도록이면 피하자.
- 중간 테이블에 컬럼 추가 불가능
- 세밀하게 쿼리 실행하기 어려움
- 중간 엔티티를 만들어 @ManyToOne과 @OneToMany로 매핑.
- 실무에서 엔티티 매핑은 모두 지연로딩으로 설정하자 (즉시로딩 금지!!)
- @XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시로딩(EAGER)이므로 직접 지연로딩(fetch = LAZY)으로 설정해줘야한다. (👁️👁️)