소프트웨어 전개는 프로덕션 전 단계에서 대충 수행할 수 있는 필요악으로 간주되기도 한다. 그러나 개발 주기의 다른 부분뿐 아니라 전개 부분에 있어서도 소프트웨어 엔지니어링 원칙을 적용해야 한다. 수작업으로 적용할 경우 전개는 반복적이면서 많은 오류가 발생할 수 있는 프로세스가 된다. 빌드 자동화를 통해 오류를 줄이고 소프트웨어 개발 시간을 단축할 수 있는 것처럼 전개 프로세스도 자동화를 통해 오류를 줄이고 소프트웨어 전달 시간을 단축할 수 있다.
사람을 위한 자동화 기획 기사로 실린 "자동화를 통한 신속한 전개"에서는 소프트웨어를 여러 대상 환경에 원격으로 전개하는 기술을 살펴보았다. 2편의 기사로 구성된 이 시리즈에서는 수준을 높여서 자동화된 전개에 대해 설명한다. 소프트웨어 개발에 대한 패턴이 있는 것처럼 전개에 대한 패턴도 있으며, 필자는 지난 수 년 동안 이들 패턴을 분류해 보았다. Part 1에서는 다음과 같은 8가지 전개 패턴을 예제와 함께 설명한다.
- 집중식 저장소에서 모든 구성 파일 관리하기: 스크립트를 이용한 전개를 통해 작업 소프트웨어를 생성할 수 있다.
- 스크립트를 이용한 전개: 모든 전개 조치를 스크립트로 작성하므로 사용자 개입 없이 전개를 실행할 수 있다.
- 단일 명령: 전개 복잡도를 줄이고 전개 프로세스의 헤드리스 실행을 보장한다.
- 토큰을 이용한 구성: 구성 파일에 변경 가능한 정보를 반복적으로 삽입할 수 있는 방법을 제공한다.
- 외부화된 구성: 대상 환경에 따라 달라지는 정보를 한 번만 입력하면 된다.
- 템플리트 검증 도구: 모든 대상 환경 특성이 동일하도록 보장한다.
- 헤드리스 실행: 자동화된 프로세스를 통해 여러 시스템에 안전하게 액세스할 수 있는 방법을 제공한다.
- 통합 전개: 여러 대상 환경에서 실행할 수 있는 단일 전개 스크립트를 활용한다.
Part 2에서는 다른 여러 가지 전개 패턴에 대해 설명한다.
그림 1에서는 이 기사에서 다루는 전개 패턴 간의 관계를 보여 준다.
그림 1. 전개 자동화 패턴
이 기사에서 설명하는 순서에 따라 각 패턴에 대한 설명을 읽게 되면 그림 1에서 설명하는 상호 관계를 이해할 수 있다.
이름: 저장소
패턴: 전개 컨텍스트에서 사용되는 모든 구성 파일 및 도구를 포함한 모든 파일을 버전 제어 저장소에서 관리한다.
안티 패턴: 일부 팀에서는 이 정보를 액세스가 통제된 공유 드라이브에 저장한다. 로컬 시스템에만 정보를 저장해 놓은 후 대상 환경에 복사하는 방법을 사용하는 팀도 있다.
일반적인 규칙에 따르면 개발 팀에서 작업 소프트웨어를 만드는 데 필요한 모든 파일을 체크인하는 것이 좋다. 예외적으로 이 규칙이 적용되지 않는 경우도 있지만 대부분의 경우에는 이 규칙이 적용된다. 전개 컨텍스트에서 일부 팀은 실수로 서버 및 서버 구성을 고정 자산으로 간주하고 변경하지 않기도 한다. 대용량 바이너리를 체크인하는 데에 따른 제약이 있기도 하지만 구성, 데이터베이스 스크립트 및 모든 빌드 및 전개 스크립트를 버전 제어 저장소에서 관리해야 한다. 저장소 패턴은 다음에 설명할 스크립트를 이용한 전개 패턴 및 특히, 단일 명령 패턴에서 많은 도움이 된다.
이름: 스크립트를 이용한 전개
패턴: 모든 전개 프로세스를 한 스크립트로 작성한다.
안티 패턴: 일부 팀에서는 웹 컨테이너 설치 및 구성 등의 작업을 수동으로 구성할 수 있다. 특정 환경을 기반으로 하는 컨테이너를 수정하기 위해 해당 컨테이너에서 제공하는 GUI 기반 관리 도구를 사용하는 경우도 있다. 구성을 수동으로 수정하는 작업이 처음에는 간단할 수도 있지만 1주일에 여러 차례에 걸쳐서 많은 대상 환경에 대한 여러 전개를 수행할 경우에는 적합한 방법이 아니다. 또한 GUI 기반 관리 도구를 처음 사용할 때는 전개 작업에 매우 유용할 수 있다. 하지만 이 방법도 많은 사람이 이러한 프로시저를 반복해서 수행해야 하므로 오류가 발생하기 쉽고 적합한 방법이 되지 못한다.
Listing 1에서 보여 주는 스크립트를 이용한 전개 패턴에서는 스크립트를 이용한 전개를 통해 Tomcat 웹 컨테이너를 시작 또는 다시 시작하는 프로세스를 자동화한다. 이 프로세스는 Apache Ant 빌드 스크립트 언어로 작성되었다.
Listing 1. Tomcat 웹 컨테이너 시작 예제
<available file="@{tomcat.home}/server/@{tomcat.server.name}/bin"
property="tomcat.bin.exists"/>
<if>
<isset property="tomcat.bin.exists"/>
<then>
<echo message="Starting tomcat instance at @{tomcat.home} with start_tomcat" />
<exec executable="@{tomcat.home}/server/@{tomcat.server.name}/bin/start_tomcat"
osfamily="unix" />
</then>
<else>
<echo message="Starting tomcat instance at @{tomcat.home} with startup.sh" />
<exec osfamily="unix" executable="chmod" spawn="true">
<arg value="+x" />
<arg file="@{tomcat.home}/bin/startup.sh" />
<arg file="@{tomcat.home}/bin/shutdown.sh" />
</exec>
<exec executable="sh" osfamily="unix" dir="@{tomcat.home}/bin" spawn="true">
<env key="NOPAUSE" value="true" />
<arg line="startup.sh" />
</exec>
<exec osfamily="windows" executable="cmd" dir="@{tomcat.home}/bin" spawn="true" >
<env key="NOPAUSE" value="true" />
<arg line="/c startup.sh" />
</exec>
<sleep seconds="15" />
</else>
</if>
|
이 프로세스를 스크립트로 작성했으므로 이 경우에는 Tomcat의 GUI 관리 콘솔에서 마우스를 클릭할 필요가 없어졌다. 게다가 스크립트로 작성되었기 때문에 헤드리스 프로세스를 통해 자동화된 종합 전개의 일부로 실행할 수도 있다.
이름: 단일 명령
패턴: 전개자 또는 헤드리스 프로세스가 단일 명령을 입력하여 사용자를 위한 작업 소프트웨어를 생성할 수 있다.
안티 패턴: 일부 전개 프로세스에서는 사람이 파일 복사, 구성 파일 수정, 서버 다시 시작, 암호 설정 및 기타 반복적이고 오류가 발생하기 쉬운 조치를 수행하기 위해 여러 명령과 프로시저를 입력해야 한다. 운이 좋은 경우 이러한 조치를 수행하는 과정을 안내하는 단계별 프로시저 설명서가 제공될 수도 있지만 그렇다고 하더라도 사람이 전개 프로시저를 수행해야 하는 경우에는 오류의 위험성이 상존하고 여러 대상 환경에 소프트웨어를 릴리스하는 동안 많은 시간이 지연될 수 있다.
전개를 작성할 때 자신의 팀, 조직, 회사 또는 시스템의 다른 사용자가 클라이언트인 경우도 종종 있다. 전개를 실행하는 과정이 복잡할수록 다른 사용자 또는 헤드리스 프로세스에서 오류 없이 전개를 성공적으로 실행할 수 있는 가능성이 낮아진다. Listing 2에서는 전개를 실행하는 간단한 단일 명령 예제를 보여 준다.
Listing 2. Ant를 사용한 단일 명령 전개
ant -Dproperties.file=$USERHOME/projects/petstore/properties/dev-install.properties \ deploy:remote:install |
Listing 2의 명령은 다른 시스템에 원격으로 소프트웨어를 전개하기 위해 환경 관련 .properties 파일을
함께 전달하면서 deploy:remote:install이라는 Ant 태스크를 실행한다. 이 작업은
SCP(Secure Copy Protocol)를 사용하여 파일을 안전하게 복사하고, SSH(Secure Shell)를 통해 원격 시스템에서
안전하게 명령을 실행하고, 웹 컨테이너를 설치, 구성 및 다시 시작하고, 다른 프로세스에 대한 호스트 기능을
제공하는 등의 조치를 사용자의 간섭 없이 수행한다. 물론 사용자가 명령을 입력할 수 있기는 하지만 매우 간단한
명령이므로 지속적인 통합 또는 빌드 관리 서버와 같은 헤드리스 프로세스에서 쉽게 실행할 수 있다.
이름: 토큰을 이용한 구성
패턴: 토큰 값을 구성 파일에 입력된 후 저장소에 체크인된 외부화된 구성 특성을 기반으로 스크립트를 이용한 전개 동안 토큰 값을 바꾼다.
안티 패턴: 대상 관련 데이터를 각 환경의 구성 파일에 입력한다.
Listing 3은 웹 컨테이너와 데이터베이스 서버 간의 구성을 관리하는 XML 파일이다. 이 파일에서는 @ 기호를
사용하여 토큰을 배치했다. 자동화된 전개 프로세스 동안 스크립트가 실행되면서 이러한 토큰이 외부화된 구성 파일의 실제 값으로 바뀐다.
Listing 3. 토큰을 이용한 웹 컨테이너 구성 파일
<datasources>
<local-tx-datasource>
<jndi-name>@application.context.name@</jndi-name>
<use-java-context>false</use-java-context>
<connection-url>@database.url@</connection-url>
<user-name>@database.user@</user-name>
<password>@database.password@</password>
<driver-class>@database.driver@</driver-class>
</local-tx-datasource>
</datasources>
|
환경 관련 값이 될 항목을 토큰으로 지정하게 되면 스크립트를 이용한 전개와 통합 전개를 통해 여러 환경을 지원할 수 있다.
이름: 외부화된 구성
패턴: 애플리케이션 구성의 모든 변수 값을 빌드 타임 특성으로 외부화한다.
안티 패턴: 일부 개발자는 각 대상 환경별로 이러한 값을 수동으로 하드코딩하거나 GUI 도구를 사용하여 동일한 작업을 수행한다.
Listing 4에서는 코드 베이스를 통해 애플리케이션 관련 구성 파일에 종종 포함되어 있는 일부 특성을 보여 준다. 모든 변수 값을 단일 .properties 파일로 모아 놓으면 데이터(변수 특성)와 동작(전개 스크립트)을 분리할 수 있다. 다시 말해서, 대상 환경과 상관 없이 자동화된 전개 프로세스가 항상 동일한 방법으로 실행된다.
Listing 4. 애플리케이션 관련 파일과 분리된 예제 특성
authentication.type=db
application.url=http://${tomcat.server.hostname}:${tomcat.server.port}/brewery-webapp
database.type=mysql
database.server=localhost
database.port=3306
database.name=mydb
database.user=myuser!
database.password=mypa$$!
database.url=jdbc:mysql://${database.server}:${database.port}/${database.name}
tomcat.server.hostname=localhost
tomcat.server.name=default
tomcat.web.password=pa$$123!
tomcat.cobraorb.port=12748
|
Listing 4의 값은 소스 코드, 서버 구성, XML, .properties 및 기타 파일에 흩어져 있다. 더구나 이 데이터는 시스템 전체에서 중복되기 때문에 디버깅하기에 까다로운 복잡한 전개 문제를 일으킬 수 있다. 이 많은 소스에 흩어져 있는 이 정보를 단일 .properties 파일로 추출하게 되면 발생 가능한 여러 가지 전개 문제를 줄일 수 있다.
이름: 헤드리스 실행
패턴: 명령을 입력하지 않고 여러 시스템과 안전하게 통신한다.
안티 패턴: 각 시스템에 각기 다른 사용자로 로그인하여 시스템에 수동으로 액세스한 후 파일을 복사하고, 값을 구성하는 등의 작업을 수행한다.
이름이 투박하기는 하지만 헤드리스 실행은 자동화된 프로세스를 통해 원격으로 다른 시스템에 액세스해야 하는 경우 매우 효과적으로 사용할 수 있는 방법이다. PKI(Public Key Infrastructure)를 사용하여 일반적으로 개발자, 빌드 엔지니어, SCM(Software Configuration Management) 또는 운영자에게 의존하게 되는 명령을 자동화된 솔루션으로 만들 수 있다. 그림 2에서는 개인 키 파일이 빌드 시스템 및 SSH에 설치되어 있으며 특정 값이 각각의 대상 관련 .properties 파일에 정의되어 있다. 이 파일에는 일반적으로 개인 키 파일 이름 및 위치, SSH 포트 번호 및 호스트 이름이 있다. 대상 시스템은 공용 SSH 키 파일을 호스트하여 SSH 핸드셰이크를 완료한다.
그림 2. SSH 키를 사용하여 헤드리스 실행 패턴 구현하기
이 방법을 사용할 경우에는 스크립트를 이용한 전개에서 사용자의 개입 없이 빌드 환경의 프로세스를 대상 환경에 실행할 수 있다.
이름: 템플리트 검증 도구
패턴: 모든 대상 환경 특성의 기반이 되는 단일 템플리트 파일을 작성한다.
안티 패턴: 일부 개발자는 수동 검증 또는 시도 및 오류(전개 실패 시 원인 확인) 방법을 사용하거나 파일을 "숨겨진" 채로 시스템에 둔다.
모든 대상 환경의 속성이 완전히 동일하도록 보장해야 하지만 자동화된 환경에서 이를 검증할 수 있는 방법이 필요하다. 모든 대상 환경 파일을 검증하는 단일 템플리트 .properties 파일을 사용하면 실행 중인 환경에 관계 없이 모든 속성이 동일하도록 보장할 수 있다. 그림 3의 빌드 스크립트에서는 template.properties와 대상 관련 .properties 파일(dev.properties, qa.properties 등)의 속성(값이 아님)을 비교하는 Ant 태스크를 실행한다. 서로 다른 점이 발견되면 전개가 실패한다.
그림 3. 템플리트 검증 도구 패턴의 구현
Listing 5에서는 그림 3에서 설명한 template.properties 파일의 예제를 보여 준다. 값은 관련이 없기 때문에 이 파일에는 속성만 있다.
Listing 5. 값이 아닌 속성이 포함된 템플리트 파일
db.database= db.username= db.password= db.hostname= db.driver= db.port= db.url= |
Listing 6에서는 그림 3에서 설명한 dev.properties(또는 qa.properties 등) 파일의 일부를 보여 준다. 이 파일에는 속성 및 값이 있다. 값은 대상 환경과 관련된다.
Listing 6. 템플리트 파일을 기반으로 하는 대상 환경 특성 파일
db.database=brewery
db.username=root
db.password=p@ssword
db.hostname=dev1.domain.com
db.driver=com.mysql.jdbc.Driver
db.port=3306
db.url=jdbc:mysql://${db.hostname}:${db.port}/${db.database}
|
이름: 통합 전개
패턴: 다양한 플랫폼 및 대상 환경에서 실행할 수 있는 단일 전개 스크립트를 작성한다.
안티 패턴: 각각의 대상 환경 또는 특정 시스템에 대해 각기 다른 전개 스크립트를 사용한다.
일부 전개 프로세스가 특정 환경에서 실행될 수 있기는 하지만 모든 프로세스는 모든 대상 환경에서 실행할 수 있어야 한다. 예를 들어, 동일한 스크립트를 이용한 전개가 개발, 테스트, 스테이지 및 프로덕션 환경에서 실행되지만 서로 다른 외부화된 구성 파일을 사용한다. 외부화된 구성 속성은 템플리트 검증 도구를 사용하여 검증된다.
그림 4에서는 여러 대상 환경에 전개할 수 있는 단일 전개 스크립트를 보여 준다.
그림 4. 단일 전개, 여러 대상 환경
전개는 자동화에 적합한 소프트웨어 작성 과정의 한 부분이다. 전개를 자동화하면 신뢰할 수 있고 반복 가능한 프로세스의 장점 즉, 정확도, 속도 및 제어를 향상시킬 수 있다. 이 기사에서는 소프트웨어 전개를 자동화하는 데 효과적인 8가지 패턴을 살펴보았다. Part 2에서는 원격 전개, 처분 가능한 컨테이너, 전개 테스트 및 환경 롤백을 포함한 여러 가지 패턴을 추가로 설명한다.
교육
- Software Configuration Management Patterns:(Stephen Bercuzk 및 Brad Appleton 저,
Addison-Wesley Professional, 2003년): 저장소 패턴 및 기타 여러 가지 소프트웨어 구성 관리 패턴에 대한 설명을 볼 수 있다.
- Patterns of Deployment: HP Lab의 SmartFrog wiki에서 여러 가지 전개 패턴의 카탈로그를 볼 수 있다.
- Continuous Integration:
Improving Software Quality and Reducing Risk(Paul Duvall, Steve Matyas 및 Andrew Glover 저, Addison-Wesley Signature
Series, 2007년): 8장 Continuous Deployment에서는 전개를 자동화된 프로세스로 통합하는 예제를 볼 수 있다.
-
Pragmatic Project Automation:
How to Build, Deploy, and Monitor Java Apps(Mike Clark 저, The Pragmatic Programmers, 2004년): 항상 신뢰할 수 있고
정확한 프로그래밍 방식의 자동화된 자동 소프트웨어 프로덕션을 즐기자.
-
Release It!:
Design and Deploy Production-Ready Software(Michael T. Nygard 저, The Pragmatic Programmers, 2007년): 이 책은
새벽 3시에 호출되는 것을 원하지 않는 개발자에게 많은 도움을 줄 것이다.
-
"자동화를 통한 신속한 전개"(Paul Duvall 저,
IBM developerWorks, 2008년 1월): 자동화를 활용하여 다른 환경에 소프트웨어를 빠르게 이동시키는 방법을 설명한다.
-
기술 서점에서
다양한 기술 주제와 관련된 서적을 살펴보자.
- developerWorks Java 기술 영역: Java 프로그래밍과 관련된 모든 주제를 다루는 여러 편의 기사를 찾아보자.
제품 및 기술 얻기
- Ant: Ant를
다운로드하여 예측 가능하고 반복 가능한 방식으로 소프트웨어 빌드를 시작하자.
토론
-
Improve Your Code Quality
토론 포럼: 이 토론 포럼에서는 코드 품질 향상과 관련된 질문에 대한 developerWorks의 정기 기고자인 Andrew
Glover의 전문성 높은 답변을 볼 수 있다.
-
Accelerate development space: developerWorks의 정기 기고자인
Andrew Glover가 개발자 테스트, 지속적인 통합, 코드 메트릭 및 리팩토링에 관한 모든 사항을 다루는 원스톱 포털을 호스트한다.
-
developerWorks 포럼 & 블로그를 통해 developerWorks 커뮤니티에 참여하자.

Paul Duvall은 상품성을 갖춘 소프트웨어를 개발하는 데 필요한 지원을 제공하는 컨설팅 회사인 Stelligent의 CTO이다. Addison-Wesley Signature Series 중 하나인 Continuous Integration: Improving Software Quality and Reducing Risk(Addison-Wesley Professional, 2007년, Jolt Award 2008 수상)의 공동 저자이며 UML 2 Toolkit(Wiley, 2003년) 및 No Fluff Just Stuff Anthology(Pragmatic Programmers, 2007년)에도 도움을 주었다.