[java] 자바 모듈 시스템

자바 9부터 도입된 자바 모듈 시스템은 애플리케이션을 더 작고 모듈화된 형태로 개발할 수 있는 기능을 제공합니다. 이 기능은 기존의 JAR 파일에 비해 더욱 체계적이고 유연한 코드 구성을 가능하게 합니다.

모듈 정의하기

자바 모듈 시스템에서는 모듈을 정의하기 위해 module-info.java라는 특별한 파일을 사용합니다. 이 파일은 각 모듈의 루트 디렉토리에 위치하며, 모듈의 이름과 의존 관계, 내보내는 패키지 등을 명시합니다.

module com.example.myapp {
    requires java.base;
    requires com.example.library;
    exports com.example.myapp;
}

위의 코드에서는 com.example.myapp이라는 이름의 모듈을 정의하고 있습니다. requires 키워드를 사용하여 다른 모듈에 대한 의존 관계를 명시하고, exports 키워드를 사용하여 외부로 공개되는 패키지를 정의합니다.

모듈 간 의존 관계 관리하기

자바 모듈 시스템에서는 모듈 간의 의존 관계를 명시적으로 정의하여 의존성을 관리할 수 있습니다. 이를 통해 필요한 모듈만을 가져와서 애플리케이션을 구성할 수 있습니다.

module com.example.myapp {
    requires java.base;
    requires com.example.library;
    exports com.example.myapp;
}

위의 코드에서는 com.example.myapp 모듈이 java.base와 com.example.library 모듈에 의존해야 함을 명시하고 있습니다. 이와 같은 선언을 통해 필요한 모듈만을 가져와서 컴파일과 실행 시에 정확한 의존성을 갖도록 할 수 있습니다.

모듈 경로와 클래스 경로

자바 모듈 시스템에서는 모듈들이 별도의 모듈 경로(module path)에 위치하게 됩니다. 모듈 경로는 클래스 경로(classpath)와 구분되며, 각 모듈은 자체적인 의존성을 관리하고 다른 모듈과 격리됩니다.

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

위의 예시에서는 mymodules 디렉토리에 있는 모듈들을 모듈 경로로 지정하고, com.example.myapp 모듈의 메인 클래스를 실행하는 명령어입니다. 자바 모듈 시스템은 이를 통해 각 모듈과 그들의 의존성을 명확하게 구분합니다.

결론

자바 모듈 시스템은 애플리케이션의 모듈화를 위한 강력하고 유연한 기능을 제공합니다. 모듈의 정의와 의존 관계 관리, 모듈 경로와 클래스 경로의 구분 등을 통해 자바 개발자들은 더 효율적이고 견고한 애플리케이션을 개발할 수 있게 되었습니다.

참고 자료