ch13. 이벤트 기반 트리거 -- 모니터 접속, 로그인 주말/평일 분기
Mac에 모니터를 연결하거나 로그인하는 순간, 업무 환경이 자동으로 세팅된다. 이벤트 기반 트리거와 조건 분기를 조합하여 상황에 맞는 워크플로우를 설계한다.
이런 불편함, 겪어보셨나요?
출근해서 MacBook을 외부 모니터에 연결한다. Chrome을 열고 적당한 위치로 옮긴다. Slack도 열고 위치를 잡는다. 나머지 업무 앱도 하나씩 실행한다. 매일 같은 작업을 반복한다.
재택 근무일에는 다르다. 모니터가 하나뿐이니 창 배치도 달라진다. 주말에 잠깐 노트북을 열면 업무 앱이 뜰 필요가 없다.
이 모든 상황을 사람이 판단하고 수동으로 처리하고 있다. 모니터를 꽂는 순간, 혹은 로그인하는 순간 Mac이 알아서 판단하면 어떨까.
이번 챕터에서는 두 개의 매크로를 분석한다. 하나는 모니터 연결이라는 물리적 이벤트에 반응하는 매크로다. 다른 하나는 로그인이라는 시스템 이벤트에 반응하면서, 요일에 따라 다른 동작을 수행하는 매크로다. 두 매크로 모두 서브매크로 호출 체인을 통해 실제 작업을 위임한다.
매크로 분석: 00. 회사에서 모니터 접속 시 실행
무엇을 하는 매크로인가
외부 모니터가 연결되면, 평일인지 확인한 후 업무용 프로그램들의 창 위치를 자동으로 배치한다.
트리거
| 트리거 타입 | 값 | 설명 |
|---|---|---|
| Display | 모니터 연결/해제 | 외부 디스플레이가 연결되거나 해제될 때 자동 실행 |
액션 흐름
그림 13-1. 모니터 접속 시 실행 매크로 흐름도 -- Display 트리거에서 주말/모니터 수 조건 분기 후 서브매크로 체인 호출
- 변수 설정 --
varDate에 현재 요일을 저장한다. KM의 ICU 날짜 토큰%ICUDateTime%EEE%를 사용한다. 결과는 "Mon", "Tue" 같은 영문 약어다. - 1차 조건 분기 (주말 체크) --
varDate가 토요일 또는 일요일인지 확인한다. 주말이면 아무 동작도 하지 않는다. Then 블록이 비어 있다. - 2차 조건 분기 (모니터 수 체크) -- 주말이 아닌 경우(Else), 연결된 모니터 수를 확인한다. 외부 모니터가 실제로 연결된 상태인지 검증하는 단계다.
- 서브매크로 호출 -- 조건을 통과하면
99. Sub - 업무 프로그램 위치 저장 및 실행서브매크로를 호출한다. 실제 창 배치 작업은 이 서브매크로가 담당한다.
핵심은 트리거와 실행 로직의 분리다. Display 트리거는 "모니터가 연결되었다"는 이벤트만 감지한다. 그 이후의 판단(주말인가? 모니터가 정말 연결된 건가?)은 액션 내부의 조건 분기가 처리한다.
핵심 기술 해설
Display 트리거
Keyboard Maestro가 제공하는 이벤트 기반 트리거 중 하나다. 외부 디스플레이가 연결되거나 해제될 때 매크로를 실행한다. USB 허브나 독(Dock)을 통해 연결하는 경우에도 동작한다.
Display 트리거는 연결과 해제를 구분하지 않는다. 두 경우 모두 트리거가 발동한다. 따라서 매크로 내부에서 현재 모니터 상태를 확인하는 조건 분기가 필수다. 이 매크로에서는 중첩 IfThenElse로 이를 처리한다.
ICU 날짜 토큰을 활용한 요일 판별
%ICUDateTime%EEE%는 KM의 텍스트 토큰이다.
ICU(International Components for Unicode) 형식을 따르며, EEE는 요일의 영문 약어를 반환한다.
이 값을 변수에 저장하고 조건문에서 비교하면, 요일별 분기를 구현할 수 있다.
이 패턴은 ch12의 Cron 트리거에서도 활용한 시간 기반 분기와 유사하다. 차이점은 Cron이 "특정 시간에 실행"하는 반면, 여기서는 "이벤트 발생 시점의 요일을 확인"하는 용도로 사용한다는 것이다.
서브매크로 호출 체인
이 매크로는 직접 창을 배치하지 않는다.
99. Sub - 업무 프로그램 위치 저장 및 실행 서브매크로에 작업을 위임한다.
해당 서브매크로는 다시 네 개의 하위 서브매크로를 순차 호출한다:
99. Sub - 크롬 윈도우 위치 설정99. Sub - Slack 윈도우 위치 설정- (기타 업무 앱 위치 설정 서브매크로 2개)
이 구조는 ch11에서 다룬 서브매크로 모듈화 패턴의 실전 적용이다. 트리거 매크로는 "언제, 어떤 조건에서"만 결정하고, "무엇을"은 서브매크로 체인이 담당한다.
[트리거 매크로: 모니터 접속 시 실행]
└─ 조건 확인 (주말? 모니터 수?)
└─ [Sub: 업무 프로그램 위치 저장 및 실행]
├─ [Sub: 크롬 윈도우 위치 설정]
│ └─ 모니터 수에 따라 다른 위치 배치
├─ [Sub: Slack 윈도우 위치 설정]
│ └─ 모니터 수에 따라 다른 위치 배치
├─ [Sub: 앱 C 위치 설정]
└─ [Sub: 앱 D 위치 설정]
각 하위 서브매크로는 Until 루프로 앱이 완전히 실행될 때까지 대기한 후, 연결된 모니터 수에 따라 다른 좌표로 창을 배치한다. 모니터가 3개면 Third Monitor 설정을, 2개면 Second Monitor 설정을, 1개면 기본 설정을 적용한다.
활용 팁
- Display 트리거는 해제 시에도 발동한다. 퇴근 시 모니터를 분리하면 "퇴근 모드" 매크로를 실행하는 것도 가능하다.
- 회사와 집의 모니터가 다른 경우, 모니터 이름이나 해상도를 조건으로 추가하면 장소별 분기도 가능하다.
- 서브매크로를 공유하므로, 창 배치를 변경하려면 서브매크로만 수정하면 된다. 트리거 매크로는 건드릴 필요가 없다.
매크로 분석: 00. 로그인 시 주말/평일 체크해서 다르게 수행함
무엇을 하는 매크로인가
Mac에 로그인할 때, 평일이면 업무 환경을 자동으로 세팅한다. 주말이면 아무것도 하지 않는다.
트리거
| 트리거 타입 | 값 | 설명 |
|---|---|---|
| Login (Time 트리거) | 로그인 시 | Mac에 로그인하면 자동 실행 |
액션 흐름
그림 13-2. 로그인 시 주말/평일 분기 매크로 흐름도 -- Login 트리거에서 요일 판별 후 서브매크로 체인을 통한 앱 실행 및 창 배치
- 변수 설정 --
varDate에 현재 요일을 저장한다. 앞선 매크로와 동일한%ICUDateTime%EEE%토큰을 사용한다. - 조건 분기 (주말 체크) --
varDate가 토요일 또는 일요일인지 확인한다. 주말이면 Then 블록으로 진입하는데, 이 블록은 비어 있다. 즉 아무 동작도 하지 않는다. - 서브매크로 호출 -- 평일인 경우(Else),
99. Sub - 로그인서브매크로를 호출한다.
구조가 첫 번째 매크로보다 단순하다. 모니터 수를 확인할 필요가 없기 때문이다. 로그인 시점에는 "평일인가 주말인가"만 판단하면 충분하다.
핵심 기술 해설
Login 트리거의 특성
이 매크로의 트리거는 JSON 데이터에서 "Time" 타입으로 기록되어 있다. KM에서 로그인 트리거는 Time 트리거의 한 형태로 구현된다. Mac에 로그인하는 순간 한 번 실행된다.
Login 트리거는 재부팅 후 로그인, 잠자기 후 깨어남, 화면 잠금 해제 등 다양한 상황에서 발동할 수 있다. KM 설정에서 어떤 경우에 발동할지 세밀하게 조절할 수 있다.
빈 Then 블록 패턴
두 매크로 모두 동일한 패턴을 사용한다. "주말이면 아무것도 하지 않는다"를 구현할 때, Then 블록을 비워두는 방식이다.
If 주말이면:
(아무것도 안 함)
Else:
실제 작업 수행
이 패턴은 가독성 면에서 논쟁이 있을 수 있다. "평일이면 실행"으로 조건을 뒤집는 것이 더 직관적일 수도 있다. 하지만 KM에서 "주말이 아닌 날"이라는 부정 조건보다 "주말인 날"이라는 긍정 조건이 설정하기 쉽다. "토요일 OR 일요일"이라는 명시적 조건을 걸고, 해당하지 않는 경우에 동작하는 구조다.
서브매크로 호출 체인 비교
이 매크로가 호출하는 99. Sub - 로그인 서브매크로의 동작을 살펴보자:
- Chrome 실행 (
ActivateApplication) - Slack 실행 (
ActivateApplication) - Chrome이 완전히 로드될 때까지 대기 (
PauseUntil) - 1초 추가 대기 (
Pause) 99. Sub - 업무 프로그램 위치 저장 및 실행호출 (ExecuteMacro)
주목할 점은 5번이다. 로그인 서브매크로가 다시 "업무 프로그램 위치" 서브매크로를 호출한다. 이것은 첫 번째 매크로(모니터 접속)가 호출하는 것과 동일한 서브매크로다.
[로그인 매크로]
└─ [Sub: 로그인]
├─ Chrome 실행
├─ Slack 실행
├─ 앱 로드 대기
└─ [Sub: 업무 프로그램 위치 저장 및 실행] <-- 공유
├─ [Sub: 크롬 윈도우 위치 설정]
├─ [Sub: Slack 윈도우 위치 설정]
└─ ...
[모니터 접속 매크로]
└─ [Sub: 업무 프로그램 위치 저장 및 실행] <-- 동일한 서브매크로
├─ [Sub: 크롬 윈도우 위치 설정]
├─ [Sub: Slack 윈도우 위치 설정]
└─ ...
로그인 매크로는 앱을 "실행"하는 단계가 추가로 필요하다. 모니터 접속 매크로는 앱이 이미 실행 중이므로 "위치 배치"만 하면 된다. 공통 부분(위치 배치)은 같은 서브매크로를 재사용한다.
이것이 서브매크로 모듈화의 핵심 이점이다. ch11에서 설계한 모듈 구조가 여기서 빛을 발한다.
활용 팁
- 주말 조건을 공휴일까지 확장할 수 있다. 공휴일 날짜를 변수에 저장해두고, 현재 날짜와 비교하는 조건을 추가하면 된다.
- Then 블록에 주말용 환경 세팅(개인 앱 실행 등)을 추가하면, 주말에도 자동화 혜택을 받을 수 있다.
- Login 트리거 대신 Wake 트리거를 사용하면, 잠자기에서 깨어날 때마다 실행되도록 변경할 수 있다.
두 매크로의 아키텍처 비교
두 매크로는 동일한 설계 철학을 공유하지만, 트리거와 실행 깊이가 다르다.
| 구분 | 모니터 접속 매크로 | 로그인 매크로 |
|---|---|---|
| 트리거 | Display (물리적 이벤트) | Login (시스템 이벤트) |
| 조건 분기 | 주말 + 모니터 수 (2단) | 주말만 (1단) |
| 서브매크로 체인 | 1단계 (위치 배치) | 2단계 (앱 실행 + 위치 배치) |
| 공유 서브매크로 | 업무 프로그램 위치 | 업무 프로그램 위치 |
이 구조에서 배울 수 있는 설계 원칙이 있다.
첫째, 트리거와 로직의 분리다. 트리거 매크로는 "언제"만 결정한다. "무엇을"은 서브매크로가 결정한다. 이렇게 하면 같은 작업을 다른 트리거로 실행할 때 서브매크로를 재사용할 수 있다.
둘째, 조건의 계층화다. 가장 넓은 범위의 조건(주말인가?)부터 확인하고, 점점 구체적인 조건(모니터 몇 개인가?)으로 좁혀간다. 불필요한 처리를 조기에 차단하는 구조다.
셋째, 공유 모듈의 활용이다. 두 매크로가 공통으로 사용하는 "창 배치" 로직은 하나의 서브매크로로 존재한다. 배치 방식을 변경하면 두 매크로 모두에 반영된다.
직접 만들어보기
로그인 시 평일/주말을 구분하는 매크로를 직접 만들어보자. 서브매크로 없이 단순화된 버전으로 시작한다.
-
KM 에디터에서 새 매크로를 만든다. 이름은 "로그인 시 평일/주말 분기"로 설정한다.
-
트리거를 추가한다. Trigger > At Login 을 선택한다. "At system startup or login" 옵션을 활성화한다.
-
첫 번째 액션을 추가한다. Set Variable to Text 액션을 선택한다.
- Variable:
varDate - To:
%ICUDateTime%EEE%
- Variable:
-
두 번째 액션을 추가한다. If Then Else 액션을 선택한다.
- 조건: The variable
varDatematchesSat|Sun(정규표현식 사용) - Then: 비워둔다 (주말이므로 아무 동작 없음)
- Else: 평일에 실행할 동작을 추가한다
- 조건: The variable
-
Else 블록 안에 원하는 액션을 추가한다. 예를 들어:
- Activate Application -- Chrome
- Activate Application -- Slack
- Display Notification -- "업무 환경 세팅 완료"
- 테스트한다. 매크로를 선택하고 Run 버튼을 눌러서 수동 실행한다. 현재 요일에 따라 알림이 뜨거나 뜨지 않는지 확인한다.
이 기본 구조가 동작하면, Else 블록의 내용을 서브매크로로 분리하는 리팩토링을 시도해본다. ch11에서 배운 서브매크로 추출 기법을 적용하면 된다.
이 챕터에서 배운 것
- Display 트리거로 외부 모니터 연결/해제 이벤트에 반응하는 매크로를 만드는 방법
- Login 트리거로 시스템 로그인 시점에 자동 실행되는 매크로를 만드는 방법
- ICU 날짜 토큰(
%ICUDateTime%EEE%)을 활용한 평일/주말 분기 패턴 - 트리거 매크로와 서브매크로 체인을 분리하여 재사용 가능한 모듈 구조를 설계하는 방법
- 여러 트리거 매크로가 공통 서브매크로를 공유하는 아키텍처 패턴
다음 챕터 예고
ch14에서는 복합 워크플로우를 다룬다. YouTube 영상을 Gemini로 요약하고 Google Docs에 저장하는, 여러 앱과 서비스를 연결하는 매크로를 분석한다. 단일 트리거에서 시작하여 여러 단계의 자동화가 연쇄적으로 실행되는 구조를 설계한다.