제공 :
한빛 네트워크
저자 : Tony Hillerson
역자 : 채수원
원문 :
Anatomy of an Enterprise Flex RIA Part 6: The Data Project Maven Build
지난 기사에서 우리는 Maven 빌드 생명주기와 예제 프로그램에서 테스트들의 위치에 대해 살펴봤다. 이제는 Maven과 Ant가 어떻게 통합되는지, 그리고 데이터베이스를 생성하고 내용을 채우기 위해 DBUnit과 DDLUtils 를 어떻게 사용할지 살펴볼 것이다.
우선, 스키마를 갱신하고 샘플 데이터를 읽어 들이는 등의 데이터 관련 작업들을 Ant 빌드로 어떻게 수행할지 살펴보자. 그리고 나서 Ant를 호출하기 위해서는 Maven이 어떻게 설정되어야 하는지 볼 것이다.
...lots of includes to jars...
Bookie-data 의 build.xml 시작부분은 위와 같다. 우선 Maven의 로컬 저장소 위치 같은 몇 가지 속성값들을 설정한다. 이때 user.home 변수 값은 Maven 이 Ant를 호출할 때 넘겨줄 것이다. 이후 MySQL용 몇몇 접속 속성들을 읽어 들이고, Ant에게 데이터 프로젝트의 데이터 정의 파트에서 사용할 소스가 어디에 존재하는지 알려줄 것이다. 그리고는 라이브러리들 전체를 읽어 들이도록 Ant를 설정할 것이다. 만일 실제 파일(build.xml)을 열어 살펴본다면, 많은 JAR파일들에 대한 참조구문을 볼 수 있을 것이다. Maven 빌드에서 분리된 임의의 Ant 작업 실행을 원할 경우 이러한 JAR들을 포함시킬 필요가 있다.
그런데 만일 우리가 의존관계에 대해 Ant에게 알려주어야만 한다면 Maven의 사용목적을 훼손하는 것은 아닐까? 글쎄.. 이렇게 하는 것이 다소 추가적인 설정이긴 하지만, Maven이 해당 부분을 위한 코드를 자동 생성해 주니까 적어도 우리에겐 (일이) 쉬워진다. 이렇게 하는 것이 그다지 참신한 방식은 아니지만, 분리된 JAR 파일들을 갖게 됨으로써, ANT로 소스 관리 시스템에 체크인도 해야 하고, Maven 저장소에도 중복 저장되는 것 보다는 낫다. 포함시킬 JAR파일들을 위해 생성되는 코드를 얻는 방법은 다음과 같다.
첫째로, 빌드파일을 생성하기 위해서 Maven의 Ant 플러그인을 사용해라.
build.xml이 덮어 쓰여지는 것 때문에 당신은 지금 있는 파일(build.xml)을 안전한 어딘가로 복사해 놓기를 원할 수도 있다. (이럴 때에) bookie-data 프로젝트 내에서 ‘mvn atn:ant’ 라고 타이핑만 하면 Maven이 프로젝트 빌드에 사용되는 것과 동일한 형태의, build.xml 이라는 이름의 Ant 빌드파일을 만들어낼 것이다. 그런 다음 모든 라이브러리들이 포함된 섹션을 사용자의 Maven 저장소로부터 복사해서, 필요한 일들을 수행할 수 있도록 빌드파일(build.xml) 안에 붙여 넣어라. 이게 내가 했던 단계들이다. 그리고 DBUnit은 단지 빌드파일 안에서만 사용되므로, 더 많은 의존관계를 가진 프로젝트의 다른 파트들을 빌드하기 이전에 해당 파트를 잘 정리해 놓을 수 있다. 그림5는 그 과정을 보여주는 화면이다.
[그림 5] 빌드 파일 생성하기
빌드파일 생성이 다 되고 나면, 데이터 프로젝트의 build.xml안에는 몇 가지 작업에 대한 정의들이 들어있다.
이들 작업 정의구문들은 DDLUtils와 DBUnit을 Ant빌드에서 사용할 수 있게 해 준다.
< span>databaseToDdl>
이것들은 데이터베이스가 최신상태를 유지할 수 있도록 해주는 작업들이다. Dump-schema작업은 데이터 베이스에 있는 테이블들을 데이터 소스 디렉터리의 schema.xml 파일에 써넣는다. 이건 스키마를 DDLUtils가 읽을 수 있는 형태로 만드는 유용한 작업이다. 이 작업이 끝나면, 보통 나는 곧바로 스키마 파일을 수정한다. 이게 데이터 정의를 최신으로 유지시키는 데이터베이스 독립적인 방식이다. 그리고 나는 이렇게 하는 것이 SQL생성문들을 사용하는 것 보다 읽기에도, 그리고 이해하기에도 더 쉽다고 생각한다.
개발자가 해당 스키마의 변경사항을 확인할 때에, 다른 팀 원 들은 (ant build의) "load-schema" 작업을 실행시킴으로써 그들의 로컬 데이터베이스를 가장 최신 버전으로 동기화 시킬 수 있다. DDLUtils는 기존 데이터베이스를 유지한 채 실시되는 업데이트(non-destructive updates)의 경우에도 마찬가지로 매우 유용하지만, 로컬 데이터 베이스에 있는 개발 데이터에 대해서는 크게 신경을 쓰지 않는다. 데이터베이스의 변경이 일어나면, 어떤 식으로든 데이터가 잘못될 가능성은 있다. 만일 모든 개발자들이 쉽게 읽어 들일 수 있는 개발용 데이터 세트를 유지하고 싶으면, 다음 작업을 살펴봐라.
이 작업들은 XML에 정의된 데이터세트를 데이터베이스에 입력하기 위해서 DBUnit을 사용한다. 테스팅 섹션에서는 이런 데이터세트들을 더 볼 수 있을 것이다. 그러나 기본적으로 그것들은 하나, 혹은 그 이상의 테이블들에 들어갈 데이터 행(Row)들을 기술해 놓은 XML파일들이다. 여기서의 이들 두 개의 작업은 DBUnit 과 Ant로 할 수 있는 것들 중 단지 두 가지 예시에 지나지 않는다. 첫 번째 작업(export-full-dataset)은 데이터베이스에 있는 모든 데이터를 full_dataset.xml 파일로 내보낸다. 만일 당신이 다른 개발자들과 공유하기를 원하는 어떤 형태의 데이터베이스를 갖고 있다면, 이 작업을 수행하고, (그 결과 생긴) dataset.xml파일 전체를 적절한 이름의 새 파일로 복사한 다음, 그 데이터를 읽어 들이는 Ant 작업(task)을 만들어라.
다음 작업(clean-database)은 내보내는 작업대신 어떻게 데이터를 읽어 들일 수 있는지를 보여준다. 이건 약간 혼란스러울 수도 있긴 한데, 나는 데이터가 들어있지 않은 테이블들 각각에서 사용할 행(rows)값이 들어있는 파일을 이용한다. 이때 그 대상 이 되는 테이블들의 데이터는 DELETE_ALL 오퍼레이션
주(1)를 사용해서 모두 지운다. 이건 데이터베이스를 깨끗이 정리하는 쉬운 유틸리티 작업이다. 물론, 실제로 데이터가 들어있는 데이터세트를 사용해서 팀의 모든 구성원들과 데이터를 공유하는 데에도 이런 식으로 쉽게 적용할 수 있다.
주(2) 어쩌면 수많은 상품들과 테스트용 고객정보를 포함하고 있는 데이터 세트를 갖게 될 수도 있을 텐데, 그럴 경우 "쇼핑카트 테스트" 같은 테스트들은 쉽게 작성될 수 있다. 또 어쩌면 성능테스트에 사용되는 많은 양의 데이터를 공유하고 싶을 수도 있다. 어느 경우든, 이런 식의 접근이 텍스트 파일 하나에 많은 SQL문장들이 들어있는 것 보다는 유지하기 쉬울 것이다.
주(1): DELETE_ALL 오퍼레이션은 DBUnit의 DatabaseOperation 중 하나. 데이터세트에 지정되어 있는 테이블의 모든 행을 지운다.
주(2): DBUnit은 DELETE_ALL 오퍼레이션 이외에도 INSERT, UPDATE, REFRESH등의 다양한 오퍼레이션을 제공한다.(http://dbunit.sourceforge.net/components.html#cleanInsert)
스키마가 변경되거나 체크아웃 할 때마다 매번 "ant load-schema"를 실행해야 한다는 사실을 팀 구성원들이 기억하고 있어야 하는 것 보다 더 나은 방법은, Maven이 팀 원 들을 위해 해당 명령어를 실행하게 만드는 것이다. 데이터 프로젝트 pom.xml 내에서 이와 관련된 섹션은 아래와 같다.
maven-antrun-plugin
ant-data-tasks
run
이런 식으로 빌드작업의 process-resources 단계 때마다 Build.xml 의 "load-schema" 작업을 매번 실행되도록 Maven Ant 실행 플러그인의 환경을 설정한다. 또한 이 작업은 로컬 저장소로 유지되는 유저의 홈 디렉터리의 값을 넘겨줌으로써 Ant가 동작하는 데에도 도움을 준다.
다음 연재에서는 Maven에서 Ant에 걸쳐 Flex 생성을 포함하고 있는 프로젝트의 UI파트와 이클립스에서 자동적으로 외부 작업을 실행하는 것에 대해 살펴볼 것이다.
여기를 클릭하면 전체 시리즈(영문)를 볼 수 있다.