Maven을 왜 쓰나요?

Hyeokwoo Kwon·2021년 11월 30일
0
post-thumbnail

프로젝트를 진행하다 보면 외부 라이브러리를 가져다 쓸 일이 있다. Pure Java 프로젝트에서 모듈을 하나 만들었는데, 이 모듈이 의도한 대로 작동하는지 테스트하기 위해 JUnit 라이브러리를 가져와야 한다고 하자. 이 때 프로젝트에 라이브러리를 어떻게 추가할까? 혼자 작업하는 프로젝트라면, 구글링을 통해 라이브러리 파일을 찾아서 프로젝트에 직접 넣는 방법이 제일 편할 것이다.


위 사진처럼 mvnrepository에 직접 들어가 라이브러리의 jar 파일을 다운로드해 프로젝트에 직접 추가할 수 있다.

아니면 위 사진과 같이, jar 파일을 직접 다운로드받지 않고 Maven Repository에 존재하는 라이브러리를 검색해서 추가하는 방법도 있다.

이렇게, Maven을 사용하지 않아도 라이브러리를 별 문제 없이 프로젝트에 넣을 수 있다. 그렇다면 굳이 Maven을 사용하는 이유는 무엇일까?

Maven

Maven을 왜 쓰나요?

공식 사이트를 보면, Maven은 소프트웨어 프로젝트 관리 및 생성 도구라고 정의하고 있다. 즉, Maven은 라이브러리를 관리하고 프로젝트를 빌드하는 도구이다. 그런데 왜 굳이 Maven을 사용해서 라이브러리를 관리해야 할까?

프로젝트의 규모가 작을 때에는 위 방법으로 프로젝트에 라이브러리를 가져와도 문제가 없을 것이다. 하지만 프로젝트의 규모가 점점 커지고, 사용하는 라이브러리의 수가 늘어나면 프로젝트에서 사용하는 라이브러리를 관리할 필요가 생긴다. 다른 사람에게 작업하던 프로젝트를 넘겨주고, 추가된 라이브러리를 일일이 설치하는 것은 쓸데 없는 일이다. 그것을 대신 해 주는 것이 Maven이 하는 일이다.
Maven 프로젝트에서는 pom.xml에 POM(Project Object Model)을 정의해서 사용한다. 사용하는 라이브러리의 목록을 pom.xml에 적어 두기만 하면 라이브러리의 변경을 쉽게 관리할 수 있다.

Maven 프로젝트 생성하기 (with IntelliJ)


프로젝트를 생성하는 화면에서 Maven을 선택한다.
(당연한 이야기지만 Gradle을 선택하면 Gradle 프로젝트가 된다.)


Maven 프로젝트가 생성되고, pom.xml을 편집하는 탭이 열린다.

Maven의 라이프 사이클


우측의 Maven 탭에서 Maven 플러그인의 기능을 실행할 수 있다. 플러그인 말고도 Lifecycle 그룹이 보이는데, 각 항목은 Goal이라고 부른다. 각각의 Goal이 무엇을 수행하는지 그룹 별로 간단하게 정리해 보면 다음과 같다. 아래 내용은 공식 사이트를 참고하며 작성하였다.

  • 기본 라이프사이클 (빌드 라이프사이클이라고도 부른다)
    • validate: 빌드 가능한 프로젝트인지 확인한다.
    • compile: 프로젝트의 소스 코드를 컴파일한다.
    • test: surefire 플러그인을 이용하여, 적절한 단위 테스트 프레임워크를 사용해 컴파일된 코드에 대해 테스트를 수행한다.
    • package: 컴파일된 코드를 배포 가능한 형식(jar, war 등)으로 패키징한다.
    • verify: 통합 테스트를 통해 품질 기준을 만족하는지 검사한다.
    • install: 패키징한 파일을 로컬 저장소에 배포한다.
    • deploy: 패키징한 파일을 원격 저장소에 배포한다.
  • clean 라이프사이클
    • clean: 이전까지의 Maven 빌드를 통해 생성된 모든 파일을 삭제한다.
  • site 라이프사이클
    • site: 프로젝트의 문서 사이트를 생성한다.
    • site-deploy: site를 통해 생성된 문서 사이트를 지정된 웹 서버에 배포한다.

각 Goal은 command line에 mvn {keyword}의 형식으로 명령어를 입력해 사용할 수 있다.
(e.g. mvn package, mvn clean, mvn install 등)

그럼 Gradle은 뭐지?

Gradle은 Java가 아닌 Groovy를 기반으로 만든 빌드 자동화 도구이다. Maven과 기능이 유사해서 비교하기 좋은데, 재미있게도 공식 사이트에서 직접 Maven과의 차이점을 비교하고 있다. 내용을 요약해서 가져와 보자면 다음과 같다.

  • Gradle은 Maven보다 유연하다.
  • Gradle은 Maven보다 성능이 좋다.
  • Gradle은 Maven보다 사용하기 편리하다.
  • Gradle은 Maven보다 더 좋은 사용자 경험을 제공한다. (IDE에서 자체 지원)
  • Gradle은 종속성 관리가 편리하다.

Maven은 확실히 너무 장황하다. 장황하기 때문에 실수가 잦아지고, 실수가 잦아져서 에러가 많이 난다. Gradle은 이것을 해결하려고 개발된, Maven의 장점만 뽑아와서 만든 빌드 도구이다. 또, Maven은 모듈을 상속하는 식으로 의존성을 관리하고, Gradle은 설정을 주입받아서 의존성을 관리한다고 한다. 따라서 다양한 모듈을 가져와서 사용하는 프로젝트의 경우는 특히나 Maven보다 Gradle을 사용하는 편이 더 나을 것이다.

다음 글에서는 Gradle에 대해서 알아보겠다.

0개의 댓글