Automating Development Tasks with Automator and Xcode
OSXDEV
목차 |
[편집] 오토메이터와 Xcode로 개발과정 자동화
오토메이터를 이용하면, 액션 - 액션이란 하나의 작업만을 담당하는 모듈을 말한다 - 을 화면에서 연결해서 하나의 작업흐름(Workflow)을 만들어 복잡한 작업을 만들어 낼 수 있다.이러한 액션중에는 소프트웨어 개발 프로젝트를 도와주는 오토메이터에는 포함되어 있다. 개발과정중에 만날 수 있는 작업을 쉘액션과 워크플로를 이용해서 손쉽게 처리하는 방법에 대해서 알아보겠다.
[편집] 소트프웨어 개발자를 위한 오토메이터의 기능들
대부분의 개발 프로젝트에는 자동화가 분명 필요한 반복적인 작업이 있다. 예를 들면, 형상관리 도구로 부터 소스코드를 받아오고, 보내는 과정, 단위테스트 자동 수행 후 결과 수집 및 확인, 실행중 오류 로그의 분석 등이 있겠다. 가장 일반적인 자동화 과정은 파이썬이나 펄을 이용해서 쉘 스크립트를 작성하는 방법이겠다. 그러나, 오토메이터를 이용하면 쉘 스크립트를 이용하는 것보다 좀 더 나은 방법을 제공한다.
잘 만들어지고, 충분한 기능을 갖춘 액션은 기본적으로 재사용이 가능하기 때문에, 개발 팀에서는 일반적인 개발 관련 액션의 라이브러리만을 제작하게 되면, 필요할때마다 그것들을 모아서 하나의 작업흐름을 손쉽게 만들수 있겠다. 화면에서 마우스를 이용해서 작업흐름을 만들게 되면, 쉘 스크립트를 직접 작성하는 것보다는 훨씬더 에러가 발생할 확율이 적고, 명령어를 사용해서 실행하는 것보다는 훨씬 사용하기도 쉽게 만들수 있다. 화면에서 모든 것이 이루어지기 때문에, 보고 기억하기도 쉬울 것이다.
또 다른 장점으로는, 액션은 Mac OS X 응용프로그램에서 제공하는 서비스, 시스템 자원, 프레임워크에 손쉽게 접근이 가능하다. 스크립트 언어로 접근 하려면 그보다는 많이 복잡한 과정이 필요하다. 응용프로그램, 유닉스 커맨드와 프로그램, 시스템 프레임워크, 기타 리소스등 대부분은 각기 개별적이고 서로가 서로를 모른다. 그래서 하나의 응용프로그램을 실행시키고 그로부터 서비스를 이용하여 데이타를 가져온 다음 또 다른 프로그램으로 넘어가서 그 데이타를 가져온 다음 다시 처리하고 이런식으로 사용이 가능한 것이다.
[편집] 스크립트언어와 다른 오토메이터만의 장점
하나의 결과물을 얻기 위해서 여러개의 프로그램을 옮겨다니는 것보다는, 기존의 프로그램과 시스템이 제공하는 서비스를 하나로 묶어서 또 다른 하나의 프로그램을 만들어내는 것이 뛰어난 점이다. 이런 것을 할 수 있는 방법이 Mac OS X에서는 바로 애플스크립트를 사용하거나 스크립트 언어를 사용하는 것이다. (프로그램이 애플스크립트를 지원하거나 명령어 인터페이스를 지원하면 되겠다) 그러나, 이런 방법을 이용하기 위해서는 스크립트를 사용하는 방법, 하나의 프로그램이 스크립트를 통해서 제공하는 기능등을 배워야 하고, 프로그램에 따라 각기 다른 내용도 알아야 한다.
오토메이터에서 제공하는 액션은 Mac OS X 응용프로그램 서비스와 시스템 자원, 프레임워크등을 바로 접근할 수 있기 때문에, 작업흐름을 손쉽게 만들 수 있다. 또한 기존의 스크립트 언어로 작성한 내용도 이 흐름에 함께 포함할 수 있다.
또한, 기존의 기능으로부터 완전히 새로운 기능을 만들어 낼 수도 있다. 다시 보자면, 하나의 맥은 응용프로그램, 시스템 프레임워크, 리소스 단위로 구성된 서비스의 묶음으로 보여질 수도 있겠다. (그림1 참조)
텍스트편집기 프로그램의 경우 텍스트 편집 및 변환에 관한 서비스를 제공하고, 사파리는 웹관련 서비스, 유닉스에서는 정말 다양한 서비스, 퀵타임은 미디어 관련 서비스 등등 각기 제공한다. 오토메이터를 이용하면, 시스템을 서비스들의 모음이라 생각하고, 이 서비스의 기능들을 모아 작업흐름을 생성할 수 있는 것이다.
이러한 것들이 가능하기 위해서는, 프로그램이 제공하는 서비스가 오토메이터 액션이나 애플스크립트로 접근이 가능하도록 하거나 명렁어 환경에서 접근이 가능하도록 만들어야 한다. 만약 가능하다면, 오토메이터를 이용하여 그 기능들을 이용할 수 있는 것이다.
여기에서는, Xcode와 오토메이터를 이용해서 샘플 개발 프로젝트를 하나 만들어 볼 것이다. Xcode 프로젝트와 오토메이터 액션(dmg 568KB)를 다운 받아서 따라해 보면서 이 문서를 보면 도움이 될 것이다.
[편집] 기존의 액션 사용하기
기존에 존재하는 액션만 가지고도 얼마든지 훌륭한 개발 관련 작업흐름을 만들어 낼 수 있다. 예를들면, 그림 2를 보면, Xcode가 소스코드를 빌드하는 것을 볼 수 있다. Xcode가 프로젝트를 완전히 비우고(Clean) 새롭게 빌드하는 것을 생각해 보자. 이런 작업이 바로 액션을 이용하여 만들어 낼 수 있다.
기존의 오토메이터 액션을 이용하여 Xcode 프로젝트 빌드하기

