노트

도메인 주도 설계 (DDD)

Domain-Driven Design

설계#architecture · 연결된 개념 10개

쉽게 말하면

도메인 주도 설계는 코드가 현장 사람들의 말과 일하는 방식을 그대로 닮게 만드는 거예요. 회의에서 '결제 승인'이라 부르면 코드에도 같은 이름이 있으니, 개발자와 업무 담당자가 통역 없이 이야기할 수 있어요.

비유가 깨지는 곳 말만 맞추면 될 것 같지만 엔티티, 애그리거트, 바운디드 컨텍스트처럼 개념이 많아 학습 비용이 커요. 업무 규칙이 단순하면 과하니, 도메인별 폴더와 유비쿼터스 언어처럼 가벼운 부분부터 취해요.

소프트웨어 구조를 기술이 아니라 해결하려는 업무 영역(도메인)의 개념을 중심으로 짜는 설계 접근. 에릭 에반스(Eric Evans)가 2003년 같은 이름의 책에서 정리했다. 코드의 구조와 언어가 업무의 구조와 언어를 닮게 만드는 것이 목표다.

핵심 개념

  • 유비쿼터스 언어(Ubiquitous Language): 개발자와 업무 담당자가 문서·회의·코드에서 같은 용어를 쓴다. 회의에서 "결제 승인"이라 부르면 코드에도 approvePayment()가 있다
  • 엔티티(Entity): 식별자로 같음을 판단하고 상태가 바뀌는 객체(주문, 계정)
  • 값 객체(Value Object): 식별자 없이 값으로 같음을 판단하는 불변 객체(금액, 주소)
  • 애그리거트(Aggregate): 함께 일관성을 지켜야 하는 객체 묶음과 그 입구가 되는 루트
  • 리포지터리(Repository): 애그리거트를 저장하고 꺼내는 창구. 저장 기술을 도메인에서 감춘다(Spring Data 리포지터리와 쿼리 메서드)
  • 도메인 서비스(Domain Service): 특정 엔티티에 넣기 어려운 업무 로직(환율 계산, 여러 애그리거트에 걸친 규칙)
  • 바운디드 컨텍스트(Bounded Context): 한 모델과 용어가 일관된 의미를 갖는 경계

폴더 구조로 보면

기술 레이어별(controllers, services, repositories)이 아니라 도메인별(order, payment, delivery)로 묶는다. 프런트엔드의 기능 단위 구조와 비슷하다(변경하기 쉬운 프런트엔드 코드). 함께 바뀌는 코드를 모으니 응집도가 높아진다.

주의

개념이 많고 학습 비용이 크다. 업무 규칙이 단순한 서비스에는 과하다. 실무에서는 도메인별 폴더 구성과 유비쿼터스 언어처럼 가벼운 부분부터 취하는 경우가 많다. 무엇을 풀지 먼저 정의하는 문제 공간과 해결 공간 사고와 짝을 이룬다.

출처: DDD Resources 에릭 에반스

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 심플 디자인

    켄트 벡이 XP(Extreme Programming)에서 제시한 단순한 설계의 네 가지 규칙. 우선순위 순으로 ① 모든 테스트를 통과하고 ② 의도를 드러내고 ③ 중복이 없고 ④ 요소가 가장 적다. 마틴 파울러가 이렇게 정리한 형태가 널리 쓰인다.

  • 테스트 주도 개발 (TDD)

    코드를 쓰기 전에 실패하는 자동화된 테스트부터 쓰고, 그 테스트를 통과시킨 뒤 중복을 없애는 짧은 주기를 반복하는 개발 방식. 켄트 벡이 정리했다.

  • 구조와 동작, 옵션의 가치

    켄트 벡이 정리 시점을 판단하려고 꺼내는 경제학 틀. 소프트웨어는 두 가지 가치를 만든다. 오늘 하는 일(동작)과, 내일 새로 할 수 있게 되는 일(옵션)이다. 구조는 동작을 바꾸지 않지만 옵션을 만든다.

  • 집단 코드 소유

    코드의 주인을 개인으로 두지 않고 팀 전체가 코드베이스 전체를 소유해, 누구나 필요한 곳을 고칠 수 있게 하는 XP 실천법.

  • DRY 원칙

    "모든 지식은 시스템 안에서 단일하고 명확하며 권위 있는 표현을 하나만 가져야 한다." 앤디 헌트와 데이브 토머스가 『실용주의 프로그래머』에서 정리한 원칙이다. 코드 줄의 반복만이 아니라 규칙·데이터·지식의 중복을 말한다.

보기 옵션