Java 9에 도입된 모듈 시스템(Java Module System)은 Java 플랫폼의 구조를 근본적으로 변화시키는 주요 기능입니다. 과거에는 Java Runtime Environment(JRE)가 모노리식 구조로 되어 있어 필요한 모든 코드를 포함하고 있었지만, 모듈 시스템을 통해 필요한 부분만 포함할 수 있게 되었습니다. 이를 통해 애플리케이션의 크기를 줄이고, 보안과 유지 보수성을 향상시킬 수 있습니다.
2017년에 출시되었으며, 많은 새로운 기능을 도입했지만, 그 중에서도 가장 주목받는 기능은 바로 “모듈 시스템”(JPMS, Java Platform Module System)입니다. 이 모듈 시스템은 자바 애플리케이션을 더 작고, 관리하기 쉬운 부분으로 나누는 것을 가능하게 하여, 대규모 시스템의 복잡성을 줄여줍니다.
Java 9 모듈 시스템의 주요 특징
- 모듈화: 자바 코드를 모듈 단위로 분할하여 각각이 자신의 의존성을 선언하고, 제공하는 API를 명시적으로 표시합니다.
- 캡슐화 향상: 모듈은 자신이 공개하고자 하는 API만을 선택적으로 공개할 수 있으며, 내부 구현은 숨길 수 있습니다.
- 의존성 관리: 모듈 시스템은 모듈 간의 의존성을 명확하게 정의하고, 불필요한 의존성을 제거하여 애플리케이션의 시작 시간과 성능을 개선합니다.
모듈 시스템의 기본 구성요소
- 모듈:
module-info.java
파일에 선언된, 관련된 패키지와 리소스의 묶음입니다. - exports: 모듈이 다른 모듈에 공개하고자 하는 패키지를 선언합니다.
- requires: 모듈이 의존하는 다른 모듈을 선언합니다.
모듈 개념
모듈은 Java 플랫폼의 기본 구성 단위입니다. 각 모듈은 패키지, 클래스, 리소스 등의 그룹으로 구성되며, 명확히 정의된 경계와 의존성을 가지고 있습니다. 모듈은 module-info.java
파일을 통해 선언되며, 여기에는 모듈 이름, 의존성, 내보내는 패키지 등의 정보가 포함됩니다.
1
2
3
4
5
|
// module-info.java
module com.example.mymodule {
requires java.logging;
exports com.example.mymodule.api;
}
|
cs |
모듈 의존성
모듈은 다른 모듈에 대한 의존성을 명시적으로 선언해야 합니다. 이를 통해 불필요한 코드를 포함하지 않게 되며, 보안 문제도 해결할 수 있습니다. 예를 들어, java.logging
모듈이 필요하다면 위와 같이 requires
키워드를 사용하여 선언할 수 있습니다.
패키지 내보내기
모듈은 다른 모듈이 사용할 수 있는 패키지를 명시적으로 내보내야 합니다. exports
키워드를 사용하여 내보낼 패키지를 지정할 수 있습니다. 내보내지 않은 패키지는 해당 모듈 내부에서만 사용 가능합니다.
모듈 경로와 모듈 레이어
Java 9부터는 모듈 경로(module path)라는 개념이 도입되었습니다. 모듈 경로는 애플리케이션이 실행될 때 참조할 모듈들의 위치를 지정합니다. 또한, 모듈은 레이어(layer)라는 개념으로 구성될 수 있습니다. 레이어는 모듈의 그룹으로, 계층적 구조를 가지고 있습니다. 이를 통해 모듈 간의 의존성 관리와 버전 관리를 더욱 효율적으로 할 수 있습니다.
Java 9의 모듈 시스템은 Java 플랫폼의 구조를 모듈화하여 더욱 유연하고 효율적으로 만들었습니다. 모듈 시스템을 활용하면 애플리케이션의 크기를 최적화하고, 의존성 관리와 보안 문제를 해결할 수 있습니다. 또한, 모듈 시스템은 Java 플랫폼의 미래 발전을 위한 기반이 되었습니다.