MVVM + 클린 아키텍처를 공부하던 중, DTO(Data Transfer Object)라는 개념에 대해 알게되었습니다.
설명 중 "DTO는 Domain(Entity)를 다른 레이어간에 주고 받을 때 Domain의 비즈니스 로직을 캡슐화하기 위해 사용된다"라는 글을 읽던 와중 Domain? Entity? Model?의 개념은 정확히 어떤 것인지에 대한 궁금증이 생겼습니다. 그리고 클린 아키텍처에서도 Domain, Entity라는 개념이 사용되는데, 정확한 뜻을 모르고 대략 넘겨짚었어서....🥲
그래서 오늘은 Domain, Entity가 각각 어떤 개념인지 알아보려고 합니다!
학습하며 작성한 글이라 부족한 점이 많습니다.
🌷피드백, 의견 나눔은 늘 환영입니다🌷
먼저 DTO를 공부하다가 알게된 Layered Architecture, 계층화 아키텍쳐에 대해 잠깐 알아보도록 하겠습니다.
DTO는 계층간 데이터 교환을 위해 사용되는 객체로, 즉 계층으로 이루어진 아키텍처인 Layered Architecture에서 사용됩니다.
layered architecture도 아키텍처 스타일 중 하나로, 비슷한 기능의 모듈과 컴포넌트를 수평한 레이어로 구성하여, 각 레이어는 애플리케이션에서 특정할 역할을 수행합니다. 각 레이어별로 관심사를 분리하는데 목적이 있습니다. 관심사 분리를 통해 각 레이어간 독립적 개발을 용이하게 하고, 설계의 유연성을 높일 수 있습니다.
layered architecture를 검색해보면 3-tier 아키텍처가 가장 많이 눈에 띕니다. 3-tier 아키텍처란 presentation layer
, businessLogic layer
, data access layer
3개의 레이어로 구성된 아키텍처입니다.
그럼 클린 아키텍처도 layered architecture일까요?
네 맞습니다. 클린 아키텍처도 layered architecture를 구현한 아키텍처 중 하나입니다.
그러나 3-tier와는 다르게 DomainLayer(Entity)를 계층의 중심에 두고 있는 형태입니다.
먼저, 위키백과의 정의를 살펴보겠습니다.
도메인은 일반적인 요구사항, 전문 용어, 그리고 컴퓨터 프로그래밍 분야에서 문제를 풀기 위해 설계된 어떤 소프트웨어 프로그램에 대한 기능성을 정의하는 연구의 한 영역이다. 도메인 엔지니어링이라고도 알려져 있다.
도메인은 "기획의 요구사항을 구현하고, 문제를 풀기 위해 설계된 소프트웨어 프로그램의 기능성을 정의하는 영역"이라고 설명합니다.
잘 와닿지 않았는데, 다른 블로그에서 이해하기 쉽게 풀어내고 있어 설명을 가져와봤습니다.
블로그에 따르면 앱의 기능, (기획의) 요구사항을 개발하는 영역을 도메인이라고 정의하고 있습니다. 예를 들어 택시 앱이라면, 도메인은 기사님께 콜을 요청하고, 탑승하고, 요금을 지불하는 과정을 포함하고 있다고 합니다. 또한 도메인 레이어의 결과를 도메인 모델이라 하며, 도메인 모델을 가지고 기획자와 개발팀이 요구사항을 올바르게 이해했는지 확인할 수 있고, 의사소통의 도구로도 사용될 수 있습니다.
즉, 도메인이란 "사용자가 이용하는 앱의 기능, 회사의 비즈니스 로직을 정의하고 있는 영역"이라고 이해해 볼 수 있겠습니다.
Entity는 일반적으로 존재하는 것, 즉 실체를 의미합니다.
다양한 컨텍스트에서 Entity의 의미는 다양하게 구체화 되어 사용됩니다. 즉 사용되는 상황에 따라 다른 의미를 갖고 있습니다. Entitiy의 다양한 해석
- 실제 DB의 테이블과 매핑되는 객체. identifier로 구분된다.(DB관련 영속성 엔티티)
- 비지니스 로직을 포함하는 도메인 엔티티
DTO는 Entity의 변경을 최소화하기 위해 탄생했습니다. 따라서 DTO에서 Entity를 사용할 때, 도메인 엔티티가 될 수도, DB의 영속성 엔티티가 될수도 있습니다.
전사적 비즈니스 규칙을 캡슐화합니다. 메서드를 가지는 객체가 될 수 도 있고, 데이터 구조체, 함수가 될 수도 있습니다. 가장 높은 수준의 규칙을 캡슐화하고 외부 변화에 의해 가장 변하지 않는 부분입니다.
비즈니스 로직을 캡슐화한 객체라는 의미로 사용됩니다.
프로그램 아키텍처, 사용언어에 따라 조금씩 의미가 달라질 수 있어서 사용되는 컨텍스트를 고려해 해석해야한다는 걸 배웠습니다! 대략적인 개념은 잡았지만, 명쾌하게 풀린 것 같지 않네요ㅠㅠ
ios외의 개발 영역(java, Spring등)의 기술 블로그도 찾아보며, 플랫폼에 상관없이 프로그래밍은 동일한 관심사들을 공유하고 있다는 걸 다시 느겼던 흥미로운 시간이었네요 😊
layered architecture란?
https://cs.uwaterloo.ca/~m2nagapp/courses/CS446/1195/Arch_Design_Activity/Layered.pdf
3tier와 클린아키텍처를 구현하고 비교한 글
https://betterprogramming.pub/comparing-three-layered-and-clean-architecture-for-web-development-533bda5a1df0
Domain이란?
https://javacan.tistory.com/entry/what-is-a-domain-model
Object와 Entity, Entity의 다양한 용례
https://linuxism.ustd.ip.or.kr/45
Clean Architecture - Clean Coder Blog
https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html
엔티티 또는 도메인객체를 DTO와 분리해야하는 이유
https://mangkyu.tistory.com/192