[Spring] OOP 5κ°μ§ μ€κ³μμΉ
1. μ€νλ§μ΄λ?
- κΈ°λ³Έμ μΌλ‘ μ€νλ§μ΄λΌκ³ ν¨μ μ€νλ§ λΆνΈ, μ€νλ§ νλ μμν¬ λ±μ λͺ¨λ ν¬ν¨ν μ€νλ§ μνκ³λ‘, μ’μ κ°μ²΄ μ§ν₯ μ ν리μΌμ΄μ μ κ°λ°ν μ μκ² λμμ£Όλ νλ μμν¬μ λλ€.
μ€νλ§ νλ μμν¬
- ν΅μ¬ κΈ°μ : μ€νλ§ DI 컨ν μ΄λ, AOP, μ΄λ²€νΈ, κΈ°ν
- μΉ κΈ°μ : μ€νλ§ MVC, μ€νλ§ WebFlux
- λ°μ΄ν° μ κ·Ό κΈ°μ : νΈλμμ , JDBC, ORM μ§μ, XML μ§μ
- κΈ°μ ν΅ν© : μΊμ, μ΄λ©μΌ, μ격μ κ·Ό, μ€μΌμ₯΄λ§
- ν μ€νΈ : μ€νλ§ κΈ°λ° ν μ€νΈ μ§μ
- μΈμ΄ : μ½νλ¦°, 그루λΉ
μ€νλ§ λΆνΈ
- μ€νλ§μ νΈλ¦¬νκ² μ¬μ©ν μ μλλ‘ μ§μ, μ΅κ·Όμλ κΈ°λ³ΈμΌλ‘ μ¬μ©
- λ¨λ μΌλ‘ μ€νν μ μλ μ€νλ§ μ ν리μΌμ΄μ μ μ½κ² μμ±
- μ€νλ§ λΆνΈλ₯Ό μ¬μ©νλ©΄ ν°μΊ£ κ°μ μΉμλ²λ₯Ό λ΄μ₯ν΄μ λ³λμ μΉμλ²λ₯Ό μ€μΉν νμκ° μμ
- μμ¬μ΄ λΉλ ꡬμ±μ μν μ€νν° μ’ μμ± μ 곡
2. μ’μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ΄λ?
κ°μ²΄ μ§ν₯ νΉμ§
- μΆμν
- μΊ‘μν
- μμ
- λ€νμ±
κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ νλ‘κ·Έλ¨μ μ μ°νκ³ λ³κ²½μ΄ μ©μ΄νκ² λ§λ€κΈ° λλ¬Έμ λκ·λͺ¨ μννΈμ¨μ΄ κ°λ°μ λ§μ΄ μ¬μ©λλ€.
λ€νμ±(Polymorphism)
μν κ³Ό ꡬνμΌλ‘ ꡬλΆνλ©΄ μ΄ν΄νκΈ° μ½μ΅λλ€.
ν΄λΌμ΄μΈνΈ(μ΄μ μ)λ λμμ μν (μΈν°νμ΄μ€)λ§ μκ³ , ꡬν λμ(κ°μ²΄)μ λ΄λΆ ꡬ쑰λ₯Ό μ νμ μμ!
κ·Έλ¦¬κ³ κ΅¬ν λμμ λ΄λΆκ΅¬μ‘°κ° λ³κ²½λλλΌλ ν΄λΌμ΄μΈνΈλ μν₯μ λ°μ§ μμ.
+ ꡬνλμ μ체λ₯Ό λ³κ²½ν΄λ μν₯μ λ°μ§ μμ. ex) K3 -> Tesla
βοΈ κ°μ²΄ μ€κ³μ μν (μΈν°νμ΄μ€)μ λ¨Όμ λΆμ¬νκ³ , κ·Έ μν μ μννλ ꡬν κ°μ²΄ λ§λ€κΈ°!
μ₯μ
- λ€νμ±μ μ΄μ©νλ©΄ μΈν°νμ΄μ€λ₯Ό ꡬνν κ°μ²΄ μΈμ€ν΄μ€λ₯Ό μ€ν μμ μ μ μ°νκ² λ³κ²½ν μ μμ΅λλ€.
- ν΄λΌμ΄μΈνΈλ₯Ό λ³κ²½νμ§ μκ³ , μλ²μ ꡬν κΈ°λ₯μ μ μ°νκ² λ³κ²½ν μ μμ΅λλ€.
νκ³
- λ§μ½ μΈν°νμ΄μ€ μ체λ₯Ό λ³κ²½ν΄μΌ νλ κ²½μ°, ν΄λΌμ΄μΈνΈμ μλ² λͺ¨λμ ν° λ³κ²½μ΄ λ°μν©λλ€.
λ°λΌμ μΈν°νμ΄μ€λ₯Ό μμ μ μΌλ‘ μ μ€κ³νλ κ²μ΄ μ€μνλ€.
μ’μ κ°μ²΄ μ§ν₯ μ€κ³μ 5κ°μ§ μμΉ (SOLID)
1. SRP (Single Responsibility Principle) / λ¨μΌ μ± μ μμΉ
- ν ν΄λμ€λ νλμ μ± μ(λͺ©μ )λ§ κ°μ ΈμΌ νλ©° λ³κ²½λλ μ΄μ λ νλμ¬μΌ νλ€.
- μ½κ²λ§ν΄, κ°μ²΄κ° λ΄λΉνλ λμμ΄ λ§μμ§μλ‘ ν΄λΉ κ°μ²΄μ λ³κ²½μ λ°λ₯Έ μν₯λμ μκ³Ό λ²μκ° λ§€μ° μ»€μ§κΈ° λλ¬Έμ νΉμ κ°μ²΄μ μ± μ μμ‘΄μ± κ³Όμ€μ μ΅λν μ§μνμλ μμΉ
2. OCP (Open/Closed Principle) / κ°λ°©-νμ μμΉ
- λ³κ²½μλ λ«νμκ³ νμ₯μλ μ΄λ €μμ΄μΌ νλ€.
- ꡬν체μ μμ‘΄νκΈ°λ³΄λ€ μ μν μΆμνμ μμ‘΄νλλ‘ μ½λλ₯Ό μμ± νλ€.
- κ°λ°©-νμ μμΉμ λ°λ₯΄μ§ μλλ€κ³ ν΄μ κ°μ²΄ μ§ν₯ μΈμ΄(Java, C++ λ±)μ ꡬνμ΄ λΆκ°λ₯ν κ²μ μλμ§λ§ μ΄ μμΉμ 무μνκ³ νλ‘κ·Έλλ°μ νλ€λ©΄, κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ κ°μ₯ ν° μ₯μ μΈ μ μ°μ±, μ¬μ¬μ©μ±, μ μ§λ³΄μμ± λ±μ κ²°μ½ μ»μ μ μλ€.
λ¬Έμ μ
MemberRepository m = new MemoryMemberRepository(); //κΈ°μ‘΄ μ½λ
MemberRepository m = new JdbcMemberRepository(); //λ³κ²½ μ½λ
ꡬν κ°μ²΄λ₯Ό λ³κ²½νλ €λ©΄ ν΄λΌμ΄μΈνΈ μ½λλ₯Ό λ³κ²½ν΄μΌ νλ€.
λΆλͺ
λ€νμ±μ μ¬μ©νμ§λ§ OCP μμΉμ μ§ν¬ μ μλ€. (λ³κ²½γ΄γ΄ νμ₯ γ±γ±)
μ΄ λ¬Έμ λ₯Ό μ΄λ»κ² ν΄κ²°ν΄μΌ ν κΉ?
κ°μ²΄λ₯Ό μμ±νκ³ , μ°κ΄κ΄κ³λ₯Ό λ§Ίμ΄μ£Όλ λ³λμ 쑰립, μ€μ μκ° νμνλ€.
3. LSP (Liskov substitution principle) / 리μ€μ½ν μΉν μμΉ
- νλ‘κ·Έλ¨μ κ°μ²΄λ νλ‘κ·Έλ¨μ μ νμ±μ κΉ¨λ¨λ¦¬μ§ μμΌλ©΄μ νμ νμ μ μΈμ€ν΄μ€λ‘ λ°κΏ μ μμ΄μΌ νλ€
- λ€νμ±μμ νμ ν΄λμ€λ μΈν°νμ΄μ€ κ·μ½μ λ€ μ§μΌμΌ νλ€λ κ², λ€νμ±μ μ§μνκΈ° μν μμΉ, μΈν°νμ΄μ€λ₯Ό ꡬνν ꡬν체λ λ―Ώκ³ μ¬μ©νλ €λ©΄, μ΄ μμΉμ΄ νμνλ€.
μ) μλμ°¨ μΈν°νμ΄μ€μ μμ μ μμΌλ‘ κ°λΌλ κΈ°λ₯, λ€λ‘ κ°κ² ꡬννλ©΄ LSP μλ°, λ리λλΌλ μμΌλ‘ κ°μΌν¨
4. ISP (Interface Segregation Principle) / μΈν°νμ΄μ€ λΆλ¦¬ μμΉ
- νΉμ ν΄λΌμ΄μΈνΈλ₯Ό μν μΈν°νμ΄μ€ μ¬λ¬ κ°κ° λ²μ© μΈν°νμ΄μ€ ν κ° λ³΄λ€ λ«λ€λ μμΉ
- μλμ°¨ μΈν°νμ΄μ€ -> μ΄μ , μ λΉ μΈν°νμ΄μ€λ‘ λΆλ¦¬
- μ¬μ©μ ν΄λΌμ΄μΈνΈ -> μ΄μ μ, μ λΉμ¬ ν΄λΌμ΄μΈνΈλ‘ λΆλ¦¬
- μ΄λ κ² λΆλ¦¬νλ©΄ μ λΉ μΈν°νμ΄μ€ μμ²΄κ° λ³ν΄λ μ΄μ μ ν΄λΌμ΄μΈνΈμ μν₯μ μ£Όμ§ μμ
-> μΈν°νμ΄μ€κ° λͺ νν΄μ§κ³ λ체 κ°λ₯μ±μ΄ λμμ§λ€.
5. DIP (Dependency Inversion Principle) / μμ‘΄κ΄κ³ μμ μμΉ
- νλ‘κ·Έλλ¨Έλ μΆμνμ μμ‘΄νκ³ , ꡬ체νμ μμ‘΄νλ©΄ μλλ€λ μμΉ
- μ½κ²λ§ν΄, ꡬν ν΄λμ€μ μμ‘΄νμ§ λ§κ³ , μΈν°νμ΄μ€μ μμ‘΄νλΌλ λ»
- μμ μ΄μΌκΈ°ν μν μ μμ‘΄νκ² ν΄μΌνλ€λ κ²κ³Ό κ°λ€. μΈν°νμ΄μ€μ μμ‘΄ν΄μΌ μ μ°νκ² κ΅¬ν체λ₯Ό λ³κ²½ν μ μλ€.
- ꡬν체μ μμ‘΄νκ² λλ©΄ λ³κ²½μ΄ μ΄λ €μμ§.
λ¬Έμ μ
κ·Έλ°λ° OCPμμ μ€λͺ ν MemberServiceλ μΈν°νμ΄μ€μ μμ‘΄νμ§λ§, ꡬν ν΄λμ€λ λμμ μμ‘΄νλ€.
MemberService ν΄λΌμ΄μΈνΈκ° ꡬν ν΄λμ€λ₯Ό μ§μ μ ν.
MemberRepository m = new MemoryMemberRepository(); DIP μλ°
μ 리νμλ©΄,
κ°μ²΄ μ§ν₯μ ν΅μ¬μ λ€νμ±μΈλ°,
> λ€νμ± λ§μΌλ‘λ μ½κ² λΆνμ κ°μ λΌμ°λ―μ΄ κ°λ°μ ν μ μκ³ , ꡬν κ°μ²΄λ₯Ό λ³κ²½ν λ ν΄λΌμ΄μΈνΈ μ½λλ ν¨κ» λ³κ²½λλ€.
> μ¦, λ€νμ± λ§μΌλ‘λ OCP, DIPλ₯Ό μ§ν¬ μ μλ€.
> 무μΈκ° λ νμν μν©.
λ€μ μ€νλ§μΌλ‘ κ°λ΄ μλ€.
μ€νλ§μ λ€μ κΈ°μ λ‘ λ€νμ± + OCP, DIPλ₯Ό κ°λ₯νκ² μ§μν΄μ€λλ€.
- DI : μμ‘΄κ΄κ³, μμ‘΄μ± μ£Όμ
- DI 컨ν μ΄λ μ 곡
λ²μΈλ‘ DI κ°λ μ λ§λ‘ μ€λͺ ν΄λ μ΄ν΄κ° μ μλλ€. μ½λλ‘ μ§λ΄μΌ νμμ±μ μκ² λλ€.
- ν΄λΌμ΄μΈνΈ μ½λμ λ³κ²½ μμ΄ κΈ°λ₯ νμ₯
μ€λ¬΄μμλ
- λͺ¨λ μ€κ³μ μν (μΈν°νμ΄μ€)κ³Ό ꡬν(κ°μ²΄)λ₯Ό λΆλ¦¬νμ.
- νμ§λ§ μΈν°νμ΄μ€λ₯Ό λμ νλ©΄ μΆμνλΌλ λΉμ©μ΄ λ°μνλ€. λ§μ½μ κΈ°λ₯μ νμ₯ν κ°λ₯μ±μ΄ μλ€λ©΄, ꡬν체 ν΄λμ€λ₯Ό μ§μ μ¬μ©νκ³ , ν₯ν κΌ νμν λ 리νν°λ§ν΄μ μΈν°νμ΄μ€λ₯Ό λμ νλ κ²λ λ°©λ²μ΄λ€.
<μ°Έκ³ μλ£>
μ€νλ§ ν΅μ¬ μ리 - κΈ°λ³ΈνΈ - μΈνλ° | κ°μ
μ€νλ§ μ λ¬Έμκ° μμ λ₯Ό λ§λ€μ΄κ°λ©΄μ μ€νλ§μ ν΅μ¬ μ리λ₯Ό μ΄ν΄νκ³ , μ€νλ§ κΈ°λ³ΈκΈ°λ₯Ό νμ€ν λ€μ§ μ μμ΅λλ€., - κ°μ μκ° | μΈνλ°...
www.inflearn.com
κ°λ°©-νμ μμΉ - μν€λ°±κ³Ό, μ°λ¦¬ λͺ¨λμ λ°±κ³Όμ¬μ
μν€λ°±κ³Ό, μ°λ¦¬ λͺ¨λμ λ°±κ³Όμ¬μ . κ°λ°©-νμ μμΉ(OCP, Open-Closed Principle)μ 'μννΈμ¨μ΄ κ°μ²΄(ν΄λμ€, λͺ¨λ, ν¨μ λ±λ±)λ νμ₯μ λν΄ μ΄λ € μμ΄μΌ νκ³ , μμ μ λν΄μλ λ«ν μμ΄μΌ νλ€'λ ν
ko.wikipedia.org
[OOP] π μλ²½νκ² μ΄ν΄νλ OCP (κ°λ°© νμ μμΉ)
κ°λ°© νμ μμΉ - OCP (Open Closed Principle) κ°λ°© νμμ μμΉ(OCP)μ΄λ κΈ°μ‘΄μ μ½λλ₯Ό λ³κ²½νμ§ μμΌλ©΄μ, κΈ°λ₯μ μΆκ°ν μ μλλ‘ μ€κ³κ° λμ΄μΌ νλ€λ μμΉμ λ§νλ€. λ³΄ν΅ OCPλ₯Ό νμ₯μ λν΄μλ
inpa.tistory.com