PHpullh
학습 라이브러리/Java/모듈 시스템 — module-info.java

JAVA · 디자인패턴

모듈 시스템 — module-info.java

Java 9+의 모듈 시스템(JPMS)으로 강한 캡슐화를 구현합니다. module-info.java에서 공개할 패키지와 의존성을 명시적으로 선언하여 대규모 애플리케이션의 구조를 강화합니다.

디자인패턴고급jpmsmoduleencapsulationjava9architecture

핵심 설명

Java 9+의 모듈 시스템(JPMS)으로 강한 캡슐화를 구현합니다. module-info.java에서 공개할 패키지와 의존성을 명시적으로 선언하여 대규모 애플리케이션의 구조를 강화합니다.

Java code

// module-info.java (모듈 정의)
module com.example.app {
    // 의존성 선언
    requires java.sql;
    requires java.logging;
    requires transitive com.example.core; // 전이적 의존성

    // 공개 패키지
    exports com.example.app.api;
    exports com.example.app.model;

    // 특정 모듈에만 공개 (리플렉션 포함)
    opens com.example.app.internal to com.example.framework;

    // 서비스 제공 & 소비
    uses com.example.app.spi.Plugin;
    provides com.example.app.spi.Plugin
        with com.example.app.plugins.DefaultPlugin;
}

// === 사용 예 ===
// com.example.app.api 패키지 (exports됨 — 외부 접근 가능)
package com.example.app.api;

public class UserService {
    public record User(long id, String name, String email) {}

    public User findById(long id) {
        // internal 패키지는 외부에서 접근 불가
        return new User(id, "홍길동", "hong@example.com");
    }
}

학습 팁

requires transitive는 이 모듈을 사용하는 모듈도 해당 의존성을 자동으로 읽을 수 있게 합니다. opens는 리플렉션(Spring, Hibernate 등)을 위해 런타임에만 패키지를 개방합니다.

주의할 점

exports하지 않은 패키지는 다른 모듈에서 컴파일 타임에 접근할 수 없습니다. 기존 라이브러리가 모듈화되지 않은 경우 자동 모듈(automatic module)로 사용할 수 있지만, 이름 충돌에 주의하세요.

자주 묻는 질문

모듈 시스템 — module-info.java란 무엇인가요?

Java 9+의 모듈 시스템(JPMS)으로 강한 캡슐화를 구현합니다. module-info.java 에서 공개할 패키지와 의존성을 명시적으로 선언하여 대규모 애플리케이션의 구조를 강화합니다.

모듈 시스템 — module-info.java 학습 시 주의할 점은 무엇인가요?

exports 하지 않은 패키지는 다른 모듈에서 컴파일 타임에 접근할 수 없습니다. 기존 라이브러리가 모듈화되지 않은 경우 자동 모듈(automatic module)로 사용할 수 있지만, 이름 충돌에 주의하세요.