research

Operation Contract (Ch 13)

Operation Contract (Ch 13)

Operation Contract는 03-system-sequence-diagram|SSD에서 도출된 시스템 이벤트 각각에 대해, 실행 후 도메인 객체들의 상태가 어떻게 변했는지를 명세한 것이다.

언제 쓰는가

유스케이스 텍스트만으로 충분하면 안 써도 된다. 하지만 유스케이스가 모호하거나, 시스템 이벤트의 효과를 정밀하게 기술해야 할 때 유용하다. Larman은 "선택적이지만, 쓰면 08-interaction-diagram|Interaction Diagram 설계가 훨씬 명확해진다"고 말한다.

구조

Operation:    enterItem(itemID: ItemID, quantity: Integer)
Cross Refs:   Use Cases: Process Sale
Preconditions: 진행 중인 Sale이 존재한다
Postconditions:
  - SalesLineItem 인스턴스 sli가 생성되었다 (인스턴스 생성)
  - sli가 현재 Sale에 연결되었다 (연관 형성)
  - sli.quantity가 quantity로 설정되었다 (속성 변경)
  - sli가 itemID에 맞는 ProductSpecification에 연결되었다 (연관 형성)

Postcondition의 세 가지 유형

사후조건은 04-domain-model|Domain Model의 객체들에 대한 상태 변화로 기술한다:

  1. 인스턴스 생성/삭제 — "SalesLineItem 인스턴스가 생성되었다"
  2. 연관 형성/해제 — "sli가 Sale에 연결되었다"
  3. 속성 변경 — "sli.quantity가 qty가 되었다"

이 세 가지만으로 어떤 시스템 이벤트의 효과도 기술할 수 있다.

핵심 포인트

사후조건은 과거 시제의 선언문으로 쓴다. "SalesLineItem을 생성한다"가 아니라 "SalesLineItem이 생성되었다". 이렇게 쓰면 구현 방법(how)이 아니라 결과 상태(what)에 집중하게 된다.

바이브 코딩에서의 활용

Contract의 postcondition은 LLM에게 **함수의 정확한 부수 효과(side effect)**를 알려준다. 테스트 코드 생성에도 직접 활용할 수 있다.

프롬프트 예시:
"enterItem(itemID, qty)의 postcondition을 기반으로 단위 테스트를 작성해줘:

검증할 상태 변화:
1. 새로운 SalesLineItem이 생성되었는가
2. 해당 LineItem이 현재 Sale의 컬렉션에 추가되었는가
3. LineItem의 quantity가 입력값과 같은가
4. LineItem이 올바른 ProductSpecification과 연결되었는가"