Search

λͺ¨λ“ˆ

Java λͺ¨λ“ˆ μ‹œμŠ€ν…œ

Java 9λΆ€ν„° λ„μž…λœ λͺ¨λ“ˆ μ‹œμŠ€ν…œ(Module System)은 Java ν”Œλž«νΌ λͺ¨λ“ˆ μ‹œμŠ€ν…œ(JPMS)이라고도 뢈리며, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ 더 μž‘κ³  κ΄€λ¦¬ν•˜κΈ° μ‰¬μš΄ λ‹¨μœ„λ‘œ ꡬ성할 수 있게 ν•©λ‹ˆλ‹€.

λͺ¨λ“ˆμ΄λž€?

λͺ¨λ“ˆμ€ κ΄€λ ¨λœ νŒ¨ν‚€μ§€μ™€ λ¦¬μ†ŒμŠ€λ₯Ό 묢어놓은 λ‹¨μœ„μž…λ‹ˆλ‹€.
각 λͺ¨λ“ˆμ€ module-info.java νŒŒμΌμ„ 톡해 μ •μ˜λ©λ‹ˆλ‹€.

λͺ¨λ“ˆμ˜ μ£Όμš” νŠΉμ§•

β€’
κ°•λ ₯ν•œ μΊ‘μŠν™”: λͺ¨λ“ˆ λ‚΄λΆ€μ˜ νŒ¨ν‚€μ§€λ₯Ό λͺ…μ‹œμ μœΌλ‘œ κ³΅κ°œν•˜μ§€ μ•ŠμœΌλ©΄ μ™ΈλΆ€μ—μ„œ μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.
β€’
λͺ…ν™•ν•œ μ˜μ‘΄μ„±: λͺ¨λ“ˆ κ°„μ˜ 의쑴 관계λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•΄μ•Ό ν•©λ‹ˆλ‹€.
β€’
μ•ˆμ •μ„± ν–₯상: 컴파일 νƒ€μž„μ— μ˜μ‘΄μ„±μ„ κ²€μ¦ν•˜μ—¬ λŸ°νƒ€μž„ 였λ₯˜λ₯Ό μ€„μž…λ‹ˆλ‹€.
β€’
μ„±λŠ₯ κ°œμ„ : ν•„μš”ν•œ λͺ¨λ“ˆλ§Œ λ‘œλ“œν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ‹œμž‘ μ‹œκ°„κ³Ό λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ΅œμ ν™”ν•©λ‹ˆλ‹€.

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 ν‚€μ›Œλ“œκ°€ ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.