DTO(Data Transfer Object, 데이터 전송 객체)란 프로세스 간에 데이터를 전달하는 객체를 의미한다. 말 그대로 데이터를 전송하기 위해 사용하는 객체라서 그 안에 비즈니스 로직 같은 복잡한 코드는 없고 순수하게 전달하고 싶은 데이터만 담겨있다. 아래의 그림을 통해 DTO는 주로 클라이언트와 서버가 데이터를 주고받을 때 사용하는 객체임이 보여진다.
DTO가 왜 필요할까?
그냥 서버 안에서 대상이 되는 Entity 객체를 직접 Get, Set 해도 되는거 아닐까?
그래도 된다. 하지만 그에 따라 Entity 객체가 가지는 책임이 커지게 되고, 코드의 규모가 커지면 커질수록 Entity의 수정이나 변경은 아예 불가능하게 되어 버린다. 그리고 Entity 자체를 다루다 보니 만약 Entity에 비밀번호와 같은 민감한 정보가 쉽게 노출되는 경우가 발생해 버린다.
DTO대신 엔티티를 사용하면 엔티티 구조가 모두 노출될 수 있다.
DTO를 사용함으로서 엔티티 내부 구현을 캡슐화할 수 있습니다.
클라이언트로 넘겨줘야 할 데이터는 API마다 다를 수 있습니다. 때문에 엔티티를 반환값으로 사용하면 유지보수가 힘들어집니다.
엔티티와 DTO가 항상 동일한 상황이라면 DTO대신 엔티티를 사용해도 됩니다. 하지만 그런 일은 거의 없습니다.
요청 & 응답시마다 DTO를 생성하는 것은 엔티티만 사용했을 경우보다 더 많은 코드를 관리해야 합니다.
하지만 엔티티만 썼을 때 발생하는 코드 버그들과 유지보수의 난이도를 생각하면 훨씬 값싼 노동입니다.
DTO를 사용하면 클라이언트에 전달해야 할 데이터의 크기를 조절할 수 있습니다.
엔티티를 반환하면 불필요한 데이터가 클라이언트에 전송될 수 있습니다.
validation, swagger 등의 코드들과 엔티티 코드를 분리할 수 있습니다. 더 깔끔한 코드가 돼서 읽고 관리하기 용이해집니다.