# DTO란?
DTO(Data Transfer Object)란 계층간 데이터 교환을 하기 위해 사용되는 객체로 Getter/Setter만 가진 클래스- 주로 View와 Controller 사이에서 활용
- 데이터 전달만을 위한 객체이므로 java-record로 구현하면 좋음
# 도메인 대신 DTO를 사용하면 좋은 이유
DTO 대신 도메인 모델을 계층간 전달에 사용하면 도메인 모델을 캡슐화 하여 보호할 수 있다. view마다 필요한 정보가 다른데, 도메인 모델의 경우 필요하지 않은 정보까지 갖고 있기 때문이다.

- 해당 사진은 MVC 패턴(출처-위키백과)을 간략하게 나타낸 사진이다.
MVC 패턴에서 Controller는 Model과 View 사이에서 데이터를 주고 받는다. 이 과정에서 Model을 바로 Controller에게 넘겨준다면 View가 Model의 메서드를 호출하거나 상태를 변경시킬 위험이 존재한다. 또한 Model과 View가 강하게 결합되어 View의 요구사항 변화가 Model에 영향을 끼치기 쉽다.
Model의 속성이 변경되면, View가 전달받을 프론트엔드 코드에도 변경을 유발하기 때문에 상호간 강하게 결합되는 것이다.
엔티티와 DTO가 항상 동일한 상황이라면 DTO대신 엔티티를 사용해도 되지만 그럴 일은 거의 없다.
물론 요청 & 응답시마다 DTO를 생성하는 것은 엔티티만 사용했을 경우보다 더 많은 코드를 관리해야 한다. 하지만 엔티티만 썼을 때 발생하는 코드 버그들과 유지보수의 난이도를 생각하면 훨씬 값싼 노동이다.
# 코드로 알아보자.
- 아래와 같은 엔티티(Model)가 있을 때
| |
- DTO
| |
- Controller
| |
# 결과
useDTOController는 엔티티의 결과를 DTO로 변환하여 원하는 결과인 name과 result만 클라이언트에게 반환한다. 하지만 DTO를 사용하지 않게되면 User 객체 전체를 반환하게되어 불필요한 데이터까지 전달하게 되는 것이다.
# 공부한 걸 토대로 이해하고 그려본 유스케이스 설계도
!! 위 그림은 제가 이해한 걸 그린 거라 정확하지 않을 수 있어요. 양해 부탁드립니다 !!
혹시라도 틀린 점이 있다면 편하게 말씀 해주시면 감사하겠습니다. 🙇♀️