πΉ chap14. μλ° λͺ¨λ μμ€ν
μλ° 9μμ κ°μ₯ λ§μ΄ κ±°λ‘ λλ μλ‘μ΄ κΈ°λ₯μ λͺ¨λ μμ€ν μ΄λ€.
14.1 μλ ₯ : μννΈμ¨μ΄ μ μΆ
μ μμ€ μμ : μ μ§λ³΄μνκΈ° μ¬μ΄ μ½λλ₯Ό ꡬν
κ³ μμ€ μμ : κΆκ·Ήμ μΌλ‘ μννΈμ¨μ΄ μν€ν μ²(κ³ μμ€ κΈ°λ° μ½λ)λ₯Ό λ°κΏμΌ ν λ μ μΆνκΈ° μ¬μ°λ―λ‘ μμ°μ±μ λμΌ μ μλ μννΈμ¨μ΄ νλ‘μ νΈκ° νμ
β κ΄μ¬μ¬ λΆλ¦¬μ μ 보 μλ
14.1.1 κ΄μ¬μ¬ λΆλ¦¬
: μ»΄ν¨ν° νλ‘κ·Έλ¨μ κ³ μ μ κΈ°λ₯μΌλ‘ λλλ λμμ κΆμ₯νλ μμΉ
Soc(Seperation of concerns) - κ΄μ¬μ¬ λΆλ¦¬
ex) λ€μν νμμΌλ‘ ꡬμ±λ μ§μΆμ νμ±νκ³ , λΆμν λ€μ κ²°κ³Όλ₯Ό κ³ κ°μκ² μμ½ λ³΄κ³ νλ νκ³ μ ν리μΌμ΄μ κ°λ°
SoC(κ΄μ¬μ¬ λΆλ¦¬)λ₯Ό μ μ©ν¨μΌλ‘ νμ±, λΆμ, λ ν¬νΈ κΈ°λ₯μ λͺ¨λμ΄λΌλ κ°κ°μ λΆλΆ μ¦, μλ‘ κ±°μ κ²ΉμΉμ§ μλ μ½λ κ·Έλ£ΉμΌλ‘ λΆλ¦¬ν μ μλ€.
β ν΄λμ€λ₯Ό κ·Έλ£Ήνν λͺ¨λμ μ΄μ©ν΄ μ ν리μΌμ΄μ μ ν΄λμ€ κ°μ κ΄κ³λ₯Ό μκ°μ μΌλ‘ 보μ¬μ€ μ μλ€.
λͺ¨λΈ, λ·°, 컨νΈλ‘€λ¬ κ°μ μν€ν μ² κ΄μ κ·Έλ¦¬κ³ λ³΅κ΅¬ κΈ°λ²μ λΉμ¦λμ€ λ‘μ§κ³Ό λΆλ¦¬νλ λ±μ νμ μμ€ μ κ·Ό λ±μ μν© β SoC μμΉμ΄ μ μ©
[ SoC μμΉμ μ₯μ ]
- κ°λ³ κΈ°λ₯μ λ°λ‘ μμ ν μ μμΌλ―λ‘ νμ΄ μ½κ² νμ ν μ μλ€.
- κ°λ³ λΆλΆμ μ¬μ¬μ©νκΈ° μ½λ€.
- μ 체 μμ€ν μ μ½κ² μ μ§λ³΄μν μ μλ€.
14.1.2 μ 보 μλ
: μΈλΆ ꡬνμ μ¨κΈ°λλ‘ μ₯λ €νλ μμΉ
μννΈμ¨μ΄λ₯Ό κ°λ°ν λ μꡬμ¬νμ μμ£Ό λ³κ²½λλ€. μΈλΆ ꡬνμ μ¨κΉμΌλ‘ νλ‘κ·Έλ¨μ μ΄λ€ λΆλΆμ λ°κΏ¨μ λ λ€λ₯Έ λΆλΆκΉμ§ μν₯μ λ―ΈμΉ κ°λ₯μ±μ μ€μΌ μ μλ€.
β μ½λλ₯Ό κ΄λ¦¬νκ³ λ³΄νΈνλ λ° μ μ©ν μμΉ
- μΊ‘μν
νΉμ μ½λ μ‘°κ°μ΄ μ ν리μΌμ΄μ μ λ€λ₯Έ λΆλΆκ³Ό κ³ λ¦½λμ΄ μλ€.
μΊ‘μνλ μ½λμ λ΄λΆμ μΈ λ³νκ° μλμΉ μκ² μΈλΆμ μν₯μ λ―ΈμΉ κ°λ₯μ±μ΄ μ€μ΄λ λ€. ν΄λμ€ λ΄μ μ»΄ν¬λνΈμ μ μ ν private ν€μλλ₯Ό μ¬μ©νλμ§λ₯Ό κΈ°μ€μΌλ‘ μ»΄νμΌλ¬λ₯Ό μ΄μ©ν΄ μΊ‘μνλ₯Ό νμΈν μ μλ€.
μλ° 9 μ΄μ κΉμ§λ ν΄λμ€μ ν¨ν€μ§κ° μλλ λλ‘ κ³΅κ°λμλμ§λ₯Ό μ»΄νμΌλ¬λ‘ νμΈν μ μλ κΈ°λ₯μ΄ μμλ€.
14.1.3 μλ° μννΈμ¨μ΄
μ μ€κ³λ μννΈμ¨μ΄λ₯Ό λ§λ€λ €λ©΄ μμ λ κ°μ§ μμΉμ λ°λ₯΄λ κ²μ΄ νμλ€.
μ½λλ§μΌλ‘λ μννΈμ¨μ΄ λμμ μΆλ‘ νκΈ° μ΄λ ΅λ€. λ°λΌμ UML λ€μ΄μ΄κ·Έλ¨κ°μ λꡬλ₯Ό μ΄μ©νλ©΄ κ·Έλ£Ή μ½λ κ°μ μμ‘΄μ±μ μκ°μ μΌλ‘ 보μ¬μ€ μ μμΌλ―λ‘ μννΈμ¨μ΄λ₯Ό μΆλ‘ νλλ° λμμ΄ λλ€.
μ 보μλμ μ΄ν΄λ³΄λ©΄ μλ°μμ public, protected, private λ±μ μ κ·Ό μ νμμ ν¨ν€μ§ μμ€ μ κ·Ό κΆνμ μ΄μ©ν΄ λ©μλ, νλ ν΄λμ€μ μ κ·Όμ μ μ΄νλ€.
νμ§λ§ μ΄λ° λ°©μμΌλ‘λ μνλ μ κ·Ό μ νμ λ¬μ±νκΈ° μ΄λ €μ°λ©° μ¬μ§μ΄ μ΅μ’ μ¬μ©μμκ² μνμ§ μλ λ©μλλ 곡κ°ν΄μΌ νλ μν©μ΄ λ°μνλ€.
14.2 μλ° λͺ¨λ μμ€ν μ μ€κ³ν μ΄μ
14.2.1 λͺ¨λνμ νκ³
μλ° 9 μ΄μ κΉμ§λ λͺ¨λνλ μννΈμ¨μ΄ νλ‘μ νΈλ₯Ό λ§λλ λ° νκ³κ° μμλ€.
μλ°λ ν΄λμ€, ν¨ν€μ§, JAR μΈ κ°μ§ μμ€μ μ½λ κ·Έλ£Ήνλ₯Ό μ 곡νλ€. ν΄λμ€μ κ΄λ ¨ν΄ μλ°λ μ κ·Ό μ νμμ μΊ‘μνλ₯Ό μ§μνλ€.
νμ§λ§ ν¨ν€μ§μ JAR μμ€μμλ μΊ‘μνλ₯Ό κ±°μ μ§μνμ§ μμλ€.
μ νλ κ°μμ± μ μ΄
μλ°μ λ€ κ°μ§ κ°μμ±. μ κ·Όμ
β public, protected, ν¨ν€μ§ μμ€(default) , private
ν¨ν€μ§ κ°μ κ°μμ±μ μ΄λ»κ² μ μ΄ν κΉ?
ν ν¨ν€μ§μ ν΄λμ€μ μΈν°νμ΄μ€λ₯Ό λ€λ₯Έ ν¨ν€μ§λ‘ 곡κ°νλ €λ©΄ publicμ μ μΈν΄μΌ νλ€. κ²°κ³Όμ μΌλ‘ μ΄λ€ ν΄λμ€μ μΈν°νμ΄μ€λ λͺ¨λμκ² κ³΅κ°λλ€.
νΉν κΈ°λ³Έ ꡬνμ μ 곡νλ μλ―Έλ‘ βimplβμ΄λΌλ λ¬Έμμ΄μ κ°μ§ ν¨ν€μ§μμ μ΄λ° λ¬Έμ κ° λλλ¬μ§λ€. μ΄λ° μν©μμ λ³΄ν΅ ν¨ν€μ§ λ΄λΆμ μ κ·Όμ public μ΄λ―λ‘ μ¬μ©μκ° μ΄ λ΄λΆ ꡬνμ λ§μλλ‘ μ¬μ©ν μ μλ€.
β λ€λ₯Έ νλ‘κ·Έλλ¨Έκ° μμμ μΌλ‘ μ¬μ©ν΄ μ μ°©ν΄λ²λ¦΄ μ μμΌλ―λ‘ κΈ°μ‘΄μ μ ν리μΌμ΄μ μ λ§κ°λ¨λ¦¬μ§ μκ³ λΌμ΄λΈλ¬λ¦¬ μ½λλ₯Ό λ°κΎΈκΈ° μ΄λ €μμ§λ€. 보μ μΈ‘λ©΄μμλ μ½λκ° λ ΈμΆλμμΌλ―λ‘ μμλ‘ μ‘°μνλ μνμ λ λ§μ΄ λ ΈμΆλ μ μλ€.
ν΄λμ€ κ²½λ‘
μ ν리μΌμ΄μ μ λ²λ€νκ³ μ€ννλ κΈ°λ₯κ³Ό κ΄λ ¨ν΄ μλ°λ νμμ μΌλ‘ μ½μ μ κ°κ³ μλ€. ν΄λμ€λ₯Ό λͺ¨λ μ»΄νμΌν λ€μ λ³΄ν΅ ν κ°μ νλ²ν JAR νμΌμ λ£κ³ ν΄λμ€ κ²½λ‘μ μ΄ JAR νμΌμ μΆκ°ν΄ μ¬μ©ν μ μλ€. κ·Έλ¬λ©΄ JVMμ΄ λμ μΌλ‘ ν΄λμ€ κ²½λ‘μ μ μλ ν΄λμ€λ₯Ό νμν λ μ½λλ€.
ν΄λμ€ κ²½λ‘μ JAR μ‘°ν©μλ λͺ κ°μ§ μ½μ μ΄ μ‘΄μ¬νλ€.
ν΄λμ€ κ²½λ‘μλ κ°μ ν΄λμ€λ₯Ό ꡬλΆνλ λ²μ κ°λ μ΄ μλ€.
ex) νμ± λΌμ΄λΈλ¬λ¦¬ JSONParser ν΄λμ€λ₯Ό μ§μ ν λ λ²μ 1.0μ μ¬μ©νλμ§ λ²μ 2.0μ μ¬μ©νλμ§ μ§μ ν μκ° μμΌλ―λ‘ ν΄λμ€ κ²½λ‘μ λ κ°μ§ λ²μ μ κ°μ λΌμ΄λΈλ¬λ¦¬κ° μ‘΄μ¬ν λ μ΄λ€ μΌμ΄ μΌμ΄λ μ§ μμΈ‘ν μ μλ€.
λ€μν μ»΄ν¬λνΈκ° κ°μ λΌμ΄λΈλ¬λ¦¬μ λ€λ₯Έ λ²μ μ μ¬μ©νλ μν©μ΄ λ°μν μ μλ ν° μ ν리μΌμ΄μ μμ μ΄λ° λ¬Έμ κ° λλλ¬μ§λ€.
ν΄λμ€ κ²½λ‘λ λͺ μμ μΈ μμ‘΄μ±μ μ§μνμ§ μλλ€.
κ°κ°μ JAR μμ μλ λͺ¨λ ν΄λμ€λ classesλΌλ ν μ£Όλ¨Έλλ‘ ν©μ³μ§λ€. μ¦ ν JARκ° ν¬ν¨λ ν΄λμ€ μ§ν©μ μ¬μ©νλΌκ³ λͺ μμ μΌλ‘ μμ‘΄μ±μ μ μνλ κΈ°λ₯μ μ 곡νμ§ μλλ€. μ΄ μν©μμλ ν΄λμ€ κ²½λ‘ λλ¬Έμ μ΄λ€ μΌμ΄ μΌμ΄λλμ§ νμ νκΈ° μ΄λ €μ°λ©°, λ€μκ³Ό κ°μ μλ¬Έμ΄ λ λ€.
- λΉ μ§ κ² μλκ°?
- μΆ©λμ΄ μλκ°?
λ©μ΄λΈμ΄λ κ·Έλ μ΄λ€ κ°μ λΉλ λꡬλ μ΄λ° λ¬Έμ λ₯Ό ν΄κ²°νλ λ° λμμ μ€λ€.
νμ§λ§ μλ° 9 μ΄μ μλ μλ°, JVM λꡬλ λͺ μμ μΈ μμ‘΄μ± μ μλ₯Ό μ§μνμ§ μμλ€.
14.2.2 κ±°λν JDK
- μλ° κ°λ° ν€νΈ(JDK)
μλ° νλ‘κ·Έλ¨μ λ§λ€κ³ μ€ννλ λ° λμμ μ£Όλ λꡬμ μ§ν©
- javac - μλ° νλ‘κ·Έλ¨ μ»΄νμΌλ¬
- java - μλ° μ ν리μΌμ΄μ μ λ‘λνκ³ μ€ν
- JDK λΌμ΄λΈλ¬λ¦¬ - μ μΆλ ₯μ ν¬ν¨ν΄ λ°νμ μ§μμ μ 곡
- 컬λ μ
- μ€νΈλ¦Ό
λ±μ΄ μλ€.
- μλ° 8μ μ»΄ν©νΈ νλ‘νμΌ κΈ°λ²
κ΄λ ¨ λΆμΌμ λ°λΌ JDKλΌμ΄λΈλ¬λ¦¬κ° μΈ κ°μ§ νλ‘νμΌλ‘ λλμ΄ κ°κ° λ€λ₯Έ λ©λͺ¨λ¦¬ ννλ¦°νΈλ₯Ό μ 곡
14.3 μλ° λͺ¨λ : ν° κ·Έλ¦Ό
μλ° 8λ λͺ¨λμ΄λΌλ μλ‘μ΄ μλ° νλ‘κ·Έλ¨ κ΅¬μ‘° λ¨μλ₯Ό μ 곡νλ€.
moduleμ΄λΌλ μ ν€μλμ μ΄λ¦κ³Ό λ°λλ₯Ό μΆκ°ν΄μ μ μνλ€.
λͺ¨λ λμ€ν¬λ¦½ν°
- module-info.javaλΌλ νΉλ³ν νμΌμ μ μ₯
- λ³΄ν΅ ν¨ν€μ§μ κ°μ ν΄λμ μμΉνλ©° ν κ° μ΄μμ ν¨ν€μ§λ₯Ό μμ νκ³ μΊ‘μνν μ μμ§λ§ λ¨μν μν©μμλ μ΄λ€ ν¨ν€μ§ μ€ ν κ°λ§ μΈλΆλ‘ λ ΈμΆμν΄
μ§μ νΌμ¦μ λΉμ νμλ©΄ exports - λμΆλΆ, requires - ν¨μΈ λΆλΆ μΌλ‘ μκ°ν μ μλ€.
λ©μ΄λΈ κ°μ λꡬλ₯Ό μ¬μ©ν λ λͺ¨λμ λ§μ μΈλΆ μ¬νμ IDEκ° μ²λ¦¬νλ©° μ¬μ©μμκ²λ μ λλ¬λμ§ μλλ€.
14.4 μλ° λͺ¨λ μμ€ν μΌλ‘ μ ν리μΌμ΄μ κ°λ°νκΈ°
14.4.1 μ ν리μΌμ΄μ μ μ
μλ° λͺ¨λ μμ€ν μ μ μ©νκΈ° μν΄ μ½λλ₯Ό ꡬνν μμ νλ‘μ νΈλ‘ μμμ¦ λΉμ© κ΄λ¦¬ μ ν리μΌμ΄μ μ ꡬνν΄λ³΄μ. λ€μκ³Ό κ°μ μ¬λ¬ μμ μ μ²λ¦¬ν΄μΌ νλ€.
- νμΌμ΄λ URLμμ λΉμ© λͺ©λ‘μ μ½λλ€.
- λΉμ©μ λ¬Έμμ΄ ννμ νμ±νλ€.
- ν΅κ³λ₯Ό κ³μ°νλ€.
- μ μ©ν μμ½ μ 보λ₯Ό νμνλ€.
- κ° νμ€ν¬μ μμ, λ§λ¬΄λ¦¬ μ§μ μ μ 곡νλ€.
μ ν리μΌμ΄μ μ κ°λ μ λͺ¨λΈλ§ν μ¬λ¬ ν΄λμ€μ μΈν°νμ΄μ€λ₯Ό μ μν΄μΌ νλ€.
- [ Reader μΈν°νμ΄μ€ ]
μμ€μμ μ»μ΄μ¨ μ§λ ¬νλ μ§μΆμ μ½λ μν
- μμ€κ° μ΄λλμ λ°λΌ HttpReader, FileReader λ± μ¬λ¬ ꡬνμ μ 곡ν΄μΌ νλ€.
- JSON κ°μ²΄λ₯Ό μλ° μ ν리μΌμ΄μ μμ μ¬μ©ν μ μλ λλ©μΈ κ°μ²΄ Expenseλ‘ μ¬κ΅¬μ±ν Parser μΈν°νμ΄μ€λ νμνλ€.
- μ£Όμ΄μ§ Expense κ°μ²΄ λͺ©λ‘μΌλ‘ ν΅κ³λ₯Ό κ³μ°νκ³ SummaryStatistics κ°μ²΄λ₯Ό λ°ννλ SummaryCalculator ν΄λμ€κ° νμνλ€.
νλ‘μ νΈλ₯Ό μ€λΉνμΌλ μλ° λͺ¨λ μμ€ν μΌλ‘ μ΄λ€μ λͺ¨λνν΄μΌ νλ€. νλ‘μ νΈμλ λ€μμ²λΌ λΆλ¦¬ν μ μλ μ¬λ¬ κΈ°λ₯(κ΄μ¬μ¬)μ΄ μλ€.
- λ€μν μμ€μμ λ°μ΄ν°λ₯Ό μ½μ(Reader, HttpReader, FileReader)
- λ€μν ν¬λ§·μΌλ‘ ꡬμ±λ λ°μ΄ν°λ₯Ό νμ±(Parse, JSONParser, ExpenseJSON-Parser)
- λλ©μΈ κ°μ²΄λ₯Ό ꡬ체ν(Expense)
- ν΅κ³λ₯Ό κ³μ°νκ³ λ°ν(SummaryCalculator, SummaryStatics)
- λ€μν κΈ°λ₯μ λΆλ¦¬ μ‘°μ (ExpensesApplication)
κ΅μλ²μ λ°λΌ μμ£Ό μΈλΆμ μΌλ‘ λ¬Έμ λ₯Ό λλλ μ κ·Ό λ°©λ²μ μ΄μ©νλ€. λ€μμ²λΌ κ° κΈ°λ₯μ κ·Έλ£Ήνν μ μλ€(λͺ¨λμ λͺ λͺ ν λ°°κ²½μ λμ€μ μ€λͺ νλ€)
- expenses.readers
- expenses.readers.http
- expenses.readers.file
- expenses.parsers
- expenses.parsers.json
- expenses.model
- expenses.statistics
- expenses.application
μ΄ κ°λ¨ν μ ν리μΌμ΄μ μμ λͺ¨λ μμ€ν μ μ¬λ¬ λΆλΆμ΄ λλλ¬μ§ μ μλλ‘ μκ² λΆν΄νλ€.
κ°λ¨ν νλ‘μ νΈμμ μ΄μ²λΌ μκ² λΆν΄ν΄ μμ κΈ°λ₯κΉμ§ μΊ‘μννλ κ²μ μ₯μ μ λΉν΄ μ΄κΈ° λΉμ©μ΄ λμμ§λ€. νμ§λ§ νλ‘μ νΈκ° μ μ 컀μ§λ©΄μ λ§μ λ΄λΆ ꡬνμ΄ μΆκ°λλ©΄ μ΄λλΆν° μΊ‘μνμ μΆλ‘ μ μ₯μ μ΄ λλλ¬μ§λ€.
μ λͺ©λ‘λ€μ μ ν리μΌμ΄μ κ²½κ³μ μμ‘΄νλ ν¨ν€μ§ λͺ©λ‘μΌλ‘ μκ°ν μ μλ€. μλ§ κ° λͺ¨λμ λ€λ₯Έ λͺ¨λλ‘ λ ΈμΆνκ³ μΆμ§ μλ λ΄λΆ ꡬνμ ν¬ν¨ν κ²μ΄λ€.
ex) expenses.statistics λͺ¨λμ μ€νμ μΈ ν΅κ³ λ°©λ²μ λ€λ₯Έ λ°©λ²μΌλ‘ ꡬνν μ¬λ¬ ν¨ν€μ§λ₯Ό ν¬ν¨ν μ μλ€. μ΄λ€ ν¨ν€μ§μμ μ΄λ€ κ²μ μ¬μ©μμκ² λ¦΄λ¦¬μ€ν μ§λ λμ€μ κ²°μ ν μ μλ€.
14.4.2 μΈλΆμ μΈ λͺ¨λνμ κ±°μΉ λͺ¨λν
μΈλΆμ μΈ λͺ¨λν
: λͺ¨λ ν¨ν€μ§κ° μμ μ λͺ¨λμ κ°λλ€.
β μ€κ³ λΉμ© μ¦κ°
κ±°μΉ λͺ¨λν
: ν λͺ¨λμ΄ μμ€ν μ λͺ¨λ ν¨ν€μ§λ₯Ό ν¬ν¨νλ€.
β λͺ¨λνμ λͺ¨λ μ₯μ μ μμ
κ°μ₯ μ’μ λ°©λ²μ μμ€ν μ μ€μ©μ μΌλ‘ λΆν΄νλ©΄μ μ§ννλ μννΈμ¨μ΄ νλ‘μ νΈκ° μ΄ν΄νκΈ° μ½κ³ κ³ μΉκΈ° μ¬μ΄ μμ€μΌλ‘ μ μ νκ² λͺ¨λνλμ΄ μλμ§ μ£ΌκΈ°μ μΌλ‘ νμΈνλ νλ‘μΈμ€λ₯Ό κ°λ κ²μ΄λ€.
λͺ¨λν = μννΈμ¨μ΄ λΆμμ μ
14.4.3 μλ° λͺ¨λ μμ€ν κΈ°μ΄
λ©μΈ μ ν리μΌμ΄μ μ μ§μνλ ν κ°μ λͺ¨λλ§ κ°λ κΈ°λ³Έμ λͺ¨λν μ ν리μΌμ΄μ
module-info.javaλΌλ νμΌμ΄ νλ‘μ νΈ κ΅¬μ‘°μ μΌλΆμ ν¬ν¨λμ΄ μλ€. μ΄ νμΌμ μμμ μ€λͺ ν λͺ¨λ λμ€ν¬λ¦½ν°λ‘ λͺ¨λμ μμ€μ½λ νμΌ λ£¨νΈμ μμΉν΄μΌ νλ©° λͺ¨λμ μμ‘΄μ± κ·Έλ¦¬κ³ μ΄λ€ κΈ°λ₯μ μΈλΆλ‘ λ ΈμΆν μ§λ₯Ό μ μνλ€.
μ§μΆ μ ν리μΌμ΄μ μμ μμλ μμ§ λ€λ₯Έ λͺ¨λμ μμ‘΄νκ±°λ μΈλΆλ‘ λ ΈμΆνλ κΈ°λ₯μ΄ μμΌλ―λ‘ μ΅μμ μμ€μ module-info.java νμΌμ μ΄λ¦λ§ μ μλμ΄ μμ λΏ λ΄μ©μ λΉμ΄μλ€.
1
2
3
4
// νμ¬ module-info.java
module expenses.application {
}
[ λͺ¨λν μ ν리μΌμ΄μ μ€ν λ°©λ² ]
νλ‘μ νΈμ λͺ¨λ μμ€ λλ ν°λ¦¬μμ λ€μ λͺ λ Ήμ μ€ννλ€.
1
2
javac module-info.java
com/example/expenses/application/ExpensesApplication.java -d target
1
2
jar cvfe expenses-application.jar
com.example.expenses.application.ExpensesApplication -C target
κ·ΈλΌ μ΄λ€ ν΄λμ ν΄λμ€ νμΌμ΄ μμ±λ JAR(expenses-application.jar)μ ν¬ν¨λμ΄ μλμ§λ₯Ό 보μ¬μ£Όλ λ€μκ³Ό κ°μ κ²°κ³Όκ° μΆλ ₯λλ€.
1
2
3
4
5
6
7
added manifest
added module-info: module-info.class adding: com/(in = 0) (out= 0)(stored 0%)
adding: com/example/(in = 0) (out= 0)(stored 0%)
adding: com/example/expenses/(in = 0) (out= 0)(stored 0%)
adding: com/example/expenses/application/(in = 0) (out= 0)(stored 0%)
adding: com/example/expenses/application/ExpensesApplicatioin.class(in = 456)
(out= 306)(deflated 32%)
λ§μ§λ§μΌλ‘ μμ±λ JARλ₯Ό λͺ¨λν μ ν리μΌμ΄μ μΌλ‘ μ€ννλ€.
1
2
java --module-path expenses-application.jar \
--module expenses/com.example.expenses.application.ExpensesApplication
μ²μ λ κ³Όμ μ μλ° μ ν리μΌμ΄μ μ JARλ‘ ν¨ν€μ§νλ νμ€ λ°©λ²μ΄λ―λ‘ μ΄λ―Έ μ΅μν κ²μ΄λ€. μλ‘μ΄ λΆλΆμ μ»΄νμΌ κ³Όμ μ μλ‘ μΆκ°λ module-info.javaλ€.
java νλ‘κ·Έλ¨μΌλ‘ μλ° .class νμΌμ μ€νν λ λ€μκ³Ό κ°μ λ κ°μ§ μ΅μ μ΄ μλ‘ μΆκ°λμλ€.
--module-path
: μ΄λ€ λͺ¨λμ λ‘λν μ μλμ§ μ§μ νλ€. μ΄ μ΅μ μ ν΄λμ€ νμΌμ μ§μ νλ--classpath
μΈμμλ λ€λ₯΄λ€.--module
: μ΄ μ΅μ μ μ€νν λ©μΈ λͺ¨λκ³Ό ν΄λμ€λ₯Ό μ§μ νλ€.
λͺ¨λ μ μλ λ²μ λ¬Έμμ΄μ ν¬ν¨νμ§ μλλ€.
μλ° 9 λͺ¨λ μμ€ν μμ λ²μ μ ν λ¬Έμ λ₯Ό ν¬κ² κ³ λ €νμ§ μμκ³ λ°λΌμ λ²μ κΈ°λ₯μ μ§μνμ§ μλλ€. λμ λ²μ λ¬Έμ λ λΉλ λꡬλ 컨ν μ΄λ μ ν리μΌμ΄μ μμ ν΄κ²°ν΄μΌ ν λ¬Έμ λ‘ λκ²Όλ€.
14.5 μ¬λ¬ λͺ¨λ νμ©νκΈ°
λͺ¨λμ μ΄μ©ν κΈ°λ³Έ μ ν리μΌμ΄μ μ μ€μ νλ€.
λΉμ© μ ν리μΌμ΄μ μ΄ μμ€μμ λΉμ©μ μ½μ μ μμ΄μΌ νλ€. μ΄ κΈ°λ₯μ μΊ‘μνν expense.readerλΌλ μ λͺ¨λμ λ§λ€ κ²μ΄λ€. expenses.applicationμ expenses.readers λ λͺ¨λκ°μ μνΈ μμ©μ μλ° 9μμ μ§μ ν export, requiresλ₯Ό μ΄μ©ν΄ μ΄λ£¨μ΄μ§λ€.
14.5.1 exports ꡬ문
λ€μμ expenses.readers λͺ¨λμ μ μΈμ΄λ€.
1
2
3
4
5
6
module expenses.readers {
// μ΄λ€μ λͺ¨λλͺ
μ΄ μλλΌ ν¨ν€μ§λͺ
exports com.example.expenses.readers;
exports com.example.expenses.readers.file;
exports com.example.expenses.readers.http;
}
exports β λ€λ₯Έ λͺ¨λμμ μ¬μ©ν μ μλλ‘ νΉμ ν¨ν€μ§λ₯Ό κ³΅κ° νμμΌλ‘ λ§λ λ€.
κΈ°λ³Έμ μΌλ‘ λͺ¨λ λ΄μ λͺ¨λ κ²μ μΊ‘μν λλ€. λͺ¨λ μμ€ν μ νμ΄νΈ 리μ€νΈ κΈ°λ²μ μ΄μ©ν΄ κ°λ ₯ν μΊ‘μνλ₯Ό μ 곡νλ―λ‘ λ€λ₯Έ λͺ¨λμμ μ¬μ©ν μ μλ κΈ°λ₯μ΄ λ¬΄μμΈμ§ λͺ μμ μΌλ‘ κ²°μ ν΄μΌ νλ€(μ΄ μ κ·Όλ²μ μ€μλ‘ μ΄λ€ κΈ°λ₯μ μΈλΆλ‘ λ ΈμΆν¨μΌλ‘ λͺ λ μ΄ μ§λ λ€μ ν΄μ»€κ° μμ€ν μ λ¨μ©ν μ¬μ§λ₯Ό λ°©μ§νλ€).
νλ‘μ νΈμ λ λͺ¨λμ λλ ν°λ¦¬ ꡬ쑰λ λ€μκ³Ό κ°λ€.
14.5.2 requires ꡬ문
λλ λ€μμ²λΌ module-info.javaλ₯Ό ꡬνν μ μλ€.
1
2
3
4
5
6
7
module expenses.readers {
requires java.base; // ν¨ν€μ§λͺ
μ΄ μλλΌ λͺ¨λλͺ
μ΄λ€.
exports com.example.expenses.readers;
exports com.example.expenses.readers.file;
exports com.example.expenses.readers.http;
}
requires β μμ‘΄νκ³ μλ λͺ¨λμ μ§μ νλ€.
κΈ°λ³Έμ μΌλ‘ λͺ¨λ λͺ¨λμ java.baseλΌλ νλ«νΌ λͺ¨λμ μμ‘΄νλλ° μ΄ νλ«νΌ λͺ¨λμ net, io, util λ± μλ°μ λ©μΈ ν¨ν€μ§λ₯Ό ν¬ν¨νλ€. (νμ κΈ°λ³Έμ μΌλ‘ νμν λͺ¨λμ΄λ―λ‘ java.baseλ λͺ μμ μΌλ‘ μ μν νμκ° μλ€.)
μλ°μμ βclass Foo extends Object { β¦ }βμ²λΌ νμ§ μκ³ βclass Foo { β¦ }βμ²λΌ ν΄λμ€λ₯Ό μ μνλ κ²κ³Ό κ°μ μ리λ€.
λ°λΌμ java.base μΈμ λͺ¨λμ μν¬νΈν λ requiresλ₯Ό μ¬μ©νλ€.
μλ° 9μμλ requiresμ exports ꡬ문μ μ΄μ©ν΄ μ’ λ μ κ΅νκ² ν΄λμ€ μ κ·Όμ μ μ΄ν μ μλ€. μλλ μλ° 9 μ΄μ κ³Ό μ΄νμ μ κ·Όμμ κ°μμ± λ³νλ₯Ό 보μ¬μ€λ€.
14.5.3 μ΄λ¦ μ νκΈ°
μ€λΌν΄
β ν¨ν€μ§λͺ μ²λΌ μΈν°λ· λλ©μΈλͺ μ μμ(ex. com.iteratrlearning.training)μΌλ‘ λͺ¨λμ μ΄λ¦μ μ νλλ‘ κΆκ³ νλ€. λμ±μ΄ λͺ¨λλͺ μ λ ΈμΆλ μ£Όμ API ν¨ν€μ§μ μ΄λ¦μ΄ κ°μμΌ νλ€λ κ·μΉλ λ°λΌμΌ νλ€.
λͺ¨λμ΄ ν¨ν€μ§λ₯Ό ν¬ν¨νμ§ μκ±°λ μ΄λ€ λ€λ₯Έ μ΄μ λ‘ λ ΈμΆλ ν¨ν€μ§ μ€ νλμ μ΄λ¦μ΄ μΌμΉνμ§ μλ μν©μ μ μΈνλ©΄ λͺ¨λλͺ μ μμ±μμ μΈν°λ· λλ©μΈ λͺ μ μμμΌλ‘ μμν΄μΌ νλ€.
14.6 μ»΄νμΌκ³Ό ν¨ν€μ§
λ¨Όμ κ° λͺ¨λμ pom.xmlμ μΆκ°ν΄μΌ νλ€. μ¬μ€ κ° λͺ¨λμ λ 립μ μΌλ‘ μ»΄νμΌλλ―λ‘ μ체μ μΌλ‘ κ°κ°μ΄ ν κ°μ νλ‘μ νΈλ€. μ 체 νλ‘μ νΈ λΉλλ₯Ό μ‘°μ ν μ μλλ‘ λͺ¨λ λͺ¨λμ λΆλͺ¨ λͺ¨λμλ pom.xmlμ μΆκ°νλ€. μ 체 ꡬ쑰λ λ€μκ³Ό κ°λ€.
μ΄λ κ² 3κ°μ pom.xml νμΌμ μΆκ°ν΄ λ©μ΄λΈ λλ ν°λ¦¬ νλ‘μ νΈ κ΅¬μ‘°λ₯Ό μμ±νλ€. λͺ¨λ λμ€ν¬λ¦½ν°(module-info.java)λ src/main/java λλ ν°λ¦¬μ μμΉν΄μΌ νλ€. μ¬λ°λ₯Έ λͺ¨λ μμ€ κ²½λ‘λ₯Ό μ΄μ©νλλ‘ λ©μ΄λΈμ΄ javacλ₯Ό μ€μ νλ€.
λ€μμ expenses.readers νλ‘μ νΈμ pom.xml λͺ¨μ΅μ΄λ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0,0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>expenses.readers</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<parent>
<groupId>com.example</groupId>
<artifactId>expenses</artifactId>
<version>1.0</version>
</parent>
</project>
μμ‘°λ‘κ² λΉλλ μ μλλ‘ λͺ μμ μΌλ‘ λΆλͺ¨ λͺ¨λμ μ§μ ν μ½λλ₯Ό 보μ.
λΆλͺ¨λ ID expensesλ₯Ό ν¬ν¨νλ λΆμ°λ¬Ό(artifact)μ΄λ€. pom.xmlμ λΆλͺ¨λ₯Ό μ μν΄μΌ νλ€.
λ€μμΌλ‘ expenses.application λͺ¨λμ pom.xmlμ μ μνλ€. μ΄ νμΌμ μ΄μ νμΌκ³Ό λΉμ·νμ§λ§ ExpenseApplicationμ΄ νμλ‘ νλ ν΄λμ€μ μΈν°νμ΄μ€κ° μμΌλ―λ‘ expenses.readersλ₯Ό μμ‘΄μ±μΌλ‘ μΆκ°ν΄μΌ νλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0,0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>expenses.application</artifactId>
<version>1.0</version>
<packaging>jar</packaging>
<parent>
<groupId>com.example</groupId>
<artifactId>expenses</artifactId>
<version>1.0</version>
</parent>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>expenses.readers</artifactId>
<version>1.0</version>
</dependency>
</dependencies>
</project>
expenses.applicationκ³Ό expenses.readers λ λͺ¨λμ pom.xmlμ μΆκ°νμΌλ―λ‘ μ΄μ λΉλ κ³Όμ μ κ°μ΄λν μ μ pom.xmlμ μ€μ ν μ°¨λ‘λ€.
λ©μ΄λΈμ νΉλ³ν XML μμ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0,0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>expenses</artifactId>
<packaging>pom</packaging>
<version>1.0</version>
<modules>
<module>expenses.application</module>
<module>expenses.readers</module>
</modules>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>9</source>
<target>9</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
mvn clean package λͺ λ Ήμ μ€νν΄μ νλ‘μ νΈμ λͺ¨λμ JARλ‘ λ§λ€ μ μλ€. λ€μκ³Ό κ°μ λΆμ°λ¬Όμ΄ λ§λ€μ΄μ§λ€.
1
2
./expenses.application/target/expenses.application-1.0.jar
./expenses.readers/target/expenses.readers-1.0.jar
λ JARμ λ€μμ²λΌ λͺ¨λ κ²½λ‘μ ν¬ν¨ν΄μ λͺ¨λ μ ν리μΌμ΄μ μ μ€νν μ μλ€.
1
2
3
4
5
java --module-path \
./expenses.application/target/expenses.application-1.0.jar:\
./expenses.readers/target/expenses.readers-1.0.jar \
--module \
expenses.application/com.example.expenses.application.ExpensesApplication
μ§κΈκΉμ§ λͺ¨λμ λ§λλ λ°©λ²μ λ°°μ μΌλ©° requiresλ‘ java.baseλ₯Ό μ°Έμ‘°νλ λ°©λ²λ μ΄ν΄λ΄€λ€.
μ€μ λ‘λ java.base λμ μΈλΆ λͺ¨λκ³Ό λΌμ΄λΈλ¬λ¦¬λ₯Ό μ°Έμ‘°ν΄μΌ νλ€.
14.7 μλ λͺ¨λ
HttpReaderλ₯Ό μ μμ€μΌλ‘ ꡬννμ§ μκ³ μνμΉ νλ‘μ νΈμ httpclient κ°μ νΉν λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©ν΄ ꡬννλ€κ³ κ°μ νμ λ, μ΄λ° λΌμ΄λΈλ¬λ¦¬λ₯Ό νλ‘μ νΈμ μΆκ°νλ €κ³ νλ€.
requires ꡬ문μ λ°°μ μΌλ―λ‘ expenses.readers νλ‘μ νΈμ module-info.javaμ μ΄ κ΅¬λ¬Έμ μΆκ°νλ€. mvn clean packageλ₯Ό λ€μ μ€ννλ©΄ λ€μκ³Ό κ°μ μλ¬κ° λ°μνλ€.
1
[ERROR] module not found: httpclient
μμ‘΄μ±μ κΈ°μ νλλ‘ pom.xmlλ κ°±μ ν΄μΌ νλ―λ‘ μλ¬κ° λ°μνλ κ²μ΄λ€.
λ©μ΄λΈ μ»΄νμΌλ¬ νλ¬κ·ΈμΈμ module-info.javaλ₯Ό ν¬ν¨νλ νλ‘μ νΈλ₯Ό λΉλν λ λͺ¨λ μμ‘΄μ± λͺ¨λμ κ²½λ‘μ λμ μ μ ν JARλ₯Ό λ΄λ €λ°κ³ μ΄λ€μ΄ νλ‘μ νΈμ μΈμλλλ‘ νλ€. λ€μκ³Ό κ°μ μμ‘΄μ±μ΄ νμνλ€.
1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.3</version>
</dependency>
</dependencies>
λ€μ mvn clean packageλ₯Ό μ€ννλ©΄ νλ‘μ νΈκ° μ¬λ°λ‘ λΉλλλ€. νμ§λ§ httpclientλ μλ° λͺ¨λμ΄ μλλ€.
httpclientλ μλ° λͺ¨λλ‘ μ¬μ©νλ €λ μΈλΆ λΌμ΄λΈλ¬λ¦¬μΈλ° λͺ¨λνκ° λμ΄ μμ§ μμ λΌμ΄λΈλ¬λ¦¬λ€. μλ°λ JARλ₯Ό μλ λͺ¨λμ΄λΌλ ννλ‘ μ μ νκ² λ³ννλ€. λͺ¨λ κ²½λ‘μμ μμΌλ module-info νμΌμ κ°μ§μ§ μμ λͺ¨λ JARλ μλ λͺ¨λμ΄ λλ€.
μλ λͺ¨λμ μ묡μ μΌλ‘ μμ μ λͺ¨λ ν¨ν€μ§λ₯Ό λ
ΈμΆμν¨λ€. μλ λͺ¨λμ μ΄λ¦μ JAR μ΄λ¦μ μ΄μ©ν΄ μ ν΄μ§λ€. jar λꡬμ --describe-module
μΈμλ₯Ό μ΄μ©ν΄ μλμΌλ‘ μ ν΄μ§λ μ΄λ¦μ λ°κΏ μ μλ€.
1
2
jar --file=./expenses.readders/target/dependency/httpclient-4.5.3.jar \
--describe-module httpclient@4.5.3 automatic
κ·Έλ¬λ©΄ httpclientλΌλ μ΄λ¦μΌλ‘ μ μλλ€.
λ§μ§λ§μΌλ‘ httpclient JARλ₯Ό λͺ¨λ κ²½λ‘μ μΆκ°ν λ€μ μ ν리μΌμ΄μ μ μ€ννλ€.
1
2
3
4
5
6
java --module-path \
./expenses.application/target/expenses.application-1.0.jar: \
./expenses.readers/target/expenses.readers-1.0.jar \
./expenses.readers/target/dependency/httpclient-4.5.3.jar \
--module \
expenses.application/com.example.expenses.application.ExpensesApplication
14.8 λͺ¨λ μ μμ ꡬ문λ€
module μ§μμ΄λ₯Ό μ΄μ©νλ©΄ λͺ¨λμ μ μν μ μλ€. λ€μμ com.iteratrlearning.applicationλΌλ λͺ¨λλͺ μ μμ λ€.
1
2
3
module com.iteratrlearning.application {
}
requires, exports ꡬ문 μ΄μΈμλ requires-transitive, exports-to, open, opens, uses, provides κ°μ λ€λ₯Έ ꡬ문λ€λ μλ€.