모듈 시스템

AI
qwen-3-235b-a22b-instruct-2507
작성자
익명
작성일
2025.09.26
조회수
19
버전
v1

모듈 시스템

Java 모듈 시스은 Java 9JDK 9)에서 도입된 중요한 기능으로, Java Platform System(JPMS)이라고도 불립니다. 이 시스템은규모 애플리이션의 구조를 보다 명확하게 하고, 코드의 유지보수성과 보안성을 향상시키기 위해 설계되었습니다. 기존의 패키지 기반 접근 방식에서 벗어나, 모듈**(module)이라는 더 높은 수준의 캡슐화 단위를 도입함으로써, 어떤 코드가 어디에서 사용될 수 있는지를 명시적으로 제어할 수 있게 되었습니다.

모듈 시스템은 자바 생태계의 "모듈화"를 촉진하며, 특히 대규모 애플리케이션과 라이브러리 개발에서 의존성 관리, 캡슐화 강화, 런타임 성능 최적화에 기여합니다.


모듈 시스템의 필요성

자바는 오랜 기간 동안 패키지(package)를 기본적인 코드 구성 단위로 사용해 왔습니다. 하지만 패키지는 다음과 같은 한계를 가졌습니다:

  • 캡슐화의 부족: public이 아닌 클래스도 동일한 패키지 내에서 접근 가능했지만, 패키지 간 접근 제어는 제한적이었음.
  • 의존성 명시의 어려움: 어떤 라이브러리가 어떤 다른 라이브러리에 의존하는지 명확히 드러내기 어려움.
  • JAR 헬(JAR Hell): 버전 충돌, 중복된 클래스 로딩 등의 문제 발생 가능.
  • 대규모 시스템 관리의 어려움: 수천 개의 클래스가 포함된 애플리케이션에서 의존성 트리 파악이 어려움.

이러한 문제들을 해결하기 위해 Java 9에서 모듈 시스템이 도입되었습니다.


모듈의 정의와 구조

모듈은 하나 이상의 패키지를 포함하는 자기 설명형(self-describing) 코드 단위입니다. 각 모듈은 [module-info.java](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EB%AA%A8%EB%93%88%20%EA%B5%AC%EC%84%B1/module-info.java)라는 특별한 소스 파일로 정의되며, 이 파일에는 모듈의 이름, 어떤 모듈을 의존하는지([requires](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EC%9D%98%EC%A1%B4%EC%84%B1%20%EA%B4%80%EB%A6%AC/requires)), 어떤 패키지를 외부에 공개하는지([exports](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EC%BA%A1%EC%8A%90%ED%99%94/exports)) 등의 정보가 명시됩니다.

module-info.java 예시

module com.example.mymodule {
    requires java.base;
    requires java.logging;
    requires com.example.library;

    exports com.example.mymodule.api;
    opens com.example.mymodule.config to com.example.framework;
}

  • requires: 이 모듈이 의존하는 다른 모듈을 선언합니다.
  • exports: 특정 패키지를 다른 모듈이 사용할 수 있도록 공개합니다.
  • [opens](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EB%A6%AC%ED%94%8C%EB%A0%89%EC%85%98%20%EC%A0%9C%EC%96%B4/opens): 리플렉션을 통해 패키지 내 클래스에 접근할 수 있도록 허용합니다 (특정 모듈에 한정 가능).

주요 특징

1. 강력한 캡슐화

모듈은 기본적으로 모든 패키지를 비공개로 간주하며, exports를 통해 명시적으로 공개한 패키지만 외부에서 접근할 수 있습니다. 이는 내부 구현을 숨기고, API 계약을 명확히 함으로써 정보 은닉(information hiding)을 강화합니다.

예: com.example.internal 패키지를 exports하지 않으면, 다른 모듈은 해당 패키지의 public 클래스도 사용할 수 없습니다.

2. 명시적 의존성 관리

모듈은 requires 키워드를 통해 필요한 다른 모듈을 명시적으로 선언합니다. 런타임 시 JVM은 이러한 의존성을 기반으로 모듈 그래프를 구성하고, 의존성 충족 여부를 검사합니다.

  • 컴파일 시점런타임 시점 모두에서 의존성 검사가 이루어져 오류를 조기에 탐지할 수 있습니다.

3. 모듈 경로 (Module Path)

기존의 클래스 경로(--class-path)와 달리, 모듈 시스템은 모듈 경로(--module-path)를 사용하여 모듈을 로드합니다. 이는 모듈 간 의존성 관계를 더 정확하게 추적할 수 있게 해줍니다.

  • 클래스 경로는 모듈 시스템과 충돌할 수 있으므로, 모듈 기반 애플리케이션에서는 피하는 것이 좋습니다.

JDK 내장 모듈

Java 9부터 JDK 자체가 모듈화되었습니다. 예를 들어:

  • java.base: 기본 자바 라이브러리 (모든 모듈이 자동으로 의존)
  • java.logging: 로깅 기능 제공
  • java.sql: JDBC 관련 클래스 포함
  • java.desktop: GUI 관련 클래스

이러한 모듈들은 [jlink](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EB%9F%B0%ED%83%80%EC%9E%84%20%EC%B5%9C%EC%A0%81%ED%99%94/jlink) 도구를 사용해 최소한의 런타임 이미지를 생성할 때 유용합니다.


모듈 시스템 활용 사례

1. 마이크로서비스 아키텍처

각 마이크로서비스를 별도의 모듈로 구성하면, 의존성과 인터페이스를 명확히 정의할 수 있어 유지보수성이 향상됩니다.

2. 라이브러리 개발

라이브러리 제작자는 내부 구현을 숨기고, 안정적인 API만 공개함으로써 클라이언트 코드의 안정성을 보장할 수 있습니다.

3. 자바 런타임 최적화

jlink 도구를 사용하면, 애플리케이션에서 실제로 사용하는 모듈만 포함한 커스텀 런타임 이미지를 생성할 수 있습니다. 이는 배포 크기를 줄이고, 시작 속도를 향상시킵니다.

jlink --module-path $JAVA_HOME/jmods:myapp.jar \
      --add-modules com.example.mymodule \
      --output myruntime


참고 자료 및 관련 문서

  • Oracle 공식 문서: Java Platform Module System
  • JSR 376: Java Platform Module System
  • [jdeps](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EC%9D%98%EC%A1%B4%EC%84%B1%20%EB%B6%84%EC%84%9D/jdeps) 도구: 모듈 의존성 분석
  • [jmod](/doc/%EA%B8%B0%EC%88%A0/%EC%86%8C%ED%94%84%ED%8A%B8%EC%9B%A8%EC%96%B4%20%EA%B0%9C%EB%B0%9C/%EB%AA%A8%EB%93%88%20%ED%8C%A8%ED%82%A4%EC%A7%95/jmod) 도구: 모듈 파일 생성
  • jlink: 커스텀 JRE 생성 도구

결론

Java 모듈 시스템은 자바 언어의 진화에서 중요한 전환점입니다. 대규모 시스템의 복잡성을 관리하고, 보안과 성능을 향상시키는 데 기여하며, 자바를 더 현대적인 플랫폼으로 만드는 데 핵심적인 역할을 하고 있습니다. 특히 기업용 애플리케이션과 라이브러리 개발에서는 모듈 시스템의 도입이 점점 더 중요해지고 있습니다.

AI 생성 콘텐츠 안내

이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.

주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.

이 AI 생성 콘텐츠가 도움이 되었나요?