Home DDD란 무엇인가? - Ubiquitous Language 이해하기
Post
Cancel

DDD란 무엇인가? - Ubiquitous Language 이해하기

0. 알아보게 된 이유

Hexagonal Architecture를 학습하면서 자연스럽게 함께 등장하는 개념인 DDD(Domain-Driven Design)가 무엇인지 제대로 이해해보고 싶었다.
예전에 스터디 형식으로 DDD를 학습하려고 시도한 적이 있었지만 끝까지 완주하지 못했고, 개념도 명확하게 정리되지 않은 상태로 남아 있었다.

이번에는 DDD의 모든 내용을 깊게 파고들기보다는,
DDD를 사용하는 목적이 무엇인지,
그리고 실제로 설계를 할 때 어떤 구조와 기준으로 모델을 나누는지에 대해
전체적인 흐름을 이해하는 것을 목표로 학습을 진행하려고 한다.

1. DDD(Domain-Driven Design)란 무엇인가?

DDD는 복잡한 비즈니스 로직을 잘 다루기 위해 설계의 중심을 업무 영역(도메인)에 두는 개발 방법이다.

기술 중심 설계가 아닌 도메인 중심 설계를 목표로 한다.


2. 왜 DDD 인가

실무에서는 의사소통의 불일치로 인해 요구사항 해석이 달라지거나, 구현 방향이 어긋나는 문제가 자주 발생한다.

  • 현실에서 자주 마주하는 문제
    • 요구사항이 지속적으로 변경된다.
    • 비즈니스 로직이 점점 복잡해진다.
    • 이해관계자마다 같은 대상을 서로 다른 표현과 의미로 이해한다.

이러한 문제는 코드 구조의 문제가 아니라, 도메인을 이해하는 방식의 문제에서 비롯되는 경우가 많다.

  • DDD가 제시하는 접근 방식
    • 먼저 업무 영역, 즉 도메인을 중심으로 모델링한다.
    • 모델링한 도메인을 기반으로 코드를 구현한다.
    • 이해관계자들이 동일한 개념과 용어를 사용할 수 있도록
    • 유비쿼터스 언어(Ubiquitous Language)를 맞춘다.

결국 DDD의 목적은 단순히 설계 기법을 적용하는 것이 아니라, 변화하는 요구사항과 복잡한 비즈니스 로직 속에서도 지속적으로 유지보수가 가능한 구조를 만드는 것이라고 볼 수 있다.

3. Ubiquitous Language (유비쿼터스 언어)

3.1 유비쿼터스 언어란?

DDD(Domain-Driven Design)에서 말하는 유비쿼터스 언어(Ubiquitous Language)는 도메인 전문가, 기획자, 개발자가 동일한 의미로 사용하는 공통 언어를 의미한다.

실무에서 프로젝트를 진행하다 보면 같은 기능을 이야기 하면서도 각자의 역할에 따라 서로 다른 용어를 사용하는 경우가 많다.

  • 기획자는 업무 용어를 사용하고
  • 개발자는 기술 용어를 사용하고
  • 사용자는 서비스 용어를 사용한다

이렇게 서로 다른 표현을 사용하면 같은 대상을 이야기하면서도 다르게 이해하는 문제가 발생할 수 있다.

유비쿼터스 언어는 이러한 문제를 해결하기 위해 팀 전체가 동일한 개념과 동일한 용어를 사용하도록 만드는 것이다.

이 언어는 단순한 대화에서만 사용하는 것이 아니라 문서, 설계, 코드, 테스트 이름까지 동일하게 사용되어야 한다.

3.2 왜 필요한가?

프로젝트가 복잡해질수록 가장 많이 발생하는 문제는 기술적인 문제가 아니라 의사소통의 불일치이다.

요구사항을 전달할 때 사용하는 단어의 의미가 서로 다르면 잘못된 구현이 만들어지고, 그 결과 수정 비용이 크게 증가한다.

특히 도메인 로직이 많은 시스템일수록 용어의 의미가 정확하지 않으면 코드 구조도 쉽게 무너진다.

유비쿼터스 언어를 사용하면

  • 요구사항 전달이 정확해지고
  • 코드가 도메인을 그대로 표현하게 되고
  • 변경에 강한 구조를 만들 수 있다.

즉,

1
유비쿼터드 언어는 좋은 설계를 위한 시작점이다.

병원 예약 시스템을 만든다고 가정해보자.

  • 도메인 전문가(병원 직원)
    • 접수 -> 진료 신청
    • 예약 -> 날짜 지정
    • 내원 -> 실제 방문
    • 취소 -> 예약 취소
  • 기획자
    • 예약하기 버튼
    • 접수 완료 화면
    • 방문 여부 체크
  • 개발자
    • registerPatient()
    • createBooking()
    • visit()
    • cancel()

이렇게 용어가 다르면 문제가 생긴다.

예를 들어 직원 : 접수 완료된 환자만 진료 가능 개발자 : 예약 완료된 환자만 진료 가능 접수와 예약을 다르게 이해하면 잘못된 로직이 만들어질 수 있다. 그래서 용어를 이렇게 맞춘다.

용어의미
Appointment예약
CheckIn접수
Visit진료
Cancel예약 취소

코드

1
2
3
4
createAppointment()
checkIn()
startVisit()
cancelAppointment()

문서

1
예약 후 접수를 해야 진료 가능

회의

1
Appointment -> CheckIn -> Visit

위와같이 모두 같은 언어 사용하여 이해관계자간 이해관계를 명확하게 하는게 유비쿼터스 언어이다.

3.3 유비쿼터스 언어의 특징

유비쿼터스 언어는 다음과 같은 특징을 가진다.

  • 도메인 중신으로 만들어진다
  • 팀 전체가 동일하게 사용한다
  • 코드에도 그대로 사용한다
  • 의미가 하나로 고정된다
  • 프로젝트 진행 중 계속 발전한다
1
좋은 DDD 설계는 좋은 유비쿼터스 언어에서 시작된다.

4. 정리

유비쿼터스 언어란

도메인 전문가, 기획자, 개발자가 같은 개념을 같은 단어로 이해하기 위해 사용하는 공통 언어이다.

이 언어는 대화뿐 아니라

  • 문서
  • 설계
  • 코드
  • 테스트

모든 곳에서 동일하게 사용 되어야 하며, 이를 통해 복잡한 도메인에서도 일관된 구조를 유지할 수 있다.

5. 다음에 알아볼 내용

유비쿼터스 언어 다음으로 중요한 개념은
도메인을 어떻게 경계로 나누는가에 대한 개념이다.

DDD에서는 이를 Bounded Context(바운디드 컨텍스트)라고 하며,
복잡한 시스템을 여러 개의 의미 있는 영역으로 나누는 기준이 된다.

다음 글에서는

  • Bounded Context란 무엇인가
  • 왜 도메인을 나누어야 하는가
  • 실제 설계에서 어떻게 나누는가

에 대해 정리해보려고 한다.

참고

This post is licensed under CC BY 4.0 by the author.

Ollama 사용법 정리

DDD - Bounded Context란 무엇인가?