Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

공hannah부

DDD 본문

공부/백엔드

DDD

Hannah0226 2023. 11. 21. 17:48

DDD (Domain Driven Design)

Domain이란?

  • 정보와 활동의 영역을 말함
  • 프로그래머들에게는 흔히 애플리케이션 내의 로직들이 관여하는 정보와 활동의 영역, 유사한 업무의 집합
  • 애플리케이션은 비즈니스 domain 별로 나누어 설개/개발

DDD란?

  • 도메인이 중심이 되는 개발 방식
  • 목적: 소프트웨어의 연관된 부분들을 연결하여 계속해서 진화하는 새로운 모델을 만들어나가 복잡한 애플리케이션 개발을 쉽게 해주는 것
  • 핵심적인 목표: 도메인 간 느슨한 결함도와 도메인의 높은 응집도로 가벼운 설계

도메인 모델 설계시 요구사항

  • 모델과 핵심 설계는 상호 영향을 주고받으며 구체화된다.
  • 모델은 모든 팀 구성원들이 사용하는 언어의 근간을 이룬다.
  • 모델은 불순물을 걸러낸 핵심 지식만을 포함한다.

 

보편언어 (Ubiquitous Language)

보편언어의 목표

  • 도메인 전문가와 개발자 사이의 의사소통의 어려움 팀 내의 의사소통 및 구현에서 사용되는 언어에 대한 이해가 서로 일치해야 한다.

정의

  • 현업, 개발자, 디자이너 등 참여자들이 동일한 의미로 이해하는 언어
  • 정확한 커뮤니케이션을 위해 공통 언어를 정의하고 사용

제한영역 (Bounded Context) 범위 내에서의 정의

  • 독립적으로 서비스될 때  문제가 없는 업무 범위
  • 여러 context 내에 비슷해보이는 용어가 서로 다른 위미로 사용될 수 있기때문에 용어사전 (Glossary) 형태로 구성하는 것이 좋다.

 

도메인 모델 패턴 (Domain Model Pattern)

도메인 모델이란?

  • 객체 지향 분석 설계에 기반하여 구현하고자 하는 도메인의 모델을 생성하는 패턴이다.
  • 이는 소프트웨어의 기능과 데이터 구조를 비즈니스의 실제 운영과 일치시키기 위해 사용한다.

Entity

  • 정의: 속성이 아닌 식별성을 기준으로 정의되는 도메인 객체
  • 예시
    1. DB의 ERD: 엔티티를 테이블로 표현. 각 테이블은 고유한 식별자를 가진 레코드의 집합이다.
    2. J2EE의 엔티티 빈: 비즈니스 로직 수행. DB의 레코드와 직접적인 상호작용을 담당한다.

Value Object

  • 식별성이 아닌 속성을 이용해 정의되는 불편 객체
  • 모든것에 식별성을 부여하고 Entity로 관리한다면 복잡성이 증가한다.
  • Value Object의 기본 특성
    1. Immutability (불변성): 수정자가 없다. 번거로움 없는 공유
    2. value equality (값 동등성): 내부 값 동등성 검사
    3. 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