Spring 시리즈를 읽다가 갑자기 Maven 설명에 대한 글을 봐서 많이 당황했을 것이다. 하지만 Maven에 대한 이해없이 Spring을 사용한다는 것은 그저 라이브러리를 pom.xml에 복붙해 사용하는 개발자였기 때문이라고 생각한다.
물론, 나 또한 Maven을 단순하게 의존성 관리 및 빌드용으로만 사용했기 때문에 Maven에 대해 자세히 몰랐었고 그렇기 때문에 발생한 여러 문제를 빠르게 해결하지 못한 경험이 있다.
이번 글을 통해 Maven에 대한 이해를 조금이나마 쌓고자 하는 의미를 두고 이를 공유하고자 한다.
Maven은 Apache 소프트웨어 재단에서 만든 오픈 소스 소프트웨어이며 자바용 프로젝트 관리 도구이다. 우리는 Maven을 이용하여 보다 다음과 같은 이점을 얻을 수 있다.
그럼 어떻게 다음과 같은 특징들을 Maven을 통해 제공하는지 알아보는 시간을 가져보자
우리는 Spring 프로젝트를 생성할 경우 빌드 도구를 일반적으로 Gradle 또는 Maven 둘 중 하나를 선택한다. 이 때, 빌드 도구를 Maven으로 선택하여 프로젝트를 생성한다면 다음과 같은 프로젝트가 생성된다.
생소한 내용이 많지만 Maven을 빌드 도구로 선택할 경우 다음과 같은 파일들이 프로젝트에 추가된다. 하나하나 알아가보자.
이처럼 메이븐을 사용할수도, 별도로 설치하지 않아도 스크립트 파일을 통해 이용할 수 있도록 친절하게 제공해주고 있다. mvnw은 그냥 사용하면 되겠는데 pom.xml은 빌드 정보를 담고있는 파일로서 조금 더 자세하게 알아볼 필요가 있을 것 같다.
방금도 설명했듯이 pom.xml은 Maven의 빌드 정보를 담고 있는 파일로서, 다양한 설정을 통해 maven 빌드 옵션을 설정할 수 있다. 우리는 하나의 pom.xml만 있으면 다른 프로젝트에서 복붙을 통해 편리하게 프로젝트간 동일한 빌드가 가능해진다.
pom.xml에 대해서는 좀 더 자세하게 알아볼 필요가 있어 다음 장에서 보다 더 구체적으로 다루어 보겠다.
Maven의 생애주기는 크게 8가지 단계로 나뉘어진다.
Validate: 프로젝트 구조가 정확한지 유효성을 검사하는 단계이다. 한 예시로, 모든 의존성이 로컬 레포지토리에 다운로드 되어있는지 확인하는 단계라고 생각하면 된다.
Compile: 소스코드를 컴파일하여, 자바 파일을 target 폴더에 클래스 파일로 전환하는 역할을 수행한다.
Test: 프로젝트의 단위테스트를 수행한다.
Package: jar 또는 war 파일로 컴파일하여 패키징하는 단계이다.
Integration test: 프로젝트에 대한 통합 테스트를 수행하는 단계이다.
Verify: 프로젝트가 실행되는지 검증하는 단계이다.
Install: 패키지된 코드를 로컬 Maven 저장소에 설치합니다.
Deploy: 패키지 된 코드를 원격 저장소에 저장하고, 다른 개발자와 공유하는 단계이다.
Maven은 8단계로 구성된 빌드 도구이며, 만약 n번째를 수행한다고 가정할 때, n번째 이전의 모든 단계 또한 수행한다.
(7단계시 1~6단계 또한 자동으로 실행)