14. 자바 모듈 시스템

주요내용
  • 자바 모듈 시스템을 설계한 이유
  • 주요 구조: 모듈 declarations, requires, exports 지시어
  • 기존 자바 아카이브(JAR)에 적용되는 자동 모듈
  • 모듈화와 JDK 라이브러리
  • 모듈과 메이븐 빌드
  • 주요 구조외 모듈 지시어 간단 요약

자바 모듈 시스템을 설계한 이유#

  • 패키지와 JAR 수준에서 캡슐화를 거의 지원하지 않음
  • 클래스 경로의 한계
    • 클래스 경로에 같은 클래스를 구분하는 버전 개념이 없음
    • 명시적 의존성 지원 X (다른 JAR의 클래스를 사용하라고 명시적으로 지정할 수 없음)

자바 모듈 시스템#

패키징 명령어 정리
# 컴파일
javac module-info.java com/example/expenses/application/ExpensesApplication.java -d target
# jar 패키징 (마지막 . 하나 때문에 1시간 반 삽질...)
jar cvfe expenses-application.jar com.example.expenses.application.ExpensesApplication -C target .
# 실행
java --module-path expenses-application.jar \
--module expenses.application/com.example.expenses.application.ExpensesApplication
  • 실행 옵션
    • --module-path: 어떤 모듈을 로드할 지 지정
    • --module: 실행할 메인 모듈과 클래스 지정

exports#

module-info.java
module expenses.readers {
exports com.example.expenses.readers;
exports com.example.expenses.readers.file;
exports com.example.expenses.readers.http;
}
  • 기본적으로 모듈 내의 모든 것은 캡슐화 됨
  • 화이트 리스트 기반, 명시적으로 공개할 것을 exports 로 지정해주어야 함

requires#

module-info.java
module expenses.readers {
requires java.base; // 실제로는 필요 없음
...
}
  • requires를 통해 해당 모듈에 필요한 모듈을 명시할 수 있음

컨벤션#

도메인의 역순으로 모듈(패키지)를 구성하는 것이 권장 모듈 이름 컨벤션

자동 모듈#

외부 의존성을 추가할 때, 불러오는 JAR 는 자바 모듈 기능을 사용하고 있지 않더라도 자동 모듈이라는 형태로 적절하게 변환되어 사용 함

예제#

https://github.com/DaehunGwak/study-java/tree/main/modernjava-module-2/expenses

Last updated on