Java/일반

Java Module

창욱씨 2020. 9. 7. 22:41

Moudle이 등장하게 된 배경

Java는 public, private와 같은 클래스 수준의 한정자가 있습니다. 그러나 이 한정자들은 클래스까지만 유효하고 패키지를 넘어서면 힘을 잃어버리게 됩니다. 이러한 캡슐화에 대한 지원 부족으로 인해 Java Module이 등장했습니다.

예를 들어, 우리는 JAR로 제공된 패키지의 클래스를 보면 어느 클래스를 써야할 지 알 수 가 없습니다. 대부분의 클래스가 public이고 접근이 가능합니다. 그 안에는 API 설계자가 내부 구현을 위해 만든 내부용 API 문서도 있습니다. 기존에는 내부용 API에 접근이 가능합니다. JAR로 제공되고 문서화가 잘 되더라도 클래스와 메소드가 public이면 API 설계자가 의도하지 않은 호출이 발생할 수 있습니다.

Module이란

Module은 module-info.java라는 파일에 아래의 세 가지 질문에 대한 답을 선언하는 소프트웨어적인 단위입니다.

  • 이름이 무엇인가? (name)
  • 어떤 것을 제공하는가? (export)
  • 어떤 것들이 필요한가? (require)

Module에는 이름이 있습니다. 그리고 이름은 충돌을 피하기 위해 패키지 명명 규칙과 유사해야 합니다. 그리고 Module은 다른 외부 Module에서 사용할 수 있도록 공개 API로 간주되는 모든 패키지 목록을 제공합니다. 만약 어떤 클래스가 public이라 할지라도 export된 패키지에 없으면 모듈 외부의 어떤 것도 이 클래스에 접근할 수 없습니다. 모듈의 사용 예시는 아래와 같습니다.

module de.codecentric.addresschecker {
    exports de.codecentric.addresschecker.api;
    required de.codecentric.zipvalidator;
}

Module 사용시 유의할 점

  • Export하지 않은 타입 사용
  • 순환 참조
  • 묵시적인 접근

특정 모듈에 대한 접근(읽기) 제한

Java Module은 특졍 모듈에만 public을 지정할 수 있는 정교한 접근성 레벨을 지원합니다. 이 경우, 우리는 export된 패키지를 익을 수 있는 모듈을 제한할 수 있습니다.

module de.codecentric.zipvalidator {
    exports de.codecentric.zipvalidator.api
    to de.codecentric.addresschecker;
}

위와 같이 선언하면 addresschecker만 zipvalidator API를 액세스 할 수 있습니다. 하지만 접근 제한은 패키지 수준에서 이루어지기 때문에 일부 패키지의 액세스를 완벽하게 제한할 수 있지만, 제한하지 않는 다른 패키지는 모든 권한을 허용합니다.

728x90