본문으로 건너뛰기

6.2 모듈

모듈은 클래스 로드 및 의존성 관리를 위해 사용되는 클래스의 논리적 그룹이다. 모듈은 필요할 때만 로드 된다. 일반적으로 명시적, 암시적 의존성이 있는 애플리케이션이 배포될 경우에만 실행된다.

JBoss EAP 6에서 모듈을 다음과 같이 정의할 수 있다.

  • 클래스를 로드할 때 묶음 단위
  • 일반적으로 하나의 jar 파일
  • 여러 개의 jar파일이나 프로퍼티 파일 등 자원을 포함할 수 있음
  • 모듈 하나에 대해서 하나의 클래스 로더
  • 각 모듈은 런타임에 필요한 의존 모듈을 정의
  • 계층형 클래스 로더 구조가 아닌 그래프 클래스 로더 구조
  • ‘클래스 패스’는 없음

JBoss EAP 6에는 정적 모듈(Static module)과 다이내믹 모듈(Dynamic Module)의 두 가지 모듈이 있다. 이 두 가지 모듈의 차이점은 패키징 방법이 다를 뿐이며, 모든 모듈은 동일한 기능을 갖는다.

구분설명
정적 모듈 (Module 디렉터리에 저장 방식)정적 모듈은 애플리케이션 서버 $JBOSS_HOME/modules/ 디렉터리에 저장되어 배포되었다. 각 하위 디렉터리는 하나의 모듈이고 1 개 또는 여러 개의 JAR 파일 및 설정 파일인 modules.xml가 저장되었다. 모듈의 이름은 module.xml 파일에 정의된다. JBoss EAP 6에서 제공하는 모든 API(Java EE API 및 JBoss Logging과 같은 API 포함)는 정적인 모듈로 제공된다.
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="com.mysql">
<resources>
<resource-root path="mysql-connector-java-5.1.15.jar"/>
</resources>

<dependencies>
<module name="javax.api"/>
<module name="javax.transaction.api"/>
</dependencies>
</module>

별도의 외부 라이브러리를 사용하기 위하여 사용자가 직접 지정한 정적 모듈도 서버에 배포할 수 있다. 이러한 라이브러리들은 JBoss 관리자가 라이브러리가 포함된 모듈을 만들어 설치할 수 있다. 사용자 지정 정적 모듈에서도 명시적으로 의존성을 선언할 수 있다. | | 다이내믹 모듈 (배포 방식 모듈) | 다이내믹 모듈은 JAR 또는 WAR 배포(또는 EAR의 하위 배포)시 JBoss EAP 6에서 생성되어 로드된다. 다이내믹 모듈의 이름은 배포 된 파일의 이름이다. 배포되는 애플리케이션도 다른 모듈과 마찬가지로 로드되기 때문에 의존성을 설정할 수 있고 다른 모듈을 참조하여 사용할 수 있다. |

표 2. 정적 모듈과 다이내믹 모듈의 차이

모듈 의존성​

모듈 의존성은 모듈이 동작하기 위해 다른 모듈의 클래스가 필요한 경우에 이를 참조하기 위한 선언이다. 명시적으로 다른 모듈의 종속성을 지정하지 않으면 의존성은 전혀 없다. 모듈은 얼마든지 다른 모듈의 의존성을 선언할 수 있다. JBoss EAP 6에서 모듈을 로드 할 때 모듈 클래스 로더가 모듈의 의존성을 분석하고 각 의존성 클래스를 클래스 패스에 추가한다. 지정된 의존성 모듈이 없으면 모듈을 로드 할 수 없어 오류가 발생한다.

배포된 애플리케이션(JAR 및 WAR)은 다이내믹 모듈로 로드 된 의존성을 사용하여 JBoss EAP 6에서 제공하는 API에 액세스한다.

의존성은 두 가지 유형으로 명시적, 암시적 의존성이 있다.

명시적 의존성 관계는 개발자가 설정 파일에서 선언할 수 있다. 정적 모듈 의존성을 modules.xml 파일에 선언할 수 있다. 다이내믹 모듈은 배포의 MANIFEST.MF 또는 jboss-deployment-structure.xml 디스크립터에 의존성을 선언할 수 있다.

명시적 의존성은 선택적(optional)으로 지정할 수 있다. 선택적인 의존성이 로드되지 못한다고 해서 모듈을 로드하는데 실패하지는 않는다. 그러나 이후에 의존성을 정의해도 그것이 모듈의 클래스 패스에 추가되지 않는다. 즉 모듈이 로드 될 때 종속성 모듈을 사용할 수 있어야 한다.

암시적 의존성은 특정 조건 또는 메타 데이터를 발견하면 JBossEAP 6에서 자동으로 추가한다. JBoss EAP 6와 함께 제공되는 Java EE 6 API는 배포시 암시적 의존성이 감지되어 추가된 모듈의 대표적인 예이다.

설정을 통하여 원치 않는 암시적 의존성을 제외 할 수도 있다. jboss-deployment-structure.xml 디스크립터 파일에 <exclusions>를 사용하여 정의하면 된다. 또, JBoss EAP 6에서 암시적 의존성을 추가하려면 WEB-INF/lib 디렉터리에 필요한 JAR파일을 넣는 방법을 일반적으로 사용한다.

모듈의 클래스 패스는 자신의 클래스와 직접적인 의존성을 갖는 것만 포함한다.

모듈은 해당 의존성 중 하나의 의존성 클래스에만 접근할 수 있다. 하지만 모듈은 특정 명시적 의존성을 익스포트 할 수 있다.

| 모듈 의존성 예 | 모듈 A는 모듈 B 에 의존하고, 모듈 B는 모듈 C 에 의존한다. 모듈 A는 모듈 B의 클래스에 접근할 수 있고 모듈 B는 모듈 C 의 클래스에 접근할 수 있다 .하지만 모듈 A는 모듈 C의 클래스는 접근할 수 없다. 다음과 같은 방법을 사용하면 모듈 A에서 모듈 C의 클래스에 접근할 수 있다. . 모듈 A 에서 모듈C에 대한 명시적 의존성을 정의한다. . 모듈 B에서 모듈 C에 대한 의존성을 익스포트한다.

|