Java 모듈 시스템이 수행하는 기능과 보다 안전하고 구조화된 코드를 작성하는 데 어떤 이점이 있는지 빠르게 알아봅니다.
Java SE 9는 Java 모듈 시스템을 도입했습니다. 메이븐이나 IntelliJ Idea 등의 모듈과 혼동해서는 안 됩니다. Java SE 9 모듈은 Java를 직접 지원하는 새로운 기능입니다.
Java Module 시스템이 수행하는 기능과 보다 안전하고 구조화된 코드 작성에 어떤 이점이 있는지를 간략하게 소개합니다.
Java 모듈 사용의 이점
모듈식 Java 코드를 사용하면 다음과 같은 이점이 있습니다:
강력한 캡슐화: 글로벌 공간에서 의도하지 않은 클래스 없음
Java 모듈은 다른 Java 모듈로 내보낼(사용 가능) Java 패키지를 명시적으로 알려주어야 합니다. 이는 모듈 수준에서 강력한 캡슐화를 만듭니다.
컴파일 시간 종속성 감소
다른 패키지에 대한 의존성이 있을 때, Java 모듈은 어떤 모듈이 필요한지 명시적으로 알려주어야 합니다. 모듈을 사용하면 JVM이 종속성을 신속하게 찾아 로드할 수 있으므로 시간이 절약됩니다.
더 작은 크기의 배포 가능한 리소스
응용프로그램에 필요한 모든 종속성을 알고 있으므로 필요한 패키지만 발송할 수 있으므로 응용프로그램의 크기가 작아집니다.
구축 안정성 향상
모듈 정의를 통해 종속성을 지정하면 모든 종속 패키지가 개발 시점부터 이미 알려져 있습니다. 따라서 배포 후 종속성 누락으로 인해 런타임 예외가 발생하는 문제가 발생하지 않습니다.
모듈 정의 방법
모듈은 module-info.java라는 이름의 파일을 사용하여 설명됩니다. 모듈 정의에는 다음과 같은 정보가 포함됩니다:
- 모듈 이름
- 모듈 설명자
- 패키지 세트
- 종속성, 리소스 유형 등.
다음 섹션에서는 두 개의 모듈로 구성된 Java Modular 애플리케이션을 만들 것입니다. 이 애플리케이션은 Java 모듈을 탐색하는 데 도움이 되고 좋은 시작을 제공합니다.
모듈식 샘플
두 개의 모듈이 포함된 작은 애플리케이션을 작성할 것입니다.
모듈 1(차량 작업장): 첫 번째 모듈은 자동차 수리, 타이어 교체 등 다양한 기능을 제공하는 Car Shop 모듈입니다. 모듈 2에서 제공하는 DTO/모델 클래스에 따라 다릅니다. 다음은 자동차의 가게의 모듈 정의입니다.
module car.shop {
exports car.shop;
requires car.common;
}
모듈 2(차량 공통): 다양한 DTO 클래스를 제공합니다. 이 모듈의 정의는 다음과 같습니다.
여기 이 모듈에서는 car.common.model이라는 이름의 패키지 하나를 내보냅니다. 즉, 이 모듈에 패키지가 많을 수도 있지만 패키지가 캡슐화되어 있는지 확인하고 있습니다. 우리가 외부에 제공해야 한다고 생각하는 패키지만 수출해야 합니다.
module car.common {
exports car.common.model;
}
샘플 코드
모듈 1에 정의된 샘플 서비스 클래스를 살펴보겠습니다.
package car.shop;
import car.common.model.Car;
public class CarService {
public static void main(String[] args) {
Car car = new Car();
changeTire(car);
}
public static void changeTire(car.common.model.Car car) {
System.out.println("Car Service");
}
}
위의 코드는 특별한 것 없이 매우 친숙해 보입니다. car.common.model 유형의 매개 변수를 취하는 정적 메서드 changeTire를 정의하고 있습니다.
이제 이 특정 패키지 car.common.model은 Module 2에 정의되어 있으며, 우리가 두 모듈을 모두 정의했기 때문에 시스템은 컴파일 시에 우리가 의존성을 가지고 있고 이를 해결하는 방법을 알고 있습니다.
장점은 우리가 모듈 수준에서 패키지 간의 관계를 지시하고 있다는 것입니다. 이제 car.common에 car.internal, car.workin.progress, car.private.package 등과 같은 많은 다른 패키지가 포함되어 있다고 상상해 보십시오. Modular Java가 없으면 응용 프로그램에서 필요한 패키지만 선택할 수 없으므로 필요 여부와 상관없이 모든 패키지를 함께 번들로 묶어야 합니다.
Java Modules를 사용하면 외부에서 사용할 수 있어야 하는 패키지(export car.common)를 캡슐화할 수 있을 뿐만 아니라 노출되지 않아야 하는 클래스 또는 패키지를 외부에서 숨길 수 있습니다.
Java Module 프로젝트의 전체 소스 코드는 GitHub에서 확인할 수 있습니다.
요약
Java 프로그램을 모듈식으로 활용할 필요는 없습니다. 그럼에도 불구하고 개발자들은 이 새로운 개념을 활용하여 보다 효율적이고 안전한(패키지 수준의 캡슐화) 코드를 작성할 수 있는 새로운 도구를 제공합니다.
'SW > Java' 카테고리의 다른 글
효과적인 Java Collection Framework: 모범 사례 및 팁 (0) | 2023.08.02 |
---|---|
자카르타 EE 10과 글래스피쉬 7로 업그레이드하는 방법 (0) | 2023.07.28 |
RxJava 사용한 비동기 HTTP 요청 (0) | 2023.06.09 |
Java : this 키워드 : 개념, 개요, 예제, 설명 (0) | 2023.02.28 |
Java : 자바 생성자 : 개념, 예제, 개요, 설명 (0) | 2023.02.26 |