BackEnd
μ’μ κ°μ²΄ μ§ν₯ μ€κ³μ 5κ°μ§ μμΉ(SOLID)
mokhs
2021. 6. 12. 23:39
κΉμνλμ μ€νλ§ ν΅μ¬ μ리 κΈ°λ³ΈνΈ κ°μλ₯Ό λ³΄κ³ μ 리ν λ΄μ©μ λλ€.
SOLID
ν΄λ¦°μ½λλ‘ μ λͺ ν λ‘λ²νΈ λ§ν΄μ΄ μ’μ κ°μ²΄ μ§ν₯ μ€κ³μ 5κ°μ§ μμΉμ λ€μκ³Ό κ°μ΄ μ 리ν¨.
- SRP: λ¨μΌ μ± μ μμΉ(single responsibility principle)
- OCP: κ°λ°©-νμ μμΉ (Open/closed principle)
- LSP: 리μ€μ½ν μΉν μμΉ (Liskov substitution principle)
- ISP: μΈν°νμ΄μ€ λΆλ¦¬ μμΉ (Interface segregation principle)
- DIP: μμ‘΄κ΄κ³ μμ μμΉ (Dependency inversion principle)
SRP λ¨μΌ μ± μ μμΉ
Single responsibility principle
- ν ν΄λμ€λ νλμ μ±
μλ§μ κ°μ ΈμΌ νλ€.
-> μ¬μ€ λͺ¨νΈνλ€ - νλμ μ±
μμ΄λΌλ κ²μ λͺ¨νΈνλ€.
- μ± μμ΄ ν΄ μλ, μμ μλ μλ€
- λ¬Έλ§₯κ³Ό μν©μ λ°λΌ λ€λ₯΄λ€.
- μ€μν κΈ°μ€μ λ³κ²½μ΄λ€. λ³κ²½μ΄ μμ λ νκΈ ν¨κ³Όκ° μ μΌλ©΄ λ¨μΌ μ± μ μμΉμ μ λ°λ₯Έ κ²
- ex) UI λ³κ²½, κ°μ²΄μ μμ±κ³Ό μ¬μ©μ λΆλ¦¬
-> λ²μλ₯Ό μ μ νκ² μ‘°μ νλ κ²μ΄ κ°μ²΄ μ§ν₯ μ€κ³μ λ¬λ―Έ, λ³κ²½μ΄ μμ λ νλμ ν΄λμ€μ νλμ λΆλΆλ§ κ³ μΉ μ μλ μ€κ³λΌλ©΄ SRPλ₯Ό μ μ§ν¨ κ²!
OCP κ°λ°©-νμ μμΉ
Open/closed principle
- μννΈμ¨μ΄ μμλ νμ₯μλ μ΄λ €μμΌλ λ³κ²½μλ λ«ν μμ΄μΌ νλ€.
- νμ₯μ νλ €λ©΄, λΉμ°ν κΈ°μ‘΄ μ½λλ₯Ό λ³κ²½ν΄μΌ νλ€. κ·ΈλΌ μ΄κ±΄ μ§ν¬ μ μλ κ²μΌκΉ?
- μλλ€. λ€νμ±μ νμ©νλ€λ©΄ μ½κ² μ΄λ₯Ό μ΄ν΄ν μ μλ€.
- μΈν°νμ΄μ€λ₯Ό ꡬνν μλ‘μ΄ ν΄λμ€λ₯Ό νλ λ§λ€μ΄μ μλ‘μ΄ κΈ°λ₯μ ꡬννλ λ°©μμΌλ‘ νμ₯νλ©΄ λλ€.
λ¬Έμ μ
// MemberRepository reopsitory = new JDBCMemberRepository();
MemberRepository reopsitory = new JpaMemberRepository();
- μμ κ°μ΄ ꡬν κ°μ²΄λ₯Ό λ³κ²½νλ €λ©΄ κ²°κ΅ ν΄λΌμ΄μΈνΈ μ½λλ₯Ό λ³κ²½ν΄μΌ νλ€.
- λΆλͺ λ€νμ±μ μ¬μ©νμ§λ§, OCP μμΉμ μ§ν¬ μ μλ€.
- μ΄ λ¬Έμ λ₯Ό μ΄λ»κ² ν΄κ²°ν΄μΌν κΉ?
- κ°μ²΄λ₯Ό μμ±νκ³ , μ°κ΄κ΄κ³λ₯Ό λ§Ίμ΄μ£Όλ λ³λμ 쑰립, μ€μ μκ° νμνλ€.
- μ¬μ€ μ€νλ§μμλ 컨ν μ΄λλ₯Ό μ΄μ©ν΄μ μ΄λ₯Ό ν΄κ²°νλ€.
LSP 리μ€μ½ν μΉν μμΉ
Liskov substitution principle
- νλ‘κ·Έλ¨μ κ°μ²΄λ νλ‘κ·Έλ¨μ μ νμ±μ κΉ¨λ¨λ¦¬μ§ μμΌλ©΄μ νμ νμ μ μΈμ€ν΄μ€λ‘ λ°κΏ μ μμ΄μΌ νλ€.
- λ€νμ±μμ νμ ν΄λμ€λ μΈν°νμ΄μ€ κ·μ½μ λ€ μ§μΌμΌ νλ€λ κ²μ΄λ€. λ€νμ±μ μ§μνκΈ° μν μμΉ, μΈν°νμ΄μ€λ₯Ό ꡬνν ꡬν체λ₯Ό λ―Ώκ³ μ¬μ©νλ €λ©΄ μ΄ μμΉμ΄ νμνλ€.
- λ¨μν μ»΄νμΌμ μ±κ³΅νλ κ²μ λμ΄μλ μ΄μΌκΈ°
-> μλμ°¨λ₯Ό λ§λλλ° μ μ μ λ°μΌλ©΄ μμΌλ‘ κ°λ κΈ°λ₯μ νμ€μΌλ‘ λ§λ€μλ€κ³ μΉμ κ·Έλ°λ° μ μ μ λ°μΌλ©΄ λ€λ‘ κ°λ κΈ°λ₯μΌλ‘ λ§λ€μλ€κ³ ν΄λ³΄μ. μ»΄νμΌ μμ λ¬Έμ λ λμ§ μμ§λ§ LSP μμΉμ μ΄κΈλ κ²μ΄ λλ€.
μ΄λ₯Ό μ 리νλ©΄ μλμ κ°λ€. - μ) μλμ°¨ μΈν°νμ΄μ€μ μμ μ μμΌλ‘ κ°λΌλ κΈ°λ₯, λ€λ‘ κ°κ² ꡬννλ©΄ LSP μλ°, λ리λλΌλ μμΌλ‘ κ°μΌνλ€.
ISP μΈν°νμ΄μ€ λΆλ¦¬ μμΉ
Interface segregation principle
- νΉμ ν΄λΌμ΄μΈνΈλ₯Ό μν μΈν°νμ΄μ€ μ¬λ¬ κ°κ° λ²μ© μΈν°νμ΄μ€ νλλ³΄λ€ λ«λ€.
- μλμ°¨ μΈν°νμ΄μ€ -> μ΄μ μΈν°νμ΄μ€, μ λΉ μΈν°νμ΄μ€λ‘ λΆλ¦¬
- μ¬μ©μ ν΄λΌμ΄μΈνΈ -> μ΄μ μ ν΄λΌμ΄μΈνΈ, μ λΉμ¬ ν΄λΌμ΄μΈνΈλ‘ λΆλ¦¬
- λΆλ¦¬νλ©΄ μ λΉ μΈν°νμ΄μ€ μμ²΄κ° λ³ν΄λ μ΄μ μ ν΄λΌμ΄μΈνΈμ μν₯μ μ£Όμ§ μμ
- μΈν°νμ΄μ€κ° λͺ νν΄μ§κ³ , λ체 κ°λ₯μ±μ΄ λμμ§λ€. -> λ©μ΄λ¦¬κ° μμμ§κΈ° λλ¬Έ
- μ€νλ§μ μ λ§ μ² μ νκ² μΈν°νμ΄μ€κ° λΆλ¦¬λμ΄ μλ€κ³ ν¨.
DIP μμ‘΄κ΄κ³ μμ μμΉ
Dependency inversion principle
- νλ‘κ·Έλλ¨Έλ "μΆμνμ μμ‘΄ν΄μΌμ§, ꡬ체νμ μμ‘΄νλ©΄ μλλ€." μμ‘΄μ± μ£Όμ μ μ΄ μμΉμ λ°λ₯΄λ λ°©λ² μ€ νλλ€.
- μ½κ² μ΄μΌκΈ°ν΄μ ꡬν ν΄λμ€μ μμ‘΄νμ§ λ§κ³ , μΈν°νμ΄μ€μ μμ‘΄νλΌλ λ»!
- ex) μν (Role)μ μμ‘΄νκ² ν΄μΌνλ€λ λ§(λ°°μ°μ λ°°μ, λ°°μ°κ° λ°°κ»΄λ λ°°μμ λ³νμ§ μμ)κ³Ό κ°λ€.
- κ°μ²΄ μΈμλ ν΄λΌμ΄μΈνΈκ° μΈν°νμ΄μ€μ μμ‘΄ν΄μΌ μ μ°νκ² κ΅¬ν체λ₯Ό λ³κ²½ν μ μμ. ꡬν체μ μμ‘΄νκ² λλ©΄ λ³κ²½μ΄ μμ£Ό μ΄λ €μμ§!!!!
μλ μ½λμ MemberServiceλ μΈν°νμ΄μ€μ μμ‘΄νμ§λ§, ꡬν ν΄λμ€λ λμμ μμ‘΄νλ€.
- μμ‘΄νλ€ = ν΄λΉ ν΄λμ€κ° κ·Έ μ½λμ λν΄ μκ³ μλ€.
- λ°λΌμ DIP μλ°!
- MemberService ν΄λΌμ΄μΈνΈκ° ꡬν ν΄λμ€λ₯Ό μ§μ μ ννκ³ μμ...
@Service
class MemberService {
MemberRepository repository = new JpaMemberRepository();
}
μ 리
- κ°μ²΄ μ§ν₯μ ν΅μ¬μ λ€νμ±
- μν κ³Ό ꡬνμ λΆλ¦¬νλΌ.
- μ μ°νκ² λ³κ²½ν μ μλλ‘ λ§λλ κ²μ΄ μ’μ κ°μ²΄ μ§ν₯ μ€κ³λ€.
- μ΄μμ μΌλ‘ λͺ¨λ μ€κ³μ μΈν°νμ΄μ€λ₯Ό λΆμ¬νμ.
- νμ§λ§, λ€νμ±λ§μΌλ‘λ μ½κ² λΆνμ κ°μ λΌμ°λ―μ΄ κ°λ°ν μ μλ€..
- λ€νμ±λ§μΌλ‘ ꡬν κ°μ²΄λ₯Ό λ³κ²½ν λ ν΄λΌμ΄μΈνΈ μ½λλ ν¨κ» λ³κ²½λλ€.
- λ€νμ±λ§μΌλ‘λ OCP, DIPλ₯Ό μ§ν¬ μ μκ³ , λκ° λ νμνλ€
- κ·Έκ²μ΄ λ°λ‘ μ€νλ§!! μ€νλ§μ DIλ₯Ό ν΅ν΄ λ€νμ± + OCP, DIPλ₯Ό κ°λ₯νκ² μ§μνλ€.
λ°μν