자바 9 모듈 시스템과 의존성 관리

자바 9 모듈 시스템과 의존성 관리

Java 9

자바 9은 새로운 모듈 시스템을 도입하여 기존의 클래스 패스 및 JAR 파일로 구성된 모듈 시스템 대체할 수 있도록 만들었습니다. 이 모듈 시스템은 자바 애플리케이션의 모듈화와 의존성 관리를 위한 새로운 방식을 제공합니다. 이 글에서는 자바 9 모듈 시스템에 대해 자세히 알아보고, 모듈 시스템을 사용한 의존성 관리의 방법과 이점에 대해 알아보겠습니다.

자바 9 모듈 시스템 소개

자바 9 모듈 시스템은 애플리케이션을 모듈 단위로 나누어 관리합니다. 각 모듈은 다른 모듈에 대한 의존성을 선언하며, 필요한 모듈만 로딩하도록 설정합니다. 이를 통해 불필요한 클래스와 패키지의 로딩을 줄이고, 충돌과 버전 관리 문제를 방지할 수 있습니다.

모듈은 모듈 정보 파일(module-info.java)을 사용하여 정의됩니다. 이 파일은 모듈 이름, 의존하는 모듈의 이름, 모듈 내부에서 노출하는 패키지 등을 선언합니다. 다음은 모듈 정보 파일(module-info.java)의 예시입니다.

module com.example.myapp {
    requires transitive org.slf4j;
    exports com.example.myapp.api;
    opens com.example.myapp.internal to com.example.myapp.cli;
}

위 예시에서는 "com.example.myapp"이라는 이름의 모듈을 정의하고 있습니다. 이 모듈은 "org.slf4j" 모듈에 의존하고 있으며, "com.example.myapp.api" 패키지를 노출하고 있습니다. 또한 "com.example.myapp.internal" 패키지를 "com.example.myapp.cli" 모듈에만 열어놓고 있습니다.

이러한 모듈 정보 파일을 사용하여 모듈 간의 의존성을 선언하고, 필요한 모듈만 로딩하도록 설정함으로써 애플리케이션의 모듈화와 의존성 관리를 효과적으로 할 수 있습니다.

모듈 시스템에서 의존성 관리 방법

자바 9 모듈 시스템에서는 모듈 간의 의존성을 선언하는 방식이 기존의 클래스 패스와는 다릅니다. 기존의 클래스 패스에서는 클래스나 라이브러리를 찾을 때 먼저 현재 위치에서부터 찾고, 찾지 못하면 다음 위치에서 찾는 방식을 사용합니다. 이에 비해 자바 9 모듈 시스템에서는 모듈 간의 의존성을 명시적으로 선언합니다.

의존성을 선언할 때는 "requires" 키워드를 사용합니다. 다음은 "requires" 키워드를 사용하여 다른 모듈에 의존하는 방법의 예시입니다.

module com.example.myapp {
    requires org.slf4j;
}

위 예시에서는 "com.example.myapp" 모듈이 "org.slf4j" 모듈에 의존하고 있다는 것을 선언하고 있습니다. 이를 통해 "com.example.myapp" 모듈이 로딩될 때 "org.slf4j" 모듈도 함께 로딩됩니다.

또한, "requires transitive" 키워드를 사용하면, 해당 모듈에 의존하는 모듈들도 함께 의존하게 됩니다. 이를 통해 중복된 모듈 의존성을 줄일 수 있습니다.

module com.example.myapp {
    requires transitive org.slf4j;
}

위 예시에서는 "com.example.myapp" 모듈이 "org.slf4j" 모듈에 의존하고, "org.slf4j" 모듈에 의존하는 다른 모듈들도 함께 의존하게 됩니다.

또한, 모듈 정보 파일에서 "exports" 키워드를 사용하여 해당 패키지를 노출할 수 있습니다. 이를 통해 다른 모듈에서 해당 패키지를 사용할 수 있습니다.

module com.example.myapp {
    exports com.example.myapp.api;
}

