JPA를 이용한 회원 주문서비스 설계

김재민·2022년 4월 14일
0
package hello.hellospring.domain;

import lombok.Getter;

import javax.persistence.Embeddable;

@Embeddable
@Getter
public class Address {

    private String city;
    private String street;
    private String zipcode;

    protected Address() {
    }

    public Address(String city, String street, String zipcode) {
        this.city = city;
        this.street = street;
        this.zipcode = zipcode;
    }
}

값 타입은 변경 불가능하게 설계해야 함.

@Setter를 제거하고, 생성자에서 값을 모두 초기화해서 변경 불가능한 클래스를 만들자. JPA 스펙상 엔티티나 임베디드(@Embeddable)은 자바 기본 생성자(default constructor)를 public또는 protected로 설정해야함. public으로 두는 것 보다는 protected로 설정하는 것이 그나마 더 안전함
JPA가 이런 제약을 두는 이유는 JPA 구현 라이브러리 객체를 생성할 때 리플렉션 같은 기술을 사용할 수 있도록 지원해야 함

엔티티 설계시 주의점

  1. 엔티티에는 가급적 Setter를 사용하지 말자
  2. Setter가 모두 열려있다면 변경 포인트가 너무 많아서, 유지보수가 어렵다.

모든 연관관계는 지연로딩으로 설정!

  1. 즉시로딩(EAGER)은 예측이 어렵고, 어떤 SQL이 실행될지 추적하기 어렵다. 특히 JPQL을 실행할 때 N+1 문제가 자주 발생함.
  2. 실무에서 모든 연관관계는 지연로딩(LAZY)으로 설정해야 한다.
  3. 연관된 엔티티를 함께 DB에서 조회해야 하면, fetch join 또는 엔티티 그래프 기능을 사용
profile
어제의 나보다 나은 오늘의 내가 되자!🧗‍♂️

0개의 댓글

관련 채용 정보