Java λͺ¨λ μμ€ν
Java 9λΆν° λμ
λ λͺ¨λ μμ€ν
(Module System)μ Java νλ«νΌ λͺ¨λ μμ€ν
(JPMS)μ΄λΌκ³ λ λΆλ¦¬λ©°, μ ν리μΌμ΄μ
μ λ μκ³ κ΄λ¦¬νκΈ° μ¬μ΄ λ¨μλ‘ κ΅¬μ±ν μ μκ² ν©λλ€.
λͺ¨λμ΄λ?
λͺ¨λμ κ΄λ ¨λ ν¨ν€μ§μ 리μμ€λ₯Ό λ¬Άμ΄λμ λ¨μμ
λλ€.
λͺ¨λμ μ£Όμ νΉμ§
β’
κ°λ ₯ν μΊ‘μν: λͺ¨λ λ΄λΆμ ν¨ν€μ§λ₯Ό λͺ
μμ μΌλ‘ 곡κ°νμ§ μμΌλ©΄ μΈλΆμμ μ κ·Όν μ μμ΅λλ€.
β’
λͺ
νν μμ‘΄μ±: λͺ¨λ κ°μ μμ‘΄ κ΄κ³λ₯Ό λͺ
μμ μΌλ‘ μ μΈν΄μΌ ν©λλ€.
β’
μμ μ± ν₯μ: μ»΄νμΌ νμμ μμ‘΄μ±μ κ²μ¦νμ¬ λ°νμ μ€λ₯λ₯Ό μ€μ
λλ€.
β’
μ±λ₯ κ°μ : νμν λͺ¨λλ§ λ‘λνμ¬ μ ν리μΌμ΄μ
μμ μκ°κ³Ό λ©λͺ¨λ¦¬ μ¬μ©λμ μ΅μ νν©λλ€.
module-info.java ꡬ쑰
module com.example.mymodule {
// νμν λͺ¨λ μ μΈ
requires java.base; // κΈ°λ³Έμ μΌλ‘ μλ ν¬ν¨
requires java.sql;
// λ€λ₯Έ λͺ¨λμ 곡κ°ν ν¨ν€μ§ μ μΈ
exports com.example.mymodule.api;
// νΉμ λͺ¨λμλ§ κ³΅κ°
exports com.example.mymodule.internal to com.example.friend;
// μλΉμ€ μ 곡
provides com.example.service.MyService
with com.example.mymodule.MyServiceImpl;
// μλΉμ€ μ¬μ©
uses com.example.service.OtherService;
// 리νλ μ
νμ©
opens com.example.mymodule.entity;
}
Java
볡μ¬
μ£Όμ ν€μλ
ν€μλ | μ€λͺ
|
module | λͺ¨λμ μ μΈν©λλ€. |
requires | μ΄ λͺ¨λμ΄ μμ‘΄νλ λ€λ₯Έ λͺ¨λμ μ§μ ν©λλ€. |
requires transitive | μ μ΄μ μμ‘΄μ±
(μ΄ λͺ¨λμ μ¬μ©νλ λ€λ₯Έ λͺ¨λλ μλμΌλ‘ μμ‘΄μ±μ κ°κ² λ¨) |
requires static | μ»΄νμΌ μμλ§ νμν μ νμ μμ‘΄μ± |
exports | λ€λ₯Έ λͺ¨λμμ μ κ·Ό κ°λ₯ν ν¨ν€μ§λ₯Ό μ§μ ν©λλ€. |
exports...to | νΉμ λͺ¨λμλ§ ν¨ν€μ§λ₯Ό 곡κ°ν©λλ€. |
opens | λ°νμμ 리νλ μ
μ κ·Όμ νμ©ν©λλ€. |
opens...to | νΉμ λͺ¨λμλ§ λ¦¬νλ μ
μ κ·Όμ νμ©ν©λλ€. |
uses | μλΉμ€λ₯Ό μ¬μ©ν¨μ μ μΈν©λλ€. |
provides...with | μλΉμ€μ ꡬν체λ₯Ό μ 곡ν©λλ€. |
λͺ¨λ μμ€ν μ μ₯μ
β’
보μ κ°ν: λ΄λΆ APIλ₯Ό μ¨κ²¨ λ¬΄λ¨ μ κ·Όμ λ°©μ§ν©λλ€.
β’
μ μ§λ³΄μμ±: λͺ¨λ κ° λͺ
νν κ²½κ³λ‘ μ½λ κ΄λ¦¬κ° μ©μ΄ν©λλ€.
β’
νμ₯μ±: λͺ¨λ λ¨μλ‘ μ ν리μΌμ΄μ
μ νμ₯ν μ μμ΅λλ€.
β’
μ»΄ν©νΈν λ°°ν¬: JLinkλ₯Ό μ¬μ©νμ¬ νμν λͺ¨λλ§ ν¬ν¨ν κ²½λ λ°νμμ μμ±ν μ μμ΅λλ€.
μ€μ΅ μμ
1. κ°λ¨ν λͺ¨λ μμ±
νλ‘μ νΈ κ΅¬μ‘°:
myapp/
βββ src/
β βββ com.example.hello/
β βββ module-info.java
β βββ com/
β βββ example/
β βββ hello/
β βββ HelloWorld.java
Plain Text
볡μ¬
module-info.java:
module com.example.hello {
exports com.example.hello;
}
Java
볡μ¬
HelloWorld.java:
package com.example.hello;
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Java Modules!");
}
}
Java
볡μ¬
2. λͺ¨λ κ° μμ‘΄μ±
λ κ°μ λͺ¨λμ λ§λ€μ΄ μμ‘΄μ±μ μ€μ νλ μμ :
λͺ¨λ A (com.example.utils):
module com.example.utils {
exports com.example.utils;
}
// StringUtils.java
package com.example.utils;
public class StringUtils {
public static String reverse(String str) {
return new StringBuilder(str).reverse().toString();
}
}
Java
볡μ¬
λͺ¨λ B (com.example.app):
module com.example.app {
requires com.example.utils;
}
// App.java
package com.example.app;
import com.example.utils.StringUtils;
public class App {
public static void main(String[] args) {
String reversed = StringUtils.reverse("Hello");
System.out.println(reversed); // olleH
}
}
Java
볡μ¬
λͺ¨λ μ»΄νμΌ λ° μ€ν
μ»΄νμΌ:
javac -d out --module-source-path src $(find src -name "*.java")
Bash
볡μ¬
μ€ν:
java --module-path out -m com.example.app/com.example.app.App
Bash
볡μ¬
Unnamed Moduleκ³Ό Automatic Module
β’
Unnamed Module: λͺ¨λ μμ€ν
μ μ¬μ©νμ§ μλ κΈ°μ‘΄ ν΄λμ€ν¨μ€ κΈ°λ° μ½λ
β’
Automatic Module: module-info.javaκ° μλ JAR νμΌμ΄ λͺ¨λ κ²½λ‘μ μμ λ μλμΌλ‘ μμ±λλ λͺ¨λ
JLinkλ‘ μ»€μ€ν λ°νμ μμ±
JLinkλ₯Ό μ¬μ©νλ©΄ μ ν리μΌμ΄μ
μ νμν λͺ¨λλ§ ν¬ν¨ν κ²½λ JREλ₯Ό μμ±ν μ μμ΅λλ€:
jlink --module-path $JAVA_HOME/jmods:out \
--add-modules com.example.app \
--output myruntime \
--launcher myapp=com.example.app/com.example.app.App
Bash
볡μ¬
μμ±λ λ°νμ μ€ν:
./myruntime/bin/myapp
Bash
볡μ¬
μ£Όμμ¬ν
β’
μν μμ‘΄μ±μ νμ©λμ§ μμ΅λλ€.
β’
κ°μ ν¨ν€μ§λ₯Ό μ¬λ¬ λͺ¨λμμ exportν μ μμ΅λλ€ (split package κΈμ§).
β’
리νλ μ
μ μ¬μ©νλ νλ μμν¬(μ: Spring, Hibernate)μ ν¨κ» μ¬μ©ν λλ opens ν€μλκ° νμν μ μμ΅λλ€.




