--- 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) 개념들이 대부분 독립적으로 동작하며, 최소한의 동기화(주로 데이터 일관성 유지용)만 존재. > **fig. 6.1** (*A todo app showing the tasks carrying the label "chores."*): Todoist 앱 스크린샷으로, 왼쪽 사이드바에 Inbox, Today, Upcoming, Projects, Labels(chores 3, tech 1, urgent 1, finances 1) 계층이 보이고, 오른쪽 메인 패널에 "chores" 레이블이 선택되어 "shovel snow off driveway (chores, urgent)", "pay estimated taxes (chores, finances)", "install new router (chores, tech)" 세 태스크가 표시돼 있다. *todo* 개념과 *label* 개념이 자유 조합된 결과로, 각 태스크에 여러 레이블이 붙고 레이블 클릭 시 해당 태스크들이 필터링된다. **예시**: Todoist의 *todo* + *label* 조합 ``` app todo-label include todo label [todo.Task] sync todo.delete (t) label.clear (t) ``` 동기화 하나: 태스크 삭제 시 해당 태스크의 레이블도 자동 제거. 이 동기화가 없으면, 삭제된 태스크가 레이블 검색 결과에 나타나는 이상 동작이 발생한다. > **fig. 6.4** (*A free composition of todo and label concepts. In the diagram (right), the circles on the left represent actions provided to the user, and the black arrow denotes the synchronization.*): 다이어그램은 두 개의 박스(todo, label)가 나란히 있고, 각 박스 왼쪽에는 사용자에게 제공되는 행동(원으로 표시)이, 오른쪽에는 개념 내부 행동(add, delete, complete / affix, detach, find, clear)이 나열돼 있다. todo의 delete와 label의 clear 사이에 굵은 화살표가 하나 연결돼 있다 — 오직 하나의 동기화만으로 두 개념이 연결된 자유 조합 구조를 보여준다. **"존재 결합(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` 행동이 동기화돼, 특정 이메일 주소로 메일을 보내면 자동으로 태스크가 추가된다. > **fig. 6.6** (*A collaborative composition of todo and email concepts. The diagram describes the synchronization only partially: the arrow from receive to add does not imply that every email.receive leads to a task.add; as the text says, only messages to todo-user are relevant.*): 세 개의 박스(todo, label, email)가 세로로 나열되고, 각 박스 좌우에 행동 목록이 있다. todo-label 간에는 delete→clear 화살표(이전 자유 조합), email.receive→todo.add 화살표가 추가로 표시돼 있다. 세 개념이 두 개의 동기화로 연결된 협력 조합 구조를 보여준다 — receive 화살표는 이메일 수신 이벤트가 todo 태스크 추가를 유발함을 나타낸다. **협력 조합의 활용 패턴**: - **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년 수정됨) > **fig. 6.9** (*The original Apple Calendar dialog that unhelpfully always synchronized deleting an event with notifying the sender (left), and the most recent version (right) that fixes the problem by making the synchronization optional.*): 왼쪽은 구버전 다이얼로그로 "Are you sure you want to delete this event? Deleting this meeting will remove it from your calendar and notify the invitees that this event has been deleted. You can't undo this action." — 취소 또는 삭제 버튼만 있어 알림 발송이 강제됨. 오른쪽은 수정된 버전으로 "Delete and Notify"와 "Delete and Don't Notify" 두 버튼이 제공돼 사용자가 알림 여부를 선택할 수 있다. 과잉 동기화(삭제+알림 강제 결합)가 수정된 설계 개선의 전후를 명확히 보여준다. **사례 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]] — 전체 개요