Entity vs DTO 논쟁의 본질: 순수성인가, 실용성인가?
소프트웨어 설계에서 자주 반복되는 논쟁 중 하나는 바로 Entity를 Presentation Layer에서 사용하는 것이 적절한가? 하는 질문이다. 이 논쟁은 단순히 기술적인 분리가 옳으냐를 넘어서, 실용성과 유지보수 비용, 협업의 복잡성, 그리고 조직적 일관성이라는 주제를 포함하고 있다.
이 글에서는 실용주의 관점에서 Entity와 DTO 사이의 경계를 바라보고, 그에 따른 trade-off를 분석하고자 한다.
Entity는 Presentation Layer 에서 써도 되는가?
가능하다. Entity는 단순히 persistence 객체가 아니라 도메인 개념을 표현하는 모델이기 때문이다. 복잡한 변환이 필요 없는 단순 CRUD나 목록 조회 화면에서, DTO를 만드는 것은 오히려 과설계가 될 수 있다.
✅ 사용할 수 있는 근거
- 불변성과 은닉은 설계로 통제 가능 (
val,@JsonIgnore등) - 매핑/변환 없이 생산성과 유지보수성을 확보할 수 있다
- 단순 응답 모델에서는 오히려 DTO가 비용만 증가시킴
⚠️ 우려 사항들
Entity가 도메인 모델이라면 Presentation Layer에서 직접 사용하는 것은 지양해야 한다. 이유는 다음과 같다: • 도메인 캡슐화 침해: 화면 요구사항(View 특화 필드 등)이 도메인 내부로 침투할 수 있다. • 단일 책임 원칙 위배: 도메인은 비즈니스 규칙에 집중해야 하며, 표현 책임은 별도 객체가 가져야 한다. • 변경 전파 위험: 도메인 모델 구조 변경 시, View 및 API 응답 구조도 영향을 받을 수 있다. • 아키텍처 원칙 위배: Hexagonal Architecture 등 계층적 설계 원칙에서 도메인과 UI는 간접적으로만 연결되어야 한다.
따라서 도메인 모델은 Presentation Layer에 직접 노출되지 않도록, Response와 같은 표현 계층 전용 객체를 두는 것이 바람직하다.
Entity는 도메인 모델인가, 영속화 모델인가?
Entity는 원래 도메인 모델의 개념이다. 즉, 식별 가능한 객체이며 비즈니스 의미를 가진다.
하지만 실무에서는 흔히 @Entity 어노테이션을 통해 JPA 기반의 영속화 모델로도 사용된다. 이는 현실적인 경계 융합이며, trade-off를 전제로 한다면 수용 가능하다.
Entity에 @Entity 어노테이션이 붙는 것이 괜찮은가?
이론적으로는 기술 의존성 침투이며, Clean Architecture나 DDD에서 지양된다.
하지만 도메인 로직이 기술에 오염되지 않는 한, @Entity 정도의 침투는 허용 가능한 절충안이 될 수 있다.
단,
@Query,@Transactional같은 구체적인 persistence 행위가 도메인에 포함되는 것은 지양해야 한다.
저장소 설계와 도메인 모델이 충돌할 때?
이럴 땐 다음과 같은 전략이 필요하다:
- Projection DTO, ReadModel을 사용해 조회 모델 따로 설계
- ViewEntity나
@SecondaryTable같은 기능으로 DB 구조에 대응 - 도메인 모델은 유지하고, Repository 단에서 native query 처리로 흡수
