JPMS(Java Platform Module System)는 Java 플랫폼 출시 이후 가장 중요한 아키텍처 변경 사항 중 하나입니다. Java 애플리케이션을 광범위하게 사용해 본 사람으로서 저는 이 강력한 기능이 코드를 구성하고 구성하는 방식을 어떻게 변화시켰는지 직접 보았습니다.
Java 9에 도입된 모듈 시스템은 패키지보다 더 높은 수준에서 코드를 구성하는 기본적인 방법을 제공합니다. 기본적으로 모듈은 종속성을 명시적으로 선언하고 다른 모듈에서 사용할 수 있게 만드는 독립된 단위입니다[1]. 이는 본질적으로 모든 코드가 다른 모든 코드에 액세스할 수 있었던 전통적인 클래스 경로 기반 접근 방식에서 획기적인 변화였습니다.
기본 모듈 선언부터 시작해 보겠습니다.
module com.myapp.core { requires java.base; exports com.myapp.core.api; provides com.myapp.core.spi.Service with com.myapp.core.impl.ServiceImpl; }
이 간단한 선언은 모듈 이름 지정, 종속성 선언, 패키지 내보내기[2] 등 여러 주요 개념을 요약합니다. 모듈 시스템은 컴파일 시간과 런타임에 이러한 경계를 적용하여 이전보다 더 강력한 캡슐화를 제공합니다.
모듈식 애플리케이션을 만들 때 구조는 일반적으로 다음과 같습니다.
myapp/ ├── src/ │ ├── module-info.java │ └── com/ │ └── myapp/ │ └── Main.java └── out/
다음은 간단한 모듈식 애플리케이션의 전체 예입니다.
// module-info.java module com.myapp { requires java.logging; exports com.myapp.api; } // com/myapp/api/Service.java package com.myapp.api; public interface Service { String getMessage(); } // com/myapp/internal/ServiceImpl.java package com.myapp.internal; import com.myapp.api.Service; public class ServiceImpl implements Service { public String getMessage() { return "Hello from modular service!"; } }
JPMS의 가장 강력한 기능 중 하나는 강력한 캡슐화 메커니즘입니다[4]. 기존의 공개/비공개 액세스 수정자와 달리 모듈 수준 캡슐화는 공개로 표시되어 있어도 내부 구현 세부 정보에 대한 액세스를 방지합니다.
다음 시나리오를 고려해보세요.
module com.myapp.core { exports com.myapp.core.api; // Internal packages are not exported // com.myapp.core.internal remains hidden }
내부 패키지의 클래스가 공개 클래스라도 명시적으로 내보내지 않는 한 모듈 외부에서 액세스할 수 없습니다[1]. 이는 모듈 이전의 Java에 비해 캡슐화가 크게 향상되었음을 나타냅니다.
JPMS는 require 지시문을 통해 명시적인 종속성 선언을 도입합니다. 이는 Java 애플리케이션을 자주 괴롭히는 "JAR 지옥" 문제를 방지하는 데 도움이 됩니다[3]. 종속성을 일반적으로 관리하는 방법은 다음과 같습니다.
module com.myapp.service { requires com.myapp.core; requires java.sql; requires transitive com.myapp.common; }
Requires 전이 지시문은 종속성 전달을 허용하여 이 지시문에 의존하는 모든 모듈에서 필수 모듈을 사용할 수 있도록 한다는 점에서 특히 흥미롭습니다[2].
모듈 시스템은 Java의 ServiceLoader 메커니즘과 완벽하게 통합됩니다.
module com.myapp.core { uses com.myapp.spi.Plugin; } module com.myapp.plugin { provides com.myapp.spi.Plugin with com.myapp.plugin.impl.PluginImpl; }
이를 통해 서비스 인터페이스와 구현이 명확하게 분리되어 진정한 플러그인 아키텍처가 가능해집니다[8].
기존 애플리케이션을 JPMS로 이동하는 것은 어려울 수 있습니다. 가장 일반적인 문제는 다음과 같습니다.
module com.myapp.core { requires java.base; exports com.myapp.core.api; provides com.myapp.core.spi.Service with com.myapp.core.impl.ServiceImpl; }
마이그레이션을 돕기 위해 Java는 --add-exports 및 --add-opens 명령줄 옵션을 제공합니다[5]:
myapp/ ├── src/ │ ├── module-info.java │ └── com/ │ └── myapp/ │ └── Main.java └── out/
모듈 시스템은 다음을 통해 더 나은 런타임 최적화를 가능하게 합니다.
jlink를 사용하여 사용자 정의 런타임 이미지를 만들 수 있습니다.
// module-info.java module com.myapp { requires java.logging; exports com.myapp.api; } // com/myapp/api/Service.java package com.myapp.api; public interface Service { String getMessage(); } // com/myapp/internal/ServiceImpl.java package com.myapp.internal; import com.myapp.api.Service; public class ServiceImpl implements Service { public String getMessage() { return "Hello from modular service!"; } }
테스트에는 특별한 고려가 필요합니다. 일반적인 테스트 모듈 설정은 다음과 같습니다.
module com.myapp.core { exports com.myapp.core.api; // Internal packages are not exported // com.myapp.core.internal remains hidden }
많은 빌드 도구가 모듈식 애플리케이션 테스트를 위한 특정 지원을 제공합니다. 예를 들어 Maven은 적절한 구성과 함께 maven-surefire-plugin을 사용합니다[8].
모듈형 애플리케이션의 더 완전한 예를 살펴보겠습니다.
module com.myapp.service { requires com.myapp.core; requires java.sql; requires transitive com.myapp.common; }
이 구조는 강력한 캡슐화와 명시적인 종속성을 유지하면서 문제를 깔끔하게 분리합니다[11].
모듈 시스템은 Java 애플리케이션 구조화에 대한 우리의 생각을 근본적으로 바꿔 놓았습니다. 특히 기존 애플리케이션의 경우 전환이 어려울 수 있지만 유지 관리성, 보안 및 성능 측면에서 이점이 있으므로 전환할 가치가 있습니다. 생태계가 계속 성숙해짐에 따라 더 많은 라이브러리와 프레임워크에서 JPMS를 채택하여 진정한 모듈식 애플리케이션을 더 쉽게 구축할 수 있게 되었습니다.
Java 개발의 미래는 모듈식이며 JPMS를 마스터하는 것이 Java 개발자에게 점점 더 중요해지고 있습니다. 새 프로젝트를 시작하든 기존 프로젝트를 유지 관리하든 이러한 개념을 이해하면 더욱 강력하고 유지 관리 가능한 애플리케이션을 구축하는 데 도움이 됩니다.
더 많은 통찰력과 이야기를 보려면 https://techkoalainsights.com/을 방문하세요
박수를 누르고 저를 팔로우하고 TechKoala Insights 더 많은 이야기를 보려면
인베스터 센트럴 |스마트 리빙 |
시대와 메아리 |
수수께끼의 미스터리 |
힌두트바 |
엘리트 개발자 |
JS 학교
위 내용은 Java 모듈 출시: 매우 안전하고 초고속 앱 뒤에 숨은 비밀 무기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!