그림2 기존의 오토메이터 액션을 이용하여 Xcode 프로젝트 빌드하기
c 소스코드 파일을 c++ 파일로 이름을 변경해 주는 XcodeBuild.workflow의 입력값은 프로젝트 폴더(들)의 이름이다. 이것의 출력값은 프로젝트 폴더(들)의 이름이다. 또 다른 출력은 빌드과정에서 발생하는 메시지가 포함된 파일들의 이름들이다. 문제는, Xcode 빌드의 성공 여부를 알 수 없다는 것이다. 경고 메시지가 있었는지도 모른다. 이러한 기능이 없기 때문인데, 빌드의 결과값을 알기 위해서는 새로운 액션을 만들어야 한다.
[편집] 사용자 정의 액션과 작업흐름 만들기
Xcode에서 사용자 정의 오토메이터 액션을 만들 수 있고, Xcode에는 4가지 종류의 템플릿이 포함되어 있다. (그림3 참조)
- 애플스크립트 오토메이터 액션 : 애플스크립트를 이용한 오토메이터 액션 작성 (액션이 스트립트 가능한 응용프로그램과 서로 작용할 경우 사용)
- 코코아 오토메이터 액션 : 코코아로 작성된 오토메이터 액션 작성 (시스템 리소스나 프레임워크와 서로 작용할때 유용)
- 정의된 번들 : 새로운 자료유형을 정의하는 오토메이터 정의 번들 작성
- 쉘스크립트 오토메이터 액션 : 펄이나 파이선같은 쉘 스크립트 언어를 사용하는 오토메이터 액션 작성 (유닉스 명령어나 툴을 사용할 경우 사용)
Xcode 오토메이터 액션 프로젝트 템플릿

