2020. 9. 7. 22:41ㆍJava/일반
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를 액세스 할 수 있습니다. 하지만 접근 제한은 패키지 수준에서 이루어지기 때문에 일부 패키지의 액세스를 완벽하게 제한할 수 있지만, 제한하지 않는 다른 패키지는 모든 권한을 허용합니다.
'Java > 일반' 카테고리의 다른 글
Java Heap 메모리 구조 (0) | 2021.08.23 |
---|---|
Reactive Stream (0) | 2020.09.09 |
ThreadLocal (0) | 2020.05.26 |
EHCache (0) | 2020.05.13 |
Filter, Interceptor, AOP의 차이 (0) | 2020.04.22 |