도메인 : 사용자가 사용하는 것이며, 소프트웨어로 해결하고자 하는 문제 영역을 의미함.
(DNS와 같은 도메인관 약간 의미가 다름) → 소프트웨어가 어떤걸 해결할지.
각각의 기능적인 문제에 영역들을 정의하는 도메인과 그 도메인을 사용하는 비지니스 로직을 중심으로 설계하는 것을 말함.
이러한 방식에는 몇가지 특징이 있음.
1, 데이터 중심이 아닌, 도메인의 모델과 로직에 집중하는 것이며
2, 동일한 표현과 단어로 구성된 단일화된 언어체계를 사용함 Ubiquitous Language, 보편적 언어 사용 → 신규회원 등록, 신규회원 추가 와 같이 애매한 단어가 아닌 업무 용어를 통일하여 소통함
3, software entity와 domain간 개념의 일치 → 분석 모델과 설계가 다르고, 그것과 코드가 다른 구조가 아닌, 도메인 모델부터 코드까지 항상 함께 움직이는 모델을 지향하고 있음.
이러한 디자인 방식은 레거시 서버가 있어 이미 큰 틀과 검증된 플로우가 있을 때,
이것을 전체적으로 한 번에 갈아엎는 빅뱅 방식 대신, 필요한 기능을 조금씩 구별하고 그것에 대해 필터링 하여 개선하는 점진적인 향상을 선택할때 유리함
사람이나 시간과 같은 리소스를 조금 더 유연하게 관리가 가능함
layered 아키텍처는 코드의 아키텍처를 구성할 때 주로 사용되며, 일반적으로 3~4계층으로 나누어 사용함.
3계층은 표현계층(Presentation Layer) - 서비스 계층 (Business Layer) - 영속성 계층(Persistence Layer)로 나누어 사용하곤 함.
DDD 를 이용할 때도 이에 대응되는 계층적인 구조가 있음.
대충 계층 구조는 아래와 같이 잡음.
위에 있는 계층에서는 아래 이는 계층에 접근이 가능하지만, 아래에서 위로는 불가능 한것을 기본으로 하고 있음.
어플리케이션과 연결되며, 인아웃풋 관련 통신 변환 등을 담당함.
위 도메인 객체를 직접적으로 사용하면서 어떻게 사용할지를 정의하는 유스케이스를 실제로 구현함.
비지니스 룰 등의 도메인과 관련된 직접적인 기능과 그 객체를 이루는 도메인 계층.
리포지토리나 퍼시스턴스 메세지 전송과 같은 기술적인 기능을 제공하는 계층.
정리하자면
각 계층별로의 책임이 있고, 그 책임별로 구현하는 것.
refer :
https://dev-coco.tistory.com/166