프로그래밍을 공부하면서 DTO(Data Transfer Object)의 개념을 접하게 되었고, 그 역할과 사용 방법 등에 대해 많은 생각을 하게 되었습니다. 지금부터 제 고민과 나름의 답에 대해 기록해보려 합니다.
목차
왜 모든 엔티티 속성 요청에도 DTO를 사용해야 하는가
변환 로직 코드, 어디에 작성하는 게 좋을까
사용하면 무엇이 효율적이라는 건지
왜 모든 엔티티 속성 요청에도 DTO를 사용해야 하는가
이 문제는 DTO가 수행하는 역할을 이해하면 명확한 답이 나옵니다. DTO를 사용하는 이유는 단순히 데이터를 효율적으로 전송하는 목적에만 있지 않습니다. 명시적 계약과 보안, 데이터 형식 변환 등을 위한 중요한 역할을 한다는 것이었습니다.
- 명시적 계약 수립
엔티티의 모든 속성이 필요하다 하더라도, DTO를 사용하면 API의 응답 구조에 대한 명확한 정의가 가능합니다. 특히, 이후 엔티티 구조가 변경되더라도 외부에 미치는 영향이 최소화됩니다. 이는 코드의 유지보수성과 확장성을 높이는 데 중요한 역할을 합니다. - 보안
엔티티에 민감한 정보나 내부 로직이 포함될 수 있기 때문에, DTO를 통해 이러한 정보를 외부에 노출하지 않도록 할 수 있습니다. 예를 들어, 클라이언트에게는 필요하지 않은 내부 ID나 상태 값 등을 숨기고 필요한 정보만 제공할 수 있습니다. - 형식 변환
엔티티의 데이터 형식이 클라이언트에서 요구하는 형식과 다를 수 있습니다. 이때 DTO를 사용하여 데이터를 변환하거나 포맷을 맞추는 작업을 할 수 있습니다.
따라서, 엔티티의 모든 속성을 요청하는 경우라도 DTO를 사용해야 한다는 결론을 내리게 되었습니다. DTO는 단순히 데이터를 전달하는 객체가 아니라, 여러 측면에서 중요한 역할을 담당하기 때문입니다.
변환 로직 코드, 어디에 작성하는 게 좋을까
DTO와 엔티티 간의 변환 로직을 어디에 두어야 할지에 대한 고민도 계속되었습니다. 처음에는 변환 로직을 서비스 계층에 두는 것이 자연스럽다고 생각했지만, 점점 더 고민이 깊어졌습니다. 예를 들어, 서비스 계층에 모든 변환 로직을 넣으면 서비스 코드가 복잡해지고, 변환 로직이 계속 늘어나는 문제가 발생할 수 있겠다는 생각이 들었습니다.
- 서비스 계층 내 변환:
- 장점: 비즈니스 로직과 함께 변환할 수 있는 장점이 있지만, 서비스 계층이 너무 많은 역할을 하게 되어 코드가 복잡해지고 유지보수가 어려워질 수 있습니다.
- 단점: 여러 변환 로직이 얽히게 되면 관심사가 분리되지 않아서 서비스 계층이 과도한 책임을 지게 될 위험이 있습니다.
- DTO 내부의 정적 팩토리 메서드:
- 장점: DTO 클래스 내부에 변환 메서드를 두면, 변환 책임이 한 곳에 집중되어 가독성이 좋습니다. 또한, 변환 로직을 재사용할 수 있어 코드가 간결해질 수 있습니다.
- 단점: 변환 로직이 DTO 클래스에 집중되면, DTO 클래스가 비대해지고 복잡해질 수 있습니다.
- 별도의 Mapper 클래스 사용:
- 장점: 변환 로직을 별도의 Mapper 클래스로 분리하면, 코드가 깔끔해지고 변환 로직의 테스트도 용이합니다. 또한, 여러 DTO와 엔티티 간의 변환을 효율적으로 처리할 수 있습니다.
- 단점: 추가적인 클래스가 생겨서 코드가 복잡해질 수 있지만, 이는 규모가 커지는 프로젝트에서는 유리할 수 있습니다.
사용하면 무엇이 효율적이라는 건지
여기서 효율은 데이터 전송 측면에서의 최적화를 뜻합니다. 구체적으로는 대역폭 절약(bandwidth saving)과 데이터 크기 축소(data size reduction)를 포함합니다. DTO를 사용하면 어떤 효율성을 높일 수 있는지 항목별로 더 자세히 살펴봅시다.
- 불필요한 데이터 제외 (Data Exclusion)
DTO는 엔티티에 비해 필요한 데이터만 포함하므로, 불필요한 데이터가 전송되지 않습니다. 이렇게 함으로써 대역폭을 절약하고, 네트워크 자원을 낭비하지 않습니다. 예를 들어, 클라이언트가 불필요한 엔티티의 필드를 요구하지 않을 때 DTO를 통해 꼭 필요한 필드만 보내는 것입니다. - 데이터 크기 축소 (Data Size Reduction)
DTO는 일반적으로 엔티티보다 더 작은 크기로 데이터를 전송할 수 있습니다. 엔티티는 보통 데이터베이스에 저장된 구조를 그대로 반영하는 반면, DTO는 클라이언트에 전달될 목적에 맞게 데이터의 구조나 형식을 변경할 수 있습니다. 이로 인해 전송되는 데이터의 양이 줄어들어 데이터 전송의 효율성을 높이게 됩니다. - 네트워크 성능 개선 (Network Performance Improvement)
DTO를 사용하면 불필요한 필드나 데이터를 전송하지 않기 때문에 네트워크 성능이 개선될 수 있습니다. 예를 들어, 대용량 데이터를 포함하는 엔티티를 그대로 전달하는 대신, 필요한 정보만 포함된 DTO를 사용하면 전송되는 데이터 양을 줄여서 더 빠르게 네트워크가 동작하게 됩니다.
참고 자료:
DTO를 어디까지 사용하는게 좋을까
728x90