๐Ÿ’ป BackEnd/๐ŸŸจ Java

๐ŸŸจ [Java] ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ / ๋ชจ๋“ˆ

Dbswnstjd 2023. 4. 18. 16:14

์ž๋ฐ” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ž€ ?

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ ์‹œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๋“ค์„ ๋ชจ์•„๋†“์€ ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ JAR ์••์ถ• ํŒŒ์ผ ํ˜•ํƒœ๋กœ ์กด์žฌํ•œ๋‹ค. JAR ํŒŒ์ผ์—๋Š” ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ ํŒŒ์ผ์ด ์••์ถ•๋˜์–ด ์žˆ๋‹ค. ํŠน์ • ํด๋ž˜์Šค์™€ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๊ณตํ†ต์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค๋ฉด JAR ํŒŒ์ผ๋กœ ์••์ถ•ํ•ด์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

ํ”„๋กœ๊ทธ๋žจ ๊ฐœ๋ฐœ ์‹œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ด์šฉํ•˜๋ ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ JAR ํŒŒ์ผ์„ ClassPath์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. ClassPath๋ž€ ๋ง ๊ทธ๋Œ€๋กœ ํด๋ž˜์Šค๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ๊ฒฝ๋กœ์ด๋‹ค.

my_lib ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

Eclipse ๊ธฐ์ค€์œผ๋กœ [File] - [New] - [Java Project] ๋ฅผ ์„ ํƒํ•œ๋‹ค. 

Project name ์€ my_lib์œผ๋กœ ์ ๊ณ  Create module-info.java file ์„ ํƒ์„ ํ•ด์ œํ•ด์ค€๋‹ค. (์ด ๋•Œ ๋ฐ˜๋“œ์‹œ ํ•ด์ œํ•ด์ค˜์•ผํ•œ๋‹ค)

my_lib์˜ src ํด๋” ์šฐํด๋ฆญ ํ›„ [New] - [Package] ๋กœ ๋‹ค์Œ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ค€๋‹ค. 

๊ทธ๋ฆฌ๊ณ  my_lib ํ”„๋กœ์ ํŠธ ์šฐํด๋ฆญ ํ›„ [New] - [Folder] ๋ฅผ ์„ ํƒํ•ด dist ์ธ ํด๋”๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

 

my_lib ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ํƒํ•˜๊ณ  ๋งˆ์šฐ์Šค ์šฐํด๋ฆญ ํ›„ [Export]๋ฅผ ์„ ํƒํ•œ๋‹ค. Export์˜ Java - Jar file์„ ์„ ํƒ ํ›„ srcํด๋”๋งŒ ์ฒดํฌํ•ด์ค€๋‹ค. ๊ฒฝ๋กœ๋Š” dist ์•„๋ž˜์˜ my_lib.jar ๋กœ ์ง€์ •ํ•ด์ค€๋‹ค. 

finish ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ณ  ํ™•์ธํ•ด๋ณด๋ฉด my_lib.jar ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  A์™€ Bํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•˜๋ฉด ๋œ๋‹ค.

package pack1;

public class A {
	public void method() {
		System.out.println("A-method ์‹คํ–‰");
	}
}
package pack2;

public class B {
	public void method() {
		System.out.println("B-method ์‹คํ–‰");
	}
}

 

my_application_1 ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์€ ์œ„์˜ ๋‚ด์šฉ๊ณผ ๋™์ผํ•˜๋‹ค.

์—ฌ๊ธฐ์„œ ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์€ [Build Path]์˜ [Configure Build Path]์ด๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์šฐํด๋ฆญ ํ›„ [Build Path] - [Configure Build Path]๋ฅผ ์„ ํƒํ•˜๋ฉด [Libraries] ํƒญ์—์„œ ClassPath ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜๊ณ  [Add External JARs] ๋ฅผ ํด๋ฆญํ•œ๋‹ค. my_lib ํ”„๋กœ์ ํŠธ์˜ dist ํด๋”์— ์žˆ๋Š” my_lib.jar ํŒŒ์ผ์„ ์„ ํƒํ•˜์—ฌ Apply ํ•ด์ค€๋‹ค. 

๊ทธ๋ฆฌ๊ณ  ์˜ค๋ฅธ์ชฝ ์‚ฌ์ง„์˜ Project์˜ ClassPath ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด my_lib ํ”„๋กœ์ ํŠธ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ์ฆ‰์‹œ my_application_1์—์„œ ์ˆ˜์ •๋œ ๋‚ด์šฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค. ํด๋” ์šฐํด๋ฆญ - [Refresh] ๋ฅผ ํ•ด์ค˜์•ผํ•œ๋‹ค.

 

my_application_1 ์˜ Main ํด๋ž˜์Šค๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž 

package app;

import pack1.A;
import pack2.B;

public class Main {

	public static void main(String[] args) {
		A a = new A();
		a.method();

		B b = new B();
		b.method();
	}

}

 

- Module 

๋ชจ๋“ˆ์€ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ๊นŒ์ง€ ํฌํ•จ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ์ผ๋ฐ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‚ด๋ถ€์— ํฌํ•จ๋œ ๋ชจ๋“  ํŒจํ‚ค์ง€์— ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์—์„œ์˜ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ๋ชจ๋“ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ๋ถ€ ํŒจํ‚ค์ง€๋ฅผ ์€๋‹‰ํ•˜์—ฌ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ฒŒ๋” ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋˜ ๋‹ค๋ฅธ ์ฐจ์ด์ ์€ ๋ชจ๋“ˆ์€ ์ž์‹ ์ด ์‹คํ–‰ํ•  ๋•Œ ํ•„์š”๋กœ ํ•˜๋Š” ์˜์กด ๋ชจ๋“ˆ์„ ๋ชจ๋“ˆ ๊ธฐ์ˆ ์ž(module-info.java)์— ๊ธฐ์ˆ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“ˆ ๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

 ๋˜‘๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ my_module_a ์™€ my_module_b๋ฅผ ๋งŒ๋“ค์–ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  my_application_2 ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. 

ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ ์‹œ Module์„ ๋ฐ˜๋“œ์‹œ create ํ•ด์ค€๋‹ค. module-info.java ๋ผ๋Š” ํŒŒ์ผ์ด ์ƒ๊ธธ ๊ฒƒ์ด๋‹ค. 

my_module_a ์™€ my_module_b ์˜ module-info.java ์„ ์ž‘์„ฑํ•œ๋‹ค. 

// module a
module my_module_a {
	exports pack1;
	exports pack2;
}
// module b
module my_module_b {
	exports pack3;
	exports pack4;
}

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“ˆ a์™€ b๋ฅผ require ํ•ด์ค˜์•ผ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— my_application_2์˜ module-info.java ์—๋Š” ์•„๋ž˜์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค. 

module my_application_2 {
	requires my_module_a;
	requires my_module_b;
}

 

Main Class

package app;

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

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();
	}

}

 

๋‹ค ์ž‘์„ฑ ํ›„ ๋ชจ๋“ˆ์˜ ๊ฒฝ๋กœ๊ฐ€ ์–ด๋””์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— [ํ”„๋กœ์ ํŠธ ์šฐํด๋ฆญ] - [Build Path] - [Configure Build Path] ํด๋ฆญ ํ›„ [Projects] ํƒญ์„ ์„ ํƒํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ModulePath ์—์„œ ํ•ญ๋ชฉ์„ ์„ ํƒํ•˜๊ณ  ๋งˆ์น˜๋ฉด๋œ๋‹ค.