모듈 시스템(Module System)은 Java 9에서 새롭게 도입된 핵심 기능입니다. 모듈이란 패키지들의 집합을 의미하며, 크게 두 가지로 나뉩니다. 바로 내보내진 패키지(Exported Packages)와 숨겨진 패키지(Concealed Packages)입니다.
내보내진 패키지와 숨겨진 패키지
내보내진 패키지는 해당 모듈 외부에서도 자유롭게 사용할 수 있는 패키지입니다. 반면 숨겨진 패키지는 모듈 외부에서 접근할 수 없으며, 오직 해당 모듈 내부의 코드만 이 패키지들을 사용할 수 있습니다. 이러한 캡슐화를 통해 개발자는 라이브러리의 내부 구현을 안전하게 보호할 수 있습니다.
Java 9의 네 가지 모듈 유형
Java 9에는 다음과 같은 네 가지 유형의 모듈이 존재합니다.
1. 애플리케이션 모듈(Application Modules)
특정 기능을 구현하기 위해 만들어지는 모듈입니다. 모든 서드파티(third-party) 의존성이 이 범주에 속합니다. 개발자가 직접 작성한 module-info.java 파일을 포함하는 일반적인 애플리케이션 모듈이라고 이해할 수 있습니다.
2. 자동 모듈(Automated Modules)
모듈 디스크립터(module-info.class) 없이도 모듈 경로에 배치할 수 있는 JAR 파일들이 여기에 해당합니다. 이 모듈의 가장 큰 장점은 Java 9 이전에 빌드된 기존 JAR 파일을 그대로 활용할 수 있다는 점입니다. 덕분에 기존 라이브러리를 손쉽게 모듈 시스템으로 마이그레이션할 수 있습니다.
3. 이름 없는 모듈(Unnamed Modules)
클래스패스(classpath)에 존재하는 모든 JAR 또는 클래스는 이름 없는 모듈에 속합니다. 이름이 없기 때문에 다른 모든 모듈을 읽고(read), 모든 패키지를 내보낼(export) 수 있습니다. 이는 하위 호환성을 보장하기 위한 설계로, 기존 방식대로 클래스패스를 사용하는 애플리케이션이 Java 9 이상에서도 정상적으로 동작하도록 돕습니다.
4. 플랫폼 모듈(Platform Modules)
JDK 자체가 모듈화된 구조로 전환되었는데, 이렇게 재구성된 JDK의 각 모듈들을 플랫폼 모듈이라고 부릅니다. 예를 들어 java.base, java.sql, java.xml 등이 대표적인 플랫폼 모듈입니다. 필요한 모듈만 선택적으로 사용함으로써 더 작고 효율적인 런타임 환경을 구성할 수 있습니다.
모듈 선언 예시
모듈은 module-info.java 파일에서 다음과 같은 형식으로 선언합니다.
module <모듈-이름> {
requires 모듈명; // 의존하는 모듈 지정
exports 패키지명; // 외부에 공개할 패키지 지정
}requires 키워드는 해당 모듈이 의존하는 다른 모듈을 명시하고, exports 키워드는 모듈 외부로 공개할 패키지를 지정합니다. 이처럼 Java 9의 모듈 시스템은 명시적인 의존성 관리와 강력한 캡슐화를 제공하여, 대규모 애플리케이션의 구조를 더욱 견고하고 관리하기 쉽게 만들어 줍니다.