Java Category/Java

[JAVA] 모듈(응용 프로그램 모듈화)

ReBugs 2023. 7. 21.

이 게시글은 이것이 자바다(저자 : 신용권, 임경균)의 책과 동영상 강의를 참고하여 개인적으로 정리하는 글임을 알립니다. 


모듈

  • Java 9부터 지원함
  • 모듈은 패키지 관리 기능까지 포함된 라이브러리
  • 모듈을 만들려면 필수로 모듈 기술자(module-info.java)가 있어야 한다.
    모듈 기술자가 없으면 라이브러리이고, 있으면 모듈이다.

패키지 은닉

  • 라이브러리와 달리 모듈은 패키지를 은닉하여 모듈 밖인 외부에서는 접근할 수 없게 할 수 있다.(접근 제한자 private와 비슷한 기능)
패키지 은닉
패키지를 은닉하는 이유는 아래와 같다.
-패키지 1은 공개하고 패키지 2와 3은 은닉하여, 패키지 1로 사용방법을 통일할 수 있기 때문이다.
-모듈 성능 향상을 위해 패키지 2와 3을 수정하더라도 외부에서는 모듈 사용 방법(패키지1)이 달라지지 않기 때문에 외부에 영향을 주지 않는다.
  • 모듈은 자신이 실행할 때 필요로 하는 의존 모듈을 모듈 기술자에 기술할 수 있기 때문에 모듈 간의 의존 관계를 쉽게 파악 가능하다.

의존관계

 

  • 모둘도 라이브러리이므로 JAR 파일 형태로 배포할 수 있다. 응용프로그램을 개발할 때 원하는 기능의 모듈을 다운로드해서 사용하면 된다.
  • 대규모 응용프로그램은 기능별로 모듈화 해서 개발할 수도 있다. 모듈별로 개발하고 조립하는 방식을 사용하면 재사용성 및 유지 보수에 유리하다.

 


 

응용프로그램 모듈화 (프로젝트 단위)

응용프로그램은 하나의 프로젝트로도 개발이 가능하지만, 대규모 프로젝트와 같은 경우 기능별로 서브 프로젝트(모듈)로 쪼갠다음 조합해서 개발할 수 있다.

아래의 그림처럼 my_app1 응용프로그램은 2개의 서브 프로젝트(모듈)인 module_1과 module_2로 쪼개서 개발하고, 이들을 조합해서 완성할 수 있다.

 

module_1 만들기

module_1에는 패키지 pack1과 pack2를 가지고 있다. 따라서 모듈 기술자에 아래와 같이 선언한다.

exports
exports 키워드는 모듈이 가지고 있는 패키지를 외부에서 사용할 수 있도록 노출시키는 역할을 한다.
exports 하지 않으면 해당 패키지는 은닉이 된다.
module my_app1 {
	//여기에 패키지를 exports 하지 않으면 은닉 패키지가 된다.
	exports pack1;
	exports pack2;
}

 

A.class

package pack1;
public class A {
	public void method(){
		System.out.println("A-method 실행");
	}
}

 

B.class

package pack2;
public class B {
	public void method(){
		System.out.println("B-method 실행");
	}
}

 

module_2 만들기

module_2에는 패키지 pack3과 pack4를 가지고 있다. 따라서 모듈 기술자에 아래와 같이 선언한다.

module module_2 {
	exports pack3;
	exports pack4;
}

 

C.java

package pack3;
public class C {
	public void method(){
		System.out.println("C-method 실행");
	}
}

 

D.java

package pack4;
public class D {
	public void method(){
		System.out.println("D-method 실행");
	}
}

 

myapp_1 프로젝트 만들기

myapp_1 프로젝트를 만들 때 꼭 해야 하는 것이 있다.

반드시 myapp_1도 모듈 기술자를 만들어야 한다. 왜냐하면 myapp_1은 module1과 modul_2를 사용해야 하는데 이것은 해당 모듈에 의존한다는 것이다. 때문에 이를 모듈 기술자에 써야 한다.

requires
requires 키워드는 필요한 모듈을 컴파일하거나 실행할 때 필요한 의존 모듈을 지정한다.
requires 키워드를 기술하고 반드시 해당 모듈이 있는 경로를 설정해야 한다.

모듈 경로를 알려주는 방법은 아래와 같다.
프로젝트 마우스 우클릭 -> Build Path -> Confugure Build Path

Project 탭 -> modulepath -> add 버튼을 누르고 필요한 모듈을 선택한다.
제대로 선택이 되었다면 apply and close 버튼을 누른다.
module my_app1 {
	requires module_1;
	requires module_2;
}

 

Main.java

package app;

import pack1.A;
import pack2.B;
import pack3.C;
import pack4.D;

public class Main {
	public static void main(String[] args) {
		A a = new A();
		a.method();
		
		B b = new B();
		b.method();
		
		C c = new C();
		c.method();
		
		D d = new D();
		d.method();
	}

}
/*
A-method 실행
B-method 실행
C-method 실행
D-method 실행
*/

필요한 모듈을 import 해서 쓰면 된다.

 


 

모듈 배포용 JAR 파일 만들기

모듈 개발을 완료했다면 다른 모듈에서 쉽게 사용할 수 있도록 바이트코드 파일로 구성된 배포용 JAR 파일을 생성할 수 있다.

위 예제에서 만든 module1과 module2 모듈의 배포용 JAR 파일을 생성하는 방법은 아래와 같다.

1. 프로젝트 우클릭 -> Export

 

2. Java -> JAR file 클릭 -> Next

 

3. src 빼고 모두 체크 해제

 

4. JAR 파일을 저장할 경로를 지정 -> 저장 -> Finish

 

5. modul_2 도 1~4 과정을 동일하게 반복

 


 

JAR 모듈 사용하기

새로운 프로젝트 myapp_2 프로젝트를 생성한다.

반드시 myapp_1도 모듈 기술자를 만들어야 한다. 왜냐하면 myapp_1은 module1과 modul_2를 사용해야 하는데 이것은 해당 모듈에 의존한다는 것이다. 때문에 이를 모듈 기술자에 써야 한다.

requires
requires 키워드는 필요한 모듈을 컴파일하거나 실행할 때 필요한 의존 모듈을 지정한다.
requires 키워드를 기술하고 반드시 해당 모듈이 있는 경로를 설정해야 한다.

JAR 모듈의 경로를 알려주는 방법은 프로젝트 모듈 경로를 알려주는 방법과 살짝 다르다.
모듈 경로를 알려주는 방법은 아래와 같다.
프로젝트 마우스 우클릭 -> Build Path -> Confugure Build Path

Libraries 탭 -> Modulepath 클릭 -> add External JARs 버튼 클릭
(그냥 Add JARs 버튼은 같은 프로젝트 내에 JAR파일이 있을 때 클릭한다.)

원하는 JAR 파일을 선택한다.

다 선택했으면 apply and close 버튼을 누른다.

 

myapp_2.java

module myapp_2 {
	requires module_1;
	requires module_2;
}

 

Main.java

package app;

import pack1.A;
import pack2.B;
import pack3.C;
import pack4.D;

public class Main {
	public static void main(String[] args) {
		A a = new A();
		a.method();
		
		B b = new B();
		b.method();
		
		C c = new C();
		c.method();
		
		D d = new D();
		d.method();
	}

}
/*
A-method 실행
B-method 실행
C-method 실행
D-method 실행
*/

필요한 모듈을 import 해서 쓰면 된다.

댓글