Java 9 모듈 시스템과 module-info.java 파일
모듈(module)은 애플리케이션을 구성하는 독립적인 단위로, 하나의 기능을 담당합니다. Java 9에서 도입된 플랫폼 모듈 시스템(JPMS)은 코드를 더 체계적이고 안전하게 관리할 수 있도록 도와줍니다.
모듈은 다음 세 가지 중요한 구성 요소를 포함합니다.
- 이름(Name): 모듈을 고유하게 식별하기 위한 식별자
- 의존성(Dependencies): 현재 모듈이 의존하는 다른 모듈들
- 내보낸 패키지(Exported Packages): 외부 애플리케이션이 사용할 수 있도록 공개된 패키지
module-info.java 파일이란?
모듈을 선언하려면 소스 코드의 루트 디렉터리에 "module-info.java" 파일을 추가해야 합니다. 이 파일에는 name(이름), requires(필요), exports(내보내기), exports to(특정 대상 내보내기) 네 가지 핵심 구성 요소가 포함됩니다.
다음은 module-info.java 파일의 기본 템플릿입니다.
module <module-name> {
requires <module-name1>;
requires <module-name2>;
...
exports <package-name1>;
exports <package-name2>;
...
exports <package-name> to <module-name>;
}각 구성 요소의 역할
name (모듈 이름)
모듈 이름은 모듈의 핵심 특징입니다. 모듈 시스템은 이름으로 모듈을 식별하므로 반드시 고유해야 합니다.
requires (필요한 모듈)
requires 절은 현재 모듈이 의존하는 외부 모듈, 즉 의존성을 정의하는 데 사용됩니다. 의존하는 각 모듈마다 별도의 "requires" 항목을 module-info.java 파일에 작성해야 합니다.
Java 9에는 기본 모듈(base module)이 존재합니다. 이는 다른 어떤 모듈도 필요로 하지 않는 독립적인 모듈로, 별도로 "requires" 절로 지정하지 않아도 됩니다. 기본 모듈은 기본적으로(by default) 사용 가능합니다.
exports (내보내는 패키지)
exports 절은 현재 모듈이 외부로 내보내는 패키지를 정의합니다. 이렇게 지정된 패키지는 다른 모듈이 자유롭게 사용할 수 있습니다. 내보내는 각 패키지에 대해 별도의 "exports" 항목을 작성해야 합니다.
exports to (특정 모듈에만 내보내기)
"exports to" 절은 패키지를 모든 모듈에 공개하는 대신, 특정 모듈에만 한정적으로 내보낼 때 사용합니다. 이를 통해 더 세밀한 접근 제어와 캡슐화가 가능해집니다.