Java/일반

Java Module

창욱씨 2020. 9. 7. 22:41
반응형

1. Java Module이란?

  • Java 9에서 도입된 JPMS (Java Platform Module System)
  • 패키지들의 집합을 하나의 단위로 묶어 캡슐화 + 의존성을 명시적으로 관리
  • module-info.java 파일로 공개 범위(exports)와 의존성(requires)을 선언

2. Library vs Module

Library Module
캡슐화 public이면 누구나 접근 가능 exports 해야만 외부 접근 가능
의존성 build tool에서 암묵적 관리 코드 레벨에서 명시적 강제
배포 JDK 전체 포함 jlink로 필요한 모듈만 경량 배포 가능

Library는 코드 재사용의 단위, Module은 캡슐화 + 의존성까지 포함한 아키텍처 단위


3. 왜 Spring 생태계는 아직도 Library를 쓰나?

근본 원인 → Spring과 JPMS의 철학적 충돌

철학
JPMS 명시적으로 허용한 것만 접근 가능 (화이트리스트)
Spring 런타임에 Reflection으로 클래스/필드/메서드를 동적 탐색 (블랙리스트)
  • Spring의 DI 컨테이너는 Reflection 기반 → 모든 것이 열려 있어야 동작
  • JPMS로 캡슐화하면 Spring이 접근할 수 없어 DI 자체가 불가능
  • Spring이 JPMS를 지원하려면 DI 구조 자체를 재설계해야 함 → 사실상 Spring을 새로 만드는 것
  • 따라서 Spring은 공식적으로 JPMS 미지원 선언

결과적으로

  • Spring에 의존하는 라이브러리들도 자연스럽게 JPMS 미지원
  • 의존성 체인 하나라도 Module이 아니면 전체가 무의미
  • Java Module은 좋은 기술이지만 Spring 생태계에서는 사실상 그림의 떡
반응형