π [Spring] π» μ€νλ§ ν΅μ¬μ리 - 1. κ°μ²΄ μ§ν₯ μ€κ³μ μ€νλ§
π» [Spring] μ€νλ§ ν΅μ¬μ리 - κ°μ²΄ μ§ν₯ μ€κ³μ μ€νλ§
μλ
νμΈμ. π
μ€νλ§μΌλ‘ μ¬λ¬ νλ‘μ νΈλ₯Ό κ°λ°νμλλ°
λ¬Έλ μ€νλ§ μ체 ν΅μ¬ μ리μ λν 볡μ΅μ΄ νκ³ μΆμμ΅λλ€.
κ·Έλμ κΉμνλμ μ€νλ§ ν΅μ¬μ리 κ°μλ₯Ό λ€μΌλ©°
μ€νλ§μ μ μ¬μ©ν΄μΌνλμ§μ
μ€νλ§ ν΅μ¬μ리μ λν΄ νμ΅ν λ΄μ©μ
λλ€.
첫λ²μ§Έ μκ°μ
λλ€.
1. μ€νλ§ μμ¬
-
μλ° νμ€ κΈ°μ λ‘ EJB λΌλ κ²μ΄ μμμ μ΄λ‘ λ μ’κ³ μ¬λ¬κ°μ§ μ§μλλ κ²μ΄ μλΉν λ§μμΌλ λΉμ©μ΄ μλΉν λΉμΈκ³ 무μ보λ€λ μ΄λ ΅κ³ 볡μ‘νκ³ λλ Έμ΅λλ€.
-
λ λͺ μ κ°λ°μ(Gavin King, Road Johnson)κ° EJBλ₯Ό λΉννλ©΄μ λ§λ κ²μ΄ κ°κ° νμ΄λ²λ€μ΄νΈμ μ€νλ§μ λ§λ€μμ΅λλ€.
-
λ‘λ μ‘΄μ¨μ΄ 3λ§μ€μ μ€νλ§ κΈ°λ°μ½λμ ν¨κ» EJBλ₯Ό λΉννλ μ± μ μ§νν¨ μ΄ κΈ°λ° μ½λλ₯Ό ν΅ν΄ μ€νλ§μ΄ μΈμμΌλ‘ λμ€κ² λμμ΅λλ€.
-
μ€νλ§μ μ΄μμ J2EE(EJB)λΌλ 겨μΈμ λμ΄ λ΄! μλ‘μ΄ μμμ΄λΌλ λ»μΌλ‘ μ§μ΄μ‘μ΅λλ€.
2. μ€νλ§ μ΄λ?
μ€νλ§μ κ°μ²΄ μ§ν₯ μΈμ΄μΈ μλ° μΈμ΄ κΈ°λ°μ νλ μμν¬ μ λλ€. κ°μ²΄ μ§ν₯μ΄ κ°μ§ νΉμ§μ κ°μ₯ ν¬κ² μ΄λ¦΄ μ μλ κ²μ΄ μ€νλ§μ λλ€. μ’μ κ°μ²΄ μ§ν₯ μ ν리μΌμ΄μ μ κ°λ°ν μ μκ² λμμ£Όλ νλ μμν¬μ λλ€. μ΄κ²μ΄ μ€νλ§μ ν΅μ¬μ λλ€.
2-1 μ€νλ§ λΆνΈλ?
- μ€νλ§μ νΈλ¦¬νκ² μ¬μ©ν μ μλλ‘ μ§μ, μ΅κ·Όμλ κΈ°λ³ΈμΌλ‘ μ¬μ©
- β» λ¨λ μΌλ‘ μ€νν μ μλ μ€νλ§ μ ν리μΌμ΄μ μ μ½κ² μμ±
- β» Tomcat κ°μ μΉ μλ²λ₯Ό λ΄μ₯ν΄μ λ³λμ μΉ μλ²λ₯Ό μ€μΉνμ§ μμλ λ¨
- μμ¬μ΄ λΉλ ꡬμ±μ μν starter μ’ μμ± μ 곡
- μ€νλ§κ³Ό 3rd parth(μΈλΆ) λΌμ΄λΈλ¬λ¦¬ μλ ꡬμ±
- λ©νΈλ¦, μννμΈ, μΈλΆ κ΅¬μ± κ°μ νλ‘λμ μ€λΉ κΈ°λ₯ μ 곡
- κ΄λ‘μ μν κ°κ²°ν μ€μ
3. μ’μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ΄λ?
3-1 κ°μ²΄ μ§ν₯ νΉμ§
- μΆμν
- μΊ‘μν
- μμ
- λ€νμ±
3-2 κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°
- κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ νλ‘κ·Έλ¨μ β»μ μ°νκ³ λ³κ²½μ΄ μ©μ΄νκ² λ§λ€κΈ° λλ¬Έμ λκ·λͺ¨ μννΈμ¨μ΄ κ°λ°μ λ§μ΄ μ¬μ©λλ€.
3-3 λ€νμ±μ μ€μλ!
λ€νμ±μ ν΅μ¬μ μΈμμ μν κ³Ό ꡬνμΌλ‘ λλλ κ²μ΄λ€. ex) μν - μλμ°¨ ꡬν - μλ°λΌ , ν μ¬λΌ, k3 , ν¬λ₯΄μ λ±λ± μ€μ ꡬν μλμ°¨κ° μλ°λΌμ΄λ ν μ¬λΌμ΄λ k3μ΄λ κ²°κ΅ λ³Έ μν μ μλμ°¨ μν μ΄λ€.
νλ‘κ·Έλλ°μμ μν μ μΈν°νμ΄μ€, ꡬνμ ꡬν κ°μ²΄μ΄λ€.
- κ°μ²΄λ₯Ό μ€κ³ν λ μν κ³Ό ꡬνμ λͺ νν λΆλ¦¬
- κ°μ²΄ μ€κ³μ μν (μΈν°νμ΄μ€)μ λ¨Όμ λΆμ¬νκ³ , κ·Έ μν μ μννλ ꡬν κ°μ²΄ λ§λ€κΈ°
λ€νμ±μ λ³Έμ§
- μΈν°νμ΄μ€λ₯Ό ꡬνν κ°μ²΄ μΈμ€ν΄μ€λ₯Ό μ€ν μμ μ μ μ°νκ² λ³κ²½ν μ μλ€.
- λ€νμ±μ λ³Έμ§μ μ΄ν΄νλ €λ©΄ νλ ₯μ΄λΌλ κ°μ²΄μ¬μ΄μ κ΄κ³μμ μμν΄μΌν¨
- ν΄λΌμ΄μΈνΈλ₯Ό λ³κ²½νμ§ μκ³ , μλ²μ ꡬν κΈ°λ₯μ μ μ°νκ² λ³κ²½ν μ μλ€.
λ¨! μΈν°νμ΄μ€λ₯Ό μμ μ μΌλ‘ μ μ€κ³νλ κ²μ΄ μ€μ!!!
μ€νλ§κ³Ό κ°μ²΄μ§ν₯
- λ€νμ±μ΄ κ°μ₯ μ€μνλ€!
- μ€νλ§μ λ€νμ±μ κ·Ήλνν΄μ μ΄μ©ν μ μκ² λμμ€λ€.
- μ€νλ§μμ μ΄μΌκΈ°νλ μ μ΄μ μμ (IoC), μμ‘΄κ΄κ³ μ£Όμ (DI)μ λ€νμ±μ νμ©ν΄μ μν κ³Ό ꡬνμ νΈλ¦¬νκ² λ€λ£° μ μλλ‘ μ§μνλ€.
- μ€νλ§μ μ¬μ©νλ©΄ λ§μΉ λ κ³ λΈλ 쑰립νλ―! μ°¨λμ μνλ μ°¨λμΌλ‘ λ°κΎΈλ―! ꡬνμ νΈλ¦¬νκ² λ³κ²½ν μ μλ€.
4. μ’μ κ°μ²΄ μ§ν₯ μ€κ³μ 5κ°μ§ μμΉ(SOLID)
-
SRP: λ¨μΌ μ± μ μμΉ(single responsibility principle)
-β» ν ν΄λμ€λ νλμ μ± μλ§ κ°μ Έμνλ€. -νμ§λ§ νλμ μ± μμ΄λΌλ κ²μ λͺ¨νΈνλ€. (ν΄ μλ μκ³ μμ μλ μκΈ° λλ¬Έ) - κ²°κ΅ μ€μν κΈ°μ€μ λ³κ²½μ΄λ€. λ³κ²½μ΄ μμλ νκΈ ν¨κ³Όκ° μ μΌλ©΄ λ¨μΌ μ± μ μμΉμ μ λ°λ₯Έ κ²
-
β» OCP: κ°λ°©-νμ μμΉ (Open/closed principle)
-β» μννΈμ¨μ΄ μμλ νμ₯μλ μ΄λ €μμΌλ λ³κ²½μλ λ«ν μμ΄μΌνλ€. - λ€νμ±μ νμ©ν΄λ³΄μ - μΈν°νμ΄μ€λ₯Ό ꡬνν μλ‘μ΄ ν΄λμ€λ₯Ό νλ λ§λ€μ΄μ μλ‘μ΄ κΈ°λ₯ ꡬν κ°λ₯ β» λ¬Έμ μ μμ μλ°λ₯Ό μ΄μ©ν΄ κ°λ°ν λ ꡬν κ°μ²΄λ₯Ό λ³κ²½νλ €λ©΄ ν΄λΌμ΄μΈνΈ μ½λλ₯Ό λ³κ²½ν΄μΌ νλ€. λΆλͺ ν λ€νμ±μ μ¬μ©νμ§λ§ OCP μμΉμ μ§ν¬ μ μλ€.! ex) MemberRepository m = new MemoryMemberRepository(); //κΈ°μ‘΄ μ½λ MemberRepository m = new JdbcMemberRepository(); //λ³κ²½ μ½λ μ΄ λ¬Έμ λ₯Ό ν΄κ²°νκΈ° μν΄ κ°μ²΄λ₯Ό μμ±νκ³ , μ°κ΄κ΄κ³λ₯Ό λ§Ίμ΄μ£Όλ λ³λμ 쑰립, μ€μ μκ° νμνλ€. => μ΄λ₯Ό ν΄κ²°ν΄μ£Όλ κ²μ΄ μ€νλ§! (μ€νλ§ μ»¨ν μ΄λ , IoC, DI λ±λ±)
-
LSP: 리μ€μ½ν μΉν μμΉ (Liskov substitution principle)
- β»νλ‘κ·Έλ¨μ κ°μ²΄λ νλ‘κ·Έλ¨μ μ νμ±μ κΉ¨λ¨λ¦¬μ§ μμΌλ©΄μ νμ νμ μ μΈμ€ν΄μ€λ‘ λ°κΏ μ μμ΄μΌνλ€. - κ°λ¨ν λ§νμλ©΄ μΈν°νμ΄μ€(μν )μ κ·μ½μ λ§μΆ°μ€μΌνλ€.
-
ISP: μΈν°νμ΄μ€ λΆλ¦¬ μμΉ (Interface segregation principle)
- νΉμ ν΄λΌμ΄μΈνΈλ₯Ό μν μΈν°νμ΄μ€ μ¬λ¬ κ°κ° λ²μ© μΈν°νμ΄μ€ νλλ³΄λ€ λ«λ€ - μλμ°¨ μΈν°νμ΄μ€ -> μ΄μ μΈν°νμ΄μ€, μ λΉ μΈν°νμ΄μ€λ‘ λΆλ¦¬ - μ¬μ©μ ν΄λΌμ΄μΈνΈ -> μ΄μ μ ν΄λΌμ΄μΈνΈ, μ λΉμ¬ ν΄λΌμ΄μΈνΈλ‘ λΆλ¦¬ - λΆλ¦¬νλ©΄ μ λΉ μΈν°νμ΄μ€ μμ²΄κ° λ³ν΄λ μ΄μ μ ν΄λΌμ΄μΈνΈμ μν₯μ μ£Όμ§ μμ - μΈν°νμ΄μ€κ° λͺ νν΄μ§κ³ , λ체 κ°λ₯μ±μ΄ λμμ§λ€.
-
β» DIP: μμ‘΄κ΄κ³ μμ μμΉ (Dependency inversion principle)
- νλ‘κ·Έλλ¨Έλ "μΆμνμ μμ‘΄ν΄μΌμ§, ꡬ체νμ μμ‘΄νλ©΄ μλλ€." μμ‘΄μ± μ£Όμ μ μ΄μμΉμ λ°λ₯΄λ λ°©λ² μ€ νλ - β»μ½κ² μ΄μΌκΈ°ν΄μ ꡬν ν΄λμ€μ μμ‘΄νμ§ λ§κ³ , μΈν°νμ΄μ€μ μμ‘΄νλΌλ λ» - μν μ μμ‘΄ ν΄μΌν¨ β» λ¬Έμ μ κ·Έλ°λ° OCPμμ μ€λͺ ν MemberServiceλ μΈν°νμ΄μ€μ μμ‘΄νμ§λ§, ꡬν ν΄λμ€λ λμμ μμ‘΄νλ€. - MemberService ν΄λΌμ΄μΈνΈκ° ꡬν ν΄λμ€λ₯Ό μ§μ μ ν - MemberRepository m = new MemoryMemberRepository(); - β» DIP μλ°
ν΅μ¬ μ 리!
- κ°μ²΄ μ§ν₯μ ν΅μ¬μ λ€νμ±
- λ€νμ± λ§μΌλ‘λ μ½κ² λΆνμ κ°μ λΌμ°λ―μ΄ κ°λ°ν μ μλ€.
- λ€νμ± λ§μΌλ‘λ ꡬν κ°μ²΄λ₯Ό λ³κ²½ν λ ν΄λΌμ΄μΈνΈ μ½λλ ν¨κ» λ³κ²½λλ€.
- β» λ€νμ± λ§μΌλ‘λ OCP, DIP λ₯Ό μ§ν¬ μ μλ€.
5. κ°μ²΄ μ§ν₯ μ€κ³μ μ€νλ§
κ°μ²΄ μ§ν₯μ΄ κ°μ§ νΉμ§μ κ°μ₯ ν¬κ² μ΄λ¦΄ μ μλ κ²μ΄ μ€νλ§μ λλ€. μ’μ κ°μ²΄ μ§ν₯ μ ν리μΌμ΄μ μ κ°λ°ν μ μκ² λμμ£Όλ νλ μμν¬μ λλ€. μ΄κ²μ΄ μ€νλ§μ ν΅μ¬μ λλ€.
μ’μ κ°μ²΄ μ§ν₯κ°λ°μ νκΈ° μν΄μ OCP, DIP μμΉμ μ§μΌμΌν©λλ€.
β» OCP, DIP μμΉκΉμ§ μ§ν¬ μ μκ² μ§μν΄μ£Όλ κ²μ΄ μ€νλ§νλ μμν¬ μ λλ€.
μ€νλ§νλ μμν¬μμ DI(Dependency Injection): μμ‘΄ κ΄κ³, μμ‘΄μ± μ£Όμ DI 컨ν μ΄λ μ 곡 λ±μ ν΅ν΄ μ§μν΄μ€λλ€.
λ
μ€νλ§μ λ μ¬λ°λ₯΄κ² μ¬μ©νκΈ° μν΄ κΉμνλμ μ€νλ§ ν΅μ¬ μ리 κ°μλ₯Ό λ€μΌλ©° μ 리ν
첫λ²μ§Έ ν¬μ€νΈμμ΅λλ€.
κ°μ¬ν©λλ€. π
Reference