노트

바운디드 컨텍스트

Bounded Context

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

쉽게 말하면

바운디드 컨텍스트는 같은 단어도 동네마다 뜻이 다르다는 걸 인정하고 긋는 경계예요. 병원에서 '차트'는 진료 기록이고 증권사에서 '차트'는 주가 그래프인 것처럼, 각자 자기 뜻을 지키게 해요.

비유가 깨지는 곳 단어 뜻만 나누는 게 아니라 모델 자체를 컨텍스트마다 따로 둬요. 경계를 넘을 땐 번역 계층을 거쳐요. 그래서 즉시 일관성 대신 최종 일관성을 받아들이는 경우가 많아요.

하나의 도메인 모델과 그 용어가 일관된 의미를 갖는 경계. 도메인 주도 설계 (DDD)에서 가장 중요한 전략적 개념으로 꼽힌다.

  • 같은 "사용자"도 결제 쪽에서는 결제 수단과 청구지를 가진 고객이고, 마케팅 쪽에서는 관심사와 수신 동의를 가진 대상이며, 배송 쪽에서는 주소와 연락처다. 하나의 거대한 User 모델로 합치려 하면 모든 쪽의 요구가 뒤섞인다
  • 그래서 컨텍스트마다 자기 모델을 따로 두고, 경계를 넘을 때 번역한다. 외부 모델이 내부로 새어 들지 않게 변환 계층을 두는 것은 어댑터 패턴과 비슷하다
  • 유비쿼터스 언어(Ubiquitous Language)는 컨텍스트 안에서만 유일하다. 같은 단어가 컨텍스트마다 다른 뜻이어도 괜찮다

서비스 경계와의 관계

바운디드 컨텍스트는 마이크로서비스(Microservices)를 나누는 좋은 기준이 된다. 팀 경계까지 맞추면 콘웨이의 법칙이 오히려 도움이 된다. 다만 처음부터 서비스로 쪼갤 필요는 없다. 한 저장소 안에서 모듈 경계로 먼저 지키다가 필요할 때 떼어 내는 편이 안전하다(골의 법칙, 모노레포).

컨텍스트 사이에서 데이터를 주고받으면 즉시 일관성을 보장하기 어려워 최종 일관성(Eventual Consistency)을 받아들이게 되는 경우가 많다. 업스트림·다운스트림 관계는 업스트림과 다운스트림 참고.

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 결합도

    한 요소를 바꿀 때 다른 요소도 바꿔야 하는 관계. 결합도는 언제나 "어떤 변경에 대해" 결합되어 있는지를 함께 말해야 의미가 있다. 같은 두 모듈도 어떤 변경에는 묶여 있고 어떤 변경에는 독립적일 수 있다.

  • 집단 코드 소유

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

  • 마이크로 프론트엔드

    마이크로 프론트엔드는 하나의 큰 프론트엔드 앱을 기능별 조각으로 나눠, 팀마다 따로 개발·배포하고 런타임에 하나의 화면으로 조립하는 아키텍처다. 백엔드의 마이크로서비스(microservices) 발상을 프론트엔드로 가져온 것이다.

  • 저장소 역할 분담 (DB·캐시·큐·검색)

    서버 애플리케이션 옆에는 거의 늘 관계형 DB, 인메모리 캐시, 메시지 브로커(message broker), 검색 엔진이 붙는다. 하나로 다 하지 않는 이유는 데이터의 성격(영구성·속도·전달·검색)마다 잘하는 도구가 다르기 때문이다.

  • 사용자 수에 따른 규모 확장

    사용자가 늘어날 때 서버 한 대짜리 시스템을 단계적으로 키워 가는 전형적인 경로. 처음부터 다 갖추는 게 아니라, 병목이 보일 때마다 한 단계씩 더한다(galls-law).

보기 옵션