그림3 Xcode 오토메이터 액션 프로젝트 템플릿
여기에서는 쉘스크립트 오토메이터 액션만을 다룰 것이다. 다른 형태에 대해서는 아래쪽 "더 많은 정보"의 내용을 살펴보기 바란다.
재사용 가능한 액션을 만드는데 있어서 핵심은 한가지 일만 하는 작고 간단한 프로그램으로 만들고, 자료를 받아서 가공하는 필터의 형식으로 만드는 것이다. 쉘 스크립트 액션을 만들기 위해서는 아래의 단계를 거치면 된다.
- 액션의 사용자 인터페이스(UI), 키, 객체 바인딩을 만든다.
- 쉘스크립트를 작성한다.
- 액션의 속성을 편집한다.
먼저 시작은 완전히 만들어진 쉘스크립트 액션을 가지고 한다. 이 액션은 개발 관련 작업흐름을 만드는데 있어서 사용가능한 완전한 것이다. MyFind.Action이라 불리는 이 액션은, 파일 목록을 입력값으로 받아서 파일을 분석한 다음 사용자가 지정한 특정 단어를 검색하고, 그 찾은 결과를 사용자가 지정한 파일에 기록하는 일을 한다.
[편집] MyFind 액션 만들기
MyFind Xcode 프로젝트는 완전히 만들어진 MyFind 액션을 포함하고 있다. (그림4 참조) 다운로드 받아서 압축을 풀고 프로젝트 파일을 더블클릭해서 MyFind.xcodeproj 파일을 Xcode에서 연다.
MyFind Action 프로젝트

그림4 MyFind Action 프로젝트
쉘스크립트 액션은 액션을 만들기 위해 필요한 4개의 파일을 가지고 있다.
- main.command : 펄이나 파이선, 혹은 다른 스크립트 언어서 작성된 스크립트 코드.
- main.nib : 인터페이스 빌더의 nib 파일. 액션의 GUI 역할을 한다. 여기에는 UI가 들어갈 빈 NSView 와 UI 객체와 액션 인스턴스와 서로 연결하기 위한 NSObjectController 객체의 인스턴스가 존재한다.
- Info.plist : 오토메이터에서 필요한 다양한 정보를 가지고 있다. 액션이 받아들이거나 출력하는 자료의 유형, 기본적인 GUI 입력값, 액션 이름과 아이콘 등.
- InfoPlist.strings : Info.plist 값들에 대한 지역화 정보
먼저 액션에 대한 GUI 부터 살펴보자. Resources 부분을 펼친다음 main.nib 파일을 더블클릭하여 인터페이스 빌더에서 파일을 연다.
[편집] 액션의 인터페이스 만들기
액션의 UI는 뷰(NSView)내에 있다. 액션의 GUI는 일반 프로그램에서 만드는 것과 동일한 방법으로 만든다. (아래쪽의 "더 자세한 정보" 부분을 참조한다) 오토메이터는 액션을 위해 특별히 만들어진 UI를 사용한다. 이를 사용하기 위해서는 인터페이스 빌터 팔레트에 추가를 해줘야 하ㄴ데, 인터페이스 빌더의 환경설정 창을 열어준후, 팔레트 탭을 선택해 준다. 그리고 /Developer/Extras/Palettes/AMPalette.palette 를 추가해 준다.
액션의 인터페이스를 만들려면, 아래 3가지 단계를 거친다.
- 팔래트로 부터 UI를 드래그해 가져와 배치한다.
- 스크립트에서 접근할 UI 개체에 대한 키값을 정의한다.
- 각 UI 객체와 관계된 키값을 서로 연결(binding)해 준다.
첫번째 단계는 액션의 GUI를 만들어 주는 것이다. MyFind 프로젝트를 Xcode에서 실행시킨 다음, main.nib 을 더블클릭한다. 인터페이스 빌더에서 팔래트에서 적절한 UI 개체를 가져온 다음, 뷰 윈도우에 배치하여 GUI를 만들어 준다. (만일 팔래트 창이나 뷰 윈도우 안보인다면, Tools/Palettes/Show Palettes를 선택하면 팔래트가 보이고, Nib 파일 창에서 View 아이콘을 더블클릭하면, 뷰 윈도우가 뜬다.)
MyFind 액션의 GUI는 이미 만들어져 있다. 하지만, 만일 직접 만들어 보고 싶다면, 각각의 UI 개체를 뷰 윈도우 직접 올려놓아야 한다. 예를들어, Output File 개체를 추가하려면, Cocoa-Automator 를 팔래트(맨 오른쪽에 있다.)에서 선택한 다음, File Chooser 개체를 선택하여 드래그하여 창에 올려놓으면 된다. GUI 구성을 위한 다른 UI 개체의 경우도 동일하다.
그림5에서는 MyFind의 GUI와 각각 인터페이스 개체의 의미와 형식을 적어놓았다.

