모듈(Modules)

모듈(Modules)

Java의 **모듈 시스템(module system)**에 대해 배우는 튜토리얼 모음이에요. Java 9에서 도입된 모듈 시스템은 애플리케이션을 모듈 단위로 쪼개고, 각 모듈이 무엇을 노출하고 무엇을 숨길지 선언적으로 통제하게 해줘요. 여기서는 기초 개념부터 시작해, 모듈을 만들고 빌드하는 방법, 유지보수성과 캡슐화를 높이는 방법까지 차근차근 다룹니다.

출처: dev.java - Modules

본문

이 튜토리얼은 다음 주제들로 이뤄져 있어요. 각 링크를 따라가면 해당 주제의 상세 내용을 배울 수 있어요.

  • Introduction to Modules in Java — 모듈 시스템의 기초를 이해하고, 모듈을 만들고 빌드하는 방법, 유지보수성과 캡슐화를 높이는 방법을 배워요.
  • Reflective Access with Open Modules and Open Packages — open 패키지와 open 모듈을 사용해, 그렇지 않으면 캡슐화돼 있는 패키지에 리플렉션 접근을 허용해요.
  • Optional Dependencies with requires static — 선택적 의존성에 requires static을 사용해요. 이렇게 요구된 모듈은 컴파일 시점에는 접근 가능하지만 실행 시점에는 없을 수 있어요.
  • Implied Readability with requires transitiverequires transitive로 암시적 가독성을 부여해요. 모듈이 다른 모듈에 대한 의존성을 전달해서, 다른 모듈이 명시적으로 의존하지 않고도 읽을 수 있게 해요.
  • Qualified exports and opensexports ... to ...opens ... to ...를 사용해 내보내거나 열린 패키지의 접근 가능성을 특정 모듈로 제한해요.
  • Decoupling Modules with Services — Java의 ServiceLoader API로 서비스 사용자와 제공자를 분리해요. 모듈 선언의 usesprovides 지시어로 모듈 시스템이 일급 개념으로 만드는 기능이죠.
  • Code on the Class Path - the Unnamed Module — 클래스 경로의 모든 JAR(모듈형이든 아니든)는 무명 모듈(unnamed module)의 일부가 돼요. 이렇게 "모든 것이 모듈"이 되면서도 클래스 경로의 혼란은 계속 살아남을 수 있죠.
  • Incremental Modularization with Automatic Modules — 모듈 경로의 일반 JAR는 자동 모듈(automatic module)이 돼요. 모듈형 JAR와 클래스 경로 사이의 다리 역할을 하죠.
  • Building Modules on the Command Linejavac, jar, java 명령을 사용해 모듈형 애플리케이션을 손으로 컴파일·패키징·실행하는 법을 배워요. 빌드 도구가 대부분을 처리해주지만 알아두면 좋아요.
  • Strong Encapsulation (of JDK Internals) — 강한 캡슐화(strong encapsulation)는 모듈 시스템의 초석이에요. 주로 java.* 패키지의 public이 아닌 타입/멤버와 sun.*, com.sun.*의 상당 부분 같은 내부 API의 (우연한) 사용을 막아줘요.
  • Circumventing Strong Encapsulation with --add-exports and --add-opens--add-exports--add-opens 명령줄 플래그로 내부 API에 접근할 수 있어요. JDK의 일부든 의존성이든, 컴파일·실행 시점에 패키지를 내보내거나 실행 중 리플렉션을 위해 열어주죠.
  • Extending the Module Graph with --add-modules and --add-reads--add-modules--add-reads 명령줄 옵션은 모듈 시스템이 생성한 모듈 그래프에 추가 모듈(노드)과 가독성 관계(간선)를 더해줘요.

더 알아보기