본문으로 건너뛰기

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에 대한 의존성을 익스포트한다.

|