Maven은 무엇을 해결해주나?

Maven은 프로젝트 관리에 있어서 많은 문제를 해결해줍니다. 표준화를 통해서 모든 개발자들이 일관된 방식으로 프로젝트를 이해하고 관리하고 빌드할 수 있도록 도와줍니다. 우리가 Maven을 쓰는 이유가 이것이며, 이 모델을 기반으로 많은 다른 빌드 도구들이 만들어졌습니다.

프로젝트 소스코드의 기본 구조를 구성해야 합니다.

  • 애플리케이션의 유형(웹 프로젝트, 순수 자바 프로젝트 등)에 따라서 다양하지만 일반적으로 표준도 없고 표준화하는 사람에 따라서 구조도 매우 다양합니다.
  • 표준화 하는 사람이 없기 때문에 프로젝트 구조다 다 다르고, 그러다보니 프로젝트를 이해하는 것도 어렵고 관리도 어렵습니다.
  • 당연히 문서화가 없더라도 누구나 이해할 수 있는 프로젝트 구조가 필요합니다.
  • Apache Maven은 표준화를 통해 어떤 프로젝트이든 동일한 프로젝트 구조를 가지고 있습니다.

빌드를 위한 스크립트를 작성해야 합니다.

  • 기존에는 일반적으로 Apache Ant를 이용하여 build.xml  파일을 작성했습니다. 빌드 절차가 복잡하고 애플리케이션의 유형이 다양하면 빌드 스크립트를 작성한 사람 이외에는 수정하기 매우 어렵습니다.
  • 빌드 절차를 수동으로 작성하기 보다는 빌드 절차는 기본적으로 모두 정의가 되어 있고 약간만 커스터마이징 할 수 있다면 참 좋을 것 같습니다.
  • 프로젝트의 구조가 판이하게 다르다면 빌드 스크립트도 프로젝트 마다 다 다르게 작성해야 합니다.
  • Apache Maven는 빌드 절차를 표준화하였고, Plugin을 통해서 빌드 절차에 따라서 커스텀한 작업을 할 수 있도록 지원합니다.

빌드 결과물을 어떻게 관리할지 결정해야 합니다.

  • 보통 프로젝트를 진행하면 소스코드와 그것에 따른 빌드 바이너리가 생성됩니다.
  • 소스코드를 제대로 관리하는 것도 힘들지만 빌드 바이너리 및 설치본을 관리하는 것도 쉽지 않은 것이 현실입니다.
  • Apache Maven은 자바 프로젝트의 결과 파일들 (WAR, JAR 등)을 Maven Repository에 배포하여 관리할 수 있도록 하고, 각 빌드 결과물들을 별도의 식별자와 버전으로 관리할 수 있도록 해줍니다.

애플리케이션을 구성하는 다양한 모듈을 구조화 해야 합니다.

  • 하나의 큰 프로젝트는 다양한 모듈로 구성되어 있습니다.
  • 또한 각 모듈은 서로 다른 유형(Web, Library 등)으로 구성되어 있습니다.
  • 또한 어떤 모듈은 다른 모듈을 참조하고 있어서 빌드 및 실행할 때 꼭 필요합니다.
  • Apache Maven은 각 Module 간에 참조관계를 구성할 수 있도록 지원하므로 큰 프로젝트에서도 프로젝트를 모듈단위로 잘 관리할 수 있도록 해줍니다.

어떤 프레임워크, 어떤 라이브러리를 써야 하는지 결정해야 합니다.

  • 소스코드를 작성하다보면 외부에서 다운로드하거나 또는 내부의 특정 라이브러리를 사용할 때가 많이 있습니다.
  • 이러한 라이브러리가 만약 특정한 사람만 가지고 있다면 새로운 개발자는 소스코드를 빌드할 수 없게 됩니다.
  • 또한 Spring Framework를 사용하기로 하였다면 Spring Framework의 빌드 바이너리인 JAR 파일들을 다운로드하여 특정 폴더에 넣고 Classpath를 적용하여 컴파일 하거나 실행합니다.
  • 어떤 라이브러리는 그 라이브러리를 위해서 다른 라이브러리가 필요하게 됩니다. 이것이 꼬리에 꼬리를 무는 형태로 라이브러리가 연결되어 있다면 빌드와 실행 자체가 고난입니다.
  • Apache Maven은 Dependency Management와 Maven Repository를 통해 외부 Library를 자동으로 다운로드하고 Classpath에 적용하여 빌드 및 실행할 수 있도록 지원합니다.

소스코드 버전 관리 및 릴리즈 절차를 만들어야 합니다.

  • 브랜치, 태그와 같은 버전 관리 절차는 일반적으로 별도로 없으며 릴리즈 절차도 표준화되어 있지 않습니다.
  • 최근은 Github 또는 Gitlab 등을 이용하여 버전관리를 하는 조직이 많아져서 통상적인 버전 관리는 하고 있습니다.
  • 하지만 프로젝트를 관리를 하다보면 빌드 시점에 개발 버전이나 릴리즈 버전을 빌드하고 배포해야 합니다. 이런 경우 해당 시점을 태깅하거나 브랜치를 생성합니다.
  • Apache Maven은 빌드 절차와 함께 릴리즈 절차와 버전 관리도구 등이 서로 연결되어 있어서 브랜치, 태깅 등의 작업을 같이 할 수 있도록 지원합니다.

개발도구를 결정해야 합니다.

  • 개발도구는 사용자에 따라 다릅니다.
  • 사용자의 환경이 다르므로 빌드 스크립트의 변수값들은 사용자 환경에 고정되어 버전관리시 많은 문제가 발생합니다.
  • Apache Maven은  Profile을 통해서 환경에 따라서 각종 변수 값들을 변경할 수 있도록 지원합니다.