[Spring] DTO(Data Transfer Object)

한호성·2022년 8월 4일
0

글의 목적

스프링 공부하면서, DTO를 통해 request 를 받고, response를 내보내주었다. DTO 개념에 대해 간단하게 정리하고, 왜 사용해야하는지에 대해 알아보자

DTO 개념

기본 용어 개념

  • DTO는 계층 간 데이터 교환을 하기 위해 사용하는 객체로, DTO는 로직을 가지지 않는 순수한 데이터 객체 (Getter & Setter만 가진 클래스)이다.
_#cf) 계층에 대한 이해를 하기 위해서는 Spring 의 MVC 패턴을 이해해야하는데 이 MVC에 대한 
자세한 패턴은 따로 자세히 공부해서 게시글에 올리도록 하자

사용예시

사진에 보면 Dto pacakage 와 model(Entity) 패키지를 나누어서 관리하는 것을 알 수 있다.

사용이유

그렇다면 왜 나누어서 사용할까? 만약 DTO를 사용하지 않고, Model의 데이터를 통해 각 계층간 데이터 교환이 이루어진다면 발생할 수 있는 문제점은

  1. 도메인 Model의 모든 속성이 외부에 노출됩니다. (필요하지 않은 데이터까지 외부에 노출)
    User 같이 민감한 데이터가 외부에 노출되는 것은 보안과 직결되는 이야기입니다.

  2. User 정보가 담긴 객체를 여러 계층에 사용할 때, 상태를 변경시키고, 그것이 User DB데이터에 영향을 줄 수 있습니다.

  3. Model 과 View가 강하게 결합되어 Model에 영향을 미치기 쉽습니다. (DTO가 아닌 Entity를 통해 외부에 정보를 전달할 경우 View를 변하게 하기 위해서 Model을 변경해야 합니다.)

이러한 문제점을 DTO를 사용하면, Model의 캡슐화 및 View에서 필요로만 하는 데이터를 선택적을 내보낼 수 있습니다.

Layer간 데이터 교환시 어느 영역에서 DTO와 Domain 간의 변환되어야 할까?

앞선 내용을 읽어보면 Presentation 영역의 view model의 DTO를 통한분리에 대해서만 이야기했다.
Layered 간의 사용시 Domain 과 DTO를 어디서 변경해서 사용하는게 맞을까?

  • Controller - > Service (requestDto)
  1. Controller에서 dto->domain 변환 후, service에 전달.
  2. Controller 에서 dto -> service 전달 후 , service 에서 domain으로 변경하여서 사용
  • Service -> Controller (reponseDto)
  1. service 에서 domain을 controller 에 전달 후 ,domain에서 responsedto 생성 후 response
  2. service 에서 responseDto를 생성 후 , Controller에게 전달 후 response

각각의 경우의 2가지의 경우를 생각해 볼 수 있겠다. DTO의 사용목적을 생각했을 때, 계층간 데이터 전달을 위해 사용한다고 하니, 2번의 경우가 타당하다고 생각할 수 있겠다.

또한 Dto를 entity model로 변경하는 로직이 복잡한 경우 Controller에서 service 로직을 수행하게 된다.

DTO의 사용목적 및 계층으로 나누어진 정의를 생각해봤을 때, service에서 DTO domain 변환이 타당해 보인다.

내가 참고한 자료의 리뷰어님의 말씀을 보면, 정확한 정답은 없지만,
service 계층에 DTO가 들어가면 안된다고 생각하신다고 말씀하신다. 이유로는 여러 종류의 컨트롤러에서 해당 서비스를 사용할 수 있기 때문이다라고 한다.

솔직히 아직 코드를 복잡하게 짜보지 않아서 와닿지 않지만 일단 그렇다고 생각하자

다른견해로는 한 종류의 컨트롤러가 보통 하나의 서비스를 사용하기 때문에 제안할 이유가 있냐? 라는 의견도 있다고 합니다. 그렇기 때문에 보통 코드들은 DTO 진입을 서비스로 허용하되 서비스 메소드 상위에서 DTO 체크 및 도메인 변환을 하고 이후에는 DTO를 사용하지 않는다고 합니다.
반환 같은 경우에는 객체를 내보내고 controller에서 dto를 변환한다고 한다.

일단 보통의 사람들은 위와 같이 사용한다고 하니, 직접 2가지 방식을 다 사용해보고 ,복잡한 로직을 구현하다보면 깨달음이 오지 않을까? 라고 생각한다. 분명 유지보수 하는데 있어서 편한 방법이 있고, 그 방법이 왜 편한지 어떤면에서 좋은지 생각하면서 코드를 돌아보면 좋겠다.

Reference

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

profile
개발자 지망생입니다.

0개의 댓글