Maven 의존성
Maven에서 의존성은 프로젝트를 빌드, 테스트, 배포할 때 필요한 외부 라이브러리, 프레임워크, 플러그인 등을 의미함.
Maven은 이러한 의존성을 자동으로 관리하여 개발자가 직접 라이브러리를 다운로드하고 설정하는 수고를 덜어줌.
의존성 관리는 Maven의 핵심 기능 중 하나로, 특히 대규모 프로젝트에서 개발의 생산성을 높이고 유지보수를 용이하게 만듦.
Maven 의존성의 기본 개념
Maven에서 의존성은 pom.xml 파일에 dependencies 섹션을 통해 정의됨.
각 의존성은 GAV 형태로 관리됨.
1. Group ID
라이브러리나 프로젝트의 소속을 나타내는 식별자
2. Artifact ID
특정 라이브러리를 구분하는 이름
3. Version
해당 라이브러리의 버전
기본 의존성 설정
<dependencies>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
Maven의 의존성 스코프
의존성은 사용되는 목적과 단계에 따라 스코프를 지정할 수 있음.
스코프를 지정하지 않으면 기본값으로 compile이 적용됨.
1. compile
컴파일, 테스트, 패키징, 실행 등 모든 단계에서 사용함.
2. provided
컴파일과 테스트 단계에서만 필요하며, 배포 시 포함되지 않음.
3. runtime
컴파일 시에는 필요하지 않지만, 실행 시 필요함.
4. test
테스트 코드 컴파일 및 실행 시에만 필요함.
5. system
외부 시스템 경로에서 의존성을 가져옴. `<systemPath>`를 명시해야 함.
6. import
주로 BOM(Bill of Materials)에서 사용하며, 외부 의존성 관리용.
스코프 지정 예시.
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
의존성 트리 및 전이적 의존성
Maven의 강력한 기능 중 하나는 전이적 의존성 관리임.
A 라이브러리가 B와 C를 의존하고, C가 D를 의존한다면, Maven은 자동으로 D를 포함함.
전이적 의존성 확인 명령어는 다음과 같음.
mvn dependency:tree
전이적 의존성 문제 해결: exclusion
때로는 전이적 의존성으로 인해 충돌이 발생할 수 있음.
이를 해결하기 위해 특정 의존성을 제외할 수 있음.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>3.0.0</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
의존성 관리
대규모 프로젝트에서 의존성 버전 관리를 일관성 있게 유지하기 위해 Maven은 dependencyManagement 태그를 사용함.
이 태그는 특정 모듈이 아닌, 상위 프로젝트에서 의존성의 버전을 정의하고 하위 모듈에서는 버전 없이 선언할 수 있도록 함.
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.19.0</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
</dependency>
</dependencies>
Maven 리포지토리
Maven은 기본적으로 중앙 리포지토리에서 라이브러리를 다운로드함.
추가적으로 사내나 개인용 로컬 리포지토리 및 사설 리포지토리를 설정할 수도 있음.
1. 로컬 리포지토리
~/.m2/repository 에 저장되며, 한 번 다운로드된 라이브러리는 재사용됨.
2. 원격 리포지토리
중앙 또는 사설 서버에서 라이브러리를 가져옴.
<repositories>
<repository>
<id>my-private-repo</id>
<url>https://my.repo.com/maven2</url>
</repository>
</repositories>
의존성 충돌 해결
여러 버전의 동일한 라이브러리가 포함될 경우, Maven의 의존성 해소 규칙이 적용됨.
1. 가장 가까운 정의 우선
의존성 트리에서 더 가까운 의존성이 우선 적용됨.
2. 선언된 순서 우선
동일한 레벨에 있을 경우, 먼저 선언된 의존성이 선택됨.
충돌 해결 방법: `dependencyManagement` 또는 `exclusion` 사용
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
</dependencies>
</dependencyManagement>
플러그인 의존성
빌드 과정에서 필요한 Maven 플러그인도 pom.xml의 <build> 섹션에 의존성으로 정의할 수 있습니다.
예제: Maven Surefire 플러그인 설정
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>3.0.1</version>
</plugin>
</plugins>
</build>
의존성 추가 자동화: `dependency:resolve`
Maven은 의존성을 자동으로 다운로드하고 해결하는 기능도 제공하며, 이를 위해 아래 명령어를 사용합니다.
mvn dependency:resolve
'Data Engineering > Zeppelin' 카테고리의 다른 글
[Zeppelin] Realm (0) | 2024.11.12 |
---|---|
[Zeppelin] Neo4j (0) | 2024.11.11 |
[Zeppelin] 전송 계층 (0) | 2024.11.04 |
[Zeppelin] TCP 통신 (0) | 2024.11.03 |
[Zeppelin] 웹소켓 (2) | 2024.10.27 |