---
title: "EOS Ch6 — 개념의 조합"
tags: [source, EOS]
source: "The Essence of Software, Daniel Jackson (2021)"
chapter: "Ch6 Concept Composition"
updated: 2026-04-30
---

# EOS Ch6 — 개념의 조합

## 핵심 아이디어

소프트웨어 앱은 다수의 개념이 조합된 것이다. 개념들은 기본적으로 독립적으로 실행되다가 **동기화(synchronization)**를 통해 연결된다. 동기화는 실행 가능한 동작의 범위를 제한(제거)할 뿐 새로운 동작을 추가하지 않는다. Jackson은 자유 조합·협력 조합·시너지 조합의 세 단계를 구분하며, 과잉·과소 동기화의 위험을 실제 사례로 보여준다.

## 전통적 조합이 개념에 맞지 않는 이유

전통적 소프트웨어 컴포넌트는 클라이언트-서비스 형태로 조합된다. 그러나 개념은:
- 정의상 **사용자를 향한다** — 한 개념이 다른 개념 뒤에 숨을 수 없다
- **자기완결적이어야 한다** — 다른 개념의 내부에 의존하면 독립적 이해와 재사용이 불가능해진다

## 개념 조합의 메커니즘

개념들은 기본적으로 독립 실행된다(역 순서로 인터리빙 허용). 동기화(sync)는 한 개념의 행동이 발생할 때 다른 개념의 행동도 함께 발생하도록 묶는다.

**핵심 성질**: 동기화는 기존 실행 시퀀스를 _제거_만 할 뿐 _추가_하지 않는다.

## 조합의 3가지 유형

### 1. 자유 조합(Free Composition)

개념들이 대부분 독립적으로 동작하며, 최소한의 동기화(주로 데이터 일관성 유지용)만 존재.

**예시**: Todoist의 *todo* + *label* 조합

```
app todo-label
include
  todo
  label [todo.Task]
sync todo.delete (t)
  label.clear (t)
```

동기화 하나: 태스크 삭제 시 해당 태스크의 레이블도 자동 제거. 이 동기화가 없으면, 삭제된 태스크가 레이블 검색 결과에 나타나는 이상 동작이 발생한다.

**"존재 결합(existence coupling)"**: 두 개념이 동일한 객체 집합을 참조한다는 사실만 공유. 나머지는 완전히 독립.

### 2. 협력 조합(Collaborative Composition)

동기화가 두 개념을 연결해 어느 개념도 홀로 제공하지 못했던 새 기능을 만든다.

**예시**: Todoist의 이메일 주소로 태스크 추가

```
app todo-label-mail
include
  todo
  label [todo.Task]
  email
sync todo.delete (t)
  label.clear (t)
sync email.receive (todo-user, m)
  todo.add (m.content)
```

*email* 개념의 `receive` 행동과 *todo* 개념의 `add` 행동이 동기화돼, 특정 이메일 주소로 메일을 보내면 자동으로 태스크가 추가된다.

**협력 조합의 활용 패턴**:
- **Logging**: 이벤트 추적 개념과 다른 개념 조합
- **Suppression**: 접근 제어 개념이 특정 행동을 차단
- **Staging**: 연락처 → 전화번호 → 전화 연결 등 단계 분리
- **Notification**: 이벤트 발생 시 알림 트리거
- **Mitigation**: 허용되지 않는 동작 방지
- **Inference**: 명시적 행동 대신 다른 행동에서 추론(예: 메시지 열면 "읽음" 자동 처리)

### 3. 시너지 조합(Synergistic Composition)

더 촘촘한 동기화를 통해 한 개념의 기능이 다른 개념의 목적 달성을 도와 전체 가치가 부품의 합을 초과한다.

**예시 1**: *todo* + *label* 시너지 — `pending` 레이블을 내장 레이블로 사용

```
sync todo.add (t)
  label.affix (t, 'pending')
sync todo.complete (t)
  label.detach (t, 'pending')
sync label.detach (t, 'pending')
  todo.complete (t)
```

이제 레이블 쿼리 언어로 "pending AND urgent" 같은 복합 조회가 가능해진다.

**예시 2**: Gmail의 *label* + *trash* 시너지 — 삭제 시 *deleted* 레이블 자동 부착, 레이블 제거 시 복원.

**예시 3**: Macintosh의 *trash* + *folder* 시너지 — trash가 folder의 인스턴스로 작동해:
- 별도 목록 인터페이스 불필요 (folder의 정렬·검색 재사용)
- 복원은 단순히 trash 폴더에서 파일을 꺼내는 것
- "date added" 정렬 기능이 삭제 날짜 정렬로 자연스럽게 동작

**시너지는 완전하지 않다**: trash 폴더는 일반 폴더와 달리 `empty` 버튼이 있고, 여러 볼륨의 파일을 한 폴더에 담는 특수성도 있다.

## 과잉 동기화(Over-Synchronization)

동기화가 너무 많으면 사용자의 제어권이 줄어든다.

**사례 1**: Apple Calendar — 이벤트 삭제 시 초대 거절 알림이 자동 발송됨. 스팸 이벤트 삭제 시 스패머에게 이메일 주소 유효성을 알려주는 역효과. (2017년 수정됨)

**사례 2**: Tumblr — 게시물 제목 끝에 `?`를 붙이면 자동으로 댓글이 활성화됨.

**사례 3**: Therac-25 방사선 치료기 — 전자빔 전류 값과 평탄화 필터 위치 동기화 결함으로 과다 조사 사망 사고 발생.

## 과소 동기화(Under-Synchronization)

동기화가 부족하면 사용자에게 불필요한 작업을 떠넘기거나 위험한 동작이 허용된다.

**사례 1**: Google Groups — "가입 허용" 설정과 "그룹 디렉토리 공개" 설정이 연동되지 않아, 가입 요청 페이지 자체에 접근이 불가능했음.

**사례 2**: Adobe Lightroom 6.2 — 전문 사진가들이 의존하던 가져오기 동기화 옵션을 제거. 사용자 반발로 업데이트 롤백.

**사례 3**: Zoom — 손 든 참가자가 발언 후 마이크를 껐을 때 손이 자동으로 내려가지 않음 → 손 올린 상태 방치 → 혼란.

## 핵심 인용

> "Synchronization is an essential part of software design. Not enough synchronization can lead to inappropriate or confusing behaviors, and miss opportunities for automation; too much can limit the user's options."

> "Composition offers an opportunity for creative design even when the concepts themselves are familiar. Synergy is often the very essence of a design, bringing unexpected power from the combination of simple parts."

> "Automation doesn't do new things that you could not previously have done manually; it just makes them inevitable."

## 관련 개념

- [[EOS-ch4-concept-structure]] — 개념 구조 (조합 전에 각 개념이 독립적으로 정의됨)
- [[EOS-ch7-concept-dependence]] — 조합 내에서 개념들 간의 의존 구조
- [[EOS-ch8-concept-mapping]] — 조합된 개념들을 UI에 매핑하는 문제
- [[EOS-part3-principles]] — Ch11 무결성: 조합 시 각 개념 명세 유지
- [[EOS-overview]] — 전체 개요
