Spring JPA Entity설계 시 주의점!

Yebali·2021년 4월 14일
1

약간의_Spring

목록 보기
10/30
post-thumbnail

Entity란?

Entity란 DB에서 영속적으로 저장된 데이터를 자바 객체로 매핑하여 '인스턴스의 형태'로 존재하는 데이터를 말합니다.
쉽게 말해서 DB와 직접 매핑되는 자바 객체입니다.

특히 JPA를 사용하면 Entity == DB table모양이 되기때문에 구현하는 비즈로직들의 기준이 되는 아이 같습니다.

이런 Entity를 설계시 주의할 점 몇가지를 적어보겠습니다.

1. Entity에는 가급적 Setter를 사용하지 말 것.

Entity가 영속성이 유지되는 도중 수정되면 그 값은 DB에 그대로 반영됩니다.
그런데 Setter를 열어두고 값을 변경하는 경우에는 변경 포인트가 많아 유지보수가 어려워 질 수 있습니다.
Setter보다는 .change()등의 매서드를 별도로 만들어 줍니다.

2. 모든 연관관계는 지연로딩으로 설정하다.

@ManyToOne(fetch = FetchType.LAZY)

즉시로딩(EAGER)를 사용 할 경우, 어떤 SQL이 나갈지 추적하기 어렵고 특히 N+1문제가 자주 발생합니다.
실무에서 개발 할때는 꼭 지연로딩(LAZY)로 설정합시다.
연관된 Entity를 함께 조회해야 한다면 fetch join을 사용 합시다.
@OneToOne, @ManyToOne관계는 기본적으로 즉시로딩(EAGER)이기 때문에 직접 설정해주어야 한다.

3. 컬렉션은 필드에서 바로 초기화하자.

컬렉션은 필드에서 바로 초기화 하는 것이 안전하다.
(특히 null 문제....)
하비어네이트는 Entity를 영속화 할 때, 하이버네이트가 제공하는 내장 컬렉션으로 변경한다. 그 때 '.Getchild()'같은 임의의 매서드를 잘못 사용하면 하이버네이트 내부에 문제가 발생할 수 있다.
그러니까 그냥 필드에서 바로 초기화 하자!!

@Entity
@Getter
public class Category {
			.
            		.
                    	.

    @OneToMany(mappedBy = "parent")
    private List<Category> child = new ArrayList<>();

   			.
            		.
                    	.
}

실무에서 엔티티는 핵심 비즈니스 로직만 가지고 있고, 화면을 위한 로직은 없어야 한다.
화면이나 API에는 그에 맞는 폼 객체나 DTO를 만들어서 사용할 것.

Entity는 최대한 순수하게 유지해야한다!!!

출처 : https://www.inflearn.com/users/@yh

profile
머리에 다 안들어가서 글로 적는 중

0개의 댓글