맥에서 AE 서버(AE Server)란?
여러 대의 맥을 사용하다 보면, 아주 간단한 작업 하나를 하기 위해서도 컴퓨터 사이를 오가야 하는 불편함이 생깁니다. 예를 들어, 다른 맥에 있는 문서를 인쇄해야 하는 상황이라면 먼저 파일을 현재 사용 중인 맥으로 복사한 뒤, 해당 맥에 로그인해서 거기서 인쇄해야 합니다. 이런 일이 생기는 이유는 내 맥에서 파일을 열 수 없거나, 파일을 실행하는 데 필요한 앱이 구버전이기 때문입니다.
특히 파일이 많을 때는 매번 다른 컴퓨터로 파일을 복사하는 것이 매우 번거롭습니다. 다행히 애플(Apple)은 AppleScript와 원격 애플 이벤트(Remote Apple Events)라는 기술을 통해, 동일한 네트워크상의 다른 맥을 손쉽게 제어할 수 있도록 만들었습니다. 덕분에 맥 사용자는 자리에서 일어나지 않고도 원격으로 앱을 실행하고 기본적인 작업을 수행할 수 있습니다. 음악을 듣기 위해 iTunes를 켜거나, 메시지 앱으로 문자를 보내거나, 이메일을 전송하는 작업 모두 원격으로 처리할 수 있습니다.
집이나 사무실에 두 대 이상의 맥이 있다면 이러한 원격 접근 기능이 매우 유용합니다. '공유(Shared)' 기능으로도 같은 네트워크의 다른 맥을 원격 제어할 수 있지만, AppleScript 명령어와 AE 서버를 활용하면 훨씬 빠르게 작업할 수 있습니다. 게다가 화면 공유 기능을 열 필요조차 없습니다.
애플 이벤트(Apple Event)란 무엇인가?
애플 이벤트는 macOS의 메시지 기반 프로세스 간 통신(Inter-Process Communication) 메커니즘으로, System 7에서 처음 등장한 이후 클래식 맥 OS의 모든 버전과 macOS에서 지원되어 왔습니다. 애플 이벤트는 '문서 열기'나 '파일 인쇄'처럼 고수준(high-level) 이벤트를 표현합니다. 반면 그 이전 운영체제는 '클릭'이나 '키 입력' 같은 훨씬 단순한 이벤트만 지원했습니다. 애플 이벤트는 맥 OS 스크립팅 시스템인 OSA(Open Scripting Architecture)의 기반을 이루며, OSA의 대표 언어가 바로 AppleScript입니다.
AEDesc와 데이터 구조
애플 이벤트의 출발점은 AEDesc라는 동적 타입의 확장 가능한 디스크립터(descriptor) 포맷입니다. AEDesc는 데이터 타입을 지정하는 OSType 코드와 타입에 따른 데이터 블록으로 구성됩니다. 예를 들어 OSType 코드 'inte'는 데이터가 빅 엔디안(big-endian) 형식의 4바이트 부호 있는 정수임을 의미합니다.
다양한 단순 타입을 위한 사전 정의된 코드 외에도, 두 가지 구조화된 디스크립터 타입이 있습니다. 바로 데이터 타입 'reco'(레코드)를 가진 AERecord와 타입 'list'(리스트 또는 배열)를 가진 AEList입니다. 이들의 내부 구조에는 AEDesc가 재귀적으로 중첩되며, AERecord는 각 요소를 OSType 형태의 고유한 레코드 필드 ID와 연결합니다. 애플 이벤트 매니저(Apple Event Manager)는 이러한 구조를 생성하고, 내용을 추출하고, 데이터 타입을 조회하는 API 호출을 제공합니다.
또한 애플 이벤트 매니저는 코어전(coercion), 즉 AEDesc를 한 데이터 타입에서 다른 타입으로 변환하는 기능을 지원합니다. 정수형과 실수형 사이의 표준 변환 외에도, 애플리케이션은 자체 코어전 핸들러 콜백을 설치하여 커스텀 데이터 타입 간의 변환을 처리할 수 있습니다.
애플 이벤트의 동작 방식
애플 이벤트 본체(event proper)는 목적에 따라 필드가 달라지는 AERecord입니다. 여기에 애플 이벤트 매니저가 미리 정의한 속성(attribute)들이 추가됩니다. 속성은 레코드 필드(이벤트의 '매개변수'라고 함)와 구분되며, 이벤트가 수행할 작업(이벤트 클래스와 이벤트 ID), 이벤트를 전송할 대상 주소(로컬 또는 원격 머신의 프로세스), 기타 처리 옵션 등을 지정합니다. 초기에는 원격 머신과 AppleTalk를 통해 연결해야 했지만, Mac OS 9부터 TCP/IP 연결 옵션이 추가되었습니다.
대상 프로세스에 애플 이벤트를 전송한 후, 발신 프로세스는 회신(reply) 애플 이벤트를 받도록 선택할 수 있습니다. 회신에는 성공/실패를 나타내는 에러 코드, 원래 요청한 정보, 그 밖의 적절한 정보가 포함될 수 있습니다.
애플 이벤트는 AppleEvent 객체 모델의 기반이며, 이는 다시 OSA와 AppleScript의 토대가 됩니다. 2016년 기준으로 애플 이벤트 매니저 API의 공식 구현체는 C 및 C++ 등 C 계열 언어에서 사용할 수 있으며, Cocoa API를 통해 Objective-C와 Swift용 공식 바인딩도 제공됩니다. Perl, UserTalk, Ruby, Python 등 다른 언어를 위한 비공식 바인딩도 존재합니다(제약 수준은 다양).
AE 서버란 무엇인가?
백그라운드에서 AE 서버가 실행 중인 것을 발견했는데 이 기능이 낯설다면, "내 맥의 AE 서버는 대체 무엇일까?"라는 궁금증이 들기 마련입니다.
AE 서버(AE Server)는 AppleEvents Server라고도 불리며, macOS에서 원격 애플 이벤트를 처리하는 역할을 합니다. 이를 통해 다른 맥에서 실행 중인 애플리케이션이 로컬 컴퓨터로 애플 이벤트(AE)를 보낼 수 있습니다. '시스템 환경설정 > 공유'에서 원격 애플 이벤트가 켜져 있는지 확인할 수 있습니다. AEServer는 macOS의 접근성 권한 패널에서도 확인할 수 있습니다:
시스템 환경설정 > 보안 및 개인정보 보호 > 개인정보 보호 > 손쉬운 사용 > AEServer
복잡해 보이지만 실제로는 생각보다 훨씬 간단합니다. macOS에 내장된 사용자 수준 스크립팅 시스템인 AppleScript는 비교적 간단한 문법으로 반복 작업을 자동화하고, 앱의 기능을 확장하며, 심지어 독립 실행형 앱까지 만들 수 있게 해줍니다. AppleScript는 '애플 이벤트'라는 간단한 메시징 시스템을 통해 macOS와 개별 대상 애플리케이션과 소통합니다.
AE 서버의 역할은 AppleScript를 받아 이를 실행하고, 다른 맥 컴퓨터로 전달하는 것입니다. AppleScript를 보내는 것만으로는 작업이 수행되지 않으며, 수신 측 컴퓨터가 원격 애플 이벤트를 통해 이를 승인해야 합니다.
내 맥은 다른 맥에서 실행 중인 애플리케이션이 보낸 애플 이벤트를 수락할 수 있습니다. '이 문서 열기' 또는 '이 문서 인쇄' 같은 작업이 macOS에서 수행되는 것입니다. 원격 애플 이벤트가 켜져 있으면, 다른 맥에서 실행 중인 AppleScript가 로컬 맥을 원격으로 제어하거나 문서 인쇄, 앱 실행 같은 작업을 수행할 수 있습니다.
macOS 카탈리나(Catalina) 사용 시 주의사항
macOS Catalina가 설치된 맥에서는 원격 시스템의 프로그램을 대상으로 하는 애플 이벤트와 AppleScript가 해당 원격 시스템의 동일한 사용자에 의해 인증되어야 합니다. 그렇지 않으면 procNotFound 오류가 발생합니다. 어떤 사용자 세션의 앱이든 원격 애플 이벤트로 제어할 수 있게 하려면, 서버 측 맥의 터미널에서 다음 명령어를 실행하세요:
defaults write /Library/Preferences/com.apple.AEServer RestrictAccessToUserSession -bool false
그런 다음 '시스템 환경설정 > 공유'에서 원격 애플 이벤트를 끄고 다시 켜면 됩니다.
애플 이벤트 매니저(Apple Event Manager)란?
애플 이벤트 매니저는 OSA(Open Scripting Architecture)의 일부로, 애플리케이션이 애플 이벤트를 주고받고, 자신의 작업과 데이터를 AppleScript 스크립트에 노출할 수 있도록 하는 기능을 제공합니다. 관련 API 참조는 Open Scripting Architecture Reference에서 확인할 수 있습니다.
애플 이벤트는 복잡한 작업과 데이터를 지정할 수 있는 프로세스 간 메시지의 한 종류입니다. 애플 이벤트는 단일 애플리케이션 내부, 같은 컴퓨터의 애플리케이션 간, 그리고 네트워크로 연결된 다른 컴퓨터의 애플리케이션 간에 모두 사용할 수 있는 데이터 전송 및 이벤트 디스패치 메커니즘을 제공합니다.
애플리케이션은 일반적으로 다른 앱에 서비스와 정보를 요청하거나, 그러한 요청에 대한 응답으로 서비스와 정보를 제공할 때 애플 이벤트를 사용합니다. Human Interface Toolbox(카본 애플리케이션) 또는 Cocoa 애플리케이션 프레임워크를 통해 사용자에게 그래픽 인터페이스를 제공하는 모든 애플리케이션은, 적절한 경우 macOS가 보내는 특정 이벤트에 응답할 수 있어야 합니다. 여기에는 앱 실행(launch), 재실행(reopen), 문서 열기, 문서 인쇄, 종료(quit) 이벤트가 포함됩니다.
애플 이벤트 매니저의 일부 함수는 스레드 안전(thread safe)으로 표시되어 있습니다. 나머지 함수들은 반드시 메인 스레드에서만 호출해야 합니다.
애플 이벤트 매니저는 AE 프레임워크(Core Services 프레임워크의 서브프레임워크)로 구현됩니다. AE 프레임워크와 직접 연결(link)하지 않고, 일반적으로 이를 포함하고 있는 Carbon 프레임워크와 연결합니다. HIToolbox 프레임워크의 AEInteraction.h처럼 일부 애플 이벤트 정의는 Carbon 프레임워크 클라이언트에게만 제공됩니다.
AE 프레임워크는 윈도우 서버와의 연결을 강제하지 않습니다. 덕분에 애플 이벤트를 활용하는 데몬(daemon)과 시작 항목(startup item)이 로그아웃 후에도 계속 작동할 수 있습니다.
맥에서 원격 애플 이벤트 허용하는 방법
내 맥은 다른 컴퓨터에서 실행 중인 앱이 보낸 애플 이벤트를 수락할 수 있습니다. 애플 이벤트는 '이 문서 열기'나 '인쇄' 같은 맥에서 수행되는 작업입니다.
원격 애플 이벤트가 켜져 있으면, 다른 맥에서 실행 중인 AppleScript 프로그램이 내 맥과 상호작용할 수 있습니다. 예를 들어, 해당 프로그램이 내 맥에 있는 문서를 열어 인쇄할 수 있습니다.
- 맥에서 애플 메뉴 > 시스템 환경설정을 선택한 후 공유(Sharing)를 클릭합니다.
- 원격 애플 이벤트(Remote Apple Events) 체크박스를 선택합니다.
- 이벤트를 보낼 수 있는 사용자를 지정합니다.
- 모든 사용자(All users): 컴퓨터의 모든 사용자와 네트워크상의 누구나 이벤트를 보낼 수 있습니다.
- 이 사용자만(Only these users): 추가(+) 버튼을 클릭한 후 이벤트를 보낼 수 있는 사용자를 선택합니다. '사용자 및 그룹'에는 컴퓨터의 모든 사용자가 포함되며, '네트워크 사용자'와 '네트워크 그룹'에는 네트워크상의 사람들이 포함됩니다.
맥에서 AE 서버 활성화하는 방법
네트워크상의 다른 맥에 지시를 내리려면 AppleScript와 원격 애플 서버 두 가지가 모두 필요합니다. AppleScript에는 다른 맥이 수행할 작업에 대한 명령이 담겨 있고, AE 서버가 이를 승인하고 실행합니다. 이 기능을 활용하면 다른 맥에게 종료, 음악 재생, 웹사이트 접속, 알림 표시 등을 지시할 수 있습니다.
맥에서 원격 애플 서버(AE 서버)를 활성화하려면 다음 단계를 따르세요:
- 원격으로 제어하려는 맥에서 애플 메뉴를 클릭한 후 시스템 환경설정(System Preferences)을 선택합니다.
- 공유(Sharing)를 클릭한 다음 원격 애플 이벤트 체크박스에 체크합니다.
- 이벤트를 보낼 수 있는 사용자를 지정합니다.
- 모든 사용자: 컴퓨터의 모든 사용자와 네트워크상의 누구나 내 맥으로 이벤트를 보낼 수 있습니다.
- 이 사용자만: 추가(+) 버튼을 클릭한 후 이벤트를 보낼 수 있는 사용자를 선택합니다. '사용자 및 그룹'은 컴퓨터의 모든 사용자를, '네트워크 사용자'와 '네트워크 그룹'은 네트워크상의 사람들을 의미합니다.
이 단계를 완료하면 지정한 사용자들이 내 맥으로 AppleScript를 보낼 수 있습니다. 단, AppleScript를 인증하려면 해당 맥의 관리자 계정 사용자 이름과 비밀번호로 로그인해야 합니다.
AppleScript를 실행하기 전에 맥 클리닝 소프트웨어로 컴퓨터를 먼저 정리하여 최상의 성능을 유지하는 것이 좋습니다.
보안을 위한 주의사항
모든 공유 기능이 그렇듯이, 원격 애플 이벤트는 정말 필요하다고 확신할 때만 활성화해야 합니다. 내 맥의 IP 주소와 사용자 이름, 비밀번호를 알고 있는 악의적인 제3자가 정보를 도난당하거나, 기기를 장악하거나, 세션을 무단으로 침해할 위험이 있습니다. 다른 맥에 지시를 보낼 필요가 없다면, 불필요한 공격 경로를 차단하기 위해 이 기능을 꺼두는 것이 가장 좋습니다.
원격 애플 서버를 비활성화하려면 공유 메뉴(애플 메뉴 > 시스템 환경설정 > 공유 > 원격 애플 이벤트)에서 끄거나, 터미널(Terminal)에서 다음 명령어를 입력하세요:
/usr/bin/sudo /bin/launchctl disable system/com.apple.AEServer
변경 사항을 적용하려면 컴퓨터를 재시작하세요. 이제 AE 서버가 비활성화됩니다.
AppleScript 작성 방법
원격 애플 서버를 활성화하는 것은 절반에 불과합니다. 다음으로는 맥에게 원하는 작업을 지시하는 AppleScript를 직접 작성해야 합니다. 이를 위해서는 Finder > 유틸리티 폴더에 있는 AppleScript 편집기(또는 스크립트 편집기)를 사용합니다. 편집기를 연 후 파일 > 새로 만들기(File > New)를 클릭하여 스크립트를 작성하면 됩니다.
아래는 바로 활용해볼 수 있는 스크립트 예시입니다:
맥 잠자기 모드로 전환
tell application "Finder" of machine "eppc://IP Address of the target Mac"
sleep
end tell
iTunes 열기
tell application "iTunes" of machine "eppc://IP Address of the target Mac"
play
end tell
iTunes 종료
tell application "iTunes" of machine "eppc://IP Address of the target Mac"
stop
end tell
Safari 실행
tell application "Safari" of machine "eppc://IP Address of the target Mac"
activate
end tell
Safari 종료
tell application "Safari" of machine "eppc://IP Address of the target Mac"
quit
end tell
이렇게 AppleScript를 작성해두면 맥에 저장해두고 필요할 때마다 실행할 수 있습니다. 스크립트를 실행하려면 대상 맥의 사용자 이름과 비밀번호를 입력해야 합니다.