본문 바로가기

잡다한 개발잡담

Apache Maven 이해하고 사용하자

저는 아직까지 SpringBoot의 빌드 도구로 gradle보다 maven을 많이 사용하고 있습니다. 인텔리제이 또는 STS와 같은 ide 덕분에 빌드 도구를 이해하지 않고 손쉽게 사용해 왔지만 간단한 이해만 하고 사용하다 보니 금일 발생한 이슈가 메이븐과 관련된 것인지 바로 파악하지 못했습니다. 원인을 찾고 해결하는데 많은 시간을 소모해서 정확하게 이해하고자 글을 포스팅하게 되었습니다.

먼저 maven은 무엇일까요??
아파치 메이븐(Apache Maven)은 자바용 프로젝트 관리 도구이다. 아파치 앤트의 대안으로 만들어졌다. 아파치 라이선스로 배포되는 오픈 소스 소프트웨어이다.

위키백과에는 메이븐을 자바용 프로젝트 관리 도구로 설명하고 있습니다. maven이전에는 앤트라는 것을 사용했나보네요. 지금은 또 gradle을 많이 사용하고 있으니 앤트 -> 메이븐 -> 그레이들 순으로 대세가 바뀌고 있나 봅니다.

그렇다면 메이븐이란 용어에 대해서는 알았으니 메이븐을 설명한 자바용 프로젝트 관리 도구란 무엇일지 궁금해졌습니다.

프로젝트 관리 도구
프로젝트 관리 도구라는 말보다는 build tool로 검색하니 훨씬 많은 정보를 접할 수 있었는데, 한번 정리해보겠습니다.

build라는 것은 결국 소스코드가 프로그램으로 동작하기 위해 벌어지는 일련의 과정을 말하는 것이잖아요? 자바에서는 프로그램을 실행하기 위해서는 우리가 작성한 소스코드를 javac라는 명령어를 통해 바이트코드로 변환 후에! 클래스 로더에 의해 jvm에 의해서 실행되는 과정을 컴파일이라하고 컴파일 이후에 jar 파일로 만들어 실행가능하게 됩니다. 이러한 실행까지의 과정을 빌드라고 하며 이러한 과정을 자동화 해주는 것이 빌드 툴의 역할인 것 같아요.

또한 메이븐은 우리가 가장 많이 사용하는 라이브러리를 자동으로 다운 받아주고 추가해주는 기능도 하고 있습니다! 그래서 pom.xml에 디펜던시를 입력하게 되면 자동으로 라이브러리를 다운로드하도록 지원해주는 것처럼요. 만약 이런 기능을 지원해주지 않는다면 jar파일을 직접 다운로드하고~ 직접 등록해야 하는데 이런 번거로움을 줄여주고 개발자들이 개발하기 편한 환경을 만들어주는 것에 목적이 있는 것 같아요.

그리고 소규모의 작은 프로젝트라면 상관 없겠지만, 대규모의 프로젝트에서 어떤 의존성을 가지고 있는지 하나하나 추가하는 것은 생산적이지 않으므로 이러한 자동화 도구를 통해 개발 생산성을 높이는 것에 의의가 있다는 의견도 보았습니다.

메이븐의 핵심 개념 5가지 

메이븐을 이해하기 위해서는 5가지의 핵심 개념을 숙지하고 있으면 된다고 합니다. 플러그인, 라이프사이클, 의존성, 프로필, POM으로 한가지 씩 알아보도록 하겠습니다.

개념 1. 플러그인



메이븐은 플러그인 실행 프레임워크라고 합니다. 플러그인이란 무엇이냐면 일반적인 소프트웨어의 일부로서 플러그를 꽂아서 바로 사용할 수 있는 것과 같이 쉽게 설치 및 실행 가능한 프로그램을 말합니다. 즉 메이븐은 이러한 플러그인을 실행해주는 역할을 하며, 플러그인은 골이라는 명령을 플러그인마다

가지고 있다고 합니다. 위와 같은 사진처럼 여러 플러그인이 있고 또 그 플러그인에는 여러 명령 또는 작업인 Goal로 이루어져 있습니다.

메이븐은 여러 goal을 묶어서 라이프사이클 단계로 만들고 실행하게 됩니다.

개념 2. 라이프 사이클이란 무엇일까~?

