첫 Spring 프로젝트인 Traduler에서는 DTO라는 데이터 전송 객체를 말 그대로 "그냥" 썼다. 대충 "보안상 문제때문에 클라이언트에게 보여질 데이터만 전달하는구나" 라고는 알고 있었지만 사실 다들 쓰니까 썼던 기억이 있다.
그리고 아직 진행중인 MyMiChef에서 또 다시 기계적으로 DTO 객체를 만들고 있는 나를 발견했다. 근거없는 코드를 쓰지 않겠다고 다짐했는데..
그래서 다음에 DTO에 대해서 제대로 공부해봐야 겠다 하고 있었는데, 마침 생각이 나서 포스팅 해보려 한다.
DTO는 데이터 전송 객체(Data Transfer Object)를 말한다. DTO는 데이터베이스나 외부 API와 같은 다른 소스에서 데이터를 가져와 컨트롤러나 서비스, 뷰 등에서 사용하는 데이터 객체이다. DTO는 가져온 데이터를 저장하거나, 새로운 데이터를 생성할 때 사용되며, 데이터 전송을 위한 필드만을 가지고 있다.
DTO의 주요 목적은 데이터 전송 과정에서 데이터 객체의 역할을 분리하는 것이다. DTO는 뷰와 서비스, 컨트롤러와 DAO 등 다른 계층 간 데이터 전송을 위한 중간 객체로 사용된다. 이를 통해 뷰와 서비스, 컨트롤러와 DAO 등 다른 계층 간 의존성을 줄일 수 있다.
DTO를 사용하는 이유
위와 같이 DTO의 개념과 사용하는 이유를 알아보았다.
내가 느끼기엔 DTO를 사용하는 목적이 보안을 제외하고는 유지보수 측면의 목적이 강하다는 느낌이 들었다.
그리고 다음과 같은 의문이 들었다.
"노출되어도 문제 없는 데이터면 DTO를 쓰지 않아도 되는게 아닌가?"
"클라이언트로부터 받아온 데이터는 DTO가 필요한가?"
알아본 바로는, 사실 보안상의 이슈가 없다면 DTO를 사용하지 않아도 무방하다.
하지만, 보안상으로 문제가 되지 않더라도 DTO를 사용하는 것에는 많은 이점이 있다.
그리고 클라이언트로부터 받은 데이터를 유효성 검사나 삭제 없이 엔터티로 사용하면 보안 문제가 발생할 수 있다. SQL 삽입, XSS(교차 사이트 스크립팅) 및 기타 유형의 삽입 공격과 같은 공격에 취약하다. 악의적인 사용자는 잠재적으로 서버로 전송되는 데이터를 조작할 수 있으며 이로 인해 데이터 손상, 손실 또는 도난이 발생할 수 있다.
DTO를 사용하여 클라이언트에서 수신한 데이터의 유효성을 검사하고 삭제하면 애플리케이션에서 항목을 생성하거나 업데이트하는 데 유효한 데이터만 사용하도록 하여 보안 취약점의 위험을 줄일 수 있다.
그렇다면 DTO를 쓰는게 무조건 좋을까?
내가 DTO에 대해 포스팅 하는 목적이 이것이다.
DTO를 쓰는데 오히려 코드베이스가 복잡해지고, 굳이 사용할 이유가 없어 보였기 때문이다.
실제로 DTO가 애플리케이션의 코드 품질을 저하시킬 수 있는 경우가 있다.
따라서 DTO는 특정 경우에 유용할 수 있지만, 관련된 장단점을 고려하여 신중하게 사용해야 한다. 경우에 따라 DTO를 사용하면 실제로 코드 품질이 저하될 수 있으므로 각각의 특정 경우에 DTO가 실제로 필요한지 여부를 고려하는 것이 중요하다.
보안, 유지보수, 설계 측면에서 DTO를 사용하는 것이 일반적으로 좋은 습관이 될 수 있다.
하지만 근거가 있는 코드를 작성하자.
참고 자료