Interaction Diagram과 Use-Case Realization (Ch 15, 17)
Interaction Diagram은 소프트웨어 객체 간의 메시지 흐름을 그린 것이다. Larman이 이 책에서 "설계의 심장"이라고 부르는 산출물이 바로 이것이다. 도메인 모델이나 SSD보다 만들기 어렵고, 더 많은 설계 판단이 필요하다.
Use-Case Realization이란
유스케이스를 소프트웨어 객체의 협력으로 "실현(realize)"하는 것이다. 유스케이스의 각 시스템 이벤트에 대해 "어떤 객체들이 어떤 순서로 메시지를 주고받으면 이 이벤트를 처리할 수 있는가"를 Interaction Diagram으로 보여준다.
산출물 간의 연결:
- 03-system-sequence-diagram|SSD의 시스템 이벤트 → Interaction Diagram의 첫 번째 메시지가 된다
- Operation Contract의 사후조건 → Interaction Diagram이 달성해야 할 목표가 된다
- 04-domain-model|Domain Model의 개념 클래스 → 소프트웨어 클래스 이름에 영감을 준다
- 07-grasp-patterns|GRASP 패턴 → 메시지를 어디로 보낼지 결정하는 원칙이 된다
시스템 이벤트별로 하나씩
보통 시스템 이벤트 하나당 Interaction Diagram 하나를 그린다. Process Sale이라면:
makeNewSale→ 다이어그램 1enterItem→ 다이어그램 2endSale→ 다이어그램 3makePayment→ 다이어그램 4
예시: enterItem의 설계 과정
Contract에서 사후조건은:
- SalesLineItem 인스턴스 생성
- 현재 Sale에 연결
- quantity 설정
- itemID에 맞는 ProductSpecification에 연결
이걸 07-grasp-patterns|GRASP로 풀어나간다:
- Controller →
Register가enterItem(itemID, qty)메시지를 받는다 - Expert → ProductSpecification 조회는 누가? ProductCatalog가 모든 spec을 알고 있으니
ProductCatalog.getSpecification(itemID) - Creator → SalesLineItem 생성은 누가? Sale이 SalesLineItem을 포함하니
Sale.makeLineItem(spec, qty) - Sale 안에서 SalesLineItem 인스턴스를 만들고 컬렉션에 추가
예시: makePayment의 설계 과정
Payment를 Register가 만들까, Sale이 만들까? 둘 다 Creator 후보다.
Low Coupling으로 평가: Register가 만들면 Register-Payment 결합이 추가된다. Sale이 만들면 Sale-Payment 결합만 생기고, Sale은 어차피 Payment와 밀접하다. → Sale이 만드는 게 낫다.
핵심 교훈
Interaction Diagram을 그릴 때마다 되물어야 하는 질문:
- 이 메시지를 왜 이 객체에 보내는가? (Expert? Creator? Controller?)
- 대안은 없는가? (Low Coupling, High Cohesion으로 평가)
- 변화 지점은 어디인가? (Protected Variations로 인터페이스 도입)
바이브 코딩에서의 활용
Interaction Diagram은 LLM에게 구현 순서와 메서드 호출 체인을 알려주는 가장 직접적인 형태다.
프롬프트 예시:
"enterItem(itemID, qty) 시스템 이벤트의 처리 흐름을 구현해줘.
호출 체인:
1. Controller(Register/OrderController)가 enterItem을 받는다
2. ProductCatalog에서 itemID로 ProductSpecification을 조회한다
3. Sale에게 makeLineItem(spec, qty)를 요청한다
4. Sale이 SalesLineItem을 생성하고 내부 컬렉션에 추가한다
5. description과 running total을 리턴한다
설계 원칙:
- Register는 ProductCatalog를 알고 있다 (startup 시 연결됨)
- Sale이 SalesLineItem을 생성한다 (Creator: Sale이 SalesLineItem을 포함)
- 총액 계산은 Sale이 한다 (Expert: Sale이 모든 LineItem을 알고 있음)"
Interaction Diagram의 메시지 흐름을 그대로 프롬프트에 넣으면, LLM이 메서드 시그니처와 호출 순서를 정확하게 생성한다.