<aside>
1️⃣ 유지보수성
</aside>
- Service에서 Response Dto를 생성하여 Controller에 전달하면 Service가 View에 종속적이게 되어 응답의 Format 변경 시 Service도 변경되어 유지보수성이 좋지 않다.
<aside>
2️⃣ 유지보수성을 위한 방안 → 서비스에서 도메인을 넘긴다.
</aside>
- 이 말의 의미는, 서비스 레이어가 클라이언트에게 전달되는 데이터의 형식에 대해 알고 있으면, 그 형식이 변경될 때마다 서비스 레이어의 코드도 변경되어야 한다는 것이다.
- 이는 서비스 레이어가 클라이언트의 요구사항에 직접적으로 영향을 받게 되어, 클라이언트의 요구사항이 변경될 때마다 서비스 레이어의 코드도 변경되어야 한다는 것을 의미한다. 이는 유지보수성을 저해하는 요인이 될 수 있다.
- 예를 들어, 서비스 레이어에서 DTO를 생성하여 컨트롤러에게 전달하는 경우, 클라이언트가 요구하는 데이터의 형식이 변경되면, 그 변경사항을 반영하기 위해 서비스 레이어의 코드를 변경해야 한다. 이는 서비스 레이어가 클라이언트의 요구사항에 직접적으로 종속되어 있음을 의미한다.
- 반면에, 서비스 레이어에서는 엔티티를 사용하고, 컨트롤러 레이어에서 엔티티를 DTO로 변환하는 경우, 클라이언트가 요구하는 데이터의 형식이 변경되더라도, 그 변경사항을 반영하기 위해 변경해야 하는 코드는 컨트롤러 레이어의 코드뿐이다. 이는 서비스 레이어가 클라이언트의 요구사항에 직접적으로 종속되어 있지 않음을 의미한다.
- 따라서, 서비스 레이어에서는 엔티티를 사용하고, 컨트롤러 레이어에서 엔티티를 DTO로 변환하는 것이 유지보수성을 높이는 방법이다.
<aside>
3️⃣ 위험성
</aside>
- 유지보수성과 책임 관점을 따라서 Service에서 도메인을 Controller에 반환한다면 컨트롤러에서 도메인 로직이 실행되는 치명적인 위험이 발생할 수 있다.
<aside>
4️⃣ 위험성 해결을 위한 방안 → 서비스에서 dto를 넘긴다.
</aside>
- 이러한 이유로, 일반적으로 서비스 레이어에서는 도메인 객체를 직접 반환하지 않고, 대신 DTO(Data Transfer Object)를 사용하여 데이터를 컨트롤러에게 전달한다. 이렇게 하면, 컨트롤러에서 도메인 로직을 실행하는 위험을 피할 수 있다.
- 도메인 객체를 직접 컨트롤러에게 전달하면, 컨트롤러에서 도메인 객체의 상태를 변경하거나 도메인 로직을 실행할 수 있다. 이는 도메인 로직이 여러 곳에 분산되어 있게 되어, 코드의 유지보수가 어려워지고 버그가 발생할 가능성이 높아진다.
- 반면에, 서비스 레이어에서는 도메인 객체를 DTO로 변환하여 컨트롤러에게 전달하면, 컨트롤러는 DTO의 데이터만 읽을 수 있고, 도메인 로직을 실행할 수 없다. 이렇게 하면, 도메인 로직이 서비스 레이어에 집중되어, 코드의 유지보수가 용이하고 버그 발생 가능성이 낮아진다.
- 따라서, 서비스 레이어에서는 도메인 객체를 직접 반환하는 대신, 도메인 객체를 DTO로 변환하여 컨트롤러에게 전달하는 것이 좋다. 이렇게 하면, 도메인 로직의 캡슐화를 유지하면서도, 컨트롤러와 서비스 레이어 간의 데이터 전달을 효율적으로 처리할 수 있다.
<aside>
5️⃣ 유지보수성이냐 위험성해결이냐 어떤 방식을 선택해야할까?
</aside>
- 서비스 레이어에서 도메인 객체를 반환하는 것과 DTO를 반환하는 것 사이에서 선택하는 것은 여러 요인을 고려해야 한다.
- 도메인 로직의 캡슐화
- 서비스 레이어에서 도메인 객체를 반환하면, 컨트롤러가 도메인 로직에 접근할 수 있다. 이는 도메인 로직의 캡슐화를 깨트릴 수 있다. 반면에, 서비스 레이어에서 DTO를 반환하면, 도메인 로직은 서비스 레이어 내부에 캡슐화되고, 컨트롤러는 DTO를 통해 데이터를 전달받기만 한다. 이는 도메인 로직의 캡슐화를 유지하고, 도메인 로직에 대한 접근을 제한한다.
- 유지보수성
- 서비스 레이어에서 도메인 객체를 반환하면, 도메인 객체의 변경이 컨트롤러에도 영향을 미칠 수 있다. 이는 유지보수성을 저해할 수 있다. 반면에, 서비스 레이어에서 DTO를 반환하면, 도메인 객체의 변경이 컨트롤러에 영향을 미치지 않는다. 이는 유지보수성을 향상시킨다.
- 코드 복잡성
- 서비스 레이어에서 도메인 객체를 반환하면, 코드가 간단하고 직관적이다. 반면에, 서비스 레이어에서 DTO를 반환하면, 도메인 객체와 DTO 간의 변환 로직을 작성해야 하므로, 코드가 약간 복잡해질 수 있다.
- 성능
- 서비스 레이어에서 DTO를 반환하면, 도메인 객체와 DTO 간의 변환 작업이 필요하다. 이는 추가적인 CPU 시간을 소비하므로, 성능에 약간의 영향을 미칠 수 있다. 하지만 이는 일반적으로 무시할 수 있는 수준의 영향이다.
- 따라서, 이러한 요인들을 종합적으로 고려하여, 프로젝트의 요구사항과 상황에 따라 적절한 방식을 선택해야 한다. 일반적으로는 도메인 로직의 캡슐화와 유지보수성을 중요하게 생각한다면, 서비스 레이어에서 DTO를 반환하는 방식을 추천한다. 하지만 코드의 간결성과 직관성을 중요하게 생각한다면, 서비스 레이어에서 도메인 객체를 직접 반환하는 방식을 선택할 수도 있다.
<aside>
6️⃣ 출처
</aside>