Maven
Maven은 Java 프로젝트의 빌드 자동화 및 프로젝트 관리 도구로 널리 사용됨.
특히 의존성 관리와 빌드 프로세스 표준화 측면에서 큰 이점을 제공함.
Apache Software Foundation이 개발했으며, Java 뿐만 아니라 여러 다른 언어의 프로젝트도 관리할 수 있음.
Maven의 핵심 목표는 프로젝트의 구조화와 라이브러리 의존성 관리를 자동화하여 개발 효율성을 극대화 하는 것임.
Maven의 핵심 개념
1. POM (Project Object Model)
Maven의 중심이 되는 파일이 POM.xml임.
각 프로젝트는 POM 파일을 통해 Maven의 동작을 정의함.
POM 파일에는 프로젝트 정보, 빌드 설정, 의존성, 플러그인, 배포 설정 등이 포함됨.
주요 태그는 다음과 같음.
- <modelVersion> : POM의 버전
- <groupId> : 프로젝트 고유 식별자 (일반적으로 조직 또는 회사의 도메인 이름)
- <artifactId> : 프로젝트의 이름
- <version> : 프로젝트의 버전
- <dependencies> : 프로젝트에서 사용하는 외부 라이브러리 의존성
- <build> : 프로젝트 빌드 시 추가 설정 (컴파일러, 플러그인 등)
예시는 다음과 같음.
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-app</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
2. 의존성 관리 (Dependency Management)
Maven은 의존성 관리가 주요 기능임.
POM 파일의 <dependencies> 섹션에서 프로젝트가 필요로 하는 외부 라이브러리들을 선언함.
Maven은 중앙 저장소에서 선언된 라이브러리를 자동으로 다운로드하고 프로젝트에 추가함.
의존성 스코프
- compile (기본값) : 컴파일 시 필요한 의존성
- provided : 컴파일 시 필요하지만 런타임에는 필요하지 않은 의존성 (예: 서블릿 API)
- runtime : 컴파일 시 필요하지 않지만 런타임에 필요한 의존성
- test : 테스트 시에만 필요한 의존성 (예: JUnit)
3. 빌드 라이프사이클
Maven은 프로젝트의 빌드 라이프사이클을 정의함.
각 라이프사이클은 여러 페이즈로 구성되며, Maven은 이러한 페이즈를 통해 순차적으로 작업을 수행함.
Maven의 기본 빌드 라이프사이클은 세 가지로 나뉨.
주요 라이프사이클
3-1. default : 프로젝트 빌드를 처리하는 주 라이프사이클
- validate : 프로젝트가 올바른지 확인
- compile : 소스 코드 컴파일
- test : 테스트 코드 실행
- package : JAR, WAR 등의 배포 가능한 파일로 패키징
- install : 패키징된 파일을 로컬 저장소에 설치
- deploy : 원격 저장소로 배포
3-2. clean : 빌드 아티팩트 삭제를 담당
- pre-clean : 클린 작업 전 실행
- clean : 이전 빌드 파일을 삭제
- post-clean : 클린 작업 후 실행
3-3. site : 프로젝트 문서화와 관련된 작업
- site : 프로젝트 사이트 문서 생성
- site-deploy : 생성된 문서를 원격 사이트로 배포
Maven은 명령어로 라이프사이클을 실행함.
각 명령어는 해당하는 페이즈와 연결됨.
예를 들어 mvn install을 실행하면 Maven은 validate, compile, test, package 및 install 순으로 작업을 수행함.
4. 플러그인
Maven의 기능 확장은 플러그인에 의존함.
각 플러그인은 특정 작업을 처리함.
예를 들어 컴파일이나 테스트, 패키징같은 작업이 있음.
플러그인은 POM 파일에서 선언하고, 이를 통해 특정 페이즈에서 플러그인이 수행할 작업을 정의함.
주요 플러그인
- maven-compiler-plugin : 소스 코드를 컴파일
- maven-surefire-plugin : 테스트 코드 실행
- maven-jar-plugin : JAR 파일 패키징
- maven-war-plugin : WAR 파일 패키징 (웹 애플리케이션)
플러그인 설정 예시
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
5. 저장소
Maven은 라이브러리와 플러그인을 저장소에서 다운로드하여 관리함.
저장소는 로컬 저장소와 원격 저장소로 나뉨.
- 로컬 저장소 : Maven이 다운로드한 모든 의존성은 로컬 머신의 .m2/repository 디렉토리에 저장됨. 의존성이 로컬에 없다면 중앙 저장소에서 자동으로 다운로드됨.
- 원격 저장소 : Maven Central Repository와 같은 중앙 저장소에서 라이브러리를 다운로드함. 필요한 경우 회사의 내부 저장소나 다른 서드파티 저장소를 설정할 수 있음.
저장소 설정 예시
<repositories>
<repository>
<id>my-internal-repo</id>
<url>http://repo.mycompany.com/maven2</url>
</repository>
</repositories>
6. 프로파일
Maven 프로파일은 특정 환경이나 조건에 따라 빌드 설정을 달리 적용하는 기능임.
예를 들어, 개발, 테스트, 프로덕션 환경에 따라 빌드 설정을 변경할 수 있음.
이를 통해 하나의 POM 파일 내에서 다양한 빌드 환경을 지원할 수 있음.
프로파일 설정 예시
<profiles>
<profile>
<id>development</id>
<properties>
<env>dev</env>
</properties>
</profile>
<profile>
<id>production</id>
<properties>
<env>prod</env>
</properties>
</profile>
</profiles>
이 경우, mvn install -Pdevelopment 명령어로 개발 환경에서 빌드를 수행할 수 있음.
Maven의 장점
1. 자동 의존성 관리
Maven은 필요한 라이브러리를 자동으로 다운로드하고 관리하므로 개발자가 직접 라이브러리 경로를 설정할 필요가 없음.
2. 일관된 빌드 프로세스
Maven은 표준화된 빌드 구조와 프로세스를 제공하여 프로젝트 간 일관성을 유지할 수 있음.
3. 플러그인 기반 확장성
Maven은 다양한 플러그인을 지원하여 다양한 빌드 작업을 자동화할 수 있음.
4. 대규모 프로젝트 관리
모듈화된 멀티모듈 프로젝트 관리가 용이함.
여러 서브모듈을 가진 프로젝트에서도 쉽게 관리가 가능함.
Maven의 단점
1. 학습 곡선
POM 파일 구조와 Maven의 다양한 설정을 완전히 이해하기까지는 시간이 걸림.
2. 의존성 충돌
여러 의존성 간 버전 충돌이 발생할 수 있으며, 이를 해결하기 위해 수동으로 조정이 필요할 때가 있음.
3. 빌드 속도
Maven은 XML 기반이므로 설정 파일이 복잡해질 수 있으며, 대규모 프로젝트에서는 빌드 속도가 느려질 수 있음.
Maven 정리
Maven은 이러한 장점과 단점을 가지고 있음.
Java 개발 환경에서 프로젝트의 규모와 복잡성에 상관없이 널리 사용되는 필수 도구임.
'Data Engineering > Zeppelin' 카테고리의 다른 글
[Zeppelin] io.micrometer.core.instrument 패키지 (0) | 2024.09.20 |
---|---|
[Zeppelin] Maven 기본 구조 (0) | 2024.09.20 |
[Zeppelin] SLF4J (0) | 2024.09.18 |
[Zeppelin] 아파치 제플린의 인터프리터 (2) | 2024.09.17 |
[Zeppelin] 아파치 제플린의 장단점 (2) | 2024.09.16 |