ch11. 서브매크로와 모듈화 -- 업무 프로그램 위치, 로그인 서브루틴
반복되는 자동화 로직을 서브매크로로 분리하고, ExecuteMacro로 호출 체인을 구성하는 방법을 배운다.
이런 불편함, 겪어보셨나요?
회사에 출근해서 맥북에 모니터를 연결한다. Chrome은 세 번째 모니터에, Slack은 메인 모니터에 배치해야 한다. 매일 아침 같은 작업을 반복한다.
처음에는 하나의 매크로에 모든 동작을 넣었다. Chrome 활성화, 윈도우 이동, Slack 활성화, 윈도우 이동, 로그인 처리까지. 매크로가 수십 줄로 길어지니 수정이 어렵다. Chrome 윈도우 배치 로직을 바꾸려면 전체 매크로를 훑어야 한다.
프로그래밍에서 함수를 분리하는 것처럼, KM에서도 매크로를 분리할 수 있다. 서브매크로(Sub Macro)라는 개념이다. 하나의 매크로가 다른 매크로를 호출하는 구조다.
이 챕터에서는 업무 환경 설정에 사용하는 서브매크로 네 개와, Finder 다운로드 폴더 이동 매크로 한 개를 분석한다. 서브매크로 간의 호출 관계를 이해하고, 모듈화의 장점을 체감하는 것이 목표다.
전체 호출 관계도
이 챕터에서 다루는 매크로들은 독립적이지 않다. 서로를 호출하는 체인 구조로 연결되어 있다.
그림 11-1. 서브매크로 전체 호출 체인 -- 로그인부터 개별 윈도우 배치까지의 의존 관계
호출 체인을 정리하면 다음과 같다.
- "99. Sub - 로그인"이 최상위 진입점이다. Chrome과 Slack을 실행한 뒤, "99. Sub - 업무 프로그램 위치 저장 및 실행"을 호출한다.
- "99. Sub - 업무 프로그램 위치 저장 및 실행"은 오케스트레이터 역할이다. 네 개의 서브매크로를 순서대로 호출한다.
- 그 중 "99. Sub - 크롬 윈도우 위치 설정"은 모니터 개수에 따라 Utility - Third Monitor 또는 Utility - Second Monitor를 호출한다.
- "99. Sub - Slack 윈도우 위치 설정"은 Utility - Main Monitor를 호출한다.
이 구조 덕분에 각 매크로는 자기 역할만 담당한다. 윈도우 배치 로직이 바뀌면 해당 서브매크로만 수정하면 된다.
매크로 분석: 99. Sub - 로그인
무엇을 하는 매크로인가
업무에 필요한 앱을 실행하고, 모든 윈도우를 제자리에 배치하는 로그인 루틴이다. 다른 매크로(예: "로그인 시 주말/평일 체크해서 다르게 수행함")에서 호출되는 서브매크로다.
트리거
| 트리거 타입 | 값 | 설명 |
|---|---|---|
| 없음 | -- | 서브매크로이므로 트리거가 없다. ExecuteMacro로만 호출된다 |
액션 흐름
- Comment -- 매크로 설명을 위한 주석이다.
- ActivateApplication: Google Chrome -- Chrome을 실행한다. 이미 실행 중이면 활성화한다.
- ActivateApplication: Slack -- Slack을 실행한다.
- PauseUntil -- Chrome이 완전히 로드될 때까지 대기한다. 앱의 번들 ID(
com.google.Chrome)로 실행 여부를 확인한다. - Pause: 1초 -- 앱 실행 직후 약간의 여유를 둔다.
- ExecuteMacro: 99. Sub - 업무 프로그램 위치 저장 및 실행 -- 윈도우 배치를 담당하는 서브매크로를 호출한다.
핵심 기술 해설
PauseUntil -- 조건 대기
Pause 액션은 고정 시간을 기다린다.
반면 PauseUntil은 조건이 충족될 때까지 기다린다.
이 매크로에서는 "Chrome 앱이 실행 중인가?"를 조건으로 사용한다.
앱 실행 직후 바로 윈도우를 조작하면 실패할 수 있다. 앱이 아직 로드되지 않았기 때문이다. PauseUntil로 앱 준비 상태를 확인한 뒤 다음 단계로 진행하면 안정적이다.
서브매크로 호출 패턴
이 매크로는 트리거가 없다. 사용자가 직접 실행하는 것이 아니라, 다른 매크로가 호출하는 용도다. "99. Sub -" 접두사는 서브매크로임을 나타내는 명명 규칙이다. 숫자 99를 붙인 이유는 매크로 목록에서 맨 아래로 정렬되어, 직접 실행할 매크로와 시각적으로 구분되기 때문이다.
매크로 분석: 99. Sub - 업무 프로그램 위치 저장 및 실행
무엇을 하는 매크로인가
여러 앱의 윈도우를 각각의 서브매크로를 호출하여 올바른 모니터에 배치하는 오케스트레이터 매크로다.
트리거
| 트리거 타입 | 값 | 설명 |
|---|---|---|
| 없음 | -- | 서브매크로. "99. Sub - 로그인"에서 호출된다 |
액션 흐름
- Comment -- 매크로 설명 주석.
- ExecuteMacro: 99. Sub - 크롬 윈도우 위치 설정 -- Chrome 윈도우를 적절한 모니터에 배치한다.
- ExecuteMacro: 99. Sub - Slack 윈도우 위치 설정 -- Slack 윈도우를 메인 모니터에 배치한다.
- ExecuteMacro: (추가 앱 1) -- 다른 업무 앱의 윈도우를 배치한다.
- ExecuteMacro: (추가 앱 2) -- 또 다른 업무 앱의 윈도우를 배치한다.
핵심 기술 해설
오케스트레이터 패턴
이 매크로는 자체적으로 윈도우를 조작하지 않는다. 네 개의 서브매크로를 순서대로 호출할 뿐이다. 프로그래밍의 "컨트롤러" 또는 "메인 함수"에 해당한다.
이런 구조의 장점은 세 가지다.
첫째, 단일 책임이다. 각 서브매크로는 하나의 앱 윈도우 배치만 담당한다.
둘째, 재사용성이다. "크롬 윈도우 위치 설정"은 이 매크로 외에 다른 상황에서도 독립적으로 호출할 수 있다.
셋째, 유지보수 용이성이다. 새 앱이 추가되면 서브매크로를 하나 더 만들고, 오케스트레이터에 ExecuteMacro 한 줄만 추가하면 된다.
ExecuteMacro의 동작 방식
ExecuteMacro는 동기적으로 실행된다. 호출된 서브매크로가 완료될 때까지 기다린 뒤, 다음 액션으로 진행한다. 따라서 위 흐름에서 Chrome 배치가 끝나야 Slack 배치가 시작된다.
매크로 분석: 99. Sub - 크롬 윈도우 위치 설정
무엇을 하는 매크로인가
연결된 모니터 개수를 확인하고, Chrome 윈도우를 적절한 모니터에 배치한다. 3대 모니터면 세 번째 모니터로, 2대면 두 번째 모니터로, 1대면 현재 화면에서 크기만 조정한다.
트리거
| 트리거 타입 | 값 | 설명 |
|---|---|---|
| 없음 | -- | 서브매크로. "99. Sub - 업무 프로그램 위치 저장 및 실행"에서 호출된다 |
액션 흐름
그림 11-2. 크롬 윈도우 위치 설정 흐름도 -- Until 루프와 모니터 개수별 분기
- Until 루프 -- Chrome 윈도우가 활성화될 때까지 반복한다.
- Chrome을 활성화한다.
- 윈도우가 전면에 없으면 BringWindowsForward를 실행한다.
- Pause: 0.5초 -- 윈도우 활성화 안정화를 위한 대기.
- IfThenElse: 모니터 3대 연결 여부 확인
- 참 (3대) -- ExecuteMacro: Utility - Third Monitor를 호출한다.
- 거짓 -- 다시 IfThenElse로 모니터 2대 연결 여부를 확인한다.
- 참 (2대) -- ExecuteMacro: Utility - Second Monitor를 호출한다.
- 거짓 (1대) -- ManipulateWindow로 현재 화면에서 윈도우 크기를 조정한다.
핵심 기술 해설
Until 루프 -- 조건 반복
Until 액션은 조건이 충족될 때까지 내부 액션을 반복한다.
이 매크로에서는 Chrome 윈도우가 전면에 나올 때까지 반복적으로 활성화를 시도한다.
단순히 ActivateApplication 한 번으로는 충분하지 않을 수 있다. 앱이 여러 윈도우를 가지고 있거나, 응답이 느린 경우가 있기 때문이다. Until 루프는 이런 불안정성을 해결한다.
중첩 조건 분기
모니터 개수에 따라 세 가지 경로로 분기한다. KM에는 Switch/Case 문이 있지만, 이 매크로는 IfThenElse를 중첩하여 구현했다. 조건이 2~3개일 때는 중첩 IfThenElse가 더 직관적일 수 있다.
Utility 매크로 호출
Utility - Third Monitor, Utility - Second Monitor는 Common 그룹에 있는 범용 매크로다. 각각 ManipulateWindow로 윈도우를 해당 모니터 크기에 맞게 이동/리사이즈하고, SimulateKeystroke(Shift+Option+Control+Enter)로 전체화면을 토글한다. 이 매크로들은 단축키 트리거(Command+Shift+`, Command+Shift+2)도 가지고 있어서 독립적으로도 사용할 수 있다.
매크로 분석: 99. Sub - Slack 윈도우 위치 설정
무엇을 하는 매크로인가
Slack 윈도우를 메인 모니터에 배치한다. 크롬 윈도우 위치 설정 매크로와 구조가 거의 동일하다.
트리거
| 트리거 타입 | 값 | 설명 |
|---|---|---|
| 없음 | -- | 서브매크로. "99. Sub - 업무 프로그램 위치 저장 및 실행"에서 호출된다 |
액션 흐름
- Until 루프 -- Slack 윈도우가 활성화될 때까지 반복한다.
- Slack을 활성화한다.
- 윈도우가 전면에 없으면 BringWindowsForward를 실행한다.
- Pause: 0.5초 -- 안정화 대기.
- IfThenElse: 모니터 개수에 따른 분기
- 모니터가 여러 대일 때 -- ExecuteMacro: Utility - Main Monitor를 호출하여 메인 모니터에 배치한다.
- 모니터가 1대일 때 -- ManipulateWindow로 현재 화면에서 윈도우 크기만 조정한다.
핵심 기술 해설
구조의 일관성
Slack 윈도우 설정 매크로는 Chrome 윈도우 설정 매크로와 동일한 패턴을 따른다. Until 루프로 윈도우를 활성화하고, 모니터 개수를 확인하여 적절한 Utility 매크로를 호출한다.
이 일관성이 서브매크로 모듈화의 실질적인 이점이다. 새로운 앱의 윈도우 배치 매크로를 만들 때, 기존 매크로를 복제하고 앱 이름만 바꾸면 된다.
Utility - Main Monitor
Common 그룹의 Utility - Main Monitor(단축키: Command+Shift+1)를 호출한다. ManipulateWindow로 윈도우를 메인 모니터 크기에 맞게 배치하고, SimulateKeystroke로 전체화면을 토글한다.
매크로 분석: Finder - Download
무엇을 하는 매크로인가
Option+E를 누르면 Finder를 열고 다운로드 폴더로 이동한다. 서브매크로를 호출하여 언어 설정을 확인한 뒤, 한국어/영어에 맞는 메뉴 항목을 선택한다.
트리거
| 트리거 타입 | 값 | 설명 |
|---|---|---|
| HotKey | Option+E | 어디서든 다운로드 폴더를 빠르게 열 수 있다 |
액션 흐름
- ActivateApplication: Finder -- Finder를 활성화한다.
- ExecuteMacro: (언어 확인 서브매크로) -- 현재 시스템 언어를 확인하는 서브매크로를 호출한다.
- IfThenElse: 언어에 따른 메뉴 선택
- 한국어일 때 -- SelectMenuItem: "이동" > "다운로드"를 선택한다.
- 영어일 때 -- SelectMenuItem: "Go" > "Downloads"를 선택한다.
핵심 기술 해설
서브매크로를 활용한 언어 분기
macOS는 시스템 언어에 따라 메뉴 항목이 달라진다. 한국어 환경에서는 "이동 > 다운로드"이고, 영어 환경에서는 "Go > Downloads"이다.
언어 확인 로직을 서브매크로로 분리하면, 같은 로직이 필요한 다른 매크로에서도 재사용할 수 있다. Finder 관련 매크로가 여러 개 있다면, 매번 언어 확인 코드를 복사하는 대신 서브매크로 한 번 호출로 해결된다.
SelectMenuItem -- 메뉴 항목 선택
앱의 메뉴 바에서 특정 항목을 선택하는 액션이다. "이동" 메뉴 하위의 "다운로드"를 계층적으로 지정한다. 메뉴 경로를 정확히 입력해야 동작한다.
활용 팁
- 같은 패턴으로 "문서", "데스크탑", "iCloud Drive" 등 자주 가는 폴더 단축키를 만들 수 있다.
- 서브매크로로 언어 확인을 분리해두면, 새 Finder 매크로를 추가할 때 언어 분기 코드를 매번 작성하지 않아도 된다.
직접 만들어보기
서브매크로의 핵심 개념을 익히기 위해, 간단한 호출 체인을 직접 구성해본다. "업무 프로그램 위치 저장 및 실행" 패턴을 축소한 버전이다.
- KM 에디터에서 새 매크로를 만든다. 이름을 "Sub - 앱 윈도우 배치"로 설정한다.
- 트리거는 설정하지 않는다. 서브매크로이므로 다른 매크로가 호출할 것이다.
- 액션을 추가한다:
- ActivateApplication -- 배치할 앱을 선택한다 (예: Safari).
- Pause -- 0.5초 대기.
- ManipulateWindow -- Move and Resize를 선택하고, 원하는 위치와 크기를 지정한다.
- 두 번째 매크로를 만든다. 이름을 "업무 환경 설정"으로 설정한다.
- 트리거를 추가한다: Hot Key Trigger -- 원하는 단축키를 지정한다.
- 액션을 추가한다:
- Execute Macro -- "Sub - 앱 윈도우 배치"를 선택한다.
- 단축키를 눌러 테스트한다. Safari가 활성화되고 지정한 위치로 이동하는지 확인한다.
- 앱을 추가하고 싶으면, "Sub - 앱 윈도우 배치"를 복제하여 앱 이름만 바꾼다. "업무 환경 설정" 매크로에 ExecuteMacro를 한 줄 더 추가한다.
이 챕터에서 배운 것
- ExecuteMacro로 매크로가 다른 매크로를 호출하는 서브매크로 패턴
- 오케스트레이터 매크로가 여러 서브매크로를 순서대로 호출하는 구조
- "99. Sub -" 접두사를 사용한 서브매크로 명명 규칙
- Until 루프로 앱 윈도우 활성화를 보장하는 기법
- PauseUntil로 앱 준비 상태를 확인하는 안전한 실행 패턴
- 모듈화를 통한 재사용성과 유지보수성 향상
다음 챕터 예고
ch12에서는 시간 기반 트리거를 다룬다. Cron Job처럼 특정 시간에 자동으로 매크로를 실행하는 방법을 배운다. 매일 정해진 시간에 정보를 수집하거나, 포인트를 적립하는 실전 매크로를 분석한다.