메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

맥 OS X 에서 애플스크립트 입문

한빛미디어

|

2002-02-21

|

by HANBIT

19,941

저자:『AppleScript in a Nutshell』의 저자 브루스 W. 페리(Bruce W. Perry), 황세진(parting@mac.com)역

애플스크립트는 운영체제 및 널리 사용되는 응용프로그램을 사용자가 직접 제어할 수 있도록 자동화 기능을 제공하는 매킨토시의 내장 기능을 말한다. 이 강력한 스크립팅 시스템은 매킨토시의 열렬한 추종자, 인쇄 및 출판업계의 전문가들이 즐겨 사용해왔었다. 그러나 그동안 맥OS X에서는 이 스크립팅 시스템이 제대로 지원되지 않았기 때문에 맥 OS X 10.1.2 버전의 출시로 지금부터 더 넓은 층의 사용자가 진정으로 애플스크립트의 기능을 사용할 수 있는 준비가 되었다고 말할 수 있다. 아래 목록은 맥 OS X에서 애플스크립트로 개발할 수 있는 놀라운 몇몇 예제들이다.
  • 애플스크립트 스튜디오는 아쿠아 GUI로 애플스크립트 응용프로그램을 작성할 수 있는 개발도구이다.
  • 애플스크립트의 "do shell script" 명령어를 이용하면 맥 OS X의 터미널에서 유닉스 셸 명령어를 호출하여 사용할 수 있다.
  • 응용프로그램과 웹간에 XML 표준 형식을 사용해 주가나 날씨 정보와 같은 정보를 받아볼 수 있는 웹 서비스 관련 기능을 지원한다.
필자는 이 기사에서 애플스크립트를 이용하여 개발할 수 있는 응용프로그램을 어디서 찾을 수 있는지에 대해 보여줄 것이며 더 나아가 간단한 애플스크립트의 예제 또한 보여줄 것이다. 요즘 독자들은 단순한 것 뿐만 아니라 멋진 예제에 관심이 많기 때문에 필자는 애플스크립트 스튜디오, 웹 서비스, 유닉스 셸 통합과 관련된 설명과 코드 예제도 제공할 것이다.

맥 OS X에 포함된 응용프로그램이나 어도비 일러스트레이터 10, 파일메이커 프로처럼 널리 사용되는 서드 파티 응용프로그램을 스크립팅하는데 관심이 많다면 아래 목록을 참고하여 애플스크립트를 사용할 수 있는 응용프로그램들을 참고하기 바란다.
애플스크립트를 사용할 수 있는 응용프로그램들

아래는 애플스크립트로 제어가 가능한 MacOS X응용프로그램 목록이다.

애플 시스템 프로파일러, 컬러싱크, 파인더, 이미지 캡쳐, 아이튠즈, 메일, 프린트센터, 퀵타임 플레이어, 셜록2, 터미널, 텍스트에디트, 인터페이스 빌더, 프로젝트 빌더

아래는 서드 파티의 스크립트 사용이 가능한 응용프로그램 목록이다.

어도비 일러스트레이터, 어도비 포토샵, 비비에디트, 유도라, 파일메이커 프로, 인터넷 익스플로러, 마이크로소프트 워드, 넷스케입 네비게이터, 쿼크 익스프레스, 스톤 스튜디오, 마이크로소프트 앙투라쥬


처음 시작하는 이를 위해…

애플스크립트 파인더를 열어 응용프로그램 아이콘을 툴바에서 클릭하면 애플스크립트라는 폴더가 있다. 여기에서 스크립트 에디터 응용프로그램을 찾을 수 있다. (파인더상에서 옵션-커맨드-A키를 누르면 바로 응용프로그램 폴더가 나타남) 아래의 [그림 1]은 스크립트 에디터 윈도우와, 컬럼 뷰로 나타난 파인더 윈도우에서 애플스크립트 폴더가 선택된 화면이다. 스크립트 에디터는 텍스트 에디터와 유사하며 여기에서 애플스크립트 소스코드를 입력하고, 문법을 체크하고, 컴파일 할 수 있다.


[그림 1]

그러면 이제 간단한 스크립팅 예제를 살펴보자. 필자는 사무실의 다른 곳에 있는 윈도우 운영체제 컴퓨터에 연결된 프린터를 사용하고 있다. 이 프린터의 대기열에 직접 문서를 추가할 수 없는 없지만 이 머신의 디스크를 필자의 노트북 바탕화면에 마운트 시켜놓을 수 있고 다른 머신(프린트 하려는 머신)의 "print" 폴더에 파일을 옮겨 놓을 수 있다. 아래와 같은 애플스크립트 코드를 이용하여 시도해 보자.

tell application "Finder"

    activate
    move selection to folder "print" of disk "M"