그림5 MyFind 액션의 UI
다음은, 속성을 위한 키들을 만드는데, Parameter 개체의 속성을 통해서 만들어 준다. (그림6 참조) 뷰에서 각각 UI개체의 키값을 만들어 준다. Parameter 인스턴스를 클릭한 다음, 인스펙터를 연다. (Tools > Show Inspector 선택)
그림6 MyFind 액션 파라미터 키
그림6에서 보는바와 같이, 각각의 키는 UI개체에 대응된다. Add 버튼을 눌러서 키를 추가하고 이름을 입력할 수 있다.
마지막 단계는 UI개체와 키를 연결해 주는 것이다. 서로 연결함으로써 UI 개체의 값을 스크립트에서 사용할 수 있게 된다. 인스펙터 창에서 Binding 을 팝업메뉴에서 선택해 준다. (그림7 참조)
그림7 MyFind 액션 바인딩
각각의 인터페이스 개체는 각자의 형태에 맞는 바인딩을 사용한다. 예를들어 File Mode 메뉴는 NSComboBox 를 사용하기때문에, selectedIndex 를 바인딩으로 사용한다. selectedIndex 바인드 체크박스가 선택되어 있으며, Model Key Path 필드에는 File Mode에서 선택한 키의 이름이 들어가 있다. 이 필드가 바로 UI 개체 File Mode와 키 fileMode를 연결하여, 스크립트에서 그 값을 쓸 수 있도록 해 준다.
| UI Object Type | Binding |
|---|---|
| NSComboBox | selectedIndex |
| AMPathPopupUpButton | path |
| NSTextField | value ("Continuously Updates Value" 체크박스를 선택해 주면, n커서가 텍스트 필드에 있지 않을 경우에도 값을 업데이트 해 줍니다. ) |
| NSButton | value |
표1 MyFind의 객체 유형과 바인딩
[편집] 스크립트 작성
인터페이스가 이제 준비가 되었으니, 스크립트를 작성할 차례이다. 액션은 쉘 액션이기 때문에, 쉘로 작성할 수도 있고, 자신이 좋아하는 스크립트 언어 아무거나로 작성할 수 있다.
Xcode에서, Script 그룹을 펼쳐보인 다음, main.command 를 연다. 스크립트는 파이썬 언어이지만, 다른언어로도 똑같이 손쉽게 작성할 수 있다. 언어에 상관없이 몇가지만 주의하면 된다.
첫째, 쉘 액션의 경우 standard input(stdin)을 통해 입력값이 들어오거나, 명령어 인자로 넘어온다. 출력은 standard output(stdout)으로 한다. 쉘 액션은 문자열을 받아들이고 쓰기 때문에, 오토메이터는 자료유형간 변환이 필요할 경우 자동으로 알아서 해 준다. 예를들어, 쉘 액션의 입력값이 배열값인 경우, 오토메이터는 자동으로 줄바꿈 문자가 들어간 문자열로 변환을 해 준다.(오토메이터 프로그래밍 안내서의 "변환 액션 만들기"를 참조하면, 어떻게 동작하는 것인지에 대해 알 수 있고, 변환 액션을 직접 만들어 볼 수도 있다.)
둘째, 스크립트는 UI 개체의 값을 환경 변수로 부터 읽어들인다. 환경변수의 이름은 Parameter 개체 - .nib 파일에서 컨트롤러 인스턴스 - 에서 지정해 준 키 값에 대응된다. 예를들어, tokenFile 키는 토큰 파일을 선택하는 UI 개체에 연결이 되어 있다. 리스트1을 보면, 스크립트에서 어떻게 token 파일 이름을 알아내는지 보여주고 있다.
리스트1. 환경변수로 부터 UI 개체의 값 읽어내기
tokenFile = os.environ.get('tokenFile')
이 액션에서는 토큰 파일은 path 로 연결했기 때문에, 문자열로 반환이 된다. 하지만, fileMode 키는 selectedIndex 로 연결했기 때문에, 선택된 값에 따라 0-k 값이 반환이 된다.
쉘 액션의 한가지 한계점은 parameter를 이용해서 반대로 UI 쪽 값에 영향을 줄 수 없다는 것이다. 한가지 방법은 Objective-C 도우미클래스를 사용하거나, 애플스크립트 유틸리티 스크립트를 사용하는 방법이 ㅇ다. osascript 도구를 사용해서 애플스크립트를 실행할 수 있다. (더 자세한 내용은 오토메이터 프로그래밍 안내서 참조)
[편집] 속성 지정하기
Info.plist 파일은 오토메이터가 다양한 목적으로 사용할 수 있는 Action 속성이 들어 있다.그 예로, 액션이 받아들이고, 생성해 내는 자료의 유형에 대한 정보가 있고, UI의 기본 초기값에 관한 정보, 그리고, 액션의 이름, 설명, 아이콘, 관련 어플리케이션, 분류등의 정보도가 있다. Infoplist.strings 에는 Info.plist 파일에 대한 각국 언어로 번역된 내용이 담겨져 있다. 오토메이터는 UI 를 보여줄때, 이 번역된 정보를 이용해서 보여준다.
속성을 수정하기 위해서는, Info.plist 를 컨트롤 클릭한 다음, Open With Finder 메뉴를 선택해 주면, Properties Editor에서 실행이 되고, 거기서 수정이 가능하다. 속성값을 정확히 입력해 주도록 주의해야 한다. 더 자세한 내용은 오토메이터 프로그래밍 안내서의 "Action 속성값 지정하기" 와 "오토메이터 액션 속성 참조"편을 참조하기 바란다.
[편집] MyFind.Action 테스트 및 디버깅
MyFind.Action을 테스트 할 수 있는 방법은 여러가지가 있다. 가장 간단한 방법은 Xcode에서 작성을 하다가 명령어 기반으로 바로 실행을 하는 것이다 (리스트 2) UI 객체는 환경변수를 이용해서 값을 전달받기 때문에, 스크립트를 실행하기 전에 반드시 미리 지정해 두어야 한다.
리스트2 명령어 기반으로 MyFind Action을 테스트하기 위한 쉘 스크립트
#!/bin/tcsh
# Usage: tcsh run.sh
setenv outputFile /Users/omalley/MyFind/myfind.out
setenv tokenFile /Users/omalley/MyFind/c.tok
setenv fileMode 0
setenv enableDB 1
setenv tag myfind
find ../c_project -name "*.c" | python main.command
스크립트가 제대로 동작이 되면, 오토메이터 환경에서 두가지 방법으로 테스트를 해 볼 수 있다.
- Xcode에서 스크립트를 실행. 이후 오토메이터가 실행이 되면서 오토메이터 라이브러리에 임시로 추가가 되고, 테스트를 위한 빈 워크플로가 생성이 된다.
- MyFind.action을 직접 /Library/Automator 나 ~/Library/Automator 에 복사한다. 그리고 오토메이터를 실행한 다음 워크플로를 생성하고 Action을 테스트 한다.
아래 방법의 장점으로는, 첫째, 여러번 반복 테스트 과정에서 워크플로를 저장해 둘 수 있다는 점, 둘째, Xcode에서 Action을 수정과 빌드를 반복하는 과정속에 만들어 놓은 워크플로를 다시 열어서 변경된 내용을 사용할 수 있다는 점이 있다. 단점은 테스트가 완료된 이후에는 반드시 Action을 설치한 폴더에서 제거해야 한다는 점이다.
가장 직접적으로 테스트 하는 방법은 명령어를 통하는 것이다. 디버깅 도구도 사용할 수 있고, 평소에 사용하는 다양한 테크닉들도 여기서는 유효하다. 오토메이터에서 디버그를 하려면, 몇가지 방법이 있는데, "View Results Action" (오토메이터 분류내에 있음)를 사용하는 것이 Action의 결과값을 보는데 유용하다. Action의 결과값을 보려면, 테스트하는 Action이 실행이 완료된 이후, "View Result"를 드래그 해서 꺼낸다. 오토메이터가 워크플로를 실행할 때, 액션의 출력물을 View Results" 텍스트창에 찍어 준다.
또 다른 방법은 디버그 메시지를 파일에 저장하는 것이다. 스크립트에 디버그 메시지세트를 만들어 놓고, 명령어 환경 뿐 아니라, 오토메이터에서 사용할 수 있다. Action을 실제 배포할 때에는 디버그를 비활성화 시키야 겠다.
Action이 제대로 동작하는 것을 확인 했으면, 오토메이터 라이브러리에 완전히 추가를 해 준다.
- ~/Library/Automator Action을 설치한 사용자에게만 사용가능
- /Library/Automator 시스템 전체에 사용가능
[편집] Report Action
Report Action도 쉘 액션이다. 입력값은 MyFind Action이 생성하는 파일명이다. Report Action은 이 파일들을 읽어서, 최종 보고서를 생성해 낸다. Fink 프로젝트에서 GNUPlot 실행파일을 설치하면, 결과 리포트에 그래프도 그려낼 수 있다.
[편집] 완전한 워크플로
이 Action들을 사용해서 C 프로젝트에서 C 호출값을 잡아내서 차후에 볼 수 있도록 정보를 저장해 내는 워크플로를 만들어 낼 수 있다. 이 워크플로를 이용해서 안전하지 못한 C 언어 사용, 기본 코드 지침을 따르지 않은 문법을 잡아낼 수 있다.
MyFind 워크플로는 MyFind와 Report 쉘 스크립트 액션 그리고 기본적으로 포함된 액션으로 이루어져 있다.(그림 8참조) 사용자가 지정한 디렉토리에서 C 소스 파일을 읽어서, 토컨 파일에서 C 언어 토큰을 찾아내고, 찾아낸 모든 값을 파일에 기록을 한다. 그리고 가능하다면, GNUPlot으로 그래프로도 표현한다. 마지막으로, 보고서가 있는 디렉토리를 보관해 준다.
그림8 완전한 MyFind 워크플로
[편집] 결론
이 문서의 정보를 통해, 개발 자동화 문제를 해결하는 많은 부분에서 유용할 수 있다는 것을 알 수 있었을 것이다. 다른 개발 관련 자동화에도 사용할 수 있다. 예를 들면, MyFind를 일반화 해서, grep 명령어를 위한 인자를 받아서 넘겨주도록 할 수 있다. Report에 그래프를 그리는 기능을 넣을 것이 아니라, 별도의 GNUPlot Action을 만들어서 다른 워크플로에서도 사용할 수 있도록 할 수 있다. 형상관리 도구에 소스코드를 제출하기 전에 소스코드를 검증할 필요가 있다. 소스코드를 검사해서 경고문 확인, lint 확인, 내부 보안 규정과 코딩 지침서 준수 확인 등을 하는 일반적인 Action을 만들 수 있다. 이 확인을 통과하면, 자동으로 코드를 형상관리 도구에 제출해 주면 되겠다. 아니면, 개발자에게 거부사유를 알려주면 되겠다.
더 많은 정보
- Automator 개발 페이지
- ADC 참조 라이브러리 : 오토메이터 프로그래밍 안내서
- 오토메이터 사용하기
- 소프트웨어 시장확대를 위한 오토메이터
- sourceforge.net의 Fink>http://fink.sourceforge.net/ 프로젝트 페이지지
출처 : http://developer.apple.com/tools/xcode/automatorforxcode.html (2006-08-07) 번역 : wangsy (2006-11-07)








