[CS] DDD (Domain-Driven Design, 도메인 주도 설계)

2024. 10. 31. 16:29·CS
728x90
728x90

DDD (Domain-Driven Design, 도메인 주도 설계)

  - 비즈니스 도메인과 로직을 중심으로 설계하는 방식

  - 현업과 개발자 간의 쌍방향 커뮤니케이션을 중요시함

     → 상호 간에 이해할 수 있는 보편적인 (Ubiquitous) 언어 사용

↔ 데이터 주도 설계

  - 객체가 가져야 할 데이터에 초점을 두고 설계하는 방식

 

 


주요 개념

1) 도메인 (Domain)

  - 소프트웨어가 해결하고자 하는 문제 영역

 

2) 유비쿼터스 언어 (Ubiquitous Language)

  - 협업과 개발자 간의 원활한 의사소통을 위해 사용하는 공통 언어

  - 코드와 문서에서 동일한 용어를 사용하는 것

  - 도메인 모델에 대한 이해를 바탕으로 설계할 수 있도록 도움

 

3) 바운디드 컨텍스트 (Bounded Context)

  - 도메인을 명확하게 이해하기 위해 도메인의 특정 구역을 정의함

     → 각 도메인은 독립적으로 운영될 수 있으며, 서로 다른 모델을 가질 수 있음

     ex) 전자상거래 시스템은 주문 관리, 상품 관리, 고객 관리 등 여러 도메인으로 나눌 수 있음

  - 특정 도메인 내에서만 유효한 모델을 정의함

     ex) 주문 관리 컨텍스트에서의 '주문'과 고객 관리 컨텍스트에서의 '주문'은 다르게 정의될 수 있음

  - 서로 다른 바운디드 컨텍스트는 각각 독립적으로 존재하며, 필요에 따라 상호작용할 수 있음

     ex) 주문 관리 시스템이 고객 관리 시스템에 고객 정보를 요청함

  - 바운디드 컨텍스트 내에서 모델은 일관된 의미를 가짐

 

4) 컨텍스트 맵 (Context Map)

  - 바운디드 컨텍스트 간의 관계

 

5) 엔티티 (Entity)

  - 고유한 식별자를 가진 도메인 객체

  - 상태가 변해도 동일성을 유지함

  ex) 고객

 

6) 값 객체 (Value Object)

  - 고유한 식별자가 없고, 속성 값으로만 정의되는 객체

  - 불변함 (Immutable)

  - 두 값 객체가 동일한 속성을 가지면 동일한 것이라고 간주됨

  ex) 주소

 

7) 애그리거트 (Aggregate)

  - 관련된 엔티티와 값 객체의 집합

  - 특정 도메인 개념을 이루는 객체들을 하나의 그룹으로 묶어 단위로 처리함

  - 외부에서 접근할 때는 이 그룹의 '애그리거트 루트'로만 접근할 수 있도록 제한함

     → 일관성 유지 / 데이터 무결성 보장

  ex) 주문 - 애그리거트

        상품 - 애그리거트 내 엔티티

          → 각각 고유 식별자를 가지며, 주문 안에서 여러 상품이 포함될 수 있음

        배송 주소 - 애그리거트 내 값 객체

          → 고유 식별자가 없으며, 주문에 따라 주소 값이 변경될 수 있음

        주문 - 애그리게잇 루트

          → 주문 자체가 루트로 동작하며, 외부에서는 주문을 통해서만 상품에 접근할 수 있음

 

8) 리포지토리 (Repository)

  - 애그리거트를 DB에 저장하고 조회하는 역할

  - 도메인 객체의 집합을 조작할 수 있도록 하는 인터페이스

     → 도메인 레이어는 DB 구현 방식에 대해 알 필요 없이 리포지토리를 통해 데이터에 접근할 수 있음

 

9) 도메인 이벤트

  - 도메인 내에서 발생한 중요한 사건

  - 시스템의 상태 변화에 대한 정보를 제공함

 

 


레이어드 아키텍처 (Layered Architecture)

  - 소프트웨어 시스템을 여러 개의 레이어로 나누어, 각 레이어가 특정한 책임을 갖도록 설계하는 구조

     → 코드의 모듈화 / 유지보수성 UP / 확장성 UP / 단위 테스트 및 통합 테스트 용이

 

도메인 레이어 (Domain Layer)

  - 시스템의 핵심 비즈니스 로직과 규칙을 담고 있는 레이어

  - 비즈니스 규칙과 정책을 다루는 핵심 레이어

  [구성요소]

    i. 엔티티 (Entity)

    ii. 값 객체

    iii. 애그리거트

    iv. 도메인 서비스

      : 특정 비즈니스 로직을 수행하지만, 엔티티나 값 객체에 속하지 않는 서비스

 