end tell
이 스크립트는 파인더에게 명령을 내리는 것으로 기술적으로 메킨토시에서는 이를 애플 이벤트라고 한다. "tell" 명령어는 특정 응용프로그램을 지정하는 것이며 애플스크립트를 사용할 수 있는 다른 응용프로그램에 대해서는 "tell application "iTunes"" 또는 "tell application "Adobe Photoshop®5.5""와 같은 문법을 사용할 수 있다는 것을 쉽게 유추할 수 있다.

"activate" 명령어는 "tell" 명령어로 지정한 응용프로그램을 데스크탑에 활성화시킨다. (다시 말해 지정한 응용프로그램의 메뉴바가 나타나게 된다.) 파인더에서 선택한 파일은 디스크 "M"(이 경우, 다른 컴퓨터의 네트워크 드라이브)의 "print" 폴더로 옮겨진다. 현 상태를 복잡하게 만들지 않기 위해 이를 테면 예외처리 즉 선택한 것이 파일인가 아닌가(폴더를 옮기려 하는 것은 아니므로)를 일일이 체크하지는 않았지만 이 예제를 통해서 애플스크립트가 얼마나 간결하고 유용한 것인가를 이해할 수만 있다면 필자는 그것으로 만족하겠다. 소수의 응용프로그램들(예를 들어 BBEdit 6.5)는 스크립트 에디터의 "기록(Record)" 기능을 이용할 수 있다(매크로의 대용으로 쓸 수 있음). 물론 이 외에도 애플스크립트로 할 수 있는 일은 더욱 많다.

애플스크립트 스튜디오

스크립트 고수를 위한 맥 OS X 10.1.2의 대표적인 기능이 바로 애플스크립트 스튜디오이다. 이는 아쿠아 GUI를 이용하여 애플스크립트 응용프로그램을 개발하는 것이다. 아래의 [그림 2]는 사용자가 주식 기호(각 회사의 고유 코드)를 입력하면 웹 서비스를 통해 주식값을 받아오고 선택한 통화단위로 표시가 되는 애플스크립트 스튜디오 응용프로그램을 보여주고 있다.


[그림 2]