위 예시에서는 "com.example.myapp" 모듈에서 "com.example.myapp.api" 패키지를 노출하고 있습니다. 이를 통해 다른 모듈에서 "com.example.myapp.api" 패키지를 사용할 수 있습니다.

모듈 시스템 적용 시 이점과 고려 사항

자바 9 모듈 시스템을 사용하면 애플리케이션의 모듈화와 의존성 관리가 효과적으로 이루어집니다. 이를 통해 애플리케이션의 유지 보수성이 향상되고, 충돌과 버전 관리 문제를 방지할 수 있습니다. 또한, 모듈 시스템을 사용하면 불필요한 클래스와 패키지의 로딩을 줄일 수 있어서 애플리케이션의 성능도 향상됩니다.

하지만, 모듈 시스템을 사용하면서 고려해야 할 사항도 있습니다. 모듈 시스템을 사용하면 기존의 라이브러리나 프레임워크와의 호환성 문제가 발생할 수 있습니다. 또한, 모듈 시스템을 사용하면 모듈 간의 의존성이 명시적으로 선언되기 때문에 모듈 간의 결합도가 높아질 수 있습니다. 따라서, 모듈 간의 의존성을 잘 파악하고, 필요한 의존성만 선언하는 것이 중요합니다.

의존성 관리를 위한 모듈 시스템 활용 방법

자바 9 모듈 시스템을 사용하여 의존성을 관리하는 방법은 다음과 같습니다.

1. 모듈 정보 파일 정의하기

의존성을 관리하기 위해서는 모듈 정보 파일(module-info.java)을 정의해야 합니다. 모듈 정보 파일에서는 모듈의 이름, 의존하는 모듈의 이름, 모듈 내부에서 노출하는 패키지 등을 선언합니다.

module com.example.myapp {
    requires org.slf4j;
    exports com.example.myapp.api;
}

2. 모듈 패스 설정하기

모듈 패스를 설정하여, 필요한 모듈만 로딩하도록 설정합니다. 모듈 패스는 다음과 같은 방식으로 설정할 수 있습니다.

java --module-path  -m /

예를 들어, "com.example.myapp" 모듈을 로딩하고, "com.example.myapp.Main" 클래스를 실행하는 경우 다음과 같이 모듈 패스를 설정할 수 있습니다.

java --module-path mods -m com.example.myapp/com.example.myapp.Main

3. 모듈화된 라이브러리 사용하기

모듈화된 라이브러리를 사용하려면, 해당 라이브러리의 모듈 정보 파일을 참조하거나, 모듈화된 라이브러리를 직접 생성하여 사용해야 합니다.

모듈화된 라이브러리를 생성하려면, 다음과 같은 방식으로 라이브러리를 패키징합니다.

jar --create --file=.jar --module-version= --main-class= -C  .

예를 들어, "org.apache.commons.lang3" 라이브러리를 모듈화하여 사용하려면 다음과 같이 라이브러리를 패키징합니다.

jar --create --file=commons-lang3-3.9.jar --module-version=3.9 --main-class=org.apache.commons.lang3.StringUtils -C commons-lang3-3.9/target/classes/ .

이후, 위에서 생성한 "commons-lang3-3.9.jar" 파일을 모듈 패스에 추가하여 사용할 수 있습니다.

java --module-path mods:libs -m com.example.myapp

결론

자바 9 모듈 시스템은 기존의 클래스 패스와 JAR 파일로 구성된 모듈 시스템을 대체하는 새로운 모듈 시스템입니다. 이를 통해 애플리케이션의 모듈화와 의존성 관리가 효과적으로 이루어지며, 유지 보수성이 향상되고, 충돌과 버전 관리 문제를 방지할 수 있습니다. 이러한 모듈 시스템을 사용하여 의존성을 관리하는 방법을 알아보았습니다. 모듈 시스템의 적용에는 고려해야 할 사항이 있지만, 모듈 간의 의존성을 잘 파악하고 필요한 의존성만 선언한다면, 모듈 시스템을 효과적으로 사용할 수 있습니다.