Java의 빌드도구 : Maven

Eojin·2024년 5월 12일
0

자바

목록 보기
3/3

작성일
20240512


➡️ Java에서의 빌드(build)

자바코드를 실행가능한 형태인 JAR 파일로 만들어주는 일련의 과정이다.

빌드 시스템(Build System)에 있는 그레이들과 메이븐은 소스코드를 이용해서 실행가능한 애플리케이션을 생성하는 과정을 자동화하는 프로그램이다. 자동화 과정에는 의존성 내려받기, 코드 패키징, 컴파일, 테스트 실행 등이 있다. 참고로 과거에는 메이븐을 많이 사용했으나 요즘은 그레이들을 많이 사용하는 추세이다.

CF. JAR vs. WAR



➡️ 메이븐(Maven)


✅ Maven은 왜 만들어졌을까?

기존의 Apache Ant의 대안으로 만들어진, Apache 회사에서 제공되는 오픈소스 소프트웨어라서 Apache Maven이라고 부르기도 한다.


Maven이 Yiddish(유대인의 언어)로 Accumulator of Knowledge(지식의 축적)를 뜻하더라. 추측해본건데... 그 복잡한 것들을 대신 하도록 도와주는 지식의 결정체와 같은 도구를 만들었다는 의미에서 그렇게 지은 것이 아닐까 생각했다.


이런 도구 없다면 모든 소프트웨어에 필요한 기본적인 동작(빌드 등)도 하나하나 지시해야 했으니 말이다. 애초에 Maven이라는 소프트웨어를 만들게 된 계기도 빌드 프로세스를 단순화하려는 시도였다고 한다.


여기서 Maven이라는 소프트웨어가 참여하는 커다란 소프트웨어(프로젝트)는 자바 프로그래밍언어 기반을 가리킨다.
다시말해 Maven은 자바 프로젝트의 빌드, 관리 및 문서화를 자동화하는 도구이다.


과거에는 프로젝트마다 본인만의 Ant 빌드 파일을 사용했다고 한다. 이러한 통일성 문제로 인해 협력이나 유지보수성 등의 개발 과정 복잡해졌다고 한다. 때문에 기존의 Ant를 확장해 프로젝트를 빌드하는 표준 방법을 제시하여 획일화된 빌드 프로세스를 갖게 되었다.


즉, 소프트웨어의 기초기반를 뚝딱! 제작해주는 도구가 만들어진 것이다. Maven이 등장함으로써 표준 빌드 프로세스가 생긴 덕분에, 누구나 프로젝트 구성을 단시간에 명확하게 알 수 있게 되었다. 뿐만 아니라 pom.xml에 필요한 라이브러리를 코딩해두면 Maven이 알아서 관리하고 다운로드받아주니, 라이브러리(JAR 파일)를 직접 다운로드받을 필요가 없어졌다.



✅ (내용 검토 및 역할요약 필요) Maven의 장점 및 역할

① 표준 빌드 라이프사이클 제공

② 개발 프로세스 간소화
: 프로젝트 빌드, 패키지, 테스트, 배포(WAR 파일) 등

③ 라이브러리의 관리

  • 프로젝트의 라이브러리 의존성 관리
  • 필요한 라이브러리를 프로젝트에 추가
  • 버전 충돌 해결

④ 라이브러리 자동 다운로드 및 프로젝트에 추가

  • 빌드를 하기 위해 필요한 라이브러리의 종속성을 다운로드
  • POM(Project Object Model, 프로젝트 객체 모델)을 이용하여 라이브러리 다운로드
  • 프로젝트의 빌드를 위해 필요한 라이브러리들의 종속성을 관리하고 해결

즉, POM 파일에 선언된 라이브러리의 종속성을 해결하여 필요한 라이브러리를 자동으로 다운로드하고 프로젝트에 추가한다는 것을 의미합니다.


⑤ 프로젝트 문서화 처리, 구조 관리

: 빌드하고자 하는 프로젝트가 무엇인지, 어떤 순서로 빌드하는지, 여러 외부 라이브러리 종속성 관계를 pom.xml파일에 명시해준다.



앞서 언급되었듯이 Maven은 POM(Project Object Model, 프로젝트 객체 모델)을 사용하여 프로젝트의 라이프사이클을 관리한다. 지금부터 POM에 대해 알아보자.

✅ POM이란?

프로젝트의 기본 정보가 들어가 있는 pom.xml 파일을 가리키며, pom.xml 파일을 구성하는 최소 항목은 아래와 같다.

  • 프로젝트의 루트

  • modelVersion

  • 프로젝트 그룹의 아이디 (groupId)

  • 프로젝트의 아이디 (artifactId) : 이는 곧 아티팩트의 아이디이기도 하다

  • 프로젝트의 버전 (version) : 이는 곧 아티팩트의 버전이기도 하다


앞선 [ Maven의 장점 및 역할 ]의 ④에서 언급되었듯이 pom.xml에서는 모든 의존성을 관리하는 역할을 한다.

이는 Maven이 최종적으로 프로젝트를 빌드하기 위해 필요한 과정이다. 그 과정에 모든 의존성을 다운로드해, 라이브러리 간의 의존성을 확인하기 해결하기 위함이다.

추가로 필요한 라이브러리를 다운로드 받기 위한 코드를 삽입하는 경우를 제외하고, 초보 개발자는 Maven을 다룰 일이 많이 없기 때문에 명령줄 사용법을 익히는 것보다는

pom.xml의 코드 구조를 대략적으로 이해하고 새 의존성을 추가하는 방법을 아는 것이 중요하다.

지금까지 의존성이라는 단어를 계속 사용해왔다.

이는 존속성이라고도 부르는데 자바와 같은 객체지향언어를 하는 사람이라면 특히 자주 접할 단어다.
이 단어 자체의 뜻은 대략 알고 있다 생각했지만...
저 말의 의미가 무엇인지 참 헷갈린다.

그래서 이번엔 위에서 설명한 의존성과 관련된 문장들을 이해해보는 시간을 가지려 한다.


✅ 라이브러리의 의존성이란?
이 글에서의 의존성(dependency)은 프로젝트가 다른 외부 라이브러리나 프레임워크에 의존하는 것을 의미한다.


단, 의존성이라는 단어가 사용되는 그 대상에 따라 해당 설명이 바뀔 수 있다.
하지만 결국 무언가 의존하는 관계를 맺고 있다는 의미를 갖는 용어이다.

즉, 라이브러리의 의존성은 프로젝트가 실행되기 위해 필요한 외부 라이브러리나 프레임워크를 가리킨다.

예를 들어, Java 프로젝트에서는 Apache Commons 라이브러리의 commons-lang3 모듈을 사용하여 문자열 처리를 한다면, 이 라이브러리는 프로젝트의 의존성(dependency)을 가지고 있는 것이다. 프로젝트는 이 외부 라이브러리의 기능을 사용하기 위해 해당 라이브러리에 의존하고 있다.


✅ 'pom.xml에 선언된 라이브러리 의존성'의 의미 :
Maven을 사용할 때, 이러한 종속성을 명시적으로 프로젝트의 pom.xml 파일에 선언한다. 여기서 명시적~ 선언이라함은 코드로 해당 내용이 적혀있다라고 생각하면 된다. Maven은 이 선언된 종속성을 해결하여 필요한 라이브러리를 다운로드하고 프로젝트에 추가한다. 따라서 Maven은 종속성을 관리하고 해결하는 역할을 수행다.


✅ 위 글에서 'Maven이 pom.xml에 선언된 라이브러리의 의존성을 해결해준다'의 의미 :
이는 Maven이 프로젝트의 종속성을 관리하는 과정을 가리키는 문장이다.

차근차근 풀어서 이해해보자.

Maven이 담당하고 있는 프로젝트의 루트 디렉토리에는 pom.xml이라는 파일이 있다.

이 파일은 프로젝트 객체 모델(Project Object Model, POM)을 정의하며, POM은 프로젝트의 구조, 종속성, 빌드 설정 등을 정의하는 XML 파일이다. 뿐만 아니라 POM 파일에는 프로젝트가 사용하는 외부 라이브러리의 정보도 있다.

예를 들어, pom.xml 파일에 아래와 같은 종속성이 선언되어 있다고 가정해보자.

<dependencies>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.12.0</version>
    </dependency>
</dependencies>




이 경우 Maven은 org.apache.commons:commons-lang3:3.12.0 라이브러리를 다운로드하고 프로젝트에 추가한다.

POM 파일에 있는 외부 라이브러리 정보를 바탕으로 Maven은 프로젝트가 의존하는 라이브러리를 찾아서 다운로드하고, 필요한 라이브러리를 프로젝트 빌드에 포함시키는 과정을 거치게 되는 것이다.


이해의 재료는 모두 모았다.
'Maven은 pom.xml에 선언된 의존성을 해결한다'의 의미를 이제 정리해보자.

1) Maven은 POM 파일에 적혀있는 외부 라이브러리들을 읽는다.

2) Maven이 외부 라이브러리들의 의존 관계에 있는 라이브러리들을 확인한다.


이를 확인하는 이유는 다음과 같다.


만약 의존성이 있는 라이브러리가 적혀있었다고 했을 때,
의존성을 무시하고 딱~! 적혀있는 라이브러리만 사용한다면 최악의 경우 아예 해당 라이브러리를 사용할 수 없게 될 것이다.


왜냐하면 라이브러리에게 의존성이 있다는 것은
해당 라이브러리의 동작이 이루어지기 위해서는
반드시 자신 외의 라이브러리를 필요로 한다는 뜻이기 때문이다.


이 설명을 다르게 설명하자면
의존성이 있는 라이브러리는 '자기 혼자 온전히 동작되지 않는' 라이브러리라는 뜻이기도 하다.


때문에 완전하게 라이브러리를 사용하려면 의존성이 있는지, 그리고 있다면 의존 관계에 있는 라이브러리까지 다운로드해야만 하는 것이다.



3) 적혀있는 라이브버리 뿐만 아니라 의존 관계에 있는 라이브러리까지 다운로드하여 프로젝트에 추가한다.


우리는 1)~4)번까지의 Maven이 하는 동작을 'Maven의 라이브러리 의존성 해결'이라고 부른다.


➡️ 참고자료

[교재] 주하 한쿨라, 「실전! 스프링부트와 리액트로 시작하는 모던 웹 애플리케이션 개발」

https://maven.apache.org/what-is-maven.html

https://mangkyu.tistory.com/8

https://jisooo.tistory.com/entry/Spring-%EB%B9%8C%EB%93%9C-%EA%B4%80%EB%A6%AC-%EB%8F%84%EA%B5%AC-Maven%EA%B3%BC-Gradle-%EB%B9%84%EA%B5%90%ED%95%98%EA%B8%B0

profile
'함께'가 즐거운 개발 공부하는 사람입니다.

0개의 댓글

관련 채용 정보