애플스크립트 스튜디오는 자바나 오브젝티브-C로 코코아 응용프로그램을 개발하는 프로젝트 빌더, 인터페이스 빌더 통합개발환경에 내장되어 있다. 애플스크립트 스튜디오는 2001년 12월부터 배포된 맥 OS X Developer Tool(http://developer.apple.com/tools/macosxtools.html 참고)에 포함되어 있다. (ADC 온라인 멤버는 무상으로 다운로드 받을 수 있음)

애플스크립트 스튜디오는 기능과 학습곡선의 양쪽 측면 모두를 고려해 스크립트 에디터를 한 단계 발전시킨 것이다. 애플스크립트 스튜디오 응용프로그램에서 부가적으로 프로젝트 빌더의 개발중인 프로젝트에 자바나 오브젝티브-C를 추가한 후 애플스크립터에서 직접 이들 객체의 메소드를 호출할 수 있다. 인터페이스 빌더를 이용하면 복잡한 사용자 인터페이스를 작성할 때 애플스크립트 스튜디오 응용프로그램 윈도우에 코코아 인터페이스 객체(텍스트 필드, 버튼, 상태진행 바와 같은)를 드래그 앤 드롭으로 사용할 수 있다. [그림 3]은 인터페이스 빌더의 팔레트와 애플스크립트 스튜디오 응용프로그램 윈도우를 보여주는 화면이다.


[그림 3]

애플스크립트 스튜디오는 사용자 상호작용을 필요로 하는 자동화 도구 개발을 위한 환경으로 그 전망이 밝아 보인다.

유닉스 쉘 스크립팅 개요

애플스크립트 개발자들은 맥 OS X 10.1.2에서 두 가지 방법으로 유닉스 셸을 이용할 수 있다. "do shell script" 구문은 특정 응용프로그램을 지정하지 않고도 유닉스 셸 구문을 실행할 수 있다. 예를 들어 스크립트 에디터 윈도우에 아래와 같은 코드를 입력하여 컴파일하고 실행하여 보자. 아래는 세미콜론으로 분리된 세 개의 유닉스 셸 명령어를 따로따로 실행한다.

  do shell script "cd $HOME; pwd; ls -l"
이 스크립트의 반환 값은 문자열형이며, 필요에 따라 다음 과정이 진행된다. 이 스크립트의 실행결과 윈도우는 아래의 [그림 4]와 같다.

  "/Users/brucep
total 0
drwxr-xr-x   7 brucep  staff   264 Nov 24 20:27 AllProps
drwxr-xr-x   5 brucep  staff   126 Jan  4 19:57 Applications
drwx------  17 brucep  staff   534 Jan 18 10:24 Desktop
drwx------  14 brucep  staff   432 Jan 18 10:17 Documents
..."


[그림 4]

터미널 스크립팅

또한 맥 OS X에 설치된 기본 명령라인 유틸리티인 터미널 응용프로그램의 스크립팅도 할 수 있다. 아래 스크립트 코드는 새로운 터미널 윈도를 열고 아파치 톰캣 자바 서블릿 엔진과 MySQL 데이터 베이스 서버를 실행한다(물론 이러한 것들이 설치되어 있어야 하겠지만…). 아주 유용하게 사용되는 스크립트이다.

ignoring application responses
    tell application "Terminal"
      activate
      do script with command ¬ 
      "/Users/brucep/bin/start_tomcat; /usr/local/bin/safe_mysqld &;"
    end tell
  end ignoring
"¬" 문자는 줄 바뀜을 표시하는 것으로 옵션-리턴키를 누르면 입력할 수 있다. "ignoring application responses/end ignoring" 구문은 터미널의 응답을 기다리는 동안 애플스크립트의 지연을 막는 것이다. "ignoring" 애플스크립트 구문에 대한 더 상세한 정보는 필자가 쓴 『AppleScript In a Nutshell』의 137페이지를 참고하기 바란다.
아이튠즈2 스크립팅

아래 코드는 아이튠즈 2를 열어 사용자가 타이틀을 선곡한 후에 곡을 연주하는 것이다.

tell application "iTunes"
  
activate
try
     set mainWindow to item 1 of browser windows
     set _playlist to the view of mainWindow
     set theSongs to the name of every track of _playlist
   set songTitle to ¬
         choose from list theSongs with prompt ¬
              "Choose a song to play"
     tell _playlist
      set song to item 1 of ¬
              (every track whose name contains the songTitle)
     end tell
     say "Now playing the song " & (name of song) & ¬
               " by " & (artist of song)
     play song
on error
    
    display dialog ¬ 
"Either a playlist is not selected or you canceled the dialog.
Please try again."
  end try
end tell
이 스크립트는 아이튠즈의 메인 윈도우에 있는 트랙의 모든 노래 제목을 표시한다. 사용자는 대화상자("choose from list the Songs" 코드가 노래목록이 들어있는 대화상자를 표시하는 기능을 함)의 목록에서 노래 제목을 선택할 수 있다. "say" 애플스크립트 명령어는 사용자가 입력한 명령이 무엇이든 간에 맥 OS X의 말하기 기능을 이용해 육성으로 알려줄 것이다. 이때의 목소리는 시스템 환경설정의 말하기 설정부분에서 정해줄 수 있다. "say" 명령어가 텍스트를 읽는 방법을 수정하기 위해 "embedded speech commands"를 사용할 수도 있다. "embedded speech commands"에 대한 더 자세한 정보는 『AppleScript In a Nutshell』 393페이지를 참조한다.
XML 웹서비스

XML 웹 서비스는 분산 컴퓨팅 환경에서 정보 교환에 초점을 두는 XML 응용프로그램이다. 이 서비스는 두 개의 프로토콜로 이루어져 있다. 하나는 XML-RPC, 다른 하나는 단순객체 접근 프로토콜(SOAP)이다. (†역자 주: 실제로 웹 서비스는 거의 SOAP을 이용하는 쪽으로 확정된 상황이다. SOAP, WSDL, UDDI의 세 가지 프로토콜을 이용하여 XML 웹 서비스가 가능하며, 애플스크립트 이용시에는 XML로 데이터를 전달하는 부분만 구현할 수 있다. WSDL은 웹서비스의 IDL(인터페이스 정의 언어)에 해당하며, UDDI는 웹 서비스를 등록하여 필요한 웹 서비스를 찾는 기능을 한다.) 기술적으로 자세한 내용은 다루지 않을 것이다. 다만 http를 이용하는 프로토콜로서 인터넷을 통해 데이터를 전달하며 원격지의 정보를 보내고 받을 수 있다는 정도만 알아두자. XML-RPC와 SOAP의 요청과 응답은 모두 XML로 이뤄진다. 맥 OS X 10.1.2의 애플스크립트는 XML-RPC와 SOAP을 쉽게 다룰 수 있다.

XML-RPC 호출

MacOS X 10.1에서 애플스크립트 개발자는 "call xmlrpc" 명령어를 사용할 수 있다. "tell" 구문으로 대상이 되는 XML-RPC 서버를 정해준다. 아래 스크립트 질의는 XML-RPC서버인 "http://time.xmlrpc.com/RPC2"에 날짜와 시간을 요청하는 것이다. 단순한 예제이지만 SOAP이나 XML-RPC에서 다양한 형태의 데이터에 접근할 수 있다. "call xmlrpc" 명령어는 메소드 이름을 요구한다("currentTime.getCurrentTime"과 같은). 필요한 매개변수를 메소드에 모두 포함해야 한다("call soap" 예제를 살펴보자). 이 스크립트는 반환 값을 받아와서, 애플스크립트에서 날짜를 출력한다. 이 코드는 미국 동부 시간대를 기준으로 하기 때문에(GMT+3) 반환된 값에 3시간을 더하였다.(서울은 GMT+9이므로, 9*hours를 사용)

  tell application "http://time.xmlrpc.com/RPC2"
  
  set returnValue to call xmlrpc ¬
      {method name:"currentTime.getCurrentTime"}
  set theDate to (returnValue as date) + (3 * hours)
  
  end tell

웹 서비스를 제공하는 웹사이트들은 평소에 주로 사용하는 메소드 이름과 매개변수를 설명해 놓았다(http://www.xmlrpc.com/currentTime에 가면 이 스크립트 예제에 대한 세부사항을 볼 수 있을 것임). 좋든 싫든 맥 OS X의 시스템 소프트웨어는 XML을 처리할 수 있다. 애플스크립트 개발자는 XML 반환 값을 파싱하거나 변환하는 작업을 별도로 하지 않아도 된다.

SOAP 호출

SOAP 서버를 사용하는 애플스크립트 명령어는 여러분이 예측한 바와 같이 "call soap"이다. SOAP은 아주 복잡한 자료형도 교환할 수 있기 때문에 부분적으로는 XML-RPC보다 더 복잡한 프로토콜이다. SOAP을 호출하는 애플스크립트 문법은 XML-RPC의 경우보다 길다. "call soap" 문법에서 메소드 이름에 대한 값을 제공하는 "method namespace URI", 모든 메소드 매개변수와 "SOAPAction"까지도 기술해야 하기 때문이다. Xmethod(필자가 찾은 SOAP 서버 정보가 있는 곳)와 같은 사이트에는 보통 이와 같은 다양한 매개변수를 사용하는데 필요한 기본적인 값들을 설명해 놓았을 것이다. 추측할 필요는 없다!

이 스크립트는 주식 기호(각 회사별 고유 코드)와 국가명을 매개변수로 보내면 특정한 통화단위로 주식가격(주식시장이 열려 있을 때만)을 받아오는 것이다. 이 경우에는 썬 마이크로시스템즈의 주가를 미 달러로 받아오는 예제이다. 이상하게 보이는 "on getStockPrice(sym, _country)" 부분이 주식기호와 국가명을 매개변수로 취하고, "call soap" 명령어로 주식가격을 받아오는 애플스크립트 핸들러이다. 애플스크립트 핸들러나 서브루틴은 『AppleScript In a Nutshell』의 챕터 8에 기술되어 있다.

set sym to "SUNW"
set _country to "United States"

getStockPrice(sym, _country)

on getStockPrice(Symbol, theCountry)
  try
      with timeout of 30 seconds  
          tell application "http://soaptest.activestate.com:8080/PerlEx/soap.plex"
        
      return (call soap ¬
         {method name:"StockQuoteInCountry", ¬
         method namespace uri:"http://activestate.com/",¬
      parameters:{Symbol:Symbol as string, country:theCountry as string},¬
        SOAPAction:"urn:activestate"} )
        
      end tell
    end timeout
    
  on error errmesg
    display dialog errmesg
  end try
end getStockPrice
"try" 구문에 포함된 "getStockPrice" 핸들러는 "try~end try" 내에서 볼 수 있는 스크립트 구문으로 예외처리를 위한 것이다. SOAP과 XML-RPC 호출에서 응답은 네트워크의 속도저하 때문에 늦어질 수 있으며 이는 애플스크립트 문법의 "time out" 구문 때문에 가능하다. 예외처리를 위한 "try" 구문을 사용하지 않으면 스크립트는 오류를 일으킬 수도 있다. 이 스크립트는 또한 "with timeout" 구문을 사용하여 SOAP 요청에 대한 응답 대기시간을 30초로 제한하여 두었다 .

웹 서비스는 소프트웨어 계에서 아주 중요한 개발환경이라고 할 수 있다. 그리고 애플스크립트가 웹 서비스와 깔끔하게 통합될 수 있다는 것도 아주 흥미로운 일이다.

더 나아가서…

이 글에서는 맥 OS X의 애플스크립트 개발자와 사용자가 사용할 수 있는 수많은 가능성 중에서 단지 표면적인 부분만을 다루었을 뿐이다. 앞으로 다룰 기사에서는 이와 유사한 주제로 애플스크립트를 사용해 스크립트 지원기능을 제공하는 주요 응용프로그램에 대해 다룰 것이다.

애플스크립트에 관한 추가정보
TAG :
댓글 입력
자료실

최근 본 책0