Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9 모듈 시스템의 핵심, 모듈 설명자(Module Descriptor) 완벽 정리

모듈(Module)패키지 단위로 구성된 클래스 형태의 코드와 프로퍼티 파일과 같은 정적 리소스를 하나로 묶은 코드 집합입니다. 모듈은 외부 환경에 해당 모듈을 사용하기 위해 필요한 모든 정보를 제공하며, Java 9부터 도입된 모듈 시스템(Platform Module System)의 기본 단위입니다.

모듈 설명자란 무엇인가?

모듈 설명자(Module Descriptor)는 모듈 시스템의 핵심 요소입니다. 모듈 디렉터리 계층 구조의 최상위 루트에 위치한 module-info.java 파일에 작성된 모듈 선언을 컴파일한 결과물로, 모듈의 이름, 의존 관계, 공개 범위 등 모듈의 모든 메타데이터를 담고 있습니다.

모듈은 아래와 같은 모듈 선언을 통해 자기 자신을 기술합니다.

module com.myproject.module1 {
    requires com.myproject.module2;
    exports com.myproject.project1;
    exports com.myproject.project2;
}

모듈 설명자의 주요 지시문

모듈 설명자에서 사용할 수 있는 주요 지시문은 다음과 같습니다.

  • module module.name: module.name이라는 이름의 모듈을 선언합니다.
  • requires module.name: 현재 모듈이 해당 모듈에 의존함을 명시합니다. 이를 통해 대상 모듈에서 export한 public 타입에 접근할 수 있습니다.
  • requires transitive module.name: 이 모듈에 의존하는 다른 모듈들이 자동으로 module.name에도 의존하게 만듭니다. 의존성 전파가 필요할 때 유용합니다.
  • exports pkg.name: pkg.name 패키지의 public 멤버를, 이 모듈을 requires하는 모든 모듈에 공개합니다.
  • exports pkg.name to module.name: 위와 동일하지만, 지정된 특정 모듈만 해당 패키지의 public 멤버를 사용할 수 있도록 접근을 제한합니다.
  • uses class.name: 현재 모듈이 class.name 서비스의 소비자(consumer)임을 선언하여, ServiceLoader를 통한 서비스 검색이 가능하게 합니다.
  • provides class.name with class.name.impl: class.name.impl 클래스를 class.name 서비스의 구현체로 등록합니다.
  • opens pkg.name: 다른 모듈이 리플렉션(reflection)을 통해 pkg.name 패키지의 private 멤버에 접근할 수 있도록 허용합니다.
  • opens pkg.name to module.name: 위와 동일하지만, 지정된 특정 모듈만 리플렉션으로 private 멤버에 접근할 수 있도록 제한합니다.

마무리

모듈 설명자는 캡슐화를 강화하고 명시적인 의존성 관리를 가능하게 하는 Java 9 모듈 시스템의 심장이라 할 수 있습니다. requires, exports, uses, provides, opens 등 각 지시문의 역할을 정확히 이해하면, 더 안전하고 유지보수하기 쉬운 애플리케이션 구조를 설계할 수 있습니다.