코딩하는 둥둥

Module과 module-info.java (Java 11버전~) 본문

Backend/Java

Module과 module-info.java (Java 11버전~)

둥둥 2022. 3. 25. 18:10
728x90

백준 스터디를 하기 위해 이클립스에서 새로운 프로젝트를 만들었는데 이전에 java8을 이용했을 때와 java11을 이용해서 프로젝트를 만들었더니 module-info.java 가 생겼다 

궁금증을 해결하기 위해 찾아보고 기록한다.


Module이란?

- 기능상 성격이 비슷한, 연관성 있는 부분들이 모여있는 덩어리

- 외부에서 재사용할 수 있는 패키지들을 묶은 것


Java Modules이란?

Java 모듈은 JPMS( Java Platform Module System )를 통한 Java9의 새로운 기능으로 Java 애플리케이션 또는 Java API를 별도의 Java 모듈로 패키징 할 수 있는 패키징 메커니즘이다.

(읽는 위치에 따라 Java Jigsaw 또는 Project Jigsaw라고도 한다.)

Java 모듈은 모듈식 JAR 파일로 패키지 되고, Java 모듈은 작업을 수행하는 데 필요한 다른 Java 모듈도 지정해야 한다. 

JAR 파일을 가져와서 module-info.class파일(파일에서 컴파일 module-info.java)에 넣으면 명명된 모듈이 된다.


Java Modules의 이점
  • 모듈식 Java 플랫폼을 통한 더 작은 애플리케이션 배포 가능
더보기

Project Jigsaw의 일부로 모든 Java 플랫폼 API는 별도의 모듈로 분할되었습니다. 모든 Java API를 모듈로 분할하는 이점은 이제 애플리케이션에 필요한 Java 플랫폼의 모듈을 지정할 수 있다는 것입니다. 애플리케이션에 필요한 Java 플랫폼 모듈이 무엇인지 알면 Java는 애플리케이션이 실제로 사용하는 Java 플랫폼 모듈만 포함하여 애플리케이션을 패키지화할 수 있습니다.

Java 9 및 Java Platform Module System 이전에는 Java 응용 프로그램이 사용하는 클래스를 안정적으로 확인할 수 있는 공식적인 방법이 없었기 때문에 모든 Java 플랫폼 API를 Java 응용 프로그램과 함께 패키징해야 했습니다. Java 플랫폼 API가 수년에 걸쳐 상당히 커졌기 때문에 애플리케이션은 배포에 포함된 많은 양의 Java 클래스를 갖게 되며, 그중 대부분은 애플리케이션에서 사용하지 않을 것입니다.

사용하지 않는 클래스는 애플리케이션을 필요한 것보다 더 크게 배포할 수 있게 합니다. 이것은 휴대폰, Raspberry Pis 등과 같은 소형 장치에서 문제가 될 수 있습니다. Java 플랫폼 모듈 시스템을 사용하면 이제 응용 프로그램이 실제로 사용하는 Java 플랫폼 API의 모듈만으로 응용 프로그램을 패키징 할 수 있습니다. 이렇게 하면 배포 가능한 응용 프로그램의 크기가 작아집니다.

 

  • 내부 패키지의 캡슐화
더보기

Java 모듈은 모듈 내부의 어떤 Java 패키지가 모듈을 사용하여 다른 Java 모듈로 내보내질(가시)야 하는지 명시적으로 알려야 합니다. Java 모듈은 내보내지지 않는 Java 패키지를 포함할 수 있습니다. 내보내지 않은 패키지의 클래스는 다른 Java 모듈에서 사용할 수 없습니다. 이러한 패키지는 패키지를 포함하는 Java 모듈에서 내부적으로만 사용할 수 있습니다.

내보내지 않은 패키지는 숨겨진 패키지 또는 캡슐화된 패키지라고도 합니다.

 

  • 누락된 모듈의 시작 감지
더보기

Java 9 이상부터는 Java 애플리케이션도 Java 모듈로 패키징해야 합니다. 따라서 응용 프로그램 모듈은 사용하는 다른 모듈(Java API 모듈 또는 타사 모듈)을 지정합니다. 따라서 Java VM은 Java VM이 시작될 때 애플리케이션 모듈에서 이후부터 전체 모듈 종속성 그래프를 확인할 수 있습니다. 시작 시 필요한 모듈이 없으면 Java VM이 누락된 모듈을 보고하고 종료됩니다.

Java 9 이전에는 애플리케이션이 실제로 누락된 클래스를 사용하려고 시도할 때까지 누락된 클래스(예: 누락된 JAR 파일에서)가 감지되지 않았습니다. 이것은 애플리케이션이 누락된 클래스를 사용하려고 시도한 시기에 따라 런타임에 언젠가 발생합니다.

애플리케이션 시작 시 누락된 모듈을 보고하는 것은 누락된 모듈/JAR/클래스를 사용하려고 할 때 런타임에 비해 큰 이점입니다.


module-info.java란?

모듈 기술자.

해당 모듈의 이름이 무엇인지, 어떤 모듈에 의존하고 있는지, 해당 모듈을 어떻게 외부에서 사용할 수 있는지에 대해 알 수 있다. 


여러 구글링의 결과 java9부터 변경된 모듈 사용이기 때문에 참고할 만한 정보가 적고 초보일 경우 아예 생성하지 않는 것을 추천한다고 한다.

따라서 새로운 프로젝트를 만들어 TIL을 진행하기로 결정했다.

새로운 프로젝트 생성시 Create module-info.java file의 체크를 해제하고 만들었다.


참고 링크 >>

1. http://tutorials.jenkov.com/java/modules.html

2. https://www.jrebel.com/blog/java-9-modules-cheat-sheet#what-is-a-java-module

3. https://daily-life-of-bsh.tistory.com/129

728x90