재성이가 보내준 메이븐 책을 읽다가 예전에 생각만 하고 실행에 옮기지 못했던 일이 하나 떠올랐다.  pom.xml 파일의 작성 방식을 바꾸는 일이다.

메이븐의 pom.xml을 직접 다뤄본 경험이 있는 사람이라면 의존 라이브러리가 늘어나고 플러그인 설정이 복잡해지면서 급격하게 양이 증가하는 pom.xml 파일에 당황해본 경험이 있을 것이다. 메이븐의 기본 관례와 페이즈를 그대로 준수하고 플러그인의 기본 설정을 바꾸지 않고 사용하는 경우라면 그나마 낫다. 하지만 의존 라이브러리 갯수가 늘어나는 데다 엉망으로 설정된 의존성 전이를 맞추느라 <exclusion>을 가득 차워야 하고, 플러그인의 기본 설정을 바꿔쓰고, 여러가지 추가 플러그인을 적용하다 보면 pom.xml이 수 백라인으로 늘어나는 것을 경험하는 것은 어렵지 않다.

Spring ROO가 만들어 주는 프로젝트는 메이븐 기반으로 되어있다. ROO 배포판에 있는 샘플 프로젝트인 clininc은 스프링과 하이버네이트 기본 기능만 사용하는 매우 간단한 웹 애플리케이션이다. 그런데 이 clinic 프로젝트의 pom.xml은 503라인이나 된다. 메이븐을 수 년간 써오면서 나름 pom.xml 파일에 익숙한 나 조차도 한 눈에 빌드 내용을 파악하기가 쉽지 않다. 프로젝트 pom.xml에는 나오지 않는 기본 설정(effective pom을 봐야 알 수 있는)까지 의식하면서 봐야 하는 이유도 있지만, 스크롤 하면서 앞 뒤의 내용을 살펴야 하는 불편 때문이기도 하다.

메이븐 pom.xml을 살펴보면 XML을 설정 파일로 사용하는 다른 제품들과 확연하게 드러나는 특징을 발견할 수 있다. 메이븐 pom.xml에서는 애트리뷰트 없이 엘리먼트만 사용한다는 점이다. pom.xml에는 메이븐 개발자들이 가진 똥고집 수준의 강력한 XML 문서 작성 철학이 적용되어있다. 엘리먼트만 사용해서 XML 문서를 작성하면 간단한 문서의 경우에 깔끔해 보인다는 장점도 있다. 파싱하기도 더 편할지 모르겠다. 하지만 문서의 길이가 대폭적으로 증가하고, 그 때문에 가독성이 떨어진다는 단점이 있다. 물론 엘리먼트만 사용해서 문서를 작성하는 것이 더 낫다고 생각하는 사람도 있을 것이다. 반대로 애트리뷰트로 세부 설정을 빼주는 것을 선호하는 개발자들도 많다. 

예를 들어보자. 

다음은 전형적인 메이븐의 의존 라이브러리 설정이다. 하나만 놓고 보면 나쁘지는 않다. 하지만 의존 라이브러리가 수 십개쯤 되는 프로젝트라면 여러 페이지를 스크롤 해야 전체 라이브러리의 종류가 어떤 것인지 파악할 수 있을 것이다.

 

<dependency>
<groupId>org.hsqldb</groupId>
<artifactId>hsqldb</artifactId>
<version>1.8.0.10</version>
<scope>provided</scope>
</dependency>

 

애트리뷰트를 이용해서 작성할 수 있다면 어떨까? 그렇다면 다음과 같이 한 줄이면 충분할 것이다.

 

<dependency groupId=”org.hsqldb” artifactId=”hsqldb” version=”1.8.0.10″ scope=”provided” />

 

실제로 메이븐의 <dependency>와 비슷한 역할을 하는 Ant/Ivy의 <dependency>는 다음과 같이 애트리뷰터를 사용해서 간결하게 작성할 수 있다.

 

<dependency org=”com.jamonapi” name=”com.springsource.com.jamonapi” rev=”2.4.0″ conf=”optional, jamon->compile”/>

 

Ivy의 경우 적지 않은 라이브러리를 사용하는 프로젝트라도 한 눈에 사용하는 라이브러리의 목록을 다 파악할 수 있고, 쉽게 편집이 가능하다.

메이븐의 엘리먼트 전용 XML 문서의 장황스러움은 엉성하게 작성된 전이적 의존 설정과 맞물리면 더 심각해진다. A 프로젝트가 B라는 라이브러리를 사용했을 경우에, B가 다시 의존하는 C,D,E,F,G 중에서 A 프로젝트가 실제 필요한 것은 일부인 경우가 대부분이다. B 라이브러리의 모든 잡다한 기능을 다 사용하는 것이 아니기 때문이다. 그렇다면 마땅히 B 라이브러리의 pom.xml을 작성하는 개발자는 C,D,E,F,G를 optional로 설정해주고, A 프로젝트 개발자가 이 중에서 원하는 것만 등록해서 쓰도록 해야 한다. 스프링의 경우 자신이 의존하는 라이브러리가 100개가 넘지만, commons-logging 빼고는 거의 다 optional로 되어있다. 반면에 간단한 유틸리티인데도 코드 내에서 참고하는 모든 라이브러리를 필수 의존 라이브러리로 잡아놓는 경우가 종종 있다. 그래서 테스트 라이브러리 하나 의존했을 뿐인데, 각종 DB관련 라이브러리가 모두 딸려 오거나, 심지어 jboss, tomcat이 통채로 끌려오는 경우가 있다. 메이븐의 의존성 전이 기능이 도움이 되기 보다는 피해를 주는 경우인데, 이런 폐혜가 많이 알려진 지금도 이런 문제는 자주 발견된다.

그래서 프로젝트의 pom을 작성하는 사람이 <dependency>로 가져오는 라이브러리의 pom.xml을 다시 살펴서 필요없는 라이브러리를 일일이 제외시켜줘야 한다. 

ROO가 만들어준 프로젝트에 포함된 commons-dbcp 라이브러리 설정을 살펴보자.

<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.3</version>
<exclusions>
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
<exclusion>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
</exclusion>
<exclusion>
<groupId>xerces</groupId>
<artifactId>xerces</artifactId>
</exclusion>
<exclusion>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
</exclusion>
<exclusion>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
</exclusion>
</exclusions>
</dependency>

commons-dbcp가 의존하는 라이브러리 중에서 4가지를 제외시켜주는 것이다. 이 설정 하나에 30줄이나 된다. 의존 라이브러리 전이 문제는 그렇다 치더라도 이 30줄이나 되는 설정을 애트리뷰트로 사용할 수 있게만 해줘도 훨씬 간결해질 것이다. 다음과 같이 고치면 6줄이면 끝이다.

<dependency groupId=”commons-dbcp” artifactId=”commons-dbcp” version=”1.3″>
<exclusion groupId=”commons-logging” artifactId=”commons-logging” />
<exclusion groupId=”commons-pool” artifactId=”commons-pool” /> 
<exclusion groupId=”xerces” artifactId=”xercesImpl” /> 
<exclusion groupId=”xml-apis” artifactId=”xml-apis” /> 
</dependency>

애트리뷰트를 쓰면 더 읽기가 불편하다고 생각하는 삐딱한 눈을 가진 사람이라면 메이븐 스타일에 만족하고 쓰면 되겠다. 하지만 나는 애트리뷰트를 쓰는 게 더 좋다. 

문제는 메이븐은 이런 개발자의 취향을 인정하지 않는다는 것이다. 메이븐은 /src/main/java 같은 디렉토리 구조부터 시작해서 메이븐 개발자들의 독특한 취향을 강요하고 강제한다. 그나마 디렉토리 구조는, 잘 알려져 있지 않긴 하지만 그래도 변경할 여지라도 줬다. 하지만 XML 작성 방법은 개발자들의 수 많은 요구가 있었음에도 3.0.3까지 나온 지금까지 요지부동이다. 

베타 버전이기는 하지만  메이븐 Polyglot 프로젝트가 만들어져서 ruby, scala, atom 등으로 메이븐 POM 파일을 작성하는 방법까지 가능해졌다. 하지만 여전히 XML 작성 방식은 그대로다.

그래서 지난 주말에 잠시 짬을 내서 메이븐 pom.xml을 애트리뷰트를 사용해서 작성할 수 있도록 메이븐을 조금 수정해봤다. 생각보다 어렵지 않게 가능했다. 

올해 들어서 처음 쓰는 블로그는 그 얘기를 해보려고 하는데… 벌써 업무시간이 되었네. 다음에 계속.

Related posts:

  1. Maven POM에 attribute 사용하기 (2)
  2. Maven 재도전기 (1)
  3. Maven 다중 리포지토리와 버전 범위를 사용할 때의 주의점
  4. Maven archetype 설정파일 자동생성기 – ArchetypeXmlWriter
  5. Maven 3.0과 버전 포맷 문제
  6. Maven settings.xml의 비밀번호 암호화
  7. Nexus Maven Repository 1.0 출시
  8. Maven 의존관계 수렁에 빠지다
  9. Spring 3.0 (34) R-941 스프링의 Maven 지원정책은?
  10. Ruby on Maven
  11. Maven: The Definitive Guide 사라지다
  12. Maven의 새로운 가이드북 – Maven: The Definitive Guide
  13. Spring 3.0 (4) – Maven에서 Spring 3.0 최신버전 사용하기
  14. Spring 3.0 (27) R-599 JDK1.5+ Concurrent
  15. Spring 3.0 (8) Core 모듈의 선택 라이브러리 분석

Facebook comments:

to “Maven POM에 attribute 사용하기 (1)”

  1. Look At These Guys

  2. Hello Web Admin, I noticed that your On-Page SEO is is missing a few factors, for one you do not use all three H tags in your post, also I notice that you are not using bold or italics properly in your SEO optimization. On-Page SEO means more now than ever since the new Google update: Panda. No longer are backlinks and simply pinging or sending out a RSS feed the key to getting Google PageRank or Alexa Rankings, You now NEED On-Page SEO. So what is good On-Page SEO?First your keyword must appear in the title.Then it must appear in the URL.You have to optimize your keyword and make sure that it has a nice keyword density of 3-5% in your article with relevant LSI (Latent Semantic Indexing). Then you should spread all H1,H2,H3 tags in your article.Your Keyword should appear in your first paragraph and in the last sentence of the page. You should have relevant usage of Bold and italics of your keyword.There should be one internal link to a page on your blog and you should have one image with an alt tag that has your keyword….wait there’s even more Now what if i told you there was a simple WordPress plugin that does all the On-Page SEO, and automatically for you? That’s right AUTOMATICALLY, just watch this 4minute video for more information at. Seo Plugin

  3. Kelsey’s team was saying untrue things in the future. A mobile phone can hold tons of data such as text messages that you can spend the morning before your celebration? A subsidiary of Info Pro Worldwide, Inc. While the Punter Net story might have you shaking your head, but that is in your result set before your process finishes selecting the data. It meets the requirement of the business.

  4. noted visit the following site

  5. Canada Payday Loans…

    superb payday loans canadian paydayloans4nels.ca…

  6. Have A Peek At These Guys

  7. Hello Web Admin, I noticed that your On-Page SEO is is missing a few factors, for one you do not use all three H tags in your post, also I notice that you are not using bold or italics properly in your SEO optimization. On-Page SEO means more now than ever since the new Google update: Panda. No longer are backlinks and simply pinging or sending out a RSS feed the key to getting Google PageRank or Alexa Rankings, You now NEED On-Page SEO. So what is good On-Page SEO?First your keyword must appear in the title.Then it must appear in the URL.You have to optimize your keyword and make sure that it has a nice keyword density of 3-5% in your article with relevant LSI (Latent Semantic Indexing). Then you should spread all H1,H2,H3 tags in your article.Your Keyword should appear in your first paragraph and in the last sentence of the page. You should have relevant usage of Bold and italics of your keyword.There should be one internal link to a page on your blog and you should have one image with an alt tag that has your keyword….wait there’s even more Now what if i told you there was a simple WordPress plugin that does all the On-Page SEO, and automatically for you? That’s right AUTOMATICALLY, just watch this 4minute video for more information at. Seo Plugin

  8. mbt sport Maven POM에 attribute 사용하기 (1) » Toby’s Epril

  9. Hello there. Simply just needed to request a simple issue.

    I’m arranging my very own web site and would want
    to realize exactly where you’ve got ones topic? Seemed to be
    this totally free? Or perhaps seemed to be it paid out?
    I can’t seem to find anything as good as this, so ideally
    it is possible to i want to realize. Cheers. PS, my personal i’m sorry.
    The english language isn’t my initial vocabulary.

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha