[Spring][JPA] (TIL) 엔터티 구성

이준규·2022년 2월 5일
0

백엔드

목록 보기
7/13

오늘 도메인 분석해서

entity 클래스를 구성하는 개발해보면서 배운거


Setter

개발중이 아니고 실무에서는 변경포인트를 열어주는 Setter를 열어 놓지 말자.


JPA Cascade Type

Spring JPA CascadeType 종류
javax.persistence.CascadeType

  • ALL
  • PERSIST
  • MERGE
  • REMOVE
  • REFRESH
  • DETACH

이 중에서

CascadeType.ALL

상위 엔터티에서 하위 엔터티로 모든 작업이 전파된다

출처: https://data-make.tistory.com/668 [Data Makes Our Future]

주문은 여러개의 주문상품을 가짐 > 하위엔터티는 OrderItems

@Entity
@Table(name = "orders")
@Getter @Setter
public class Order {

    @Id @GeneratedValue
    @Column(name = "order_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<>();

}

OrderItem 엔터티


import javax.persistence.*;

@Entity
@Getter @Setter
public class OrderItem {

    @Id @GeneratedValue
    @Column(name = "order_item_id")
    private  Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "order_id")
    private Order order;

    private int orderPrice;
    private int count;
}

위의 @ManyToOne 어노테이션에 속성
fetch = FetchType.LAZY 에 대해서도 배웠음

모든 연관관계를 지연로딩으로 설정하자

  • 즉시로딩(FetchType.EAGER) 는 예측이 어렵고 추적하기 어려움
  • 실무에서는 모든 연관관계를 LAZY(지연로딩)으로 설정해야하고 연관된 엔티티를 함께 조회해야한다면 fetch join, 엔티티 그래프 기능을 사용하면됨
  • @XToOne(OneToOne, ManyToOne) 관계는 기본이 즉시로딩이므로 직접 지연로딩으로 설정해야함

테이블 , 컬럼명 생성에 대해

하이버 네이트 기존: 엔티티 필드명 그대로 테이블 컬럼명으로 사용
SpringPhysicalNamingStrategy

스프링부트 신규 설정 (필드 -> 컬럼)

  • 카멜케이스 -> 언더스코어로 자동변경 (orderItem -> order_item)
  • 점 -> 언더스코어
  • 대문사는 소문자
  • 논리명 생성: 명시적으로 컬럼, 테이블명을 직접 적지 않으면 ImplicitNamingStrategy 사용
  • spring.jpa.hibernate.naming.physical-strategy : 모든 논리명에 적용됨, 실제 테이블에 적용 (username usernm 등으로 회사 룰로 바꿀 수 있음)

연관관계 메서드

@Entity
@Table(name = "orders")
@Getter @Setter
public class Order {

    @Id @GeneratedValue
    @Column(name = "order_id")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "member_id")
    private Member member;

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<>();

    @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    @JoinColumn(name = "delivery_id")
    private Delivery delivery;

    private LocalDateTime orderDate;

    @Enumerated(EnumType.STRING)
    private OrderStatus status; //order, cancel

    //==연관관계 메서드==//
    public void setMember(Member member) {
        this.member = member;
        member.getOrders().add(this);
    }
    public void addOrderItem(OrderItem orderItem) {
        orderItems.add(orderItem);
        orderItem.setOrder(this);
    }
    public void setDelivery(Delivery delivery) {
        this.delivery = delivery;
        delivery.setOrder(this);
    }
    //
}

데이터베이스 테이블끼리 연관성을 주입해서 구성했지만 자바 코드내에서도 연관성을 사용하기 위해 연관관계를 명시하기위한 메서드

라고 이해함

profile
백엔드

0개의 댓글