본문 바로가기
백엔드개발자/SPRING, JPA 등...

엔티티 또는 도메인 객체와 DTO를 분리해야 하는 이유?

by 보혀니 2022. 2. 18.

1. 관심사의 분리

 엔티티와 DTO를 분리해야 하는 가장 근본적인 이유는 관심사가 서로 다르기 때문이다.

관심사의 분리(separation of concerns, SoC)는 소프트웨어 분야의 오래된 원칙 중 하나로써, 서로 다른 관심사들을 분리하여 변경 가능성을 최소화하고, 유연하며 확장가능한 클린 아키텍처를 구축하도록 도와준다.

DTO(Data Transfer Object)의 핵심 관심사는 이름 그대로 데이터의 전달이다. DTO는 데이터를 담고, 다른 계층(Layer) 또는 다른 컴포넌트들로 데이터를 넘겨주기 위한 자료구조(Data Structure)이다. 그러므로 어떠한 기능 및 동작도 없어야 한다.

반면에 엔티티는 핵심 비지니스 로직을 담는 비지니스 도메인의 영역의 일부이다. 그러므로 엔티티 또는 도메인 객체는 그에 따른 비지니스 로직이 추가될 수 있다. 엔티티 또는 도메인 객체는 다른 계층이나 컴포넌트들 사이에서 전달을 위해 사용되는 객체가 아니다.

엔티티와 DTO는 엄연히 서로 다른 관심사를 가지고 있고, 그렇기 때문에 분리하는 것이 합리적이다.

 

2. Validation 로직 및 불필요한 코드 등과의 분리

 Spring에서는 요청에 대한 데이터를 검증하기 위해 @Valid 어노테이션을 지원하고 있다. 

@Valid 처리를 위해서는 @NotNull, @NotEmpty, @Size 등과 같은 유효성 검증 어노테이션들을 변수에 붙여주어야 한다. 반면에 JPA도 변수에 @Id, @Column 등과 같은 어노테이션들을 활용해 객체와 관계형 데이터베이스를 매핑해주는데, DTO와 엔티티를 분리하지 않는다면 엔티티의 코드가 상당히 복잡해진다.

만약 엔티티와 DTO를 분리하지 않으면 다음과 같은 끔찍한 클래스가 탄생하게 된다

 

'백엔드개발자 > SPRING, JPA 등...' 카테고리의 다른 글

JPA 기본 메서드 정리  (0) 2022.02.23
Bean Scope(빈 스코프)의 종류  (0) 2022.02.21
@PathVariable, @RequestBody, @RequestParam  (0) 2022.02.17
@RequestParam, @PathVariable  (0) 2022.02.17
@valid , BindingResult  (0) 2022.02.14