Entity란 DB에서 영속적으로 저장된 데이터를 자바 객체로 매핑하여 '인스턴스의 형태'로 존재하는 데이터를 말합니다.
쉽게 말해서 DB와 직접 매핑되는 자바 객체입니다.
특히 JPA를 사용하면 Entity == DB table모양이 되기때문에 구현하는 비즈로직들의 기준이 되는 아이 같습니다.
이런 Entity를 설계시 주의할 점 몇가지를 적어보겠습니다.
Entity가 영속성이 유지되는 도중 수정되면 그 값은 DB에 그대로 반영됩니다.
그런데 Setter를 열어두고 값을 변경하는 경우에는 변경 포인트가 많아 유지보수가 어려워 질 수 있습니다.
Setter보다는 .change()등의 매서드를 별도로 만들어 줍니다.
@ManyToOne(fetch = FetchType.LAZY)
즉시로딩(EAGER)를 사용 할 경우, 어떤 SQL이 나갈지 추적하기 어렵고 특히 N+1문제가 자주 발생합니다.
실무에서 개발 할때는 꼭 지연로딩(LAZY)로 설정합시다.
연관된 Entity를 함께 조회해야 한다면 fetch join을 사용 합시다.
@OneToOne, @ManyToOne관계는 기본적으로 즉시로딩(EAGER)이기 때문에 직접 설정해주어야 한다.
컬렉션은 필드에서 바로 초기화 하는 것이 안전하다.
(특히 null 문제....)
하비어네이트는 Entity를 영속화 할 때, 하이버네이트가 제공하는 내장 컬렉션으로 변경한다. 그 때 '.Getchild()'같은 임의의 매서드를 잘못 사용하면 하이버네이트 내부에 문제가 발생할 수 있다.
그러니까 그냥 필드에서 바로 초기화 하자!!
@Entity
@Getter
public class Category {
.
.
.
@OneToMany(mappedBy = "parent")
private List<Category> child = new ArrayList<>();
.
.
.
}
실무에서 엔티티는 핵심 비즈니스 로직만 가지고 있고, 화면을 위한 로직은 없어야 한다.
화면이나 API에는 그에 맞는 폼 객체나 DTO를 만들어서 사용할 것.