Universal Control에서 사라진 Caps Lock 한/영 전환, 직접 고쳐봤다
두 Mac을 Universal Control로 오가며 겪은 한/영 전환 버그를 관찰하고, 권한 설계를 한 번 실패했다가 43분 만에 되돌리며 macOS 메뉴 막대 앱으로 만들어 오픈소스로 배포하기까지의 기록.
저는 개인용 Mac과 회사 업무용 Mac, 이렇게 두 대를 씁니다. Apple의 Universal Control을 켜두면 키보드와 트랙패드 하나로 두 Mac을 마치 한 화면처럼 오갈 수 있어서, 두 Mac을 오가며 작업할 때 정말 유용하게 쓰고 있었습니다.
문제는 한/영 전환이었습니다. 평소 쓰던 Caps Lock으로는 한/영이 전환되지 않았습니다.
1. 커서는 넘어가는데, 손은 그대로였다
저는 한/영 전환을 Caps Lock 한 번으로 씁니다. 오랜 습관이라 생각하고 누르는 게 아니라 손이 먼저 반응합니다. 그런데 커서를 다른 Mac으로 옮긴 뒤 평소처럼 Caps Lock을 누르면, 아무 일도 일어나지 않았습니다.
전환할 방법이 아예 없는 건 아니었습니다. 평소 거의 쓰지 않던 fn + Space 조합으로는 한/영이 바뀌었습니다. 하지만 손에 밴 건 어디까지나 Caps Lock이었고, 매번 낯선 조합을 의식적으로 눌러야 한다는 것 자체가 피로였습니다.
매번 같은 순서로 불편했습니다.
- 커서를 다른 Mac으로 옮긴다.
- 손이 기억하는 대로 Caps Lock을 누르고 타이핑을 시작한다.
- 화면에 영어와 한글이 뒤섞여 찍혀 있는 걸 발견한다.
- 지우고,
fn + Space처럼 잘 쓰지 않던 조합을 의식적으로 눌러 전환한 뒤 다시 쓴다.
메신저 답장 한 줄, 파일 이름 하나 바꿀 때마다 이 네 단계를 반복했습니다. 도저히 그냥 쓰기 어려운 수준이라 인터넷에서 해결 방법을 찾아봤지만, 뾰족한 답은 없었습니다. 그래서 직접 고치기로 했습니다.
2. 첫 시도: 물리 Caps Lock을 그대로 옆 Mac에 전달하기
첫 버전(초기 이름은 UniInputFix, 이후 Universal Control Helper로 바꿨습니다)의 아이디어는 단순했습니다.
- 키보드가 실제로 연결된 Mac을 Source, 커서로 조작 중인 다른 Mac을 Target이라고 부른다.
- Source에서 macOS의 Input Monitoring API로 물리 Caps Lock 키 눌림 자체를 감지한다. (일반 키 입력은 건드리지 않는다.)
- 같은 로컬 네트워크에서 Bonjour로 Target을 찾고, 6자리 페어링 코드로 서로 다른 앱과 섞이지 않게 한다.
- Caps Lock이 눌렸다는 신호를 Target에 보내면, Target이 macOS 입력 소스 API로 ABC ↔ 두벌식을 직접 전환한다.
Source가 물리 Caps Lock을 감지해 Target에 전달하는 기본 구조.
키보드 입력을 가로채는 게 아니라 “Caps Lock이 눌렸다”는 신호 하나만 곁다리로 관찰하는 구조라, 다른 키 입력이나 텍스트, 클립보드에는 전혀 손대지 않습니다. 로컬 네트워크 밖으로 나가는 서버도 없습니다. 이 정도면 충분히 조심스럽게 설계했다고 생각했습니다.
3. 권한이 부담스러워서 없애봤다가, 43분 만에 되돌렸다
그런데 한 가지가 계속 마음에 걸렸습니다. 이 앱을 쓰려면 Source Mac에서 입력 모니터링(Input Monitoring) 권한을 허용해야 합니다. 키보드 입력을 감시할 수 있는 권한이라, macOS도 사용자에게 꽤 무섭게 경고하고, 실제로 써보고 싶은 사람도 이 권한 창 앞에서 망설이기 쉽습니다.
그래서 어느 날 밤, “권한 자체를 없앨 수 있지 않을까”라는 생각으로 설계를 뒤집었습니다. 물리 키를 직접 감시하는 대신, macOS가 원래 제공하는 입력 소스 변경 알림을 구독해서 Source의 ABC/두벌식 상태가 바뀌는 순간을 감지하고, 그 상태를 그대로 Target에 동기화하는 방식이었습니다. 입력 모니터링 권한도, 관련 설정 UI도 통째로 걷어냈습니다. 코드는 더 짧아지고 권한 요구는 사라지니, 누가 봐도 더 나은 버전처럼 보였습니다. 그날 밤 22시 10분, v1.5.0으로 커밋하고 릴리즈했습니다.
문제는 43분 뒤에 드러났습니다.
Universal Control은 물리 키보드 입력을 Target Mac의 HID 계층으로 직접 전달합니다. 즉 커서가 Target에 가 있는 상태에서 Caps Lock을 누르면, 그 입력은 Source의 macOS를 거치지 않고 곧장 Target으로 넘어갑니다. Source 입장에서는 입력 소스가 바뀔 이유가 없으니, 입력 소스 변경 알림 자체가 아예 발생하지 않았습니다. 제가 없애려 했던 바로 그 시나리오, 그러니까 “커서가 다른 Mac에 가 있을 때 Caps Lock을 누르는” 상황에서만 조용히 동작하지 않는 버전을 만들어 배포한 셈이었습니다. 앱이 존재하는 이유 그 자체가 빠진 릴리즈였습니다.
22시 53분, v1.5.1로 물리 Caps Lock 감지를 되돌렸습니다. 대신 입력 소스 변경 알림 구독은 완전히 버리지 않고, 두 Mac의 ABC/두벌식 상태가 어긋났을 때 자동으로 맞추는 보조 장치로 남겨뒀습니다. 권한은 다시 필요해졌지만, 그 대가로 상태가 어긋나는 엣지 케이스까지 함께 해결된 셈입니다.
배운 것: 권한을 줄이는 게 언제나 더 나은 사용자 경험은 아닙니다. 지표(권한 개수, 코드 줄 수)를 개선하는 것과 핵심 유스케이스가 실제로 동작하는지는 다른 문제입니다. 특히 “이 앱이 존재하는 단 하나의 이유”에 해당하는 경로는, 더 우아해 보이는 설계라도 반드시 실기기에서 재현해보고 바꿔야 합니다.
4. 권한 안내와 설정 화면을 다듬다
권한을 되돌린 이상, 이번에는 그 권한을 요청하는 과정 자체를 최대한 매끄럽게 만드는 쪽으로 방향을 잡았습니다.
- 스위치는 켜져 있는데 macOS 권한 목록에는 미허용으로 남는 경우가 있어, 설정창에 권한 항목 재등록 버튼을 추가했습니다.
- 앱이 권한 목록에 자동으로 나타나지 않을 때를 대비해, 직접 추가하는 방법도 안내 문구로 남겼습니다.
- 역할 선택, 페어링 코드, 입력 권한, 소프트웨어 업데이트로 흩어져 있던 항목을 설정창 하나로 모으고, 메뉴 막대 메뉴는 켜고 끄는 스위치·설정·종료만 남기고 전부 걷어냈습니다.
지금 제 Mac에서 실제로 이렇게 동작합니다.
메뉴 막대 드롭다운. 스위치, 설정, 종료 세 가지뿐입니다.
설정창 하나에 일반 · 연결 · 입력 권한 · 업데이트를 전부 모았습니다. 페어링 코드는 매번 새로 생성되는 6자리 숫자라 캡처 화면에서는 예시 값으로 가려뒀습니다.
연결 상태가 “연결됨 · 입력 소스 동기화 중”으로 뜨는 걸 보면, 지금 이 글을 쓰는 이 순간에도 다른 Mac에서 Caps Lock을 누르면 이 Mac의 한/영이 그대로 따라 바뀝니다. 딱 제가 원했던 그 경험입니다.
5. 이름을 바꾸고, 신뢰를 쌓다
기능이 안정되고 나서는 배포 쪽을 정리했습니다.
- 처음 이름 UniInputFix는 뭘 하는 앱인지 와닿지 않아서, Universal Control Helper로 바꿨습니다.
- Apple Developer ID로 서명하고 공증(notarization)까지 거치는 파이프라인을 GitHub Actions에 붙였습니다. 자격 증명이 없을 때는 임시 서명으로도 릴리즈되도록 이중화했습니다.
- 설치 스크립트가 SHA-256 체크섬과 앱 서명을 확인한 뒤에만
/Applications에 설치하도록 만들었습니다. - Sparkle로 EdDSA 서명된 업데이트만 자동으로 받도록 했습니다.
- 코드 전체를 MIT 라이선스로 GitHub에 공개했습니다. 키보드 입력 권한을 요구하는 앱이라면, 무엇을 하고 무엇을 하지 않는지 코드로 직접 확인할 수 있어야 신뢰할 수 있다고 생각했기 때문입니다.
배운 것: 입력 권한을 요구하는 유틸리티는 기능만큼이나 신뢰를 어떻게 증명할지가 중요합니다. 오픈소스 공개, 서명·공증, 체크섬 검증은 전부 “이 앱을 믿어도 된다”는 근거를 사용자 대신 기계가 확인해주는 장치입니다.
6. Caps Lock 하나 때문에
되돌아보면 시작은 사소한 불편이었습니다. 커서를 다른 Mac으로 옮겼는데, 손에 익은 습관 하나가 따라오지 않는 것. 하지만 그 사소함이 하루에 수십 번 반복되면 무시할 수 없는 마찰이 되고, 그 마찰을 없애는 과정에서 권한 설계를 한 번 잘못 풀었다가 43분 만에 되돌리는 경험도, 신뢰를 어떻게 증명할지 고민하는 경험도 했습니다.
Universal Control로 Mac 두 대를 오가며 Caps Lock으로 한/영을 전환하는 분이라면, 지금 겪고 있는 그 불편함의 마지막 한 조각을 이어드릴 수 있을 것 같습니다. 무료이고 오픈소스이며, 설치는 명령어 한 줄이면 끝납니다.
- GitHub 저장소
- 최신 릴리즈 다운로드
- 버그나 아이디어는 Issues로 알려주시면 감사하겠습니다.