Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 9에서 기존 모듈을 수정하는 방법 완벽 가이드

Java 9 모듈 시스템이란?

Java 9에서 도입된 모듈(module)은 코드와 데이터를 하나로 묶은 이름이 지정된 자기 기술적(self-describing) 컬렉션입니다. 코드는 Java 클래스와 인터페이스 같은 타입들을 포함하는 패키지 집합으로 구성되며, 데이터에는 리소스 및 기타 정적 정보가 포함됩니다.

모듈을 사용하려면 소스 코드의 루트 위치에 module-info.java 파일을 생성하고 모듈을 선언해야 합니다.

module-info.java 기본 템플릿

module <module-name> {
    requires <module-name1>;
    requires <module-name2>;

    exports <package-name1>;
    exports <package-name2>;

    exports <package-name> to <module-name>;
}

명령줄 옵션으로 기존 모듈 수정하기

Java 9에서는 명령줄 옵션(command-line options)을 활용하여 기존 모듈을 수정할 수 있습니다. 이를 통해 모듈 선언 파일(module-info.java)을 변경하지 않고도 의존성을 추가하거나, 추가 패키지를 내보내거나, 리플렉션 접근을 허용하는 등의 작업이 가능합니다.

1) --add-reads: 읽기 의존성 추가

--add-reads <module>=<target-module>(,<target-module>)*

이 옵션은 모듈 선언과 무관하게 <module><target-module>을 읽도록(read) 업데이트합니다. <target-module> 자리에 ALL-UNNAMED를 지정하면 이름 없는 모든 모듈(클래스패스상의 코드)을 읽을 수 있습니다.

2) --add-exports: 패키지 내보내기 추가

--add-exports <module>/<package>=<target-module>(,<target-module>)*

이 옵션은 모듈 선언과 무관하게 <module><package><target-module>에 내보내도록(export) 업데이트합니다. 마찬가지로 ALL-UNNAMED를 사용하면 이름 없는 모든 모듈에 패키지를 공개할 수 있습니다.

3) --add-opens: 심층 리플렉션 허용

--add-opens <module>/<package>=<target-module>(,<target-module>)*

이 옵션은 모듈 선언과 무관하게 <module><package><target-module>에 개방(open)하여, 런타임에 해당 패키지에 대한 심층 리플렉션(deep reflection) 접근을 허용합니다.

4) --patch-module: 클래스 및 리소스 교체·추가

--patch-module <module>=<file>(;<file>)*

이 옵션은 JAR 파일이나 디렉터리에 포함된 클래스와 리소스를 사용하여 기존 모듈의 내용을 교체하거나 확장할 수 있습니다. 주로 테스트나 핫픽스(hotfix) 상황에서 유용하게 활용됩니다.

정리

Java 9의 모듈 시스템은 강력한 캡슐화를 제공하지만, 때로는 기존 모듈의 동작을 유연하게 조정해야 할 필요가 있습니다. 위에서 소개한 네 가지 명령줄 옵션(--add-reads, --add-exports, --add-opens, --patch-module)을 활용하면 module-info.java를 직접 수정하지 않고도 모듈 간 의존성과 접근 권한을 손쉽게 제어할 수 있습니다.