모듈(Module)은 재사용을 목적으로 설계된 패키지들의 컨테이너입니다. 각 모듈에는 모듈 디스크립터(module descriptor)가 포함되어 있으며, 여기에는 모듈 이름, 모듈 의존성(해당 모듈이 의존하는 다른 모듈의 이름), 그리고 이 모듈에 의존하는 모듈만 사용할 수 있도록 내보내는(export) 패키지의 이름과 같은 정보가 담겨 있습니다.
모듈의 주요 장점
1. 강력한 캡슐화(Strong Encapsulation)
강력한 캡슐화는 모듈 시스템이 제공하는 가장 큰 장점 중 하나입니다. 기존 자바에서는 public 접근 제어자가 선언된 요소는 사실상 모든 코드에서 접근 가능했지만, 모듈 시스템을 도입하면 외부 애플리케이션에 공개할 패키지를 선택적으로 제한할 수 있습니다.
2. 경량화와 성능 향상
필요한 모듈만 포함하여 애플리케이션을 경량화(lightweight)할 수 있으므로, 더 많은 종류의 기기에서 실행이 가능해집니다. 애플리케이션이 가벼워진 만큼 전반적인 성능도 함께 향상됩니다.
3. 관심사 분리(Separation of Concerns)
모듈 아키텍처를 활용하면 애플리케이션을 외부에 공개하는 패키지와 외부에 숨기는 패키지로 명확하게 분리할 수 있습니다. 덕분에 관심사 분리 원칙을 훨씬 쉽게 적용하고 유지보수성 높은 구조를 설계할 수 있습니다.
4. 보안 강화
sun.security.*, com.sun.crypto.*처럼 내부 구현에 속한 패키지들은 이제 외부에서 접근할 수 없도록 숨겨집니다. 내부 API에 대한 무분별한 접근이 차단되므로 애플리케이션의 보안 수준이 향상됩니다.
모듈 선언 방법: module-info.java
모듈은 module-info.java라는 이름의 파일 안에서 선언하며, 이 파일이 곧 모듈 디스크립터 역할을 합니다. 아래는 기본적인 모듈 선언 예시입니다.
module com.tutorialspoint.app {
// "com.tutorialspoint.app" 모듈이 의존하는 모듈 선언
requires com.tutorialspoint.services;
// 이 모듈이 외부에 공개하는 패키지 선언
exports com.tutorialspoint.app.util;
}이처럼 Java 9의 모듈 시스템(JPMS, Java Platform Module System)은 캡슐화, 성능, 보안, 아키텍처 설계 측면에서 자바 애플리케이션 개발에 많은 이점을 제공합니다.