Framework/Spring

[Spring] DTO

JM Lee 2024. 4. 17. 02:25
728x90
정의
  • Data Transfer Object
  • 프로세스 간에 데이터를 전달하는 용도의 객체
  • 주로 서로 다른 시스템 간에 데이터를 전송할 때 사용
  • 비즈니스 로직을 포함하지 않는 데이터를 전달하기 위한 단순한 객체
  • DTO는 데이터를 캡슐화하여 전송 시에 데이터의 무결성을 유지
  • 데이터 전송의 효율성을 높임

 

 

사용 이유

 

스프링 부트와 같은 MVC 패턴에서는, 보통 클라이언트와 컨트롤러 사이에서 DTO의 필요성이 생긴다.

아래 User 도메인은 위 그림과 같은 흐름으로 사용자와 DB 사이에서 이동하게 된다. 

public class User {

    private String id;
    private String name;
    private String email;
    private String password;

    public User(String name, String email, String password) {
        this.name = Objects.requireNonNull(name);
        this.email = Objects.requireNonNull(email);
        this.password = this.encrypt(password);
    }

그런데 보면 password 필드도 저렇게 자유롭게 이동하는 것이 일반적일까? 그렇지 않다. 이처럼 password처럼 숨겨야 하는 값들은 User 외 다른 도메인에도 들어있을 것이다.

 

public class UserDTO {

    private String name;
    private String email;

    public UserDTO(String name, String email) {
        this.name = name;
        this.email = email;
    }

    // Getters and setters
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

불필요한 데이터인 id와 password를 제외한 속성을 DTO로 적용했다. 

 

일반적으로 RESTful API에서는 POST 요청을 통해 데이터를 생성하거나 수정할 때는 클라이언트에서 DTO를 사용하여 데이터를 전송하고, 서비스나 리포지토리 레이어에서는 해당 DTO를 User 객체로 변환하여 처리한다. 반대로, GET 요청을 통해 데이터를 조회할 때는 서비스나 리포지토리 레이어에서 User 객체를 DTO로 변환하여 컨트롤러에 반환하고, 컨트롤러에서는 해당 DTO를 클라이언트에 반환한다.

결국 이 그림을 정확하게 이해해야 한다.

 

 

 

DTO와 Domain 분리 이유

 

간단하게 이유부터 설명하자면 아래와 같다.

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

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

 

기본적으로 두 가지 개념은 서로 다른 개념이기 때문에 결국 스프링부트에서 수행하는 역할도 다르다.

만약 DTO와 Domain이 똑같아 분리의 의미가 사라지는 경우에도 마찬가지다.

 

Controller Layer와 Service Layer가 같은 객체를 사용할 시, 의존성 문제가 생기고 각 Layer가 독립적으로 변경되지 않는다. 당연히 협업에서도 문제가 된다.

"하나의 역할에는 하나의 책임만 지게 하는 단일책임원칙(SRP)을 지켜야 한다." 로 요약할 수 있겠다.

 

참조

https://umbum.dev/1206/

 

(Spring) MVC Layered Architecture - DTO와 Domain Model을 분리해야 하는 이유

그림1

umbum.dev

https://e-una.tistory.com/72

 

[Spring Boot] DTO 는 왜, 언제 사용할까?

오늘은 Spring Boot 프로젝트를 시작할 때마다 고민의 대상이 되는 DTO 에 대해 알아보도록 하겠습니다. 매번 DTO 의 필요성에 대해 깊이 고민하지 않고 사용해서 그 기준을 잡기가 어려웠는데요. 이

e-una.tistory.com

https://frogand.tistory.com/152

 

[Spring] 엔티티(Entity) 또는 도메인 객체(Domain Object)와 DTO를 분리해야 하는 이유

개발을 하다보면 API의 요청이나 응답을 처리할 때 또는 다른 계층으로 넘기는 파라미터가 너무 많은 시점에 별도의 DTO를 생성하는 것이 좋습니다. [엔티티(Entity) 또는 도메인 객체(Domain Object)와

frogand.tistory.com