Categories: 미분류

Java의 모듈 시스템 (Java 9 모듈화)에 대해 알아 보겠습니다.

Java 9에서 도입된 모듈 시스템(Module System)은 대규모 애플리케이션을 효율적으로 관리하고 유지보수할 수 있도록 설계되었습니다. 이를 통해 불필요한 코드 의존성을 줄이고, 더 안전하고 성능이 뛰어난 애플리케이션을 개발할 수 있습니다. 이번 글에서는 Java 모듈 시스템의 개념과 사용법을 심화적으로 다루어 보겠습니다.


1. Java 모듈 시스템이란?

Java의 모듈 시스템은 여러 개의 독립적인 모듈로 애플리케이션을 구성하는 방법을 제공합니다. 기존의 JAR 파일을 사용하는 방식과 달리, 모듈 시스템은 명확한 의존성 관리캡슐화를 제공합니다.

모듈 시스템의 주요 특징:

  1. 명시적 의존성 관리: module-info.java 파일을 통해 모듈 간의 관계를 정의합니다.
  2. 캡슐화 강화: 불필요한 클래스를 외부에서 접근할 수 없도록 제한할 수 있습니다.
  3. 경량화: 사용하지 않는 모듈을 제거하여 애플리케이션을 최적화할 수 있습니다.

2. Java 모듈의 기본 구조

Java 모듈 시스템을 사용하려면 module-info.java 파일을 추가해야 합니다. 기본적인 모듈 구조는 다음과 같습니다:

myapp/
 ├── src/
 │   ├── module-info.java
 │   ├── com.myapp/
 │   │   ├── Main.java

모듈 정의 (module-info.java)

module com.myapp {
    requires java.base; // 기본 Java 라이브러리
    exports com.myapp;  // com.myapp 패키지를 외부에서 접근 가능하도록 설정
}

메인 클래스 (Main.java)

package com.myapp;

public class Main {
    public static void main(String[] args) {
        System.out.println("Java 모듈 시스템 예제");
    }
}

이제 javacjava 명령어를 사용하여 모듈 기반 애플리케이션을 실행할 수 있습니다.


3. 모듈 간 의존성 관리

모듈 시스템에서는 특정 모듈이 다른 모듈을 참조하려면 requires 키워드를 사용하여 명시적으로 선언해야 합니다.

예제: 두 개의 모듈 간 의존성

app/
 ├── src/
 │   ├── module-info.java
 │   ├── com.app/
 │   │   ├── App.java

library/
 ├── src/
 │   ├── module-info.java
 │   ├── com.library/
 │   │   ├── Library.java

라이브러리 모듈 (library/module-info.java)

module com.library {
    exports com.library;
}

라이브러리 클래스 (Library.java)

package com.library;

public class Library {
    public static String getMessage() {
        return "Hello from Library!";
    }
}

애플리케이션 모듈 (app/module-info.java)

module com.app {
    requires com.library;
}

애플리케이션 클래스 (App.java)

package com.app;

import com.library.Library;

public class App {
    public static void main(String[] args) {
        System.out.println(Library.getMessage());
    }
}

이제 javac 명령어를 사용하여 두 모듈을 컴파일하고 실행할 수 있습니다.


4. requires, exports, opens 키워드

Java 모듈 시스템에서 사용되는 주요 키워드는 다음과 같습니다:

  • requires: 다른 모듈을 참조할 때 사용합니다.
  • exports: 해당 패키지를 외부에서 사용할 수 있도록 공개합니다.
  • opens: 리플렉션(Reflection) 기반 접근을 허용합니다.
  • provides ... with: 서비스 제공자를 등록할 때 사용됩니다.

예제: opens 키워드 사용

module com.example {
    opens com.example to java.logging;
}

이렇게 하면 java.logging 모듈이 com.example 패키지를 리플렉션을 통해 접근할 수 있도록 허용됩니다.


5. 모듈 시스템의 장점과 단점

장점:

  1. 캡슐화 강화: 필요 없는 클래스나 패키지를 숨길 수 있어 보안성이 증가합니다.
  2. 명확한 의존성 관리: module-info.java를 통해 의존성을 명확하게 설정할 수 있습니다.
  3. 애플리케이션 경량화: 사용하지 않는 모듈을 제거하여 최적화할 수 있습니다.
  4. 대규모 프로젝트 관리 용이: 모듈 단위로 관리하여 코드 유지보수가 쉬워집니다.

단점:

  1. 기존 코드와의 호환성 문제: 기존의 JAR 기반 애플리케이션과 통합 시 일부 라이브러리에서 문제가 발생할 수 있습니다.
  2. 학습 곡선이 높음: 기존의 클래스패스(Classpath) 방식과 다르기 때문에 학습이 필요합니다.
  3. 모든 라이브러리가 모듈을 지원하는 것은 아님: 일부 외부 라이브러리는 아직 모듈 시스템을 지원하지 않습니다.

6. 실무에서의 Java 모듈 시스템 활용

  1. 마이크로서비스 아키텍처: 개별 서비스 모듈을 독립적으로 개발 및 배포.
  2. 대규모 엔터프라이즈 애플리케이션: 기능별 모듈을 분리하여 유지보수성 향상.
  3. 경량 애플리케이션 개발: 불필요한 모듈을 제거하여 메모리 사용 최적화.

결론

Java 모듈 시스템은 대규모 애플리케이션의 유지보수를 용이하게 하고, 보안성과 성능을 향상시키는 중요한 기능입니다. module-info.java를 활용하여 명확한 의존성을 정의하고, 불필요한 요소를 캡슐화하여 더 안정적인 Java 애플리케이션을 개발해 보시길 바랍니다. 감사합니다.

루루파파

Recent Posts

신주쿠 이자카야

가게 이름숯불구이 전문 식당 시라긴야예약・문의050-1721-2892예약 가능 여부예약 가능 (전화로만 가능)주소도쿄도 신주쿠구 니시신주쿠 7-19-7 산로제 신주쿠…

3주 ago

[후기] 오키나와 나하공항 맛집 후기 – 반드시 먹어야 할 현지 음식 BEST4

오키나와 나하공항에 도착하거나 돌아가는 길, 바쁜 비행 일정에 쫓겨 허겁지겁 평범한 음식으로 끼니를 대충 때우신…

4주 ago

일본인이 알려주는 간사이 여행 필수템! ICOCA(이코카) 교통카드 완벽정리

간사이 여행을 계획 중이신가요? 오사카, 교토, 고베를 아우르는 간사이 지역 여행에서 가장 중요한 필수품이 바로…

1개월 ago

일본 여행 준비물 TOP 10: 유심 이심 교통카드 포함

일본으로의 여행을 꿈꾸며 설레는 마음으로 출발을 준비할 때, 반드시 잊지 말아야 할 부분이 있습니다. 그것은…

1개월 ago

일본 여행 규슈 료칸 베스트 10곳 최저가 예약 하기

일본 여행을 계획하고 있다면, 진정한 휴식과 힐링을 경험할 수 있는 규슈 료칸 온천 여행은 절대…

1개월 ago

미성년자들끼리 일본여행, 정말 가능할까? 준비물과 체크리스트 5가지 총정리

일본여행의 준비 청소년 시기, 가장 많이 꿈꾸는 ‘해외여행’. 그 중에서도 한국에서 가깝고 볼거리·즐길거리도 다양해 많은…

1개월 ago