스프링

[스프링] DTO를 왜 쓸까?

HHRR 2024. 1. 23. 18:17

Spring 프로젝트를 하면서 DTO를 왜 쓰는지 의문이 들었다. 사실 DTO가 정확히 와닿지도 않아서 정리를 해보려고 한다.

 

1. DTO(Data Transer Object)

DTO는 프로세스 간에 데이터를 전달하는 용도의 객체이다. 비즈니스 로직을 포함하지 않는 데이터를 전달하기 위한 단순한 객체이다.

  • 클라이언트와 Controller 사이에서는 DTO로 데이터를 전달받고
  • 어플리케이션 내부 (Service, Repository..)에서는 Domain(Entity 또는 Model)을 통해 데이터를 전달한다.

Service, Repository에서는 객체로 데이터를 전달하고,

Controller에서 DTO 객체로 매핑해서 클라이언트에 리턴한다.

 

2. DTO랑 Domain 분리하는 이유

2-1. 관심사의 분리 (Separation of Concerns, SoC)

MVC 사용하는 이유는 각각이 자신의 역할을 수행하며 유지보수가 편리하게 때문에 사용한다.

Controller는 중간다리 역할로 클라이언트와 요청/응답 하는 책임이 있고,

Model은 데이터베이스에서 받아온 데이터를 다루는 책임이 있다.

OOP 세상에서는 관심사의 분리를 통해 복잡한 시스템을 효율적으로 작동하게 한다. 즉, 애플리케이션에 같은 영향을 미치는 코드들끼리 분리한다.

 

2-2. 관심사의 수평적 분리

  • Presentation Layer: 애플리케이션의 기능과 데이터를 사용자에게 제공
  • Business Layer: 애플리케이션의 핵심 비즈니스 로직 및 나머지 두 계층 간에 전달되는 데이터 처리
  • Data Access Layer: 데이터베이스와 상호 작용하는 역할

여기서 DTO는 오직 데이터를 전달하는 목적으로 Presentation Layer에 속한다.

그리고 Domain은 비즈니스로직을 담은 Business Layer에서 역할을 수행한다.

두 객체를 분리하지 않는다면 Presentation과 Business가 혼합된 클래스가 탄생하게되는데 좋은 OOP를 위해서는 하나의 객체에는 하나의 책임만 존재해야 한다(변경이 있을 때 파급 효과를 최소화하기 위함) 그래서 DTO랑 Domain을 분리해야한다.

 

DTO 의 주요 목적은 한 번의 호출로 여러 매개 변수를 일괄 처리해서 서버의 왕복을 줄이는 것!

 

 

출처
https://e-una.tistory.com/72#1.2.1