221. 바운디드 컨텍스트 (Bounded Context) - 경계가 명확한 컨텍스트 도메인 주도 설계(DDD) 동음이의어 모델 분리 마이크로서비스(MSA) 경계 전략적 설계
핵심 인사이트: (219번 DDD 심화 2) 거대한 쇼핑몰 시스템에서 '상품(Product)'이라는 단어를 보자. [고객 구역]에서는 상품이 '화면에 보일 예쁜 사진과 이름'이다. 근데 [창고 배송 구역]에서는 상품이 '가로세로 30cm, 무게 2kg짜리 골판지 박스'다. 만약 멍청한 개발자가 "어차피 둘 다 똑같은 상품이잖아!" 라며 거대한
Product클래스 1개 안에 사진, 이름, 무게, 부피 칼럼을 짬뽕해서 다 때려 박으면? 배송팀이 박스 크기를 수정하다 에러가 나면 고객의 쇼핑몰 화면까지 터지는 스파게티 지옥이 열린다! 에릭 에반스가 분노했다. "야! 똑같은 단어라도 '어느 구역(문맥)'이냐에 따라 의미가 완전 다르잖아! 쇼핑몰을 통짜로 짜지 말고, [고객 전시] 구역과 [창고 배송] 구역 사이에 콘크리트 장벽(Bounded Context)을 철저하게 쳐버려!! 그리고 벽 양쪽에 각자 자기만의 작고 날씬한Product클래스를 따로따로 만들어라!!" MSA 캡슐을 쪼개는 우주 최강의 칼날, 바운디드 컨텍스트다.
Ⅰ. 통짜 모델(거대 클래스)의 끔찍한 비극
- 거대한 기업 시스템(모놀리식)을 짤 때, 개발자들은 중복을 싫어해서 전사적으로 단 1개의 만능
User(회원)클래스나Product(상품)클래스를 만들어 회사 내 모든 부서가 그걸 공유해서 쓰도록 짭니다. - 동음이의어의 충돌: '회원(User)'이라는 똑같은 단어라도, [마케팅 부서]에선 '나이와 성별'이 중요하고, [결제 부서]에선 '신용카드 번호'가 중요합니다. 이 모든 50개의 칼럼을 1개의
User엑셀에 다 때려 넣으면, 결제팀이 코드 1줄 바꿨다가 마케팅팀 서버가 터지는 파멸적 결합도(Coupling) 폭발이 터집니다.
Ⅱ. 바운디드 컨텍스트 (Bounded Context)의 개념 🌟
이 위대한 개념이 213번 **마이크로서비스(MSA)**를 설계하는 절대 기준점이 됩니다.
- Bounded (경계가 쳐진), Context (문맥)
- 개념: 거대한 도메인(쇼핑몰 전체)을 하나의 통짜 모델로 다루지 않고, 의미와 목적이 완전히 동일하게 유지되는 작은 구역들(예: [결제 컨텍스트], [배송 컨텍스트])로 쪼갠 뒤, 각 구역 사이에 논리적인 콘크리트 장벽(경계선)을 쳐서, "이 장벽 안에서만큼은 유비쿼터스 언어와 도메인 모델(클래스)이 100% 자기만의 독립적인 의미를 가지도록" 보장하는 완벽한 세포 격리 설계 공간입니다.
Ⅲ. 바운디드 컨텍스트가 찢어버린 마법의 경계 🌟 핵심 기출 🌟
1. 동음이의어의 완벽한 분리와 자유
- 콘크리트 장벽을 치면, [주문] 컨텍스트와 [배송] 컨텍스트는 완벽히 남남이 됩니다.
- 분리의 기적: 이제 [주문] 방 안에
OrderProduct클래스(사진, 가격만 있음)를 1개 작게 만들고, 장벽 너머 [배송] 방 안에는ShippingProduct클래스(무게, 부피만 있음)를 또 따로 1개 만듭니다. - 배송팀이 택배 무게 계산 코드를 아무리 뜯어고치고 폭파시켜도, 장벽 너머 주문팀의 전시용 상품 코드는 1%의 타격도 입지 않는 **극강의 느슨한 결합(Loose Coupling)**이 완성됩니다.
2. 마이크로서비스(MSA)와의 1:1 매핑 🌟
- MSA로 서버를 어떻게 쪼갤까요? 바로 **"1개의 바운디드 컨텍스트 = 1개의 마이크로서비스 컨테이너"**로 쪼개는 것이 전 세계 소프트웨어 아키텍트들의 절대 표준(Best Practice)입니다.
- 이 경계선을 따라 데이터베이스(DB)도 완벽하게 찢어발깁니다 (주문 DB, 배송 DB 분리).
3. 컨텍스트 간의 소통 (컨텍스트 매핑, 223번 스포일러)
- 쪼개놓은 두 방은 서로 완벽히 격리되어 있습니다. 근데 배송을 하려면 주문 정보를 알아야 하잖아요?
- 두 장벽 사이에 작은 **문(API 통신 또는 Kafka 이벤트 메시지)**을 뚫어서, 주문 방에서 배송 방으로 얇은 쪽지(주문번호 101번, 배송해!)만 던지고 쿨하게 돌아서는 방식(214번 EDA)으로 소통하게 만듭니다.
📢 섹션 요약 비유: **바운디드 컨텍스트(Bounded Context)**는 거대한 종합병원에서 **'단어의 의미가 철저하게 분리된 각 과별 진료실의 철문'**입니다. 병원 전체 공용으로 뭉뚱그려놓으면 '칼(Knife)'이라는 똑같은 단어라도 외과에서는 '사람 배를 가르는 메스'이고, 구내식당에서는 '야채 써는 식칼'입니다. 만약 이걸 1개의 거대한 '만능 칼' 서랍으로 합쳐놓으면(통짜 모델), 외과 의사가 식칼로 수술을 하는 대형 의료사고가 터집니다. 바운디드 컨텍스트는 병원을 통짜로 쓰지 않고 **[외과 구역]과 [구내식당 구역] 사이에 완벽한 방음 콘크리트 벽(경계)**을 쳐버리는 것입니다. 이 장벽 덕분에 [외과 구역] 안에서 "칼 줘!"라고 하면 100% 무조건 수술용 메스를 의미하고, 장벽 너머 [식당 구역]에서 "칼 줘!"라고 하면 무조건 식칼을 의미하는 완벽한 동음이의어 분리가 완성됩니다. 남의 구역 눈치 볼 필요 없이, 오직 내 구역(Context) 안에서 내 업무(비즈니스)에만 100% 딱 맞는 작고 날렵한 전용 도구(도메인 모델)들을 만들어 쓸 수 있게 해주는 MSA 캡슐화의 궁극적 경계선입니다.