개발공부

메이븐

holimc 2024. 6. 13. 23:33

[메이븐이란?]

https://maven.apache.org/
메이븐은 자카르타 터빈 프로젝트라는 자바 프로젝트의 build process를 단순화 하기 위려는 시도로 시작되었습니다.
과거에는 Apache Ant라는 빌드 파일을 가진 여러 프로젝트가 있고 jar파일을 CVS에 올렸습니다. 이 과정에서 표준 방법공유, 구성정의, 정보게시, 빌드 균일화 등의 목표-관심 영역이 생기게 되었고 이런 목표를 기반으로 나오게된 build tool입니다.

[빌드]

빌드의 기본적인 뜻은 소스코드를 기계어로 변환하는 과정으로, 해당 과정은 전처리-컴파일-어셈블-링크 등으로 나눠지며 소스코드를 어셈블리어->기계어로 변환하는등의 전처리를 포함한 과정을 거쳐 컴퓨터에서 읽을수 있는 파일로 변환하는 등의 모든 과정을 build라고 합니다.




java project 단위에서의 빌드는 위의 기본적인 의미에서 좀더 나아가 컴파일, 패키지, 배포 등 추가적인 과정이 포함되어 java 파일을 class파일로 변환 후 jar파일로 패키징, 이후 실행 및 배포하는 식으로 사용하고 있습니다.
그중에서도 maven, gradle 등의 빌드 도구는 라이브러리 추가, 버젼동기화, 프로젝트생성-테스트빌드-배포 등의 과정을 도와주는 프로그램 들을 의미합니다.

[maven 설계 지향점]

maven은 java 기반의 프로젝트를 구축하고 관리하는데 쉽고 용이하도록 개발된 도구입니다.
maven의 가장 기본적인 목표는 빌드 프로세스 간소화, 균일한 빌드환경 제공, 프로젝트 정보 제공, 개발 지침 제공 4가지를 가지고 있습니다.

 

1.빌드 프로세스 간소화

lifecycle에 포함된 명령어들을 통해 빌드 전 clean 같은 작업부터 compile, test, packaging 등의 작업을 쉽고 간편하게 진행할 수 있으며 특히나 IDE와 결합되면 사용자가 직접 mvn을 통해 명령어를 사용할 필요도 없이 빌드가 되기 때문에 빌드과정이 매우 쉽고 간소화됩니다.

(참고 : https://kogle.tistory.com/224 )

 

2.균일한 빌드 시스템 제공

pom.xml을 통해 플러그인과 라이브러리를 관리하여 빌드하기 때문에, 해당 xml 파일에 추가한 라이브러리, 플러그인 자체와 의존성 등을 관리함으로서 빌드 관리 및 빌드 시스템의 균일성을 보장합니다.

만일 라이브러리 관리가 없다면...

3.양질의 프로젝트 정보 제공

pom.xml을 통해 프로젝트의 버젼, 상위 프로젝트 정보, 하위 모듈 설정, 사용자 정의, profile 등을 통해 프로젝트에 대한 기본적인 정보부터 모듈등의 정보까지 확인 및 관리가 가능합니다. 

 

4.개발 지침 제공

메이븐 프로젝트를 생성시 메이븐에서 제공하는 디렉토리 구조 등을 통해 프로젝트 생성이 쉽고, 메이븐 프로젝트의 양식을 비슷하게 맞추어 접근이 용이하며 메이븐에서 권장하는 구조를 표준화하여 제공하면서 개발에 대한 권장사항등을 제공하기도 합니다.

[메이븐 생명주기]

 


 

maven build lifecycle은 빌드부터 배포 중에 일어나는 작업을 생명 주기에 빗대 정의한 내용으로 각각의 라이프사이클은 3가지로 분류할 수 있습니다.
clean : 이전 빌드의 결과물을 지워서 프로젝트를 정리
default : 프로젝트의 개발 및 배포와 관련
site : 프로젝트의 document 작성, site생성 배포 등과 관련


각각의 라이프 사이클에는 연속된 여러개의 페이즈(phase)가 존재하고 있습니다. 각 페이즈는 특정 작업에 대한 책임들을 가지고 있으며, 각 페이즈는 독립적이지 않고 연속적-순차적으로 실행됩니다. 예를 들면 'mvn deploy' 를 실행하면 deploy 라는 페이즈만 실행 되는것이 아닌, 컴파일부터 모든 페이즈가 진행됩니다.
또한 각 페이즈는 특정 작업에 대한 책임(소스코드를 컴파일, 컴파일된 소스코드를 jar나 war로 패키징 하는 등 각 페이즈의 작업에 대한 책임)이 존재하며, 각각의 페이즈는 연속되어있는 goal로 이루어져 있습니다.

 


goal은 하나의 세부적인 작업, 처리해야할 task 라고 할수있습니다. 그리고 각 goal을 위한 플러그인이 존재하며, 위의 젠킨스 버젼 관리 플러그인을 보면 deploy:deploy라는 배포와 관련된 goal과 관련되어있습니다. 

[그 외 주요기능]

아파치 메이븐의 공식 페이지에서 말한 가장 핵심적인 가치는 위의 4가지이지만, 그 외에도 많은 기능들을 제공하고 있습니다.
그중에서 추가적으로 설명하려는 두가지는 '멀티 모듈 프로젝트' 와 'profile을 이용한 서버 환경 분할' 기능입니다.

(멀티모듈 참고 사이트 :  https://techblog.woowahan.com/2637/  )


multi-module project 란 단일 프로젝트를 모듈 단위로 나누어 공통적인 기능은 공통 모듈에, 각각의 고유한 기능 및 해당 부분에서만 사용되는 기능은 세부 모듈에 구현을 할 수도 있고, 빌드 옵션에 설정을 줌으로서 특정 프로젝트(모듈)만 빌드를 할 수 있습니다.
이런 멀티모듈 기능을 통해 중복 코드를 분리하여 줄일 수 도 있고, 여러 프로젝트를 하나의 IDE를 통해 실행하는 등의 사용이 가능합니다.


(profile 참고 사이트 : https://blog.naver.com/linegamedev/220068468083)

(profile 참고 사이트 : https://minkwon4.tistory.com/163)

 

profile을 통한 서버 환경의 분할 경우는 pom.xml에 profiles를 등록하여 배포 서버에 대한 환경 구성을 활용할 수 있는 기능으로, 각자 별개의 properties를 가지게 하여 각각의 세부 설정 파일을 지정하여 static이나 jar파일 등을 다르게 생성할 수도 있습니다.
예를 들어서 DB를 3개로 나누어 사용한다고 가정시,
develop라는 단계는 개발 단계에서 사용할 DB는 개발 테스트용 더미 DB, test라는 단계에서 사용할 DB는 다른 사람들과 작업물을 취합하고 QA등에 사용하기 위한 단계의 DB, 마지막으로 demo라는 DB에는 실제 데이터를 넣어 시연 등에서 사용할 수 있게 여러개로 나누어 사용할 수 있습니다.
이처럼 사용시, 개발측에서는 테스트를 위한 더미값을 집어넣을 수도 있고 DB에 직접 쿼리를 사용할 때에도 문제가 생길 여지가 적으며 실제 데모서버는 DBA를 통해 데이터를 좀더 체계적으로 관리하거나, 더미데이터 혹은 삭제/변경으로 인한 에러 등을 줄이는데에도 도움을 받을 수 있습니다.

[기타]

https://kitty-geno.tistory.com/100

maven의 lifecycle-phase-goal 에 해당되는 내역은, 젠킨스를 통한 빌드 과정에서도 사용 및 확인 할 수 있습니다.