본문 바로가기
프로그래밍/자바

내가 메이븐(Maven) (빌드 툴, 의존성 관리도구)을 사용하는 이유

by pentode 2018. 4. 17.

메이븐(Maven)은 빌드 툴이자 의존성 관리도구 입니다. 나는 이것을 자바를 사용하는 웹 프로젝트에만 사용합니다. 다른 프로젝트에는 사용해 본적이 없습니다.

 

 

 

 

전에는 이클립스를 이용해서 자바 웹 프로젝트를 만들때 프로젝트 위저드의 "Dynamic Web Project" 템플릿을 사용해서 생성을 해서 사용을 했었습니다. 이때 프로젝트 폴더의 구조는 아주 직관적인 구조였습니다. 단순했다고 할 수 있겠습니다.

 

이 경우 필요한 라이브러리(jar 파일)들은 /WEB-INF/lib 폴더에 넣어서 컨텍스트 전용으로 배포할 것과 WAS 에서 제공되어질 것을 직접 수동으로 관리를 하였습니다. 프로젝트가 오래되어 질수록 문서가 잘 정리되어 있지 않으면 라이브러리 버전 관리가 잘 안되는 경향이 있었습니다. 요즘은 형상관리도구(SVN)을 사용하므로 예전보다는 나은 편입니다.

 

스프링 프레임웍과 이를 기반으로 하는 전자정부 표준프레임웍이 프로젝트에 사용되고 부터는 메이븐(Maven)을 사용하게 되었습니다. 메이븐의 유용성을 알아서가 아니라 프로젝트 생성에 사용되는 프로젝트 템플릿들이 메이븐을  사용하고 있기 때문에 사용하기 시작한 것입니다. STS(Spring Tool Suite)전자정부 표준프레임워크의 프로젝트 템플릿들의 폴더 구조와 설정파일들은 상당히 복잡합니다.

 

메이븐을 사용함으로 해서 편리해진 것은 라이브러리의 관리입니다. pom.xml 파일의 의존성(dependency)항목에 필요한 라이브러리를 적어 주기만 하면 되는 것입니다. 각각의 라이브러리는 같이 배포가 될지, 컴파일 때만 사용될지, 테스트 때만 사용될지를 지정해 주면 자동으로 관리가 됩니다. 배포시에는 Maven build를 해주면 배포할 수 있는 폴더 구조로 파일을 모아주고, war 파일도 생성해 줍니다. 물론 저장소에서 제공되지 않는 라이브러리가 있다면 직접 /WEB-INF/lib 폴더에 넣어주고 build path에 등록해 주면 사용할 수 있습니다.

 

실제로 build 를 할때까지 사용되어지는 jar 파일들은 프로젝트 폴더 아래에 존재하지 않습니다. 메이븐 글로벌 저장소(repository) 또는 직접 지정한 저장소의 jar 파일들이 로컬 메이븐 저장소에 다운로드 되어지고 프로젝트는 그것을 참조하게 됩니다. 빌드를 하게 되면 비로서 /WEB-INF/lib 폴더로 복사가 되어지는 것입니다.

 

글로벌 저장소들은 각종 라이브러리들을 버전별로 모두 유지하고 있기 때문에 프로젝트에 필요한 버전의 라이브러리들을 편리하게 pom.xml 파일을 통해서 관리할 수 있습니다. 하지만 모두 버전이 계속 유지될 것이라고 100% 신뢰할 수는 없습니다. 라이센스 문제 등으로 메이븐 글로벌 저장소가 아닌 다른 저장소를 사용할 경우도 있는데, 가끔 이전 버전이 사라져 버리는 경우도 있었습니다. 규모가 있는 회사라면 Sonatype Nexus 같은 소프트웨어를 사용해서 자체 저장소를 구성하는 경우도 많을 것이라고 생각됩니다.

 

메이븐을 능동적으로 선택해서 사용한것도 아니고, 의존성 관리기능외에는 관심을 가지고 사용하는 것도 아니지만, 의존성관리 기능 하나만으로도 충분히 사용할 이유가 있다고 생각이 됩니다. 

 

안드로이드 앱 개발을 위해 안드로이드 스튜디오를 사용하고 있는데, 거기에서는 그레이들(gradle) 이라는 또 다른 빌드 툴이 사용되고 있습니다. 이게 메이븐(Maven)을 대체할 새로운 기술인지, 서로 다른 영역에서 공존할지 지켜봐야할 것 같습니다. 어쨌든 공부할게 늘어난 것만은 사실인것 같습니다.

반응형