본문으로 건너뛰기
Advertisement

자바 모듈 시스템 (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. 모듈 시스템의 장점

  1. 강력한 캡슐화 (Strong Encapsulation): 내부 API를 숨기고 의도된 API만을 모듈 단위로 외부에 노출할 수 있습니다.
  2. 명확한 의존성 관리 (Reliable Configuration): 각 모듈이 필요로 하는 모듈이 실행 단계 전에 완벽하게 로드될 수 있는지 검사할 수 있습니다.
  3. JRE 다이어트 (Custom Runtime Image): 내 애플리케이션에 진짜로 필요한 자바 표준 모듈들만 묶어서(jlink 사용) 초소형의 독립적인 실행 환경(Custom JRE)을 만들 수 있습니다. Docker와 같은 컨테이너 환경에서 메모리와 용량 관리에 매우 유리합니다.

결론

모듈 시스템은 대규모 라이브러리 개발자나 대규모 엔터프라이즈 시스템 구축에 매우 유리합니다. 일반적인 소규모 웹 프로젝트에서는 Spring Boot 등의 프레임워크가 알아서 관리하는 경우가 많아 직접 모듈을 작성할 일이 적을 수 있지만, 백엔드 플랫폼 생태계를 이해하는 데 필수적인 개념입니다.

Advertisement