- Java μ§μμμ EJB(Enterprise Java Beans, = J2EE)λΌλ νμ€ κΈ°μ μ΄ μμμ
- μ¬λ¬ κΈ°λ₯μ μ 곡νμ§λ§ λΉμΈκ³ μ΄λ ΅κ³ 볡μ‘νκ³ λλ Έλ€ (νλ§λλ‘ μ§μ₯)
- λ무 EJBμ μμ‘΄μ μ΄κ³ 볡μ‘νλ€λ³΄λ POJO(Plain Old Java Object)κ° λμ€κΈ°λ νλ€
- κ³ ν΅λ°λ μ λ°° κ°λ°μλ€μ΄ EJBλ₯Ό λΉννλ©° Spring, Hibernate κ°μ κ²λ€μ λ§λ€μ΄λ
- νμ
- μ€νλ§ νλ μμν¬
- μ€νλ§ λΆνΈ
- μ ν
- μ€νλ§ λ°μ΄ν°
- μ€νλ§ μΈμ
- μ€νλ§ μν리ν°
- μ€νλ§ Rest Docs
- μ€νλ§ λ°°μΉ
- μ€νλ§ ν΄λΌμ°λ...
β ν΅μ¬μ μ€νλ§ νλ μμν¬κ³ μ΄λ₯Ό μ½κ² μ¬μ©ν μ μκ² νλκ² μ€νλ§ λΆνΈλ€
-
μ€νλ§ νλ μμν¬
- ν΅μ¬ κΈ°μ : μ€νλ§ DI 컨ν μ΄λ, AOP, μ΄λ²€νΈ, κΈ°ν
- μΉ κΈ°μ : μ€νλ§ MVC, μ€νλ§ WebFlux
- λ°μ΄ν° μ κ·Ό κΈ°μ : νΈλμμ , JDBC, ORM μ§μ, XML μ§μ
- κΈ°μ ν΅ν©: μΊμ, μ΄λ©μΌ, μ격μ κ·Ό, μ€μΌμ€λ§
- ν μ€νΈ: μ€νλ§ κΈ°λ° ν μ€νΈ μ§μ
- μΈμ΄: μ½νλ¦°, 그루λΉ
-
μ€νλ§ λΆνΈ
- μ€νλ§μ νΈλ¦¬νκ² μ¬μ©ν μ μλλ‘ μ§μ, μ΅κ·Όμλ κΈ°λ³ΈμΌλ‘ μ¬μ©
- λ¨λ μΌλ‘ μ€νν μ μλ μ€νλ§ μ ν리μΌμ΄μ μ μ½κ² μμ±
- Tomcat κ°μ μΉ μλ²λ₯Ό λ΄μ₯ν΄μ λ³λμ μΉ μλ²λ₯Ό μ€μΉνμ§ μμλ λ¨
- μμ¬μ΄ λΉλ ꡬμ±μ μν starter μ’ μμ± μ 곡
- μ€νλ§κ³Ό 3rd parth(μΈλΆ) λΌμ΄λΈλ¬λ¦¬ μλ κ΅¬μ± (μΈλΆ λΌμ΄λΈλ¬λ¦¬ λ²μ κ° λ¬Έμ κ° μλλ‘λ¨)
- λ©νΈλ¦, μννμΈ, μΈλΆ κ΅¬μ± κ°μ νλ‘λμ μ€λΉ κΈ°λ₯ μ 곡
- κ΄λ‘μ μν κ°κ²°ν μ€μ
-
μ€νλ§
- μ€νλ§ DI 컨ν μ΄λ κΈ°μ
- μ€νλ§ νλ μμν¬
- μ€νλ§ λΆνΈ, μ€νλ§ νλ μμν¬ λ±μ λͺ¨λ ν¬ν¨ν μ€νλ§ μνκ³
-
μ€νλ§μ μ§μ§ ν΅μ¬
- μ€νλ§μ μλ° μΈμ΄ κΈ°λ°μ νλ μμν¬
- μλ° μΈμ΄μ κ°μ₯ ν° νΉμ§ - κ°μ²΄ μ§ν₯
- μ€νλ§μ κ°μ²΄ μ§ν₯ μΈμ΄κ° κ°μ§ κ°λ ₯ν νΉμ§μ μ΄λ €λ΄λ νλ μμν¬
- μ€νλ§μ μ’μ κ°μ²΄ μ§ν₯ μ ν리μΌμ΄μ μ κ°λ°ν μ μκ² λμμ£Όλ νλ μμν¬
-
κ°μ²΄μ§ν₯ νΉμ§
- μΆμν
- μΊ‘μν
- μμ
- λ€νμ± (μν κ³Ό ꡬν)
-
κ°μ²΄λ€μ λͺ¨μ, λ©μμ§λ₯Ό μ£Όκ³ λ°μΌλ©° νλ ₯
-
μ μ°νκ³ λ³κ²½μ μ©μ΄
-
μλμ°¨ μν μ λ€λ₯Έ μλμ°¨λ€μ΄ λ체
-
λ‘λ―Έμ€, μ€λ¦¬μ£ μν μ λ€λ₯Έ λ°°μ°λ€μ΄ λ체
-
μν κ³Ό ꡬνμ λΆλ¦¬
- μν κ³Ό ꡬνμΌλ‘ ꡬλΆνλ©΄ λ¨μν΄μ§κ³ , μ μ°ν΄μ§λ©° λ³κ²½λ νΈλ¦¬ν΄μ§
- ν΄λΌμ΄μΈνΈλ μν (μΈν°νμ΄μ€)λ§ μλ©΄λλ€
- ν΄λΌμ΄μΈνΈλ ꡬν λμμ λ΄λΆ ꡬ쑰λ₯Ό λͺ°λΌλ λλ€
- ν΄λΌμ΄μΈνΈλ ꡬν λμμ λ΄λΆ κ΅¬μ‘°κ° λ³κ²½λμ΄λ μν₯μ λ°μ§ μλλ€
- ν΄λΌμ΄μΈνΈλ ꡬνλμμ μ체λ₯Ό λ³κ²½ν΄λ μν₯ λ°μ§ μλλ€
-
μλ° μΈμ΄μ λ€νμ±μ νμ©
- μν = μΈν°νμ΄μ€
- ꡬν = μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€, ꡬν κ°μ²΄
- κ°μ²΄λ₯Ό μ€κ³ν λ μν κ³Ό ꡬνμ λͺ νν λΆλ¦¬
- κ°μ²΄ μ€κ³μ μν (μΈν°νμ΄μ€)λ₯Ό λ¨Όμ λΆμ¬νκ³ μν μ μννλ ꡬνκ°μ²΄ λ§λ€κΈ°
-
νΌμ μλ κ°μ²΄λ μλ€
-
μ λ§μ κ°μ²΄ ν΄λΌμ΄μΈνΈμ κ°μ²΄ μλ²λ μλ‘ νλ ₯ κ΄κ³λ₯Ό κ°μ§λ€
-
λ€νμ±μ λ³Έμ§ (λ€νμ±μ΄ κ°μ₯ μ€μνλ€!)
- μΈν°νμ΄μ€λ₯Ό ꡬνν κ°μ²΄ μΈμ€ν΄μ€λ₯Ό μ€ν μμ μ μ μ°νκ² λ³κ²½ν μ μλ€
- λ€νμ±μ λ³Έμ§μ μ΄ν΄νλ €λ©΄ νλ ₯μ΄λΌλ κ°μ²΄μ¬μ΄μ κ΄κ³μμ μμν΄μΌν¨
- ν΄λΌμ΄μΈνΈλ₯Ό λ³κ²½νμ§ μκ³ , μλ² κ΅¬ν κΈ°λ₯μ μ μ°νκ² λ³κ²½ν μ μλ€
-
usb a, usb c, λ³ν μ λλ₯Ό λΉμ ν΄μ κ°μ²΄μ§ν₯ μ€λͺ
-
μ€νλ§μ λ€νμ±μ κ·Ήλνν΄μ μ΄μ©ν μ μκ² λμμ€λ€
-
μ€νλ§μμ μ΄μΌκΈ°νλ μ μ΄μ μμ (IoC), μμ‘΄κ΄κ³ μ£Όμ (DI)μ λ€νμ±μ νμ©ν΄μ μν κ³Ό ꡬνμ νΈλ¦¬νκ² λ€λ£° μ μλλ‘ μ§μνλ€
-
μ€νλ§μ μ¬μ©νλ©΄ λ§μΉ λ κ³ λΈλ 쑰립νλ―μ΄! κ³΅μ° λ¬΄λμ λ°°μ°λ₯Ό μ ννλ―μ΄! ꡬνμ νΈλ¦¬νκ² λ³κ²½ν μ μλ€
λ€νμ±κ³Ό SOLIDκ° μ€μν¨
-
SRP λ¨μΌ μ± μ μμΉ
- ν ν΄λμ€λ νλμ μ± μλ§ κ°μ ΈμΌ νλ€
- νλμ μ± μμ΄λΌλ κ²μ λͺ¨νΈ (ν΄μλ, μμμλ λ¬Έλ§₯κ³Ό μν©μ λ°λΌ λ€λ¦)
- μ€μν κΈ°μ€μ λ³κ²½μ΄λ€. λ³κ²½μ΄ μμλ νκΈν¨κ³Όκ° μ μΌλ©΄ λ¨μΌ μ±
μ μμΉμ μ λ°λ₯Έκ²
- UI λ³κ²½, κ°μ²΄μ μμ±κ³Ό μ¬μ©μ λΆλ¦¬
-
OCP κ°λ°©-νμ μμΉ (κ°μ₯ μ€μ)
- μννΈμ¨μ΄ μμλ νμ₯μλ μ΄λ € μμΌλ λ³κ²½μλ λ«ν μμ΄μΌ νλ€ (κΈ°μ‘΄ μ½λλ κ·Έλλ‘ μ κΈ°λ₯λ§ μΆκ°)
- λ€νμ±μ νμ©
- μΈν°νμ΄μ€λ₯Ό ꡬνν μ ν΄λμ€λ₯Ό νλ λ§λ€μ΄μ μ κΈ°λ₯μ ꡬν (μν κ³Ό ꡬνμ λΆλ¦¬)
- λ¬Έμ μ
MemberRepository m = new MemoryMemberRepository();MemberRepository m = new JdbcMemberRepository();- ꡬν κ°μ²΄λ₯Ό λ³κ²½νλ €λ©΄ ν΄λΌμ΄μΈνΈ μ½λλ₯Ό λ³κ²½ν΄μΌ ν¨
- λ€νμ±μ μ¬μ©νμ§λ§ OCP μμΉμ μ§ν¬ μ μμ
- κ°μ²΄λ₯Ό μμ±νκ³ μ°κ΄κ΄κ³λ₯Ό λ§Ίμ΄μ£Όλ λ³λμ 쑰립, μ€μ μκ° νμ
-
LSP 리μ€μ½ν μΉν λ²μΉ
- νλ‘κ·Έλ¨μ κ°μ²΄λ νλ‘κ·Έλ¨μ μ νμ±μ κΉ¨λ¨λ¦¬μ§ μμΌλ©΄μ νμ νμ μ μΈμ€ν΄μ€λ‘ λ°κΏ μ μμ΄μΌ νλ€
- λ€νμ±μμ νμ ν΄λμ€λ μΈν°νμ΄μ€ κ·μ½μ λ€ μ§μΌμΌ νλ€λ κ², λ€νμ±μ μ§μνκΈ° μν μμΉ, μΈν°νμ΄μ€λ₯Ό ꡬνν ꡬν체λ λ―Ώκ³ μ¬μ©νλ €λ©΄ μ΄ μμΉμ΄ νμ
- λ¨μν μ»΄νμΌμ μ±κ³΅νλ κ²μ λμ΄μλ μ΄μΌκΈ°
- μ) μλμ°¨ μΈν°νμ΄μ€μ μμ μ μμΌλ‘ κ°λΌλ κΈ°λ₯, λ€λ‘ κ°κ² ꡬννλ©΄ LSP μλ°, λ리λλΌλ μμΌλ‘ κ°μΌν¨
-
ISP μΈν°νμ΄μ€ λΆλ¦¬ μμΉ
- νΉμ ν΄λΌμ΄μΈνΈλ₯Ό μν μΈν°νμ΄μ€ μ¬λ¬κ°κ° λ²μ© μΈν°νμ΄μ€ νλλ³΄λ€ λ«λ€
- μλμ°¨ μΈν°νμ΄μ€ β μ΄μ μΈν°νμ΄μ€, μ λΉ μΈν°νμ΄μ€λ‘ λΆλ¦¬
- μ¬μ©μ ν΄λΌμ΄μΈνΈ β μ΄μ μ ν΄λΌμ΄μΈνΈ, μ λΉμ¬ ν΄λΌμ΄μΈνΈλ‘ λΆλ¦¬
- λΆλ¦¬νλ©΄ μ λΉ μΈν°νμ΄μ€ μμ²΄κ° λ³ν΄λ μ΄μ μ ν΄λΌμ΄μΈνΈμ μν₯μ μ£Όμ§ μμ
- μΈν°νμ΄μ€κ° λͺ νν΄μ§κ³ , λ체 κ°λ₯μ±μ΄ λμμ§λ€
-
DIP μμ‘΄κ΄κ³ μμ μμΉ (λλ²μ§Έλ‘ μ€μ!)
- νλ‘κ·Έλλ¨Έλ μΆμνμ μμ‘΄ν΄μΌμ§ ꡬ체νμ μμ‘΄νλ©΄ μλλ€ (μμ‘΄μ± μ£Όμ )
- μ½κ² μ΄μΌκΈ°ν΄μ ꡬν ν΄λμ€μ μμ‘΄νμ§ λ§κ³ , μΈν°νμ΄μ€μ μμ‘΄νλΌλ λ»
- μν μ μμ‘΄νκ² ν΄μΌ νλ€λ κ²κ³Ό κ°λ€ (ꡬν체μ μμ‘΄νλ©΄ λ³κ²½μ΄ λ§€μ° μ΄λ €μμ§)
β κ°μ²΄μ§ν₯μ ν΅μ¬μ λ€νμ±μ΄μ§λ§ λ€νμ±λ§ κ°μ§κ³ λ SOLID (OCP, DIP)λ₯Ό λ§μ‘±ν μ μλ€
- μ€νλ§μ λ€μ κΈ°μ λ‘ λ€νμ± + OCP, DIP λ₯Ό κ°λ₯νκ² μ§μ
- DI(Dependency Injection): μμ‘΄κ΄κ³, μμ‘΄μ± μ£Όμ
- DI 컨ν μ΄λ μ 곡
- ν΄λΌμ΄μΈνΈ μ½λμ λ³κ²½ μμ΄ κΈ°λ₯ νμ₯
- μ½κ² λΆνμ κ΅μ²΄νλ―μ΄ κ°λ°
- λͺ¨λ μ€κ³μ μν κ³Ό ꡬνμ λΆλ¦¬ (μ΄μμ μΌλ‘λ)
β OCP, DIPλ₯Ό μ§ν€κΈ° μν΄ μ½λλ₯Ό μμ±νλ€ λ³΄λ ν΅μ¬ λ‘μ§μ μ μΈν μ½λκ° λ무 λ§μμ‘κ³ κ·Έλμ μ€νλ§μ΄ λ§λ€μ΄ μ‘λ€
λ€νμ±μ νμ©νμ¬ κ΅¬νκ³Ό μν μ λΆλ¦¬νλλΌλ λ¬Έμ κ° λ°μνλ€
- μν κ³Ό ꡬνμ λΆλ¦¬νλκ°? (O)
- λ€νμ±λ νμ©νκ³ μΈν°νμ΄μ€μ ꡬν κ°μ²΄λ₯Ό λΆλ¦¬νλκ°? (O)
- OCP, DIP λ₯Ό μ€μνλκ°? (X)
- λ€νμ±(μΈν°νμ΄μ€)μ νμ©νλλΌλ ν΄λΌμ΄μΈνΈ μ½λμμ μΆμ μΈν°νμ΄μ€μ ꡬν ν΄λμ€ λͺ¨λ μμ‘΄νκ³ μμ μ΄ λ°μνκ² λλ€ (DIP μλ°°)
- μΈν°νμ΄μ€λ₯Ό ꡬννλ μλ‘μ΄ νμ₯μ΄ λ°μνλ©΄ ν΄λΌμ΄μΈνΈ μ½λμλ μμ μ΄ μΌμ΄λμΌ νλ€ (OCP μλ°°)
- ν΄λΌμ΄μΈνΈκ° μΆμ μΈν°νμ΄μ€μλ§ μμ‘΄νλλ‘ μμ νλ€ (ꡬν ν΄λμ€κ° ν΄λΌμ΄μΈνΈ μ½λμμ μλλ‘ λ§λ λ€)
- [κ΄μ¬μ¬λ₯Ό λΆλ¦¬] ν΄λΌμ΄μΈνΈμ ꡬν κ°μ²΄λ₯Ό λμ μμ±νκ³ μ£Όμ νλ μν μ κ°μ²΄λ₯Ό λ§λ λ€ (κ·Έκ²μ΄ λ°λ‘ Spring!!) -> λ§μΉ μ°κ·Ήμ λ°°μ°λ₯Ό μΊμ€ν νκ³ λ°°μΉνλ λκ΅°κ°κ° νμνλ€! (μ΄μ μλ λ°°μ°κ° μΊμ€ν λνλ μ¦, ν΄λΌμ΄μΈνΈμ μν κ³Ό μ± μμ΄ λ무 λ§μλκ²!)
- 2λ²μμ λ§λ μμ±,κ΄λ¦¬,μ£Όμ μν μ νλ κ°μ²΄κ° μμ±μλ₯Ό ν΅ν΄ ꡬν체λ₯Ό μ£Όμ ν΄μ€λ€ (μμ‘΄κ΄κ³μ λν κ³ λ―Όμ μΈλΆμκ² λ§‘κΈ°κ³ μ€νμλ§ μ§μ€!) -> μμ‘΄κ΄κ³λ₯Ό μΈλΆμμ μ£Όμ ν΄μ£Όλ μν©! (μμ‘΄κ΄κ³ μ£Όμ = μμ‘΄μ± μ£Όμ = Dependency Injection)
- κΈ°μ‘΄ νλ‘κ·Έλ¨μ ꡬν κ°μ²΄κ° μ€μ€λ‘ νλ‘κ·Έλ¨ νλ¦μ μ μ΄νλ€
- AppConfig κ° λ±μ₯νλ©΄μ ꡬν κ°μ²΄λ μμ μ λ‘μ§μ μ€ννλ μν λ§ λ΄λΉνλ€
- νλ‘κ·Έλ¨μ λν μ μ΄ νλ¦μ λν κΆνμ λͺ¨λ AppConfig κ° κ°μ§κ³ μλ€ (νλ‘κ·Έλ¨ νλ¦μ μΈλΆμμ κ΄λ¦¬νλ κ²μ΄ IoC)
- Junit κ³Ό κ°μ΄ λ΄κ° μμ±ν μ½λλ₯Ό μ μ΄νκ³ λμ μ€ννλ©΄ νλ μ μν¬
- λ΄κ° μμ±ν μ½λκ° μ§μ μ μ΄μ νλ¦μ λ΄λΉνλ€λ©΄ κ·Έκ²μ λΌμ΄λΈλ¬λ¦¬
- μμ‘΄κ΄κ³λ μ μ μΈ ν΄λμ€ μμ‘΄κ΄κ³μ μ€ν μμ μ κ²°μ λλ λμ μΈ κ°μ²΄(μΈμ€ν΄μ€) μμ‘΄κ΄κ³λ‘ λΆλ¦¬ν΄μ μκ°ν΄μΌ νλ€
- μ μ μΈ ν΄λμ€ μμ‘΄κ΄κ³λ‘λ μ€μ μ€νμμ μ΄λ€κ²μ΄ μ£Όμ λ μ§ μ μ μλ€
- μ€ν μμ (λ°νμ)μ μΈλΆμμ μ€μ ꡬν κ°μ²΄λ₯Ό μμ±νκ³ ν΄λΌμ΄μΈνΈμ μ λ¬ν΄μ ν΄λΌμ΄μΈνΈμ μλ²μ μ€μ μμ‘΄κ΄κ³κ° μ°κ²°λλ κ²μ μμ‘΄κ΄κ³ μ£Όμ μ΄λΌκ³ νλ€
- μμ‘΄κ΄κ³ μ£Όμ μ μ¬μ©νλ©΄ ν΄λΌμ΄μΈνΈ μ½λ λ³κ²½μμ΄ ν΄λΌμ΄μΈνΈκ° νΈμΆνλ λμμ νμ μΈμ€ν΄μ€λ₯Ό λ³κ²½ν μ μλ€
- μμ‘΄κ΄κ³ μ£Όμ μ μ¬μ©νλ©΄ μ μ μΈ ν΄λμ€ μμ‘΄κ΄κ³λ₯Ό λ³κ²½νμ§ μκ³ λμ μΈ κ°μ²΄ μΈμ€ν΄μ€ μμ‘΄κ΄κ³λ₯Ό μ½κ² λ³κ²½ν μ μλ€
- AppConfig μ²λΌ κ°μ²΄λ₯Ό μμ±νκ³ κ΄λ¦¬νλ©΄μ μμ‘΄κ΄κ³λ₯Ό μ°κ²°νλ κ²μ IoC 컨ν μ΄λ νΉμ DI 컨ν μ΄λλΌκ³ νλ€
- μμ‘΄κ΄κ³ μ£Όμ μ μ΄μ μ λμ΄ DI 컨ν μ΄λλΌκ³ μ£Όλ‘ λΆλ₯Έλ€ (= Assembler, Object Factory)
- AppConfig = DI 컨ν μ΄λ = ApplicationContext
- μ€νλ§ μ»¨ν μ΄λ μμ± (λΉμ΄λ¦ - λΉκ°μ²΄ ννμ μ μ₯μ)
- μ€νλ§ λΉ λ±λ‘ (μ΄λ Έν μ΄μ κΈ°λ°)
- λΉ μ΄λ¦μ λ€λ₯΄κ² λΆμ¬λμ΄μΌ ν¨
- μ€νλ§ λΉ μμ‘΄κ΄κ³ μ€μ - μ€λΉ
- μ€νλ§ λΉ μμ‘΄κ΄κ³ μ€μ - μλ£
- μ€νλ§ μ»¨ν μ΄λλ μ€μ μ 보λ₯Ό μ°Έκ³ ν΄μ μμ‘΄ κ΄κ³λ₯Ό μ£Όμ (μ€νλ§μ λΉμ μμ±νκ³ μμ‘΄κ΄κ³λ₯Ό μ£Όμ νλ λ¨κ³κ° λλμ΄μ Έ μλ€)
- λ¨μν μλ°μ½λλ₯Ό νΈμΆνλκ² κ°μ§λ§ μ°¨μ΄κ° μλ€ (μ±κΈν€ 컨ν μ΄λ)
- λΉ μ‘°νμ λμΌν νμ
μ΄ λμ΄μμΈ κ²½μ°
NoUniqueBeanDefinitionExceptionμμΈκ° λ°μλλ€ - λΆλͺ¨ νμ μΌλ‘ μ‘°ννλ©΄ μμ νμ λ ν¨κ» μ‘°νλλ€
- Object νμ μΌλ‘ μ‘°ννλ©΄ λͺ¨λ μ€νλ§ λΉμ μ‘°ννλ€
<<Interface>>BeanFactory <- <<Interface>>ApplicationContext <- AnnotationConfigApplicationContext
- μ€νλ§ μ»¨ν μ΄λμ μ΅μμ μΈν°νμ΄μ€μ΄λ€
- μ€νλ§ λΉμ κ΄λ¦¬νκ³ μ‘°ννλ μν μ λ΄λΉνλ€
getBean()μ 곡
- BeanFactory κΈ°λ₯μ λͺ¨λ μμλ°μμ μ 곡
- λΉμ κ΄λ¦¬νκ³ κ²μνλ κΈ°λ₯μ BeanFactoryκ° μ 곡ν΄μ£Όλλ° λμ μ°¨μ΄λ?
- μ ν리μΌμ΄μ
κ°λ°μλ λΉ κ΄λ¦¬ μ‘°ν λΏλ§μλλΌ μλ§μ λΆκ°κΈ°λ₯μ΄ νμνλ€
- λ©μμ§ μμ€λ₯Ό νμ©ν κ΅μ ν κΈ°λ₯ (νκ΅ -> νκ΅μ΄, μΌλ³Έ -> μΌλ³Έμ΄)
- νκ²½λ³μ (λ‘컬, κ°λ°, μ΄μ ꡬλΆν΄μ μ²λ¦¬)
- μ ν리μΌμ΄μ μ΄λ²€νΈ (μ΄λ²€νΈ λ°ν ꡬλ λͺ¨λΈμ νΈλ¦¬νκ² μ§μ)
- νΈλ¦¬ν 리μμ€ μ‘°ν (νμΌ, ν΄λμ€ν¨μ€, μΈλΆ λ±μμ 리μμ€λ₯Ό νΈλ¦¬νκ² μ‘°ν)
μ 리νλ©΄
- ApplicationContext λ BeanFactory μ κΈ°λ₯μ μμλ°λλ€
- ApplicationContext λ λΉ κ΄λ¦¬κΈ°λ₯ + νΈλ¦¬ν λΆκ°κΈ°λ₯μ μ 곡νλ€
- BeanFactory λ₯Ό μ§μ μ¬μ©ν μΌμ κ±°μ μλ€ (λλΆλΆ λΆκ°κΈ°λ₯μ΄ ν¬ν¨λ ApplicationContext μ¬μ©)
- BeanFactory, ApplicationContext λ₯Ό μ€νλ§ μ»¨ν μ΄λλΌκ³ νλ€
- μ€νλ§μ λ€μν μ€μ νμμ μ§μνλλ°
BeanDefinitionμ μΆμνλ₯Ό ν΅ν΄ κ°λ₯νκ² νλ€ - μν κ³Ό ꡬνμ κ°λ
μ μΌλ‘ λλκ²!
- μλ°μ½λ, XMLμ μ½μ΄μ BeanDefinitionμ λ§λ€λ©΄λλ€
- μ€νλ§ μ»¨ν μ΄λλ μλ°μ½λμΈμ§ XMLμΈμ§ λͺ°λΌλ λλ€ (μ€μ§ BeanDefinitionλ§ μλ©΄ λλ€)
BeanDefinitionμ λΉ μ€μ λ©νμ 보λΌκ³ νλ€@Bean,<bean>λΉ κ°κ° νλμ© λ©νμ λ³΄κ° μμ±λλ€
- μ€νλ§μ»¨ν
μ΄λλ μ΄ λ©νμ 보(
BeanDefinition)λ₯Ό κΈ°λ°μΌλ‘ μ€νλ§ λΉμ μμ±νλ€
- μ€νλ§μ κΈ°μ μ© μ¨λΌμΈ μλΉμ€ κΈ°μ μ μ§μνκΈ° μν΄ νμνλ€
- λλΆλΆμ μ€νλ§ μ ν리μΌμ΄μ μ μΉ μ ν리μΌμ΄μ μ΄λ€ (μΉμ΄ μλκ²λ κ°λ₯)
- μΉμ λ³΄ν΅ μ¬λ¬ κ³ κ°μ΄ λμμ μμ²μ νλ€
- μ€νλ§μ΄ μλ€λ©΄ λ§€λ² κ°μ²΄κ° μμ±λκ³ μλ©Έλλ©° λ©λͺ¨λ¦¬ λλΉκ° μ¬ν΄μ§λ€ -> μ±κΈν€
- μ±κΈν€μ ꡬννλ λ°©λ²μ λ§€μ° λ€μνλ€ (곡ν΅μ μΈ κ²μ private μμ±μ)
- μ±κΈν€ ν¨ν΄ ν΄λΌμ΄μΈνΈκ° ꡬ체ν΄λμ€μ μμ‘΄ν΄ DIPλ₯Ό μλ°νλ€
- λ΄λΆ μμ±μ λ³κ²½νκ±°λ μ΄κΈ°ννκΈ° μ΄λ ΅λ€
- private μμ±μλ‘ μμ ν΄λμ€λ₯Ό λ§λ€κΈ° μ΄λ ΅λ€
- μ μ°μ±μ΄ λ¨μ΄μ Έ μν°ν¨ν΄μΌλ‘ λΆλ¦¬κΈ°λ νλ€
- μ€νλ§ μ»¨ν μ΄λλ μ±κΈν€ ν¨ν΄μ λ¬Έμ μ μ ν΄κ²°νλ©° κ°μ²΄λ₯Ό μ±κΈν€μΌλ‘ κ΄λ¦¬νλ€ (λͺ¨λ μ€νλ§ λΉμ μ±κΈν€)
- μ€νλ§ μ»¨ν μ΄λλ μ±κΈν€ 컨ν μ΄λ μν μ νλ€ (μ±κΈν€ λ μ§μ€νΈλ¦¬)
- μ€νλ§ μ»¨ν μ΄λλ‘ μΈν΄ μ±κΈν€ ν¨ν΄μ μν μ§μ λΆν μ½λκ° μλ€
- μ€νλ§ μ»¨ν μ΄λλ‘ μΈν΄ DIP, OCP, ν μ€νΈ, private μμ±μλ‘ λΆν° μμ λ‘κ² μ±κΈν€μ μ¬μ©ν μ μλ€
- κ°μ²΄ μΈμ€ν΄μ€λ₯Ό νλλ§ μμ±ν΄μ 곡μ νλ μ±κΈν€ λ°©μμ μ¬λ¬ ν΄λΌμ΄μΈνΈκ° νλμ κ°μ κ°μ²΄ μΈμ€ν΄μ€λ₯Ό 곡μ νκΈ° λλ¬Έμ μ±κΈν€ κ°μ²΄λ μνλ₯Ό μ μ§νκ² μ€κ³νλ©΄ μλλ€
- 무μνλ‘ μ€κ³ν΄μΌνλ€ (λΆλ³κ°μ²΄!)
- νΉμ ν΄λΌμ΄μΈνΈμ μμ‘΄μ μΈ νλκ° μμ΄μΌνλ€
- νΉμ ν΄λΌμ΄μΈνΈ κ°μ λ³κ²½ν μ μλ νλκ° μμΌλ©΄ μλλ€
- κ°κΈμ μ½κΈ°λ§ κ°λ₯ν΄μΌ νλ€
- νλ λμ μλ°μμ 곡μ λμ§ μλ μ§μλ³μ, νλΌλ―Έν°, ThreadLocal λ±μ μ¬μ©ν΄μΌ νλ€
- μ€νλ§ λΉμ νλμ 곡μ κ°μ μ€μ νλ©΄ μ λ§ ν° μ₯μ κ° λ°μν μ μλ€!
AppConfig <- AppConfig@CGLIB
@Configurationμ΄ λΆμ ν΄λμ€λ₯ΌApplicationContextμμ κΊΌλ΄μ μΆλ ₯νλ©΄ ν΄λμ€ λͺ μ CGLIBκ° λΆλλ€- μμμ λ€λ₯Έ ν΄λμ€(
AppConfig@CGLIB)κ° μ±κΈν€μ΄ λλλ‘ λ³΄μ₯ν΄μ€λ€ (μ€νλ§ μ»¨ν μ΄λμ λ±λ‘λμ΄ μμΌλ©΄ κ°μ Έμ€κ³ μμΌλ©΄ μμ±νλλ‘) @Configurationμ΄ μλ€λ©΄@Beanμ λΆμ¬λ μ±κΈν€μ΄ 보μ₯λμ§ μλλ€@Configurationμ΄ μλ€λ©΄@Beanμ΄ λΆμ΄μλ λ©μλλ₯Ό νΈμΆν λλ§λ€ μλ‘μ΄ κ°μ²΄κ° μμ±λλ€
@Beanμ λ©μλ λ 벨μμ μ§μ μ μΈνκ³@Componentλ ν΄λμ€ λ 벨μμ μ μΈνλ€ (@Componentλ μ€νλ§μ΄ μ€μΊνμ¬ λ±λ‘ν¨)- λΉ λ±λ‘μ λͺ
μμ μΌλ‘ νκΈ°μλ κ΄λ¦¬ν κ²μ΄ λ무 λ§μλ°
@ComponentScanκ³Ό@AutoWiredλ₯Ό ν΅ν΄ λΉμ λ±λ‘νκ³ μ£Όμ νλ€ @SpringBootApplicationμ@ComponentScanκ° ν¬ν¨λμ΄ μλ€ (κΈ°λ³Έμ μΌλ‘ νμ¬ μμΉμμ νμ ν¨ν€μ§λ₯Ό λͺ¨λ μ€μΊν¨)- μ»΄ν¬λνΈ μ€μΊμ λ€μμ΄ μΆκ°λ‘ λμμ ν¬ν¨λλ€
@Component@Controller@Service@Repository@Configuration
- μ»΄ν¬λνΈ μ€μΊ μ κ°μ μ»΄ν¬λνΈ μ΄λ¦μ΄ μμΌλ©΄ μΆ©λμ΄ λ°μνλ€
- κΈ°μ‘΄μ μλλ±λ‘κ³Ό μλλ±λ‘ λΉμ μ΄λ¦μ΄ μ€λ³΅λλ κ²½μ° μλλ±λ‘μ΄ μ€λ²λΌμ΄λ©ν΄λ²λ Έλλ°, μ΅κ·Ό μ€νλ§ λΆνΈμμλ μ΄ κ²½μ°μλ μ€λ₯κ° λ°μνλλ‘ κΈ°λ³Έμ΄ λμλ€
μ€νλ§μ 컨ν μ΄λλ 2κ°μ§ λΌμ΄ν μ¬μ΄ν΄μ κ°μ§
- λͺ¨λ μ€νλ§ λΉ λ±λ‘
- μμ‘΄κ΄κ³ μ£Όμ
@AutoWired
public OrderServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}- μμ±μλ₯Ό ν΅ν΄μ μμ‘΄κ΄κ³λ₯Ό μ£Όμ λ°μ
- μμ±μ νΈμΆμμ μ λ± 1λ²λ§ νΈμΆλλ κ²μ΄ 보μ₯
- λΆλ³, νμ μμ‘΄κ΄κ³μ μ¬μ© (μΈν°κ° μμ΄μΌν¨)
- μμ±μκ° 1κ°λ§ μμΌλ©΄
@AutoWiredλ₯Ό μλ΅ν΄λ μλμΌλ‘ μμ‘΄κ΄κ³κ° μ£Όμ λ¨ - μμ±μμ£Όμ μ λΉμ λ±λ‘νλ©΄μ μλμΌλ‘ μ£Όμ λλ€
@AutoWired
public void setMemberRepository(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}- μμ μ μ£Όμ μ κ°μ²΄ μμ± μ΄νμ μ£Όμ λλ€ (μμ±μ μ£Όμ μ μμ±λλ©΄μ μ£Όμ λ¨)
@AutoWired
private MemberRepository membmerRepository;- νλμ λ°λ‘ μ£Όμ νλ λ°©μμΌλ‘ νΈν΄λ³΄μ΄μ§λ§ μΈλΆμμ λ³κ²½μ΄ λΆκ°λ₯ν΄μ μν°ν¨ν΄μΌλ‘ λΆλ₯λλ€
- DI νλ μμν¬κ° μμΌλ©΄ μ무κ²λ ν μ μλ€ (μ¬μ©νμ§ λ§κ²! μ¬μ©νλ€λ©΄ ν μ€νΈ μ½λμ λμμ!)
@AutoWiredνλλͺ λ§€μΉ (νλλͺ μ΄ μΌμΉνλ©΄ κ·Έ λΉμΌλ‘ μ£Όμ )@Qualifierμ¬μ© (λΉ μ΄λ¦ λ§€μΉ)@QualifierλΌλ¦¬ μ°Ύμλ μ¬μ©νλκ²μ μΆμ²- μ°Ύλ μ΄λ¦μ
@Qualifierκ° μμΌλ©΄@AutoWiredμ²λΌ λΉμ΄λ¦μΌλ‘ μ°Ύκ³ κ·Έλλ μμΌλ©΄ μμΈλ°μνλ€
@Primary(μ°μ μμμΈ ν΄λμ€μ λΆμΈλ€. νΈνκΈ΄ νμ§λ§ νκ³μ μ΄ μμ)
-> λ©μΈ μ°κ²°μ @Primaryλ₯Ό μ¬μ©νκ³ μμΈμ μΈ κ²½μ° @Qualifierλ₯Ό μ¬μ©νλ€ (@Qualifierλ₯Ό λͺ
μν΄μ μ¬μ©νλ©΄ μ°μ μμκ° λ λλ€)
- λΆλ³ - λλΆλΆμ μμ‘΄κ΄κ³ μ£Όμ μ μ ν리μΌμ΄μ μ’ λ£ μμ κΉμ§ λΆλ³μ΄μ΄μΌνλ€ (λΆλ³μ΄λ €λ©΄ μμ μκ° μμ΄μΌν¨)
- λλ½ - κ°μ²΄λ₯Ό μμ±ν λ μμ‘΄κ΄κ³κ° νμνκΈ° λλ¬Έμ λλ½ν μνμ΄ μ€μ΄λ λ€
- final ν€μλ κ°λ₯ - λλ½ μνμ΄ μ€κ³ , λΆλ³μ λ§λ€ μ μλ€ (μ»΄νμΌ μ€λ₯λ μΈμμμ κ°μ₯ λΉ λ₯΄κ³ μ’μ μ€λ₯!)
- μλ λΉ λ±λ‘μ μ¬μ©ν΄λ OCP, DIPλ₯Ό μ§ν¬ μ μλ€ (λλΆλΆ μλ λΉ λ±λ‘ μ¬μ©)
- μλ λΉ λ±λ‘μ κΈ°μ μ§μ λΉ μ λμμ μ¬μ©νλ κ²μ΄ μ’λ€ (μ ν리μΌμ΄μ
μ κ΄λ²μνκ² μν₯μ λ―ΈμΉλ κΈ°μ μ§μ κ°μ²΄)
- μ 무λ‘μ§ λΉ : μΉμ μ§μνλ 컨νΈλ‘€λ¬, ν΅μ¬ λΉμ¦λμ€ λ‘μ§μ΄ μλ μλΉμ€, λ°μ΄ν° κ³μΈ΅μ λ‘μ§μ μ²λ¦¬νλ 리ν¬μ§ν 리λ±
- κΈ°μ μ§μ λΉ : κΈ°μ μ μΈ λ¬Έμ λ κ³΅ν΅ κ΄μ¬μ¬(AOP)λ₯Ό μ²λ¦¬ν λ μ¬μ© (λ°μ΄ν°λ² μ΄μ€ μ°κ²°, κ³΅ν΅ λ‘κ·Έμ²λ¦¬ λ±)
μ€νλ§λΉμ ν¬κ² κ°μ²΄ μμ± -> μμ‘΄κ΄κ³ μ£Όμ
μμΌλ‘ λΌμ΄νμ¬μ΄ν΄μ κ°μ§λ€. (μ€νλ§μ λ€μν μλͺ
μ£ΌκΈ° μ½λ°±μ μ§μνλ€)
- μ€νλ§ λΉμ μ΄λ²€νΈ λΌμ΄νμ¬μ΄ν΄ (μ±κΈν€)
μ€νλ§ μ»¨ν μ΄λ μμ± -> μ€νλ§ λΉ μμ± -> μμ‘΄κ΄κ³ μ£Όμ -> μ΄κΈ°ν μ½λ°± (λΉμ΄ μμ±λκ³ , λΉμ μμ‘΄κ΄κ³ μ£Όμ μ΄ μλ£λ ν νΈμΆ) -> μ¬μ© -> μλ©Έμ μ½λ°± (λΉμ΄ μλ©ΈλκΈ° μ§μ μ νΈμΆ) -> μ€νλ§ μ’ λ£
κ°μ²΄μ μμ±κ³Όμ΄κΈ°νλ₯Ό λΆλ¦¬νμ. μμ±μλ νμ μ 보(νλΌλ―Έν°)λ₯Ό λ°κ³ λ©λͺ¨λ¦¬λ₯Ό ν λΉν΄μ κ°μ²΄λ₯Ό μμ±νλ μ± μμ κ°μ§λ€. λ°λ©΄ μ΄κΈ°νλ μμ±λ κ°λ€μ νμ©ν΄μ μΈλΆ 컀λ₯μ μ μ°κ²°νλ λ± λ¬΄κ±°μ΄ λμμ μννλ€. μμ±μ μμμ λ¬΄κ±°μ΄ μ΄κΈ°ν μμ μ ν¨κ» νλκ² λ³΄λ€ κ°μ²΄λ₯Ό μμ±νλ λΆλΆκ³Ό μ΄κΈ°ν νλ λΆλΆμ λͺ ννκ² λλλ κ²μ΄ μ μ§λ³΄μ κ΄μ μμ μ’λ€. (μ΄κΈ°ν μμ μ΄ λ΄λΆ κ°λ€λ§ μ½κ° λ³κ²½νλ μ λλ μμ±μμμ μ²λ¦¬νλκ² λμ μ μλ€)
- μΈν°νμ΄μ€ (InitializingBean, DisposableBean) - κ±°μ μ¬μ©νμ§ μμ
- μ€νλ§ μ μΈν°νμ΄μ€μ μμ‘΄ν΄μΌν¨
- μ΄κΈ°ν, μλ©Έ λ©μλμ μ΄λ¦ λ³κ²½ λΆκ°
- κ³ μΉ μ μλ μΈλΆ λΌμ΄λΈλ¬λ¦¬μ μ μ© λΆκ°
- μ€μ μ 보μ μ΄κΈ°ν λ©μλ, μ’
λ£ λ©μλ μ§μ
- λ©μλ μ΄λ¦μ μμ λ‘κ² λ³κ²½ κ°λ₯
- μ€νλ§ λΉμ΄ μ€νλ§ μ½λμ μμ‘΄νμ§ μμ
- μΈλΆ λΌμ΄λΈλ¬λ¦¬μλ μ΄κΈ°ν μ’ λ£ λ©μλ μ μ©κ°λ₯
- μ’
λ£ λ©μλλ₯Ό μΆλ‘ ν΄μ νΈμΆν΄μ€λ€ (close, shutdown μ΄λ¦μ λ©μλ, μμ΄λ€λ©΄
destoryMethod="")
@PostConstruct,@PreDestroyμ§μ (μ΄ λ°©λ² μΆμ²!)- κ°μ₯ κΆμ₯λλ λ°©λ²
- μ μΌν λ¨μ μ μΈλΆ λΌμ΄λΈλ¬λ¦¬μλ μ μ© λΆκ° (μμ μ΄κΈ°ν, μ’ λ£ λ©μλ μ§μ νλ λ°©λ² μ¬μ©ν΄μΌ νλ€)
- μ€νλ§μ κΈ°λ³Έμ μΌλ‘ μ±κΈν€μΌλ‘ μ€νλ§ μ»¨ν μ΄λκ° μ’ λ£λ λ κΉμ§ μ μ§λλ€
- νλ‘ν νμ : μ€νλ§ μ»¨ν μ΄λλ νλ‘ν νμ λΉμ μμ±κ³Ό μμ‘΄κ΄κ³ μ£Όμ κΉμ§λ§ κ΄μ¬νκ³ λλ κ΄λ¦¬νμ§ μλλ€
- μΉ κ΄λ ¨ μ€μ½ν
- request: μΉ μμ²μ΄ λ€μ΄μ€κ³ λκ°λ κΉμ§ μ μ§λλ μ€μ½ν
- session: μΉ μΈμ μ΄ μμ±λκ³ μ’ λ£λ λκΉμ§ μ μ§λλ μ€μ½ν
- application: μΉμ μλΈλ¦Ώ 컨ν μ€νΈμ κ°μ λ²μλ‘ μ μ§λλ μ€μ½ν
- μ€νλ§ μ»¨ν μ΄λ(μ±κΈν€)μμ νλ‘ν νμ λΉ μ¬μ©νλ©΄ μ¬μ©ν λλ§λ€ μλ‘ μμ±λλ κ²μ μλλ€ (λμΌν νλ‘ν νμ λΉμ΄ λ°λ³΅ν΄μ νΈμΆλ¨)
- νλ‘ν νμ λΉμ μ¬μ©νλ μ΄μ λ λ§€λ² κ°μ²΄λ₯Ό μμ±νκΈ° μν¨μΌ κ²μ (μ€λ¬΄μμ νλ‘ν νμ λΉμ μ¬μ©νλ κ²½μ°λ κ±°μ μλ€)
- μΉμ€μ½ν
- request μ€μ½ν: μμ²μ λ§λ€ μμ±λκ³ κ²°κ³Όλ₯Ό λ°ννλ©΄μ destory λλ€ (μμ²μ΄ μ€λλμ μ£Όμ λλλ‘ μ§μ°μμΌμΌνλ€ - ObjectProvider μ¬μ©)
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)μ΄λ κ² νλ‘μλ₯Ό μ¬μ©ν΄λ κ°λ₯νλ€ (무λΆλ³νκ² μ¬μ©νλ©΄ μ μ§λ³΄μνκΈ° μ΄λ ΅λ€. κΌ νμν κ³³μλ§!)