[Spring] DTO 에 대하여

2022. 4. 7. 16:14Web/Spring

강의를 들으면서 DTO라는 개념이 존재하고 DTO의 이론적인 설명에 대해 이해하는데 부족한 점이 있어 검색을 하던 중 Tecoble이라는 기술 블로그 사이트에서 좋은 글이 있어 그 글 토대로 정리해보려 한다. 

 

먼저 DTO 란?

계층 간의 데이터 교환을 위해 사용하는 객체 이다.

 

 

- MVC 패턴은 개발할 때 구성 요소를 Model과 View , Controller 등 세 가지 역할로 구분하는 디자인 패턴중 하나이다. Model 과 View는 서로의 존재를 인지하지 못하고, Controller가 중간에서 연결을 한다.

- Model 과 View를 분리함으로써 서로의 의존성을 낮추고 독립적인 개발을 가능하게 한다.

- Controller는 View와 도메인 Model의 데이터를 주고받을 때 별도의 DTO를 사용한다. 도메인 자체를 전달할 수 있지만, 문제가 생길 도메인이 노출될 수 있고 Model과 View 사이에 의존성이 생기기 때문에 DTO를 사용하는 것이 좋다.

 

Controller 가 클라이언트 요청에 대해 도메인 Model 자체를 넘겨주면 어떤 문제가 생길까?

 

- 불필요한 도메인 Model의 모든 속성들이 외부에 노출이 된다.

- UI에서 Model의 메서드를 호출하거나 상태를 변경시킬 위험이 존재한다.

즉, View의 요구사항 변화가 Model에 영향을 끼치기 쉽다.

 

하지만 DTO를 사용하면 도메인 Model을 캡슐화하고, UI 화면에서 사용하는 데이터만 선택적으로 보낼 수 있다.

DTO는 클라이언트 요청에 포함된 데이터를 담아 서버 측에 전달하고, 서버 측의 응답 데이터를 담아 클라이언트에 전달하는 계층 간 전달자 역할이다.

 

그다음 내용으로는 DTO와 Domain 간의 변환 위치가 Controller 계층 이어야 하는지 Service 계층이어야 하는지에 대한 이야기가 나오는데 정확한 답은 없다.

원칙적으로 Service계층에 DTO 가 들어오면 안 된다는 분도 있는데 이유는 그래야 여러 종류의 컨트롤러에서 서비스를 사용할 수 있기 때문이다. 하지만 현업에서는 여러 종류의 컨트롤러가 한 서비스를 사용하기 보다는 한 종류의 컨트롤러가 서비스를 쓰기 때문에 크게 제한을 두지 않는다는 의견도 있어 이 부분은 조금 더 고민하고 더 나은 방향을 찾아봐야 할 것 같다.

 

[참고자료]

https://tecoble.techcourse.co.kr/post/2021-04-25-dto-layer-scope/

 

DTO의 사용 범위에 대하여

1. DTO란? DTO(Data Transfer Object)란 계층간 데이터 교환을 위해 사용하는 객체(Java Beans)입니다. 간략하게 DTO의 구체적인 용례 및 필요성을 MVC 패턴을 통해 알아볼까요? 🚀 1.1. MVC 패턴 MVC…

tecoble.techcourse.co.kr

 

728x90