Maven Chapter2 Page 1 Table of Contents Table of Contents... 1 Revision History... 2 1. 내가꿈꾸는개발환경... 3 2. 메이븐설치및템플릿프로젝트생성... 3 2.1 메이븐설치... 4 2.2 메이븐기반의템플릿프로젝트생성... 5 2.3 메이븐기본명령어... 8 2.4 위키북템플릿프로젝트생성...10 3. 메이븐개요및설정파일... 14 4. 메이븐라이프사이클 lifecycle... 14 5. 메이븐을이용한의존라이브러리관리... 14 6. 메이븐과이클립스통합... 14 7. 메이븐과데이터베이스통합... 14 8. 메이븐프로파일, 배포... 14 9. 리포팅기능을활용한문서관리... 14 10. 메이븐모듈 module... 14 11. 메이븐사내저장소설치및활용... 14 12. 표준 POM 파일생성및리팩토링... 15 13. 메이븐아키타입 archetype... 15 14. 새로운프로젝트를시작하면서..... 15
Maven Chapter2 Page 2 Revision History Name Date Reason For Changes Version
Maven Chapter2 Page 3 1. 내가꿈꾸는개발환경 2. 메이븐설치및템플릿프로젝트생성 프로젝트시작 1 일째 1 내일부터위키북 2 프로젝트를시작한다는설레임과걱정때문에밤잠을이루지못하고있다. 위키북프로젝트는아무것도없는상태에서진행해야하는상황이기때문에프로젝트초반에방향을어떻게결정하느냐가특히중요하다. 이번위키북프로젝트에서는그동안유용하게사용했던앤트빌드툴을버리고메이븐이라는새로운빌드툴을적용해볼작정이다. 아직까지메이븐을사용한경험이없기때문에다른프로젝트에서사용하고있는메이븐빌드스크립트를무작정도입하기보다는아무것도없는상태에서단계적으로메이븐빌드스크립트를발전시켜나가기로결정했다. 오픈소스프로젝트중에서메이븐을사용하고있는프로젝트가많다. 따라서이프로젝트중괜찮다고생각하는메이븐빌드스크립트하나를선정해활용하는것도좋은전략이다. 하지만메이븐에대한이해도가없는상태에서이같은전략을취할경우빌드스크립트에문제가발생할경우해결책을찾기쉽지않겠다는생각이들었다. 오히려처음부터빌드스크립트를만들어가면서메이븐빌드스크립트에대한이해도를높인다음, 일정수준에도달하면잘만들어진빌드스크립트를참조할계획이다. 그나저나빨리잠을자야내일지각하지않을텐데걱정이다. 프로젝트개발리더가프로젝트첫날부터 지각하는모습을보일수는없지않은가? 내일걱정은내일하자. 라는마음으로잠자리에든다. 당일다행히지각은하지않았다. 프로젝트에서같이일하게될기획자 ( 재영, 별명은쨍 ), 개발자 ( 희송, 인태, 용석, 응주 ) 와인사를나누고위키북프로젝트에대한논의를시작하였다. 개발환경은위키북프로젝트에 1 프로젝트를시작하는첫째날부터개발환경을설정하지는않는다. 이책은메이븐을프로젝트에적용하는 과정을보여주기위하여프로젝트시작첫째날부터메이븐에대한준비작업을하는것으로글을시작했다. 2 내가 2007 년 11 월부터진행했던프로젝트이름이다. 위키기능에책이라는메타포를도입해진행했던 프로젝트로별도의서비스로발전하지는못했다. 이프로젝트는최종적으로 2009 년 12 월네이버카페 서비스에서카페북이라는이름으로빛을보게되었다.
Maven Chapter2 Page 4 대한분석과설계를하면서시간나는틈틈이진행하기로했다. 다른개발환경은익숙한상태이니오늘은 잠시짬을내어메이븐에대하여간단히살펴보는것이좋겠다는생각이들었다. 개발자들에게이번프로젝트는 메이븐기반으로진행하겠습니다. 라고큰소리를쳤는데메이븐사이트 3 를봐도어디서부터시작해야할지모르겠다. 그래도메이븐을사용하려면일단설치는하자. 근데설치가끝나면무엇부터할까? 그래도메이븐이빌드툴인데메이븐기반으로프로젝트를만들고빌드부터한번해보자. 그이후에메이븐구조에대해서파악하는것이좋겠다. 2.1 메이븐설치 메이븐은이책을쓰고있는시점의최신버전인 2.2.x 버전을활용한다. 메이븐 2.2.x 버전을설치하고실행하기위해서는먼저 JDK 1.4 이상의버전이설치되어있어야한다. 메이븐을설치하려는개발자는자바언어를사용하는개발자라는가정하에서 JDK 가설치되어있을것으로생각한다. 따라서이책에서는 JDK 설치과정은생략한다. 메이븐을설치하는과정은다음과같다. http://maven.apache.org/download.html 에서메이븐최신버전을다운받는다. 이책을쓰는시점의최신버전은메이븐 2.2.1 이다. 이책에서는 2.2.1 버전으로진행하겠다. 다운받은 apache-maven-2.2.1-bin.zip 파일의압축을푼다음시스템환경변수에 MAVEN_HOME 을추가한다. 시스템환경변수 PATH 에 MAVEN_HOME/bin 을추가한다. 명령프롬프트에서 "mvn version" 또는 mvn --v 를실행해메이븐버전이 2.2.1 로나타나면정상적으로설치가완료된것이다.( 그림 2-1 참조 ) 3 http://maven.apache.org
Maven Chapter2 Page 5 그림 2-1 윈도우즈 OS 에서설치한메이븐의버전을확인하는화면 메이븐설치과정은윈도우즈, 리눅스, 맥 OS X 모두동일하다. 다른점이라면환경변수에 MAVEN_HOME, PATH 를설정하는부분이다. 각 OS 마다메이븐에대한 MAVEN_HOME, PATH 를설정하는방법은 생략한다. 4 2.2 메이븐기반의템플릿프로젝트생성 메이븐설치를완료했으니메이븐기반의프로젝트를만든후에빌드를해봐야겠다. 그런데메이븐은앤트와달리기본적으로정해져있는소스디렉토리구조가있다고들었는데처음부터하나씩만들어야되는거야? 메이븐기본설정파일의이름도모르는상태인데막막할따름이다. 많은오픈소스프레임워크가처음시작하는개발자를위해 Getting Started 문서를제공하고있는데메이븐도있지않을까? 메이븐사이트에서찾아보니예상한데로두가지버전의 Getting Started 문서를제공하고있다. * Getting Started in 5 Minutes (http://maven.apache.org/guides/getting-started/maven-in-fiveminutes.html), * Getting Started in 30 Minutes (http://maven.apache.org/guides/getting-started/index.html ) 오늘은메이븐맛보기만하기로했으니 30 분은너무많이걸리고 5 분짜리문서로시작해봐야겠다. 이 Getting Started 문서를살펴보니메이븐아키타입 Archetype 이라는기능을활용해서메이븐기반의템플릿 4 이책은윈도우즈 OS 를기반으로진행한다. 메이븐또한자바기반으로동작하는빌드툴이기때문에 모든 OS 에서똑같은방식으로사용가능하다.
Maven Chapter2 Page 6 프로젝트를생성할수있겠다. 이문서를참고하여메이븐기반으로일반애플리케이션 (jar 프로젝트 ) 으로 생성해봐야겠다. 메이븐은생성하는프로젝트의종류에따라기반이되는템플릿프로젝트를제공한다. 메이븐에서제공하는템플릿프로젝트를이용하여메이븐기반프로젝트를생성할수있다. 메이븐은프로젝트의소스디렉토리, 테스트디렉토리, 웹리소스디렉토리등의기본설정이예약되어있으므로정해진규칙에따라프로젝트의뼈대를만들어야한다. 메이븐의템플릿프로젝트로프로젝트를생성하면프로젝트의뼈대를자동으로생성할수있다. 메이븐의이같은기능을아키타입 archetype 이라고한다. 아키타입에대한더자세한내용은 13 장에서다루고있다. 메이븐에서제공하는아키타입은메이븐중앙저장소에서관리한다. 명령프롬프트에서다음과같이 실행하면 jar 기반의메이븐프로젝트가생성된다. mvn archetype:generate -DgroupId=net.javajigi -DartifactId=myfirst -DarchetypeArtifactId=mavenarchetype-quickstart -DinteractiveMode=false 예제 2-1 메이븐아키타입을이용하여 jar 프로젝트를생성하기위한명령어 명령프롬프트에서예제 2-1 을실행하면명령프롬프트를실행한디렉토리아래에 myfirst 라는이름으로 프로젝트가자동생성된다. 위명령어로프로젝트를생성하면그림 2-2 와같은디렉토리구조가생성된다. 그림 2-2 메이븐아키타입으로자동생성된 myfirst 기본디렉토리구조 메이븐빌드툴은소스코드와테스트소스코드를분리해서관리한다. 메이븐의기본소스디렉토리는 src/main/java 이고, 기본테스트소스디렉토리는 src/test/java 이다. 각각의소스디렉토리밑에는예제 2-1 에서사용한 groupid 가기본패키지로생성된다.
Maven Chapter2 Page 7 예제 2-1 에서 groupid 와 artifactid 는프로젝트를생성하는개발자가임의로변경해도된다. groupid 와 artifactid 는메이븐빌드툴에서프로젝트를구별하는용도로사용하는고유값이다. groupid 는일반적으로생성하는프로젝트의도메인명을사용하며, artifactid 는프로젝트이름을사용한다. 예제 2-1 과같이메이븐아키타입으로프로젝트를생성하면 artifactid 값을프로젝트가생성된다. groupid 와 artifactid 에대한더자세한내용은 3 장에서다루고있다. < 참고사항 > 메이븐을이해하려면메이븐의저장소에대하여이해해야한다. 메이븐은자바진영의오픈소스라이브러리, 메이븐플러그인, 메이븐아키타입등메이븐기반으로빌드할때필요한모든자원을중앙저장소에서관리한다. 이자원은메이븐기반의프로젝트를빌드하는시점에개발자 PC 에자동으로다운로드한다. 메이븐 2.0 의중앙저장소는 http://repo1.maven.org/maven2/ 이다. 메이븐저장소에대한더자세한내용은 5 장에서다루고있다. </ 참고사항 > 예제 2-1 을실행하면메이븐기반의프로젝트뼈대를생성하면서동시에메이븐빌드툴의기본설정 파일인 pom.xml 파일도 myfirst 디렉토리아래생성된다. 생성된 pom.xml 은다음과같다. <project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelversion>4.0.0</modelversion> <groupid>net.javajigi</groupid> <artifactid>myfirst</artifactid> <packaging>jar</packaging> <version>1.0-snapshot</version> <name>myfirst</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project> 예제 2-2 생성된 myfirst 프로젝트의 pom.xml 파일 예제 2-2 를보면예제 2-1 에서템플릿프로젝트를생성할때사용한 groupid 와 artifactid 를그대로사용하는것을알수있다. <packaging/> 엘리먼트를보면생성한메이븐프로젝트가 jar 기반의자바프로젝트라는것을알수있다. 이장에서는메이븐의기본설정파일이 pom.xml 파일이라는것만알아두자. pom.xml 설정파일에대한기본적인내용은 3 장에서다루고있다.
Maven Chapter2 Page 8 2.3 메이븐기본명령어 메이븐을실행하기위한기본명령은 MAVEN_HOME/bin 디렉토리에있는 mvn.bat( 윈도우즈기준, 리눅스나맥은 mvn) 을활용한다. 메이븐명령은다음과같은형태로실행가능하다. mvn [options] [<goal(s)>] [<phase(s)>] 메이븐명령은옵션 option, 골 goal, 페이즈 phase 조합으로실행하는것이가능하다. 옵션은메이븐기본설정파일 (pom.xml) 이존재하지않는곳에서도실행하는것이가능하며, 골과페이즈는메이븐기반으로진행하는프로젝트의디렉토리에서실행할수있다. 메이븐명령에서사용할수있는옵션은 mvn help 를실행하여확인할수있다. 앞에서메이븐버전을확인하기위하여사용한 mvn version 또한옵션중의하나이다. 메이븐에서대표적으로가장많이사용하는옵션중의하나가메이븐설정파일에인자를전달하는 D 옵션이다. 메이븐은기본적으로빌드를실행할때단위테스트를진행한다. 만약단위테스트를실행하지않으려면 mvn Dmaven.test.skip=true [<phase(s)>] 와같이실행할수있다. 메이븐명령을실행하는옵션에대해서는프로젝트를진행하면서옵션을사용할필요가있는시점에추가적으로설명하도록하겠다. 메이븐은빌드를실행하기위하여페이즈와골개념을가진다. 메이븐은페이즈와골을이용하여빌드를 실행할수있으며, 빌드를실행할때여러개의페이즈와골을실행하는것이가능하다. 예를들어다음과같이 다양한형태로빌드하는것이가능하다. mvn clean test: clean 과 test 라는페이즈를실행한다. mvn clean compiler:compile: clean 페이즈를실행하고, compiler 플러그인의 compile 골을실행한다. mvn Dmaven.test.skip=true test: 옵션으로단위테스트를실행하지않도록인자를전달하면서 test 페이즈를실행한다. 위예와같이메이븐명령을실행할때옵션, 페이즈, 골을조합해서사용하는것이가능하다. 페이즈와골에 대한자세한내용은 4 장에서다루고있다. 따라서이장에서는위와같이다양한방식으로메이븐을실행하는 것이가능하다는정도로이해하면된다. 메이븐기본명령어도익혔으니앞에서생성한 myfirst 프로젝트를메이븐빌드툴로빌드를해보자. 먼저 생성한 myfirst 디렉토리로이동한다음 mvn test 를실행해서빌드가성공하면템플릿프로젝트가 정상적으로생성된것이다.
Maven Chapter2 Page 9 그림 2-3 myfirst 프로젝트를메이븐을이용하여빌드하는화면 mvn test 명령을실행한결과그림 2-3 과같이여러단계를거치면서빌드가성공한다. resources:resources 단계에서는무슨일을하는지알수없지만, compiler:compile 과 compiler:testcompile 단계에서소스코드에대한컴파일작업을하고있다는것을대략적으로알수있다. 컴파일단계가두단계로나뉘어지는것은 compiler:compile 단계에서는 src/main/java 디렉토리의소스코드를컴파일하고, compiler:testcompile 단계에서는 src/test/java 디렉토리의테스트소스코드를컴파일한다. 마지막단계인 surefire:test 단계에서단위테스트를실행한다.
Maven Chapter2 Page 10 빌드명령은 mvn test 를실행했지만단위테스트를하기위하여필요한작업을먼저실행하고최종적으로 단위테스트를진행하는과정을확인할수있다. 그림 2-3 의전체적인과정에대한더자세한내용은 4 장에서다루고있다. 2.4 위키북템플릿프로젝트생성 오늘목표는완료했지만궁금한점이하나있다. 설마메이븐에서제공하는아키타입이한가지만존재하는것은아니겠지? 예제 2-1 을보면 archetypeartifactid 인자를이용하여아키타입아이디를전달하는것을보니여러개의아키타입을제공하고있는것이분명하다. 오늘목표는완료했지만내가정말만들고싶었던프로젝트는일반애플리케이션 (jar) 이아니라웹애플리케이션 (war) 이다. 궁금증을해결하기위해구글검색엔진에서 maven archetype list 로검색해보니메이븐에서제공하는아키타입목록 5 을찾을수있다. 많아봤자 10 개정도의아키타입을제공할줄알았는데총 58 개의아키타입을제공하고있다. 예제 2-1 과같이 archetypeartifactid 를지정할수도있지만 mvn archetype:generate 만실행해서생성하는것도가능하다. 위키북프로젝트를위한웹애플리케이션프로젝트는이방식으로생성해봐야겠다. 명령프롬프트에서 mvn archetype:generate -DarchetypeCatalog=internal 를실행한다. < 참고사항 > 메이븐은아키타입의종류에따라카탈로그를나누어관리가가능하도록지원하고있다. 메이븐에서사용할 수있는카탈로그는다음과같다. internal: http://docs.codehaus.org/display/mavenuser/archetypes+list 에서관리하는 58 개의 아키타입목록. local: 본인이만든아키타입을관리하기위한카탈로그. 5 http://docs.codehaus.org/display/mavenuser/archetypes+list. 이목록은시간이지나면서계속해서 변화발전한다.
Maven Chapter2 Page 11 remote: 외부사이트에서제공하는아키타입목록. remote 카탈로그의아키타입은다양한오픈 소스프레임워크진영에서만들고있기때문에 remote 카탈로그에서제공하는아키타입은이책을 쓰고있는시점에 286 번이다. 책을처음쓸때는 archetype 플러그인의기본카탈로그 Catalog 값이 internal, local 이었다. 그런데책을쓰는중반쯤플러그인의버전이업데이트되면서기본값이 remote, local 로변경되었다. 이책에서는템플릿프로젝트를생성하기위하여 internal 카탈로그를사용한다. 카탈로그에대한자세한내용은 http://maven.apache.org/archetype/maven-archetype-plugin/examples/generate-alternative-catalog.html 문서를참고한다. </ 참고사항 > 그림 2-4 archetype:generate -DarchetypeCatalog=internal 를실행한화면 그림 2-4 에서볼수있듯이 mvn archetype:generate -DarchetypeCatalog=internal 를실행하면 메이븐에서기본적으로제공하는 58 개의아키타입목록을확인할수있다. mvn archetype:generate 명령을실행하면대화모드 interactive mode 로템플릿프로젝트를생성할수있다. 위키북프로젝트는웹애플리케이션으로개발할계획이기때문에먼저그림 2-4 에서 19 번 mavenarchetype-webapp 를선택한다. 이후과정은 archetype 플러그인에서요구하는정보를제공하면된다. 기본 값을사용하고싶으면값을입력하지않고엔터키를치면된다.
Maven Chapter2 Page 12 그림 2-5 대화모드로위키북프로젝트를생성하는화면 그림 2-5 에서보는바와같이위키북프로젝트생성을위하여필요한기본적인정보 (groupdid 는 net.javajigi, artifactid 는 wikibook) 를입력하고프로젝트를생성한다. 이과정을통하여생성된위키북 프로젝트의구조는그림 2-6 과같다. 그림 2-6 위키북프로젝트의기본디렉토리구조 메이븐기반웹프로젝트의기본웹디렉토리는 src/main/webapp 이다. webapp 디렉토리는서블릿표준 스펙에따른디렉토리구조를따른다. 위키북프로젝트의 pom.xml 파일은다음과같다.
Maven Chapter2 Page 13 <project xmlns="http://maven.apache.org/pom/4.0.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://maven.apache.org/pom/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelversion>4.0.0</modelversion> <groupid>net.javajigi</groupid> <artifactid>wikibook</artifactid> <packaging>war</packaging> <version>1.0-snapshot</version> <name>wikibook Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupid>junit</groupid> <artifactid>junit</artifactid> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalname>wikibook</finalname> </build> </project> 예제 2-3 위키북프로젝트의 pom.xml 파일 앞에서생성한 myfirst 프로젝트의 pom.xml 파일 ( 예제 2-2) 과위키북프로젝트의 pom.xml 파일 ( 예제 2-3) 을 비교해보면 <packaging/> 엘리먼트가 jar 가아닌 war 로생성된부분이다르다. 위키북프로젝트도 mvn test 를실행해빌드가성공하는지테스트하여프로젝트가정상적으로생성되었는지확인한다. 메이븐에서제공하는 Getting Started 문서를참고해서템플릿프로젝트를생성했더니메이븐의기본설정파일이 pom.xml 이며, 기본적인디렉토리구조와간단한빌드단계에대해서도알게된하루였다. 오늘목표는여기까지였는데메이븐아키타입에대한궁금증이발동해야근까지하게되었다. 프로젝트첫날부터야근하는것은좋은습관이아닌데다음부터는자제해야겠다. 메이븐이제공하는아키타입의종류를파악함으로써메이븐기반의위키북템플릿프로젝트를만들수있었다. 생성한위키북프로젝트를통하여웹자원을관리하는메이븐기본디렉토리를파악할수있었다. 그런데내가정말원하는디렉토리구조는아니다. 오늘생성한위키북프로젝트는웹자원만관리하는구조로되어있는데내가정말원하는디렉토리구조는웹자원과자바소스를같이관리하고싶다. 아무래도이작업은다음날로미루는것이좋겠다. 내일은위키북프로젝트에대한기본적인디렉토리구조를완료하면서메이븐기본설정파일에대하여 집중적으로분석해봐야겠다. 메이븐을공부하기시작한첫날임에도불구하고메이븐설치를완료하고, 기본적인사용방법을익힐수있어퇴근하는발걸음이가볍다.
Maven Chapter2 Page 14 3. 메이븐개요및설정파일 4. 메이븐라이프사이클 lifecycle 5. 메이븐을이용한의존라이브러리관리 6. 메이븐과이클립스통합 7. 메이븐과데이터베이스통합 8. 메이븐프로파일, 배포 9. 리포팅기능을활용한문서관리 10. 메이븐모듈 module 11. 메이븐사내저장소설치및활용
Maven Chapter2 Page 15 12. 표준 POM 파일생성및리팩토링 13. 메이븐아키타입 archetype 14. 새로운프로젝트를시작하면서..