일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- spring
- Streams
- producer
- git
- Kubernetes
- offsetdatetime
- CodePipeline
- Spring Data JPA
- PAGING
- QueryDSL
- kafka
- centos7
- topic생성
- spring kafka
- AWS
- Entity
- Kotlin
- mirror maker2
- consumer
- JPA
- entity graph
- K8s
- CI
- API
- transactionaleventlistener
- mysql
- cd
- Spring JPA
- ECS
- bean
- Today
- Total
Yebali
Spring JPA Entity 설계 시 주의점 본문
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 |