애플리케이션 레이어 (Application Layer)

  - 애플리케이션의 흐름과 사용자의 요청을 처리하는 레이어

  - 사용자에게 제공해야 할 기능을 구현함

  - 비즈니스 로직을 직접 포함하지 않음

  - 도메인 레이어의 기능을 이용해 애플리케이션의 주요 동작을 조정함

  - 유스케이스와 비즈니스 작업 흐름을 조정함

  [구성요소]

    i. 유스케이스 (Use Case)

      : 사용자의 요구사항을 충족하기 위해 도메인 레이어의 기능을 조합하여 수행하는 작업

      · 각 유스케이스는 애플리케이션의 특정 동작을 나타냄

    ii. 서비스 (Application Service)

      · 유스케이스를 구현함

      · 도메인 모델에 대한 조작을 수행함

 

프레젠테이션 레이어 (Presentation Layer, 인터페이스 레이어)

  - 사용자 인터페이스와 애플리케이션 간의 상호작용을 처리하는 레이어

     : 사용자의 요청을 받아 애플리케이션 레이어의 처리 결과를 다시 사용자에게 보여줌

  [구성요소]

    i. UI 컴포넌트

      : 웹 페이지, 버튼, 폼 등의 시각적 요소

    ii. API 엔드포인트

      : 인터페이스를 통해 클라이언트와 서버 간의 데이터 통신을 처리함

    iii. 뷰 모델 or 프레젠터

      : UI의 상태를 관리하고, 데이터의 변환/포맷을 담당하는 객체

 

인프라스트럭처 레이어 (Infrastructure Layer)

  - 외부 시스템과의 통신을 담당하는 레이어 (DB, 파일 시스템 등)

  [구성요소]

    i. 리포지토리 (Repository)

      : 도메인 객체를 DB에 저장/조회하는 인터페이스

      · 도메인 레이어는 리포지토리를 통해 데이터에 접근할 수 있음

         → 도메인 레이어가 특정 데이터 소스에 의존하지 않도록 분리하는 역할

    ii. 외부 시스템과의 통합

 

 

# 레이어 간의 상호작용

  - 프레젠테이션 레이어 → 애플리케이션 레이어를 호출하여 사용자의 요청을 처리함

  - 애플리케이션 레이어 → 도메인 레이어의 기능을 활용하여 비즈니스 로직을 수행함

  - 도메인 레이어 → 인프라스트럭처 레이어를 통해 데이터에 접근하거나 외부 시스템과 상호작용함

 

320x100
반응형
저작자표시 비영리 변경금지 (새창열림)

'CS' 카테고리의 다른 글

[CS] 호스팅 (Hosting)  (1) 2024.11.17
[CS] 인터넷 (Internet)  (5) 2024.11.16
[CS] 리눅스 관련  (0) 2023.10.06
[CS] 사용자 권한  (0) 2023.10.06
[CS] 라이브러리와 프레임워크  (0) 2023.07.11
'CS' 카테고리의 다른 글
  • [CS] 호스팅 (Hosting)
  • [CS] 인터넷 (Internet)
  • [CS] 리눅스 관련
  • [CS] 사용자 권한
스응
스응
    반응형
    250x250
  • 스응
    이서영의 개발 블로그
    스응
  • 전체
    오늘
    어제
  • 글쓰기 관리
    • 분류 전체보기 (385)
      • Java (134)
        • Base (54)
        • Spring Boot (37)
        • JSP (16)
        • Swing (GUI) (20)
        • Design Pattern (7)
      • C# (13)
      • PHP (18)
      • SQL (27)
      • Vue.js (9)
      • Tailwind CSS (4)
      • TypeScript (7)
      • HTML & CSS (27)
      • JavaScript (26)
      • jQuery (10)
      • Android (3)
      • - - - - - - - - - - - - - - (0)
      • Hotkeys (5)
      • CS (30)
      • IT Notes (13)
      • Error Notes (17)
      • Team Project (24)
        • Airlines Web Project (12)
        • University Web Project (6)
        • Strikers 1945 GUI Project (6)
      • My Project (18)
        • Library Web Project (8)
        • Pet Shopping Mall GUI Project (10)
      • etc. (0)
  • 블로그 메뉴

    • Home
    • Write
  • 링크

    • 깃허브
  • 공지사항

  • 인기 글

  • 태그

    jQuery
    CSS
    티스토리챌린지
    Swing
    Codeigniter
    면접
    Android
    cs
    HTML
    zapier
    SWAGGER
    SpringBoot
    jsp
    SQL
    errorNote
    java
    tailwindcss
    Wordpress
    오블완
    js
    git
    php
    http
    Hotkeys
    vuejs
    typeScript
    SEO
    개발일지
    C#
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.0
스응
[CS] DDD (Domain-Driven Design, 도메인 주도 설계)
상단으로

티스토리툴바