메이븐의 동작방식은 일련의 단계(Phase)에 연결되어 있는 goal을 실행하는 것이며 이러한 논리적인 작업 흐름의 단계 집합을 라이프 사이클이라 말합니다. 어려운 것 같은데 결국 사전 정의된 순서대로 동작한다는 소리 같네요.

라이프 사이클에서는 3개의 표준을 지정해주었는데 각각 clean, default, site라고 합니다.

clean : 빌드 시 생성되었던 산출물을 지운다.
default : 일반적인 빌드 프로세스를 위한 모델
site : 프로젝트 문서와 사이트 작성 수행

저희가 주목해서 봐야할 것은 아무래도 default 라이프 사이클이라 할 수 있는데, 자바의 실행파일인 jar를 생성하는 작업들을 의미하며 여러 개의 goal로 이루어져 있고 아래와 같은 그림의 순서대로 실행됩니다.

1. process-resource를 통해 src/main/resources를 outputDirectory에 생성합니다.
2. compile을 통해 소스 코드를 컴파일 하고 그 클래스를 outputDirectory에 생성합니다.
3. test-compile을 통해 test 코드를 컴파일합니다. (junit과 같은 단위 테스트가 만약 정상적으로 동작하지 않는다면 빌드가 멈춥니다.)

4. package를 실행하게되면 jar 또는 war파일이 타깃 디렉터리에 생성됩니다.
5. install을 하게 된다면 로컬 레파지토리에 배포합니다. (로컬 레파지토리인 ~/. m2/repository)
6. deploy을 하게 된다면 원격 저장소에 배포하게 됩니다.

개념 3. 의존성(dependency)

위에서 설명한 대로 라이브러리의 다운로드를 자동화해줍니다. 또한 메이븐은 선언적이 아닙니다. 어디서 다운로드하여야 하는지 어느 버전인지 명시하기만 한다면 코딩을 하지 않아도 메이븐이 알아서 관리합니다.(재다운로드, 최신 버전 설치)

메이븐이 관리하므로 lib 폴더를 생성하여 jar파일을 집어넣지 않아도 되며 ide에서 라이브러리, 클래스 패스와 같은 복잡한 환경 변수를 세팅할 필요가 없습니다. (저는 이런 빌드 도구를 사용하다 보니 막상 이런 것들을 수동으로 해야 할 때 조금 헤매었습니다.. lib 폴더 생성하고 클래스 패스 지정 같은 것은 다 지원해주지만 내부망과 같은 환경에서는 직접 세팅이 필요하기도 하거든요. 그러므로 이러한 내용을 이해하고 있다면 에러 포인트를 정확하게 잡아서 빠르게 처리할 수 있을 겁니다.)

개념 4. 프로파일(profile)

만약 서로 다른 운영체제이고 다른 배포 환경이라면..? 이러한 것들은 프로파일이라는 개념을 통해 추가적으로 설정할 수 있습니다. 

개념 5. POM

Project Object Model이라는 프로젝트 객체 모델입니다. 프로젝트 당 한 개씩 가지고 있는데 프로젝트 자체 정보와 의존성에 대한 설정 정보를 가지고 있습니다. 그러므로 메이븐은 이러한 pom 파일을 읽어 들여 프로젝트를 이해하게 됩니다. pom.xml은 많이들 읽으셨으니까 금방 이해가 될 것 같아요.

마지막으로 메이븐과 관련한 문제를 해결하기 위한..팁 하나 공유드립니다. 저도 이걸로 해결했습니다..

새로운 프로젝트 파일을 import 했는데 설정을 못불러오고 실행이 안된다... 괴롭다..

그렇다면. mvn clean 하고 로컬 레파지토리인 m2/reporsitory를 지워보시고 다시 해보세요..! 감사합니다~

 

출처 : ko.wikipedia.org/wiki/%EC%95%84%ED%8C%8C%EC%B9%98_%EB%A9%94%EC%9D%B4%EB%B8%90

 

아파치 메이븐

위키백과, 우리 모두의 백과사전.

ko.wikipedia.org

dzone.com/articles/a-simple-maven-3-plugin

 

Create a Simple Maven 3 Plugin - DZone Java

Making your own Maven plugins is simple. Here, we cover the setup, naming conventions, and two mains ways you can execute your custom-crafted Maven 3 plugin.

dzone.com

www.slideshare.net/sunnykwak90/ss-43767933

 

메이븐 기본 이해

apache maven basic 아파치 메이븐 기본 이해

www.slideshare.net