Yebali

Spring JPA Entity 설계 시 주의점 본문

Spring

Spring JPA Entity 설계 시 주의점

예발이 2021. 10. 11. 19:01

Entity란?

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

JPA를 사용할 때 Entity 클래스의 멤버 변수(프로퍼티)들은 DB table의 Column으로 매핑되기 때문에 비즈로직의 중심에 있다.

이런 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는 최대한 순수하게 유지하자.

'Spring' 카테고리의 다른 글

Spring을 이용한 API개발 - 기본  (0) 2021.10.11
Spring JPA 준영속 엔티티 수정하기  (0) 2021.10.11
Spring JPA 1:N 관계 설정  (0) 2021.10.10
Spring Bean의 생명주기  (0) 2021.10.10
Spring Bean 등록/설정 방법  (0) 2021.10.04