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)으로 설정해줘야한다. (👁️👁️)