[Maven] Maven 빌드가 느리게 되는 경우 처리방법

Published on: 2013. 11. 14. 13:21 by louis.dev
maven 빌드가 느려지는 경우는 다양한 경우가 있었지만, 내 경우의 경험을 써보고자 한다. 

 이전에 Maven을 통해 war 파일로 패키징을 진행할때 시간이 15분 이상 넘게 걸리는 경우가 있었다. 이때 webistrano를 이용해 빌드하고 배포를 진행했기 때문에 webistrano문제이겠거니 하고 대수롭지 않게 넘겼다. 
그런데 프로젝트 후반으로 갈수록 배포할 일이 많아졌고 그때마다 15분이나 되는 시간을 기다려야했기 때문에 결국 빌드가 느리게 되는 현상을 찾아보기로 하였다. 

이것저것 로그를 보다가 콘솔에서 직접 Maven 빌드를 진행해 보았는데 Maven 빌드 자체가 느리게 되는 문제를 확인하였다. 여기서 문제는 maven-metadata.xml과 같은 version 정보를 담고있는 xml파일을 다운로드 하는데 너무 오랜 시간이 걸리기 때문이라는 결론을 얻게 되었다. 

 회사에서는 사내에서 사용할 Nexus서버를 구축하였고, 프로젝트의 pom.xml파일에 사내 Nexus를 repository로 추가한 상태였다. 그렇기 때문에 maven-metadata.xml을 사내 repository에서 다운로드 받고 있었다.(빌드시 로그도 사내 repository에서 다운받고 있었다) 결국 문제는 네트워크 구조상의 문제였다. 


배포하려는 서버는 외부에서 들어오는 요청은 막혀있는 상태(보안을 위해)의 서버였다. 그렇기 때문에 wget 명령으로 외부페이지의 데이터를 긁어 온다거나 하는 작업을 수행할 수가 없었다. 


뜬금없지만 Maven의 구조에 대해서 먼저 말해보겠다. Maven의 설정파일인 pom.xml파일은 상속구조로 되어있다. Maven core안에 pom.xml이 기본적인 설정사항을 가지고 있고, 각 프로젝트마다 저장한 pom.xml파일이 상위의(Core의) pom.xml 파일을 상속받아(눈에보이지 않지만) 구현하고 있는 구조로 되어있다. 

이때 상위 pom.xml파일을 확인해 보면 해당 파일에 repository설정으로 Maven 중앙저장소가 세팅이 되어있고, 그렇기 때문에 우리는 각 프로젝트의 pom.xml에 repository 설정을 하지 않아도 library, maven-metadata.xml파일과 같은 파일을 자동으로 다운로드 받을수 있었던 것이다. Maven이 위와같은 구조로 되어있기 때문에 배포하려는 프로젝트는 2개의 repository(Maven에서 지원하는 중앙저장소, 사내에서 사용하는 Nexus)를 가지고 있게 되었다. 

따라서 library등을 다운로드할때 먼저 Maven 중앙저장소에서 라이브러리를 로컬에 다운로드 받고 만약 중앙저장소에 없는 라이브러리일 경우 사내 저장소에서 찾는 구조가 되었다. 이때 Maven 중앙저장소로 라이브러리와 버전정보 xml파일을 다운로드 받으려면 외부 네트워크로 트래픽이 나가야 하는데 네트워크 구조상 외부로 트래픽이 나갈수가 없어 계속 중앙저장소의 library, xml파일을 timeout 이 날때까지 계속 요청하다가 결국 받지 못하게 되고, 그 이후에 사내 저장소로 요청을하여 전체적으로 빌드 타임이 길어지는 문제가 있었다. 위와같은 문제는 maven의 global setting파일인 settings.xml파일에

중앙저장소 말고 특정한 저장소를 사용하겠다
라고 하는 세팅을 해주면 된다.  리눅스는 ${home}/.m2 디렉토리이고 윈도우는 C:사용자${사용자명}.m2 디렉토리안에 settings.xml파일을 생성해 주면 된다. 그리고 그 파일 안에 다음과 같이 설정하면 중앙저장소가 아닌 사내 저장소에서만 라이브러리를 다운로드 받을수 있게 된다.
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
  <mirrors>
    <mirror>
      <id>${아이디지정}</id>
      <mirrorOf>*</mirrorOf>
      <url>${사용하고자하는 maven repository 설정}</url>
    </mirror>
  </mirrors>

  <profiles>
    <profile>
      <id>public</id>
      <repositories>
        <repository>
          <id>central</id>
          <url>http://central</url>
          <releases><enabled>true</enabled></releases>
          <snapshots><enabled>true</enabled></snapshots>
        </repository>
      </repositories>
      <pluginRepositories>
      <pluginRepository>
        <id>central</id>
        <url>http://central</url>
        <releases><enabled>true</enabled></releases>
        <snapshots><enabled>true</enabled></snapshots>
      </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>

  <activeProfiles>
    <activeProfile>public</activeProfile>
  </activeProfiles>
</settings>
위와같이 설정하면 maven의 중앙저장소를 원하는 위치로 변경할 수 있다.