공hannah부
DDD 본문
DDD (Domain Driven Design)
Domain이란?
- 정보와 활동의 영역을 말함
- 프로그래머들에게는 흔히 애플리케이션 내의 로직들이 관여하는 정보와 활동의 영역, 유사한 업무의 집합
- 애플리케이션은 비즈니스 domain 별로 나누어 설개/개발
DDD란?
- 도메인이 중심이 되는 개발 방식
- 목적: 소프트웨어의 연관된 부분들을 연결하여 계속해서 진화하는 새로운 모델을 만들어나가 복잡한 애플리케이션 개발을 쉽게 해주는 것
- 핵심적인 목표: 도메인 간 느슨한 결함도와 도메인의 높은 응집도로 가벼운 설계
도메인 모델 설계시 요구사항
- 모델과 핵심 설계는 상호 영향을 주고받으며 구체화된다.
- 모델은 모든 팀 구성원들이 사용하는 언어의 근간을 이룬다.
- 모델은 불순물을 걸러낸 핵심 지식만을 포함한다.
보편언어 (Ubiquitous Language)
보편언어의 목표
- 도메인 전문가와 개발자 사이의 의사소통의 어려움 → 팀 내의 의사소통 및 구현에서 사용되는 언어에 대한 이해가 서로 일치해야 한다.
정의
- 현업, 개발자, 디자이너 등 참여자들이 동일한 의미로 이해하는 언어
- 정확한 커뮤니케이션을 위해 공통 언어를 정의하고 사용
제한영역 (Bounded Context) 범위 내에서의 정의
- 독립적으로 서비스될 때 문제가 없는 업무 범위
- 여러 context 내에 비슷해보이는 용어가 서로 다른 위미로 사용될 수 있기때문에 용어사전 (Glossary) 형태로 구성하는 것이 좋다.
도메인 모델 패턴 (Domain Model Pattern)
도메인 모델이란?
- 객체 지향 분석 설계에 기반하여 구현하고자 하는 도메인의 모델을 생성하는 패턴이다.
- 이는 소프트웨어의 기능과 데이터 구조를 비즈니스의 실제 운영과 일치시키기 위해 사용한다.
Entity
- 정의: 속성이 아닌 식별성을 기준으로 정의되는 도메인 객체
- 예시
- DB의 ERD: 엔티티를 테이블로 표현. 각 테이블은 고유한 식별자를 가진 레코드의 집합이다.
- J2EE의 엔티티 빈: 비즈니스 로직 수행. DB의 레코드와 직접적인 상호작용을 담당한다.
Value Object
- 식별성이 아닌 속성을 이용해 정의되는 불편 객체
- 모든것에 식별성을 부여하고 Entity로 관리한다면 복잡성이 증가한다.
- Value Object의 기본 특성
- Immutability (불변성): 수정자가 없다. 번거로움 없는 공유
- value equality (값 동등성): 내부 값 동등성 검사
- self validation (자가 유효성 검사): 생성자에서 validate. 모든 유효성 검사는 생성시간에 이루어짐.
Service
- 정의: Domain Object에서 위치시키기 어려운 Operation을 캡슐화하는 객체로 비즈니스 로직의 일부분을 담당하며, 여러 도메인 객체에 걸쳐있는 연산 처리가 가능하다.
- 특징
- 상태를 갖지 않는 stateless
- 데이터를 직접 저장하거나 관리하지 않고, 필요한 연산 수행 후 결과를 반환한다.
- 재사용이 가능하며, 유연성과 확장성을 제공한다.
- Service와 Domain Object의 관계: 도메인 객체가 자체적으로 처리할 수 있는 연산은 Service로 이동시키지 않아야 한다. →도메인의 책임을 명확하게 하고, 결합도를 낮추는데 기여함.
Module
- 정의: 관련된 기능과 개념을 함께 그룹화함으로써 시스템의 복잡도를 감소시키는 설계 기법으로, 좋은 모듈은 서로 밀접하게 관련된 기능을 내부에 담고있어야 한다. → 시스템의 다른 부분과 독립적으로 유지
- 목적: 응집도를 높이고, 결합도를 낮추는 것
- 응집도가 높다: 모듈 내부의 요소들이 서로 긴밀하게 관련이 있다.
- 결합도가 낮다: 모듈간의 의존성이 적다.
- 구현: JAVA에서는 package르 사용하여 모듈을 구현한다.
Aggregate
- 정의: 연관된 Entity와 Value Object를 하나의 그룹으로 묶어 각각의 일관성을 보장하고, 트랜잭션과 분산 처리의 단위로 삼는다.
- 목적: 도메인의 복잡성을 효과적으로 관리
Factory
- 정의: Entity 객체의 생성에 관련된 복잡성을 캡슐화하는 설계 패턴
- 중요성: 복잡한 객체를 생성하는 과정은 여러 단계를 거치고 다양한 규칙을 준수해야 하는데 Factory는 이러한 생성 과정 전체를 책임진다. → 개발자는 객체 생성의 세부사항을 걱정하지 않고, 일관된 방식으로 객체를 생성할 수 있게 된다.
- 예시: 사용자 계정을 생성하는 과정에서 사용자 닉네임, 이메일, 비밀번호 등을 동시에 설정해야 하는 경우, Factory 패턴을 사용하면 하나의 인터페이스 뒤에 숨겨서 객체 생성을 단순화할 수 있다.
Repository
- 정의: 도메인 영역과 데이터 인프라스트럭처 계층 사이의 분리를 가능하게 하는 패턴으로, 데이터 계층의 결합도를 낮추고 도메인 모델의 독립성을 향상시키는데 중요한 역할을 한다.
- 중요성: 데이터 소스의 변경이나 다른 저장소로의 이전이 필요할 때 도메인 로직을 변경하지 않고도 그대로 유지한다. → 시스템의 유연성과 확장성을 크게 향상
- 역할
- 생성된 Aggregate의 영속성을 관리
- Aggregate의 저장, 조회, 수정, 삭제와 같은 생명주기를 관리하며 일관성을 유지한다.
- 도메인 모델은 데이터베이스 구조나 데이터 액세스 로직에 구애받지 않고 비즈니스 로직에만 집중할 수 있다.
'공부 > 백엔드' 카테고리의 다른 글
[스프링 부트3 백엔드 개발자 되기] - 2일차 (0) | 2024.02.02 |
---|---|
[스프링 부트3 백엔드 개발자 되기] - 1일차 (0) | 2024.02.02 |
인증 방식의 종류 & JWT (0) | 2023.11.02 |
Spring Security (0) | 2023.11.02 |
싱글톤 (Singleton) (0) | 2023.09.16 |