[κ°μ²΄μ§ν₯] SOLID μμΉμ΄λ?
π³ SOLID μμΉ
μ€λμ κ°μ²΄μ§ν₯ κ°λ°μ 5κ°μ§ μμΉμΈ SOLID μμΉμ λν΄ κ³΅λΆν΄λ³΄μλ€.
S,O,L,I,D λ κ°κ° λ¨μ΄μ 첫 κΈμμ΄λ©° ν©νμ¬ μ리λ μμΉμ΄λΌκ³ λΆλ₯Έλ€.
μ§κΈλΆν° μ리λ μμΉμ λν΄ μμ보μ.
π± SRP ( Single Responsibility Principle )
SRPλ Single Responsibility Principle μ μ½μμ΄λ©° λ§κ·Έλλ‘
λ¨μΌ μ± μ μμΉμ λ»νλ€.
νλμ ν΄λμ€λ νλμ μ± μλ§ κ°μ ΈμΌ νλ€λ μμΉμ΄λ€.
νλμ μ± μμ΄λΌλ κ²μ κ΅μ₯ν λͺ¨νΈν ννμ΄λ€.
"ν΄ μλ μκ³ μμ μλ" μμΌλ©° "λ¬Έλ§₯κ³Ό μν©μ λ°λΌ" λ€λ₯΄λ€.
μ€μν κΈ°μ€μ λ³κ²½μ΄λ€. λ³κ²½μ΄ μμ λ νκΈ ν¨κ³Όκ° ν¬λ€λ©΄ λ¨μΌ μ± μ μμΉμ μ λλ‘ μ§ν€μ§ λͺ»ν κ²μ΄ λλ€.
π± OCP ( Open Closed Principle )
OCPλ Open Closed Principle μ μ½μλ‘ κ°λ°© νμ μμΉμ λ»νλ€.
μ΄λ "μννΈμ¨μ΄λ νμ₯μλ μ΄λ €μμΌλ λ³κ²½μλ λ«ν μμ΄μΌ νλ€" λ μμΉμ΄λ€.
π± LSP ( Liskov Subsitution Principle )
LSPλ Liskov Subsitution Principle μ μ½μμ΄λ©° 리μ€μ½ν μΉν μμΉμ λ»νλ€.
μ΄ μμΉμ΄ μλ―Ένλ λ°λ μλμ κ°λ€.
- νλ‘κ·Έλ¨μ κ°μ²΄λ νλ‘κ·Έλ¨μ μ νμ±μ κΉ¨λ¨λ¦¬μ§ μμΌλ©΄μ νμ νμ μ μΈμ€ν΄μ€λ‘ λ°κΏ μ μμ΄μΌ νλ€.
- λ€νμ±μμ νμ ν΄λμ€λ μΈν°νμ΄μ€ κ·μ½μ λ€ μ§μΌμΌ νλ€.
EX) μλμ°¨ μΈν°νμ΄μ€μ μμ μ μμΌλ‘ κ°λΌλ κΈ°λ₯, λ€λ‘ κ°κ² ꡬννλ©΄ LSP μλ°
π± ISP ( Interface Segregation Principle )
ISPλ Interface Segregation Principle μ μ½μλ‘ μΈν°νμ΄μ€ λΆλ¦¬ μμΉμ λ»νλ€.
μ΄ κ·μΉμ΄ μλ―Ένλ λ°λ μλμ κ°λ€.
- νΉμ ν΄λΌμ΄μΈνΈλ₯Ό μν μΈν°νμ΄μ€λ νλμ λ²μ© μΈν°νμ΄μ€λ³΄λ€ μ¬λ¬ κ°κ° λ«λ€.
- μλμ°¨ μΈν°νμ΄μ€ -> μ΄μ , μ λΉ μΈν°νμ΄μ€λ‘ λΆλ¦¬
- μ¬μ©μ ν΄λΌμ΄μΈνΈ -> μ΄μ μ, μ λΉμ¬ ν΄λΌμ΄μΈνΈλ‘ λΆλ¦¬
- λΆλ¦¬νλ©΄ μ λΉ μΈν°νμ΄μ€ μμ²΄κ° λ³ν΄λ μ΄μ μ ν΄λΌμ΄μΈνΈμ μν₯μ μ£Όμ§ μμ
- μΈν°νμ΄μ€κ° λͺ νν΄μ§κ³ , λ체 κ°λ₯μ±μ΄ λμμ§λ€
π± DIP ( Dependency Inversion Principle )
DIPλ Dependency Inversion Principle μ μ½μλ‘ μμ‘΄κ΄κ³ μμ μμΉμ λ»νλ€.
μ΄ μμΉμ΄ μλ―Ένλ λ°λ μλμ κ°λ€.
νλ‘κ·Έλλ¨Έλ "ꡬ체νκ° μλ μΆμνμ μμ‘΄ν΄μΌνλ€."
μ½κ² μ΄μΌκΈ°ν΄μ ꡬνλ ν΄λμ€κ° μλ μΈν°νμ΄μ€μ μμ‘΄νλΌλ λ»μ΄λ€.
μλ₯Ό λ€μ΄ λ§νλ©΄ λͺ¨λ, ν μ¬λΌ, μ λ€μμ€ λ±μ ꡬνμ²΄κ° μλ μλμ°¨ λΌλ μΈν°νμ΄μ€μ μμ‘΄νλΌλ κ²μ΄λ€.
π€·βοΈ λ¬Έμ μ ?
μΌν보면 μμ μμΉμΌλ‘ κ°λ°μ νλ λ°μ μλ¬΄λ° λ¬Έμ κ° μμ΄λ³΄μ΄μ§λ§ κ·Έλ μ§ μλ€.
OCPλ νμ₯μλ μ΄λ €μμ§λ§ λ³κ²½μλ λ«νμλ€ λΌλ μμΉμ΄λ€.
νμ§λ§
νμ₯μ νλ €λ©΄ λΉμ°ν κΈ°μ‘΄ μ½λλ₯Ό λ³κ²½νλ κ² μλκ°?
λ€νμ±μ μ¬μ©νλ€κ³ ν΄λ
MemeberRepository m = new MemoryMemberRepository(); //κΈ°μ‘΄ μ½λ
MemberRepository m = new JdbcMemberRepository(); //λ³κ²½ μ½λ
μ΄λ κ² μΈν°νμ΄μ€μ μμ‘΄νμ§λ§ ꡬν체μλ μμ‘΄νκΈ° λλ¬Έμ λ³κ²½μ΄ μΌμ΄λλ€.
μ΄λ κ² λλ©΄ OCPλΏλ§ μλλΌ DIPκΉμ§ μλ°νκ² λλ κΌ΄μ΄λ€.
"μ΄λ₯Ό μ΄λ»κ² ν΄κ²°ν μ μμκΉ" μ λν λΆλΆμ μ€νλ§μ DIμ IoCκ° μ 곡νλ€.
λ€μ μκ°μλ μ€νλ§μ DIμ IoCμ λν΄ μμ보λ μκ°μ κ°λλ‘ νκ² λ€.
λν μμ μμμ μ€λͺ ν SOLIDμμΉμ κ°μ²΄μ§ν₯μ 곡λΆνλ λ°μ μ€μν λ΄μ©μ΄λ―λ‘ μ μμ§νλλ‘ νμ