3.1 λ¨μΌ μ± μ μμΉ (SRP)
3.11 μ± μμ μλ―Έ
κ°μ²΄ μ§ν₯ μ€κ³κ΄μ μμ μ± μμ κΈ°λ³Έ λ¨μλ λ°λ‘ 'κ°μ²΄'μ΄λ€. (μ΄ 'κ°μ²΄'λ λ¨ νλμ μ± μλ§μ κ°μ ΈμΌ νλ€)
νμ 'κ°μ²΄'κ° μ¬λ¬ μ± μ(μμ λ£κΈ° + μλ°νκΈ°)μ κ°μ§λ€κ³ κ°μ ν΄λ³΄μ.
public class Student {
public void getCourses() {...}
public void addCourses() {...}
public void save() {...}
public Student load() {...}
public void printOnReport() {...}
public void printOnBook() {...}
}
νμ κ°μ²΄λ μμ μ κ΄ν μ± μλ§ κ°μ§λ κ²μ΄ μ’κ³ μ΄μΈμ μ± μμ μ΄λ₯Ό λ μ μνν μ μλ λ€λ₯Έ κ°μ²΄κ° κ°μ§λ κ²μ΄ μ’λ€.
νμ -> μμ - SRP λ§μ‘±
3.12 λ³κ²½
κ°μ²΄μ§ν₯ μ€κ³μμΉμ νμ΅νλ μ΄μ λ λκΉ?
-> κ·Έ μ΄μ λ μμΈ‘νμ§ λͺ»ν λ³κ²½μ¬νμ΄ λ°μνλλΌλ μ μ°νκ³ νμ₯μ±μ΄ μλλ‘ μμ€ν ꡬ쑰λ₯Ό μ€κ³νκΈ° μν΄μμ΄λ€.
μ’μ μ€κ³λ 무μμΌκΉ?
-> μμ€ν μ μλ‘μ΄ μꡬμ¬νμ΄λ λ³κ²½μ΄ μμ λ κ°λ₯ν ν μν₯μ λ°λ λΆλΆμ μ€μ΄λ κ²μ΄λ€.
κ°μ²΄ νλμ μ± μμ΄ λ§μμ§λ©΄ ν΄λμ€ λ΄λΆμμ μλ‘ λ€λ₯Έ μν μ μννλ μ½λλΌλ¦¬ κ°νκ² κ²°ν©λκ² λλ€.
νμμ course()κ΄λ ¨ λ©μλμ λ°μ΄ν°λ² μ΄μ€ κ΄λ ¨ λ©μλ(save, load)κ° κ²°ν©λμ΄ μΌνλ λ°©μμ΄ λ³νλ©΄ νμμ΄ μμ μ λ£λ λ° μν₯μ λ―ΈμΉκ² λ μ μλ€!! γ γ (κ°ν κ²°ν©μ λ¬Έμ μ )
νκ· ν μ€νΈ
μ΄λ€ λ³νκ° μμ λ κΈ°μ‘΄ μμ€ν μ μν₯μ μ£Όλ μ§ νκ°νλ ν μ€νΈ
-> μ± μμ λΆλ¦¬νλ©΄ λ³κ²½μ¬ν λ°μ μ μν₯μ λ°λ λΆλΆμ μ€μ¬ 'νκ· ν μ€νΈ' λΉμ©μ μ€μΌ μ μλ€.
3.13 μ± μ λΆλ¦¬
"ν ν΄λμ€μ λ¨ νλμ μ± μλ§ μννλλ‘ ν΄ λ³κ²½ μ¬μ κ° λ μ μλ κ²μ νλλ‘ λ§λλ κ²"
μ± μ λΆλ¦¬ νλ©΄ AκΈ°λ₯μ΄ λ³κ²½λλ©΄ AκΈ°λ₯μ μ§κ°μ μ μ¬μ©νλ μ½λλ§ λ€μ ν μ€νΈν μ μλ€.
κ°μ λ νμ ν΄λμ€ λμμΈ
μμ κ·Έλ¦Όμ²λΌ νμ ν΄λμ€μ μ± μμ
1. λ°μ΄ν°λ² μ΄μ€ κ΄λ ¨ νμ DAO
2. μ±μ μ λ΄λΉνλ μ±μ ν ν΄λμ€
3. μΆμμ λ΄λΉνλ μΆμν ν΄λμ€
μ΄ 3κ°μ§λ‘ μ± μμ μ μ νκ² λΆλ¦¬νλ€.
μ΄λ‘μ¨ νμ ν΄λ«λλ λ³νκ° λ°μνμ λ νμλλ μν₯μ μ΅μνν μ μλ€.
μλ₯Ό λ€μ΄, λ°μ΄ν°λ² μ΄μ€ μ€ν€λ§κ° λ³κ²½λλ€λ©΄ μ€μ§ νμ DAOν΄λμ€λ§ μν₯μ λ°κ³ μ±μ ν, μΆμλΆλ μν₯μ λ°μ§ μμ μ μλ€.
3.1.4 μ°νμ΄ μμ
νλμ μ± μμ΄ μ¬λ¬ κ°μ ν΄λμ€λ€λ‘ λΆμ°λμ΄ μλ κ²½μ°λΌλ©΄?
μ°νμ΄ μμ μ μμ² λΆμκ° λ§μ λͺ¨λ λΆλΆμ λΉ μ§μμ΄ μ°Ύμ μΉλ£ν΄μΌλ§ νλ€.
μ¦, μ¬λ¬ κ°μ ν΄λμ€μ μ± μμ΄ λΆμ°λμμ λ λ³κ²½μ΄ λ°μν κ²½μ°μ΄λ€.
μλ₯Ό λ€μ΄ λ‘κΉ , 보μ, νΈλμμ κ³Ό κ°μ΄ ν‘λ¨ κ΄μ¬μΌλ‘ λΆλ₯ν μ μλ κΈ°λ₯λ€μ΄ μ‘΄μ¬νλ κ²λ€μ΄λ€.
λ§μ½ νΉμ λ©μλ μ€ν λ‘κ·Έλ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ μ₯νλ€κ³ νλ€λ©΄ λΆλͺ λ©μλμλ 'λ‘κ·Έ κΈ°λ₯'μ΄ μ‘΄μ¬ν κ²μ΄λ€.
μ΄ λ‘κ·Έλ₯Ό λ°μ΄ν°λ² μ΄μ€μμ 'νμΌ'λ‘ μ μ₯νκ³ μΆλ€λ©΄ λ‘κ·Έ κΈ°λ₯μ΄ μ½μ λ λͺ¨λ λ©μλλ₯Ό λͺ¨λ μ°Ύμμ λ³κ²½ν΄μΌλ§ νλ€...,,
(νλμ μ± μμ΄ μ¬λ¬ κ°μ ν΄λμ€λ‘ λΆλ¦¬λμ΄ μμ΄μ μκΈ°λ λ¬Έμ )
μ΄λ₯Ό ν΄κ²°νκΈ° μν΄μλ 'λΆκ° κΈ°λ₯'μ λ³λμ ν΄λμ€λ‘ λΆλ¦¬ν΄ μ± μμ λ΄λΉνκ² νλ©΄ λλ€!!
AOP : κ΄μ¬ μ§ν₯ νλ‘κ·Έλλ°
ν‘λ¨ μ½λλ₯Ό AspectλΌλ νΉλ³ν κ°μ²΄λ‘ λͺ¨λννκ³ Weavingμ΄λΌλ μμ μ ν΅ν΄ λͺ¨λνν μ½λλ₯Ό ν΅μ¬ κΈ°λ₯μ λΌμλ£λ κ²μ λ»νλ€.
μ΄λ₯Ό ν΅ν΄ κΈ°μ‘΄μ μ½λλ₯Ό μ ν λ³κ²½νμ§ μμλ λΆκ° κΈ°λ₯μ ν¨κ³Όμ μΌλ‘ λ³κ²½ν μ μλ€. (Aspectλ§ λ³κ²½νλ©΄ μ΄λ₯Ό μ¬μ©νλ λͺ¨λ μμΉμ κΈ°λ₯μ΄ λ°λ)
3.2 κ°λ°© - νμ μμΉ (OCP)
"κΈ°μ‘΄μ μ½λλ₯Ό λ³κ²½νμ§ μμΌλ©΄μ κΈ°λ₯μ νμ₯ν μ μλλ‘ μ€κ³λμ΄μΌ νλ€"
κΈ°μ‘΄ μ½λμ λ³κ²½μλ λ«νμκ³ νμ₯μλ μ΄λ €μλ μμΉ!!
νμ κ΄λ¦¬ νλ‘κ·Έλ¨μ λμκ΄ λμ¬ μ¬λΆμ κ°μ μλ‘μ΄ λ§€μ²΄μ νμμ λμ¬κΈ°λ‘μ μΆλ ₯νλ κ²½μ° λμκ΄ λμ¬ λͺ λΆ ν΄λμ€λ₯Ό λ§λ€μ΄ clientμ μ°κ²°ν΄μ€μΌλ§ νλ€.
νμ§λ§ μ΄λ μλ‘μ΄ κΈ°λ₯μ μΆκ°νκΈ° μν΄ Clinet ν΄λμ€λ₯Ό μμ ν΄μΌλ§ νλ―λ‘ OCPμ μλ° λλ€.
OCP μ€κ³μ κ°μ₯ μ€μν κ²μ "무μμ΄ λ³νλ κ²μΈμ§, 무μμ΄ λ³νμ§ μλ κ²μΈμ§ ꡬλΆνλ κ²" μ΄λ€.
μ μ€κ³λ₯Ό OCPλ₯Ό λ§μ‘±νλ μ€κ³λ‘ μμ νκ² λλ©΄..
Clinetλ printable μΈν°νμ΄μ€λ₯Ό μ΄μ©ν΄ 'ꡬ체μ μΈ μΆλ ₯ 맀체'λ₯Ό μΊ‘μν νλλ‘ μ²λ¦¬νλ€.
OCPλ ν΄λμ€λ₯Ό λ³κ²½νμ§ μκ³ λ λμ ν΄λμ€μ νκ²½μ λ³κ²½ν μ μλ μ€κ³μ΄λ€.
λ¨μ ν μ€νΈ = λΉ λ₯Έ ν μ€νΈ
λͺ¨μ κ°μ²΄ = ν μ€νΈμ© κ°μ§ κ°μ²΄
3.3 리μ€μ½ν μΉν μμΉ (LSP)
"LSPλ λΆλͺ¨ ν΄λμ€μ μμ ν΄λμ€ μ¬μ΄μ νμκ° μΌκ΄μ±μ΄ μμ΄μΌ νλ€λ μλ―Έμ΄λ€."
LSPλ₯Ό λ§μ‘±νλ©΄ λΆλͺ¨ ν΄λμ€μ μΈμ€ν΄μ€ λμ μ μμ ν΄λμ€μ μΈμ€ν΄μ€λ‘ λμ²΄κ° κ°λ₯νλ€.
μΌλ°ν κ΄κ³(μμ)λ₯Ό λ€μ νλ² μκ°ν΄λ³΄μ. μΌλ°ν κ΄κ³λ 'is kind of κ΄κ³'λ‘ ννν μ μλ€.
λΆλͺ¨ ν΄λμ€λ‘ ν¬μ λ₯, μμ ν΄λμ€λ₯Ό μμμ΄λ‘ κ°μ ν΄λ³΄μ.
- ν¬μ λ₯λ μμ λ³μ§ μκ³ μλΌλ₯Ό λ³μ λ²μνλ€.
- ν¬μ λ₯λ μ μ λ¨Ήμ¬μ μλΌλ₯Ό ν€μ°κ³ νλ₯Ό ν΅ν΄ νΈν‘νλ€.
μμ ν¬μ λ₯μ νΉμ§μ μμμ΄λ κ°μ§κ³ μλκ°? -> ν¬μ λ₯λ₯Ό μμμ΄λ‘ λ°κΏμ ν΄λ³΄μ.
- μμμ΄λ μμ λ³μ§ μκ³ μλΌλ₯Ό λ³μ λ²μνλ€.
- μμμ΄λ μ μ λ¨Ήμ¬μ μλΌλ₯Ό ν€μ°κ³ νλ₯Ό ν΅ν΄ νΈν‘νλ€.
μ ν λ¬Έμ κ° μκΈ° λλ¬Έμ μμμ΄μ ν¬μ λ₯μ νμ(λ²μ, νΈν‘, μμ‘)μ [μΌκ΄μ±]μ΄ μλ€κ³ λ§ν μ μλ€!!!!
κ·Έλ λ€λ©΄ μμ ν΄λμ€κ° λΆλͺ¨ ν΄λμ€μ μΈμ€ν΄μ€μ νμλ₯Ό μΌκ΄μ±μκ² μ€ννλ €λ©΄ μ΄λ»κ² ν΄μΌν κΉ??
λͺ νν λ°©λ²μ λ°λ‘ μνΌ ν΄λμ€μμ μμλ°μ λ©μλλ€μ΄ μλΈ ν΄λμ€μμ μ€λ²λΌμ΄λ(μ¬μ μ)λμ§ μλλ‘ νλ©΄ λλ€.
3.4 μμ‘΄ μμ μμΉ (DIP)
"μμ‘΄ κ΄κ³λ₯Ό λ§Ίμ λ λ³ννκΈ° μ¬μ΄ κ²λ³΄λ€λ κ±°μ λ³νκ° μλ κ²μ μμ‘΄νλΌλ μμΉμ΄λ€"
μ΄λ€ κ°μ²΄κ° μμ‘΄νλ κ°μ²΄κ° μμ£Ό λ³ννλ€λ©΄ κ°μ²΄μ μμ μ΄ μ¦μμ§κ²λλ€..
κ·Έλ κΈ° λλ¬Έμ κ°μ²΄λ λ³νκ° μ μ μΆμμ μΈ κ°μ²΄μ μμ‘΄ν΄μΌνλ€.
μμ κ·Έλ¦Ό μ²λΌ μ¬λμ΄ μΆμμ μ΄ μλμ°¨μ μμ‘΄νκ² λλ©΄ μ€μ λ‘ BMWλ₯Ό νλ λ²€μΈ λ₯Ό νλ μκ΄μμ΄ μλμ°¨λ₯Ό μ΄μ©ν μ μκ²λλ€.
μ΄λ¬ν μΆμμ μΈ κ²μ κ°μ²΄μ§ν₯ κ΄μ μμλ 'μΆμ ν΄λμ€'μ 'μΈν°νμ΄μ€'λ‘ ννν μ μλ€.
=> DIPλ₯Ό λ§μ‘±νλ μ€κ³λ μΈν°νμ΄μ€λ μΆμ ν΄λμ€μ μμ‘΄κ΄κ³λ₯Ό λ§Ίκ²λκ³ μ΄λ λ³νμ μ μ°ν μμ€ν μ€κ³μ΄λ€.
μμ‘΄μ± μ£Όμ
λ§μ½ DIPλ₯Ό λ§μ‘±νλ©΄ "μμ‘΄μ± μ£Όμ "μ΄λΌλ κΈ°μ λ‘ λ³νλ₯Ό μ½κ² μμ©ν μ μλ μ½λλ₯Ό μμ±ν μ μλ€.
public class Kid{
private Toy toy;
public void setToy(Toy toy){
this.toy = toy;
}
public int play(){
sysout(toy.toString());
}
}
Kidλ μ₯λκ°μ setToy()λ₯Ό ν΅ν΄ λ‘λ΄μ΄λ μλμ°¨λ μ μ°νκ² μ νν μ μκ² λλ€.
3.5 μΈν°νμ΄μ€ λΆλ¦¬ μμΉ
μΈν°νμ΄μ€ λΆλ¦¬ μμΉ(ISP)λ μΈν°νμ΄μ€λ₯Ό ν΄λΌμ΄μΈνΈμ νΉνλλλ‘ λΆλ¦¬μν€λ μ€κ³ μμΉμ΄λ€.
볡ν©κΈ° κΈ°λ₯μ μ 곡νλ ν΄λμ€λ 'νλ¦°ν°', '볡μ¬', 'ν©μ€' κΈ°λ₯μ μ 곡νμ§λ§ ν΄λΌμ΄μΈνΈκ° μ΄λ₯Ό λμμ μ¬μ©νμ§λ μλλ€.
ν΄λΌμ΄μΈνΈλ κ° κΈ°λ₯λ§μ μ΄μ©νλ―λ‘ 'νλ¦°ν°' κΈ°λ₯λ§ μ¬μ©ν λ 'ν©μ€' κΈ°λ₯μ λ³κ²½μ΄ μκ²Όλ€κ³ μν₯μ λ°μμλ μλλ€.
μ¦, ν΄λΌμ΄μΈνΈμ 무κ΄νκ² λ°μν λ³νλ‘ ν΄λΌμ΄μΈνΈ μμ μ΄ μν₯μ λ°μ§ μμΌλ €λ©΄ λ²μ©μ μΈν°νμ΄μ€λ³΄λ€λ ν΄λΌμ΄μΈνΈμ νΉνλ μΈν°νμ΄μ€λ₯Ό μ¬μ©ν΄μΌλ§ νλ€.
볡ν©κΈ° ν΄λμ€μ ISP μμΉμ μ μ©ν κ²°κ³Ό
볡ν©κΈ°λ₯Ό μ¬μ©νλ κ°μ²΄(ν΄λΌμ΄μΈνΈ)λ€λ§λ€ μμ μ΄ κ΄μ¬μ κ°λ λ©μλλ€λ§ μλ μΈν°νμ΄μ€λ₯Ό μ 곡λ°λλ‘ μ€κ³νλ€.
--> μ΄λ κ² μ€κ³νλ©΄ μ»λ μ₯μ : μΈν°νμ΄μ€κ° λ°©νλ²½ μν μ μνν΄ ν΄λΌμ΄μΈνΈλ μμ μ΄ μ¬μ©νμ§ μλ λ©μλμ μκΈ΄ λ³νλ‘ μΈν μν₯μ λ°μ§ μκ² λλ€.
SRPμ ISP μ¬μ΄μ κ΄κ³
μ΄λ€ ν΄λμ€κ° λ¨μΌ μ± μμ΄ μλ μ¬λ¬ μ± μμ΄ μλ€λ©΄ λ°©λν λ©μλλ₯Ό κ°μ§κΈ° λλ¬Έμ λΉλν ν΄λμ€κ° λκ³ μ΄λ λΉλν μΈν°νμ΄μ€λ₯Ό μ 곡νκ² λλ€. μ΄λ κ² λΉλν ν΄λμ€λ₯Ό SRPμ λ°λΌ λ¨μΌ μ± μ μμΉμ κ°λ μ¬λ¬ ν΄λμ€λ€λ‘ λΆν νκ³ κ°μμ μΈν°νμ΄μ€λ₯Ό μ 곡νλ€λ©΄ SRPμ ISP λλ€ λ§μ‘±μν¬ μ μλ€.
κ·Έλ λ€λ©΄ ISPλ SRPλ₯Ό λ§μ‘±νλ©΄ μ±λ¦½λλκ°?
μ μ§λ¬Έμ λν λ΅μ "λ°λμ κ·Έλ λ€κ³ λ³Ό μ μλ€" μ΄λ€.
κ°λ Ή κ²μνμ μ¬λ¬ κΈ°λ₯μ ꡬνν λ©μλμ κΈμ°κΈ°, μ½κΈ°, μμ λ±μ΄ μλ€κ³ νμ.
μ΄λ κ²μνμ κ΄λ ¨λ μ±
μλ§ μννλ―λ‘ SRPλ₯Ό λ§μ‘±νμ§λ§ ν΄λΌμ΄μΈνΈμ λ°λΌ (μΌλ° μ¬μ©μ, κ΄λ¦¬μ λ±) κΈ°λ₯μ΄ λ¬λΌμ§λ―λ‘(κΈ μμ κΆν λ±) νλμ μΈν°νμ΄μ€λ₯Ό ꡬννλ€λ©΄ ISPλ₯Ό μλ°°ν μ€κ³κ° λλ κ²μ΄λ€.
SRPλ₯Ό λ§μ‘±νλλΌλ ISPλ₯Ό λ°λμ λ§μ‘±νλ€κ³ λ³Ό μ μλ€