자바 모듈 시스템 (Java Module System)
자바 9부터 Jigsaw(직소) 프로젝트의 결과물로 모듈 시스템(Module System) 이 도입되었습니다. 모듈 시스템은 기존의 패키지와 JAR 파일 기반의 구조를 넘어서, 애플리케이션을 더 작고 안전하게 구성할 수 있도록 해줍니다.
1. 모듈 시스템이 도입된 이유
이전의 자바에서는 public으로 선언된 클래스는 JAR 파일 안의 어떤 경로에서든, 심지어 외부의 다른 JAR에서도 접근할 수 있었습니다. 이는 거대한 시스템에서 의존성 관리와 보안 문제를 야기했습니다. (JAR 지옥 - JAR Hell)
또한, JRE(Java Runtime Environment) 자체가 너무 크고 무거워 IoT 기기나 작은 시스템에 배포하기 적합하지 않았습니다.
이를 해결하기 위해 자바 모듈 시스템은 패키지들을 묶는 한 단계 더 높은 개념인 모듈(Module) 을 제공합니다.
2. 모듈(Module)이란?
모듈은 패키지들의 컨테이너입니다. 하나의 모듈 내에는 관련된 패키지들이 모여 있으며, 외부에 어떤 패키지를 공개할지(Export), 자기가 동작하기 위해 어떤 외부 모듈 파일이 필요한지(Require)를 명확하게 선언할 수 있습니다.
3. module-info.java 파일
모듈을 정의하려면 프로젝트의 최상위 루트 디렉토리에 module-info.java 파일을 생성하고 모듈 정보를 작성해야 합니다.
// module-info.java 파일의 예시
module com.myapp.core {
// 1. 다른 모듈에게 노출할 패키지 지정 (기본적으로 모두 숨김 처리됨)
exports com.myapp.core.utils;
exports com.myapp.core.services;
// 2. 이 모듈이 의존하는 다른 모듈들 명시
requires java.sql; // 자바의 Database 관련 표준 모듈
requires java.logging; // 로깅 모듈
// 3. 특정 인터페이스를 구현한 클래스를 외부에 제공(SPI 체제)
provides com.myapp.core.spi.MyService with com.myapp.core.impl.MyServiceImpl;
}
접근 제어의 변화
모듈 시스템이 적용되면, 비록 클래스가 public으로 선언되었다 하더라도, 해당 클래스가 속한 패키지가 module-info.java에서 exports 되지 않았다면 외부 모듈에서는 절대 접근할 수 없습니다. 핵심 내부 로직을 완벽하게 은닉할 수 있게 된 것입니다.
4. 모듈 시스템의 장점
- 강력한 캡슐화 (Strong Encapsulation): 내부 API를 숨기고 의도된 API만을 모듈 단위로 외부에 노출할 수 있습니다.
- 명확한 의존성 관리 (Reliable Configuration): 각 모듈이 필요로 하는 모듈이 실행 단계 전에 완벽하게 로드될 수 있는지 검사할 수 있습니다.
- JRE 다이어트 (Custom Runtime Image): 내 애플리케이션에 진짜로 필요한 자바 표준 모듈들만 묶어서(jlink 사용) 초소형의 독립적인 실행 환경(Custom JRE)을 만들 수 있습니다. Docker와 같은 컨테이너 환경에서 메모리와 용량 관리에 매우 유리합니다.
결론
모듈 시스템은 대규모 라이브러리 개발자나 대규모 엔터프라이즈 시스템 구축에 매우 유리합니다. 일반적인 소규모 웹 프로젝트에서는 Spring Boot 등의 프레임워크가 알아서 관리하는 경우가 많아 직접 모듈을 작성할 일이 적을 수 있지만, 백엔드 플랫폼 생태계를 이해하는 데 필수적인 개념입니다.