모듈(Modules)
모듈(Modules)
Java의 **모듈 시스템(module system)**에 대해 배우는 튜토리얼 모음이에요. Java 9에서 도입된 모듈 시스템은 애플리케이션을 모듈 단위로 쪼개고, 각 모듈이 무엇을 노출하고 무엇을 숨길지 선언적으로 통제하게 해줘요. 여기서는 기초 개념부터 시작해, 모듈을 만들고 빌드하는 방법, 유지보수성과 캡슐화를 높이는 방법까지 차근차근 다룹니다.
본문
이 튜토리얼은 다음 주제들로 이뤄져 있어요. 각 링크를 따라가면 해당 주제의 상세 내용을 배울 수 있어요.
- 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 transitive —
requires transitive로 암시적 가독성을 부여해요. 모듈이 다른 모듈에 대한 의존성을 전달해서, 다른 모듈이 명시적으로 의존하지 않고도 읽을 수 있게 해요. - Qualified exports and opens —
exports ... to ...와opens ... to ...를 사용해 내보내거나 열린 패키지의 접근 가능성을 특정 모듈로 제한해요. - Decoupling Modules with Services — Java의
ServiceLoaderAPI로 서비스 사용자와 제공자를 분리해요. 모듈 선언의uses와provides지시어로 모듈 시스템이 일급 개념으로 만드는 기능이죠. - 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 Line —
javac,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명령줄 옵션은 모듈 시스템이 생성한 모듈 그래프에 추가 모듈(노드)과 가독성 관계(간선)를 더해줘요.