자동 모듈(Automatic Module)은 Java 9의 모듈 시스템(JPMS)에서 모듈 경로(module path)에 배치하는 JAR 파일을 의미합니다. 우리가 애플리케이션에서 활용할 수 있는 기존 라이브러리는 매우 많지만, 그중 상당수는 아직 모듈화되어 있지 않습니다. 이러한 라이브러리를 손쉽게 마이그레이션하기 위해, 해당 라이브러리의 JAR 파일을 애플리케이션의 모듈 경로에 추가하기만 하면 됩니다. 그러면 그 안의 패키지를 그대로 사용할 수 있으며, JAR은 암묵적으로 자동 모듈이 되어 모듈 선언문(module-info.java)의 requires 지시어에서 지정할 수 있습니다.
이때 JAR의 파일명이 곧 모듈 이름이 되는데, 이 이름은 requires 지시어에서 사용할 수 있는 유효한 Java 식별자 형태여야 합니다.
자동 모듈의 주요 특징
- 모든 패키지를 암묵적으로 export합니다. 따라서 자동 모듈을 읽을 수 있는(read) 모든 모듈(이름 없는 모듈(unnamed module) 포함)은 자동 모듈 패키지 내부의 public 타입에 접근할 수 있습니다.
- 다른 모든 모듈을 암묵적으로 requires합니다. 여기에는 다른 자동 모듈과 이름 없는 모듈도 포함되므로, 자동 모듈은 시스템상 다른 모듈들이 노출하는 모든 public 타입에 접근할 수 있습니다.
실행 명령어 예시
%JAVA_HOME%\java --module-path ./libs:./libs-legacy --module app/com.app.Main
위 명령어처럼 --module-path 옵션에 일반 모듈 JAR과 레거시 라이브러리 JAR을 함께 지정하면, 레거시 JAR도 자동 모듈로 취급되어 모듈형 애플리케이션에서 문제없이 동작합니다.
자동 모듈 이름 결정 규칙
자동 모듈의 이름은 별도 설정이 없으면 JAR 파일명에서 아래 규칙에 따라 자동으로 도출됩니다.
- 파일 확장자 ".jar"는 제거됩니다.
- 버전 번호는 제거됩니다. 예:
mylib-1.2.3→mylib - 영숫자(alphanumeric)가 아닌 문자(하이픈 등)는 마침표(.)로 대체됩니다.
- 연속으로 반복되는 마침표는 하나로 합쳐지고, 이름의 시작과 끝에 위치한 마침표는 삭제됩니다.
참고로, 파일명 기반의 자동 생성 이름은 리팩토링이나 버전 업데이트 시 변경될 수 있으므로, 안정적인 모듈 이름을 보장하고 싶다면 JAR의 매니페스트(MANIFEST.MF)에 Automatic-Module-Name 속성을 직접 지정하는 방법도 권장됩니다.