[자바] Technical Article 정리 - 자바 모듈

Paul Deitel의 Understanding Java 9 Modules 기고 내용 정리입니다.

모듈

  • 기존 거대한 모놀리식 자바 플랫폼에서 모듈화에 대한 요구가 있었고 Java7, 8을 거쳐 Java9에서 모듈화가 가능해졌다.
  • 모듈은 자바의 패키지 보다 더 높은 수준의 집합(어그리게이션)을 만들고 캡슐화를 가능하게 한다.
    • 자바 모듈 시스템을 이용하여 애플리케이션을 관심사에 따라 분리(기능에 따라 그룹화)할 수 있다.
    • 패키지를 한 단계 더 추상화하여 패키지를 그룹화한 것이 모듈이다.
  • 모듈은 재사용 가능한, 서로 관련 있는 패키지 그룹과 이미지 및 XML 파일 같은 리소스 및 모듈 디스크립터로 이루어져 있다.
    • 모듈 디스크립터는 모듈의 이름, 모듈의 의존성(해당 모듈에 의존하는 다른 모듈), 다른 모듈이 명시적으로 접근 가능한 패키지, 모듈이 제공하는(또는 제공받는) 서비스, 해당 모듈이 리플렉션을 허용하는 다른 모듈에 대한 정보를 가지고 있다.
  • 모듈 디스크립터가 가지고 있는 정보들로 모듈을 정의한다.
  • 모듈은 고유의 이름을 가지고 있으며 모듈 간 의존성이 존재한다.
  • 각 모듈은 의존성을 명시적으로 나타내야 한다.
  • 각 모듈은 독립적으로 컴파일된다.

모듈의 목표

  1. 신뢰할 수 있는 애플리케이션 구성
    • 모듈을 통해 모듈 간 의존 관계를 명시적으로 선언하고 이를 컴파일 타임과 런타임에 인식되게 함으로써 시스템은 이러한 의존성을 살펴보고 애플리케이션을 구성하기 위해 필요한 모든 모듈의 하위 집합을 결정할 수 있다.
  2. 높은 수준의 캡슐화
    • 모듈 내 패키지는 모듈이 명시적으로 해당 패키지를 내보낼 경우에만 다른 모듈에서 접근 가능하다.
    • 즉, 해당 모듈의 기능이 필요하다고 명시적으로 나타내지 않는 한 다른 모듈은 해당 모듈의 패키지를 사용할 수 없다.
    • 이로써 잠재적인 공격자가 접근할 수 있는 클래스가 줄어들기 때문에 플랫폼 보안이 향상된다.
  3. 확장 가능한 자바 플랫폼
    • 이전 자바 플랫폼은 엄청난 수의 패키지로 구성된 모놀리식이었기 때문에 개발, 유지 및 진화하는 것이 어려웠으며 이로 인해 플랫폼을 하위 집합으로 쉽게 나눌 수 없었다.
    • 모듈 덕분에 애플리케이션 또는 대상 장치에 필요한 모듈로만 구성된 사용자 지정 런타임을 만들 수 있다.
    • 예를 들어 장치가 GUI를 지원하지 않는 경우 GUI 모듈을 포함하지 않는 런타임을 생성하여 런타임 크기를 크게 줄일 수 있다.
  4. 플랫폼의 무결성 향상
    • Java 9 이전에는 특정 애플리케이션이 사용하도록 의도되지 않은 클래스(또는 API)들을 플랫폼에서 제약 없이 사용할 수 있었다.
    • 모듈로 인한 강력한 캡슐화를 통해 이러한 내부 API는 플랫폼을 사용하는 애플리케이션으로부터 실제로 캡슐화되고 숨겨진다.
    • 따라서 애플리케이션 코드가 내부 API에 의존하는 경우 레거시 코드를 모듈화된 Java 9로 마이그레이션하는 것이 문제가 될 수 있다.
  5. 향상된 성능
    • JVM은 다양한 최적화 기술을 사용하여 애플리케이션 성능을 향상시킨다.
    • JSR 376은 JVM이 필수 타입이 특정 모듈에만 있다는 것을 미리 알고 있을 때 이러한 기술이 더 효과적임을 나타낸다.

모듈의 의존성

  • 모듈의 모든 패키지는 기본적으로 private이다.
  • 모듈은 기본적으로 다른 모듈에 자신의 API를 제공하지 않으며 이를 통해 높은 수준의 캡슐화를 가능하게 한다.
  • 모듈의 특정 패키지를 다른 모듈이 접근 가능하게 만들면 해당 패키지의 모든 public 변수가 노출된다.
    • 특정 패키지를 다른 모듈 전체에 노출하는 것이 아닌 모듈의 일부 클래스만 접근 가능하게 할 수도 있다.
  • 모듈에 컴파일 타임 의존성과 런타임 의존성 모두를 부여하거나 컴파일 타임 의존성만 부여할 수 있다.

Comments