--- 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]] — 전체 개요