Maven Dependency Scope

Kevin·2024년 10월 10일
0

JAVA

목록 보기
15/16
post-thumbnail

1️⃣ 서론

Maven을 사용하는 프로젝트간 의존성을 Maven Central Repository가 아니라 jar 파일을 프로젝트 내부에 배치하고, 이를 의존하는 형태로 개발을 했어야 하는 일이 있었다.

이 때 결과적으로 아래 코드와 같이 System Scope 의존성 범위를 통해 프로젝트 내의 jar 파일을 의존성에 추가 하는데 성공 하였다.

<dependency>
    <groupId>org.apache</groupId> 
    <artifactId>ibatis-dao</artifactId>
    <version>2.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/의존되는.jar</systemPath>
</dependency>
  • groupId : 프로젝트나 라이브러리를 제공하는 그룹 또는 조직을 식별하는 문자열
  • artifactId : 모듈 이름

이 과정에서 공부하게 된 scope(의존성 범위)의 개념에 대해서 공부 하고자 한다.


2️⃣ scope(의존성 범위)

먼저 Maven에서는 두 종류의 의존성이 있다.

첫 번째로는 직접 의존성이다.

직접 의존성은 pom.xml 파일에 명시적으로 추가된 라이브러리를 뜻한다.

해당 프로젝트가 특정 기능 또는 라이브러리를 사용하기 위해 아래와 같이 명확히 선언하는 것이다.

<dependency>
    <groupId>org.apache</groupId> 
    <artifactId>ibatis-dao</artifactId>
    <version>2.0</version>
</dependency>

두 번째로는 전의 의존성이 있다.

전의 의존성은 직접 의존성에 포함된 다른 의존성을 의미한다.

프로젝트에서 직접 의존하는 라이브러리가 내부적으로 필요로 하는 라이브러리들을 Maven이 자동으로 관리하고 추가하는 것이다.

예를 들어서 위 직접 의존성으로 명시된 ibatis-dao 라이브러리에서 내부적으로 ibatis-common 라이브러리를 의존하면 Maven은 자동으로 ibatis-common을 의존한다는 개념이다.

정확히는 ibatis-dao 라이브러리의 pom.xml dependency에 기술된 모든 라이브러리를 같이 다운로드 받아오는 것이다.

의존성 범위는 이러한 의존성의 전이를 제한 시키는데 사용된다.

Maven은 총 6개의 기본 의존성 범위를 가지고 있다.

1. Compile

<dependency>
    <groupId>org.apache</groupId> 
    <artifactId>ibatis-dao</artifactId>
    <version>2.0</version>
</dependency>

만약 별도로 scope 설정을 하지 않는다면, 기본적으로 compile scope가 된다.

해당 의존성 범위를 가진 의존성은 모든 Build 단계와 Runtime 단계에서 사용된다.

이는 컴파일, 테스트, 패키징, 실행 모든 과정에서 의존성을 사용할 수 있다는 의미다.

추가적으로 해당 의존성은 전이 된다.


2. Provided

<dependency>
    <groupId>org.apache</groupId> 
    <artifactId>ibatis-dao</artifactId>
    <version>2.0</version>
    <scope>provided</scope>
</dependency>

provided 의존성 범위은는 Compile 시점과 Test 시점에는 의존성이 적용되지만, Runtime 시점에서는 적용되지 않는다.

추가적으로 이 의존성은 전이가 되지 않는다.


3. Runtime

<dependency>
    <groupId>org.apache</groupId> 
    <artifactId>ibatis-dao</artifactId>
    <version>2.0</version>
    <scope>rumtime</scope>
</dependency>

Runtime 의존성 범위는 Runtime 시점이나 Test 시점에 적용된다.

이 때 해당 의존성은 빌드할 때는 제외되지만, 실행될 때는 포함되기에 JDBC 드라이버와 같이 실행 시점에만 필요한 라이브러리에 사용된다.


4. Test

<dependency>
    <groupId>org.apache</groupId> 
    <artifactId>ibatis-dao</artifactId>
    <version>2.0</version>
    <scope>test</scope>
</dependency>

Test 의존성 범위는 Test 시점에만 적용되기에 테스트 용도로만 사용된다.

또한 해당 의존성은 전의되지 않는다.


5. System

<dependency>
    <groupId>org.apache</groupId> 
    <artifactId>ibatis-dao</artifactId>
    <version>2.0</version>
    <scope>system</scope>
    <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/의존되는.jar</systemPath>
</dependency>

서론에 등장하였던 system 의존성 범위는 Compile, Test, Runtime 시점에 적용된다.

특이점으로는 외부에 시스템 경로로 이미 존재하는 JAR 파일을 의존성으로 사용한다.

이러한 JAR 파일은 원격 Maven 저장소에서 다운로드 하지 않고, 로컬 시스템에서 제공 됨으로 systemPath를 통해 해당 jar 파일의 경로를 명시 해야 한다.

system 의존성 범위는 Maven 저장소의 의존성 관리 기능을 벗어나게 된다.


6. import

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.apache</groupId> 
				    <artifactId>ibatis-dao</artifactId>
            <version>2.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

import 의존성 범위는 다른 POM 파일에서 의존성들을 가져와 현재 프로젝트에서 사용할 수 있게 한다.

이 의존성은 위의 의존성 머위와 다르게 dependencyManagement 에서 다른 프로젝트의 의존성 버젼을 일괄적으로 관리하는데 사용된다.


3️⃣ 후기

원래는 주말간 공부를 진행하고, 회사에서 해당 문제를 해결 하고자 했는데, 내 게으름 때문에 이렇게 미뤄지게 되었다.

회사는 학교가 아니고 돈을 받는 곳이고, 보여줘야 하는 곳임을 다시금 기억하자.

profile
Hello, World! \n

0개의 댓글

관련 채용 정보