2022. 1. 26. 10:50γBackend/πΏ Spring
μ€νλ§ ν΅μ¬ μ리 - κΈ°λ³ΈνΈ μκ° ν μ 리ν ν¬μ€ν μ λλ€.
1. μ€νλ§μ΄λ
μ€νλ§μ ν΅μ¬ νΉμ§
1. μλ° μΈμ΄ κΈ°λ°μ νλ μμν¬
2. μλ°μ ν° νΉμ§: κ°μ²΄ μ§ν₯ μΈμ΄
3. μ¦ κ°μ²΄ μ§ν₯ μΈμ΄κ° κ°μ§ κ°λ ₯ν νΉμ§μ μ΄λ €λΌ μ μλ νλ μμν¬ : Spring
4. μ 리νμλ©΄, μ’μ κ°μ²΄ μ§ν₯ μ ν리μΌμ΄μ μ κ°λ°ν μ μλλ‘ λμμ£Όλ νλ μμν¬
μ’μ κ°μ²΄ μ§ν₯ νλ‘κ·Έλλ°μ΄λ?
1. κ°μ²΄ μ§ν₯μ μ μ : νμ€μΈκ³λ₯Ό μ½λλ‘ λ°μνμ¬, νλ‘κ·Έλ¨ κ΅¬νμ νμν κ°μ²΄(ex νμ€μ μ¬λ¬Ό, etc)λ₯Ό νμ νκ³ κ°μ²΄κ°μ μν μ λ§λ μνΈμμ©μ ν΅ν΄ νλ‘κ·Έλ¨μ λ§λλ κ²
2. μ μ°νκ³ λ³κ²½μ΄ μ©μ΄ν¨ => λ€νμ±(polymorphism)
λ€νμ±μ μ€μΈκ³ λΉμ
1. μλμ°¨κ° λ°λμ΄λ μ΄μ μλ μ¬μ ν μ΄μ μ ν μ μλ€.
2. μ΄μ μλ μλμ°¨λΌλ μν (μΈν°νμ΄μ€) μλ§ μ§μ€/μμ‘΄νκ³ μλ€. μ΄μ μλ μλμ°¨ λ΄λΆ ꡬ쑰λ₯Ό λͺ°λΌλ, μλ‘ λ€λ₯Έ μ’ λ₯μ μλμ°¨λ₯Ό μ΄μ ν μ μλ€.
3. ν΄λΌμ΄μΈνΈμκ² μν₯μ μ£Όμ§μκ³ μλ‘μ΄ κΈ°λ₯μ ꡬνν μ μλ€.
4. μλ‘μ΄ μλμ°¨κ° λμλ *ν΄λΌμ΄μΈνΈλ μ무 λ¬Έμ κ° μλ€. => μ΄κ²μ΄ μ μ°νκ³ λ³κ²½ μ©μ΄νλ€λ λ»
* ν΄λΌμ΄μΈνΈ : ν΄λΌμ΄μΈνΈ : νΈμΆ, μλ² : μλ΅ β‘οΈ νΈμΆλλ μ½λλ₯Ό μλ²μ½λλΌκ³ νλ©΄, μλ² μ½λλ₯Ό νΈμΆνλ λͺ¨λ μ½λ(κ°μ²΄, ν΄λμ€) κ° ν΄λΌμ΄μΈνΈμ΄λ€.
μν κ³Ό ꡬνμ λΆλ¦¬
μν κ³Ό ꡬνμΌλ‘ ꡬλΆνλ©΄ μΈμμ΄ λ¨μν΄μ§κ³ , μ μ°ν΄μ§λ©° λ³κ²½λ νΈλ¦¬ν΄μ§λ€.
- μ₯μ
- ν΄λΌμ΄μΈνΈλ
- λμμ μν (μΈν°νμ΄μ€)λ§ μλ©΄ λλ€.
- ꡬν λμμ λ΄λΆ ꡬ쑰λ₯Ό λͺ°λΌλ λλ€.(μλμ°¨ ꡬ쑰)
- ꡬν λμμ λ΄λΆ κ΅¬μ‘°κ° λ³κ²½λμ΄λ μν₯ λ°μ§ μλλ€.
- ꡬν λμ μ체λ₯Ό λ³κ²½ν΄λ μν₯μ λ°μ§ μλλ€.
- ν΄λΌμ΄μΈνΈλ
μλ° μΈμ΄μ λ€νμ±μ νμ©
- μν = μΈν°νμ΄μ€
- ꡬν = μΈν°νμ΄μ€λ₯Ό ꡬνν ν΄λμ€, ꡬν κ°μ²΄
- μ€μν μ μ, κ°μ²΄ μ€κ³μ μν μ λ¨Όμ λΆμ¬νκ³ , κ·Έ μν μ μννλ ꡬν κ°μ²΄ λ§λ€ κ².
κ°μ²΄μ νλ ₯μ΄λΌλ κ΄κ³λΆν° μκ°
- νΌμμλ κ°μ²΄λ μλ€.
- ν΄λΌμ΄μΈνΈ: μμ², μλ²: μλ΅ μ΄λ©°, μλ§μ κ°μ²΄ ν΄λΌμ΄μΈνΈμ μλ²λ νλ ₯ κ΄κ³λ₯Ό κ°μ§λ€.
μλ° μΈμ΄μ λ€νμ±
- μ€λ²λΌμ΄λ© => μ€λ²λΌμ΄λ λ λ©μλκ° μ€νλλ€.
- λ€νμ±μΌλ‘ μΈν°νμ΄μ€λ₯Ό ꡬνν κ°μ²΄λ₯Ό μ€ν μμ μ μ μ°νκ² λ³κ²½ν μ μλ€.
- ν΄λΌμ΄μΈνΈλ₯Ό λ³κ²½νμ§ μκ³ , μλ²μ ꡬνμ μ μ°νκ² λ³κ²½ν μ μλ€. (JDBC <=> MemoryRepository)
- ex) κΈ°μ‘΄μ jDBCμ μ μ₯νλ λ°μ΄ν°λ₯Ό MemoryRepository μλ μ μ₯ν΄μΌν λ, λΉμ¦λμ€λ‘μ§μ λ³κ²½νμ§ μμλ, μ μ°νκ² DB λ₯Ό κ΅μ²΄ν μ μλ€ (μ μ°μ±)
μ€νλ§κ³Ό κ°μ²΄ μ§ν₯
- κ°μ²΄ μ§ν₯μ κ½μ λ€νμ±!
- μ€νλ§μ λ€νμ±μ κ·Ήλνν μ μκ² λμμ£ΌκΈ°μ, λ κ³ λΈλ 쑰립νλ―μ΄ κ°μ²΄κ°μ κ΄κ³λ₯Ό μ μ°νκ² μ€κ³ν μ μλ€.
- SOLID λΌλ κ°λ μ μμμΌνλ€.
2. μ’μ κ°μ²΄ μ§ν₯ μ€κ³μ 5κ°μ§ μμΉ (SOLID)
SOLID: μ’μ κ°μ²΄ μ§ν₯ μ€κ³μ 5κ°μ§ μμΉ
SRP: Single Responsibility Principle
- νλμ ν΄λμ€λ νλμ μ± μλ§ κ°μ§λ€.
- νμ§λ§ νλμ μ±
μμ΄λΌλ λ»μ λͺ¨νΈνλ€
- μ± μμ΄ ν΄ μλ μκ³ , μμ μλ μλ€.
- λ¬Έλ§₯κ³Ό μν©μ λ°λΌ μ± μμ λ¬λΌμ§ μ μλ€.
- λ³κ²½μ΄ μμ λ νκΈν¨κ³Όκ° μ μΌλ©΄ λ¨μΌ μ± μ μμΉμ μ λ°λ₯Έ κ².
- λ무 ν¬μ§λ, μμ§λ μλλ‘ μ μ ν μ± μμ κ·μ νλκ² κ°μ²΄μ§ν₯ μ€κ³μ λ¬λ―Έ
OCP: Open/Closed Principle
- μννΈμ¨μ΄ μμλ νμ₯μλ μ΄λ €μμΌλ, λ³κ²½μλ λ«νμμ΄μΌνλ€.
- μν κ³Ό ꡬνμ λΆλ¦¬λ₯Ό μκ°ν΄λ³΄μ.
μλ μ½λλ, λ³κ²½νκΈ° μν΄ μ£Όμ μ²λ¦¬νκ³ μλ‘μ΄ μ½λλ₯Ό μμ±ν΄μΌνλ€ (λ³κ²½μ λ«νμμ§ μμ μν = λ³κ²½μ μ΄λ €μλ€ = ν΄λΌμ΄μΈνΈ μ½λλ₯Ό μ§μ λ³κ²½ν΄μΌνλ€.)
public class MemberServiceImpl implements MemberService{
// κΈ°μ‘΄
// private final MemberRepository memberRepository = new MemoryMemberRepository();
// λ³κ²½
private final MemberRepository memberRepository = new JdbcMemberRepository();
...
}
λΆλͺ λ€νμ±μ μ¬μ©νμ§λ§, OCP μμΉμ μ§ν¬ μ μλ€. (<= ꡬν κ°μ²΄λ₯Ό λ³κ²½νλ €λ©΄, κΈ°μ‘΄ μ½λλ₯Ό λ³κ²½ν΄μΌνλ€.)
κ°μ²΄λ₯Ό μμ±νκ³ , μ°κ΄κ΄κ³λ₯Ό λ§Ίμ΄μ£Όλ λ³λμ 쑰립, μ€μ μ
κ° νμνλ€. => μ΄ μν μ μ€νλ§
μ΄ ν΄μ€λ€. (νμ λ°°μΈ AppConfig ν΄λμ€μ μν )
LSP: Liskov Substitution Principle
- ex) μλμ°¨μ μμ μΈν°νμ΄μ€λ μ μ§ κΈ°λ₯μ κ°μ§λ©°, μ΄λ₯Ό λ€λ‘ κ°κ² ꡬννλ©΄ LSP μλ°νλ κ²μ΄λ€. (λ리λλΌλ μμΌλ‘ κ°μΌνλ€.)
- κ°μ²΄λ νλ‘κ·Έλ¨μ μ νμ±μ κΉ¨λ¨λ¦¬μ§ μμΌλ©΄μ νμ νμ μ μΈμ€ν΄μ€λ‘ λ°κΏ μ μμ΄μΌνλ€.
ISP: Interface Segregation Principle
- νΉμ ν΄λΌμ΄μΈνΈλ₯Ό μν μΈν°νμ΄μ€ μ¬λ¬κ°κ° λ²μ© μΈν°νμ΄μ€ νλλ³΄λ€ λ«λ€.
- (= μΈν°νμ΄μ€λ₯Ό μ¬λ¬κ° μ€κ³ν΄λΌ = νλμ μΌλ°νλ μΈν°νμ΄μ€κ° μλ λͺ©μ μ λ§λ μ¬λ¬κ°μ μΈν°νμ΄μ€λ₯Ό λ§λ€μ΄λΌ)
- νλμ κ±°λν μΈν°νμ΄μ€ 보λ€, νμμ μ¬λ¬ μΈν°νμ΄μ€λ₯Ό μ μ μνμ¬ μμ±νλ κ²μ΄ λ«λ€λ λ».
- μλμ°¨ μΈν°νμ΄μ€ ==> μ΄μ μΈν°νμ΄μ€, μ λΉ μΈν°νμ΄μ€
- μ¬μ©μ ν΄λΌμ΄μΈνΈ ==> μ΄μ μ ν΄λΌμ΄μΈνΈ, μ λΉμ¬ ν΄λΌμ΄μΈνΈ
- λΆλ¦¬νλ©΄ μ λΉ μΈν°νμ΄μ€ μμ²΄κ° λ³ν΄λ, μ΄μ μ ν΄λΌμ΄μΈνΈμ μν₯μ μ£Όμ§ μμ
- μΈν°νμ΄μ€κ° λͺ νν΄μ§κ³ , λ체 κ°λ₯μ±μ΄ λμμ§λ€.
DIP: Dependency Inversion Principle (μμ‘΄μ± 'μμ ' μμΉ, Dependency 'Injection' μ΄ μλλ€!)
- νλ‘κ·Έλλ¨Έλ 'μΆμνμ μμ‘΄ν΄μΌμ§, ꡬ체νμ μμ‘΄νλ©΄ μλλ€.' ( = μν μ μμ‘΄ν΄μΌμ§, ꡬνμ μμ‘΄νλ©΄ μλλ€.)
- μμ‘΄μ± μ£Όμ (DI)μ μ΄ μμΉμ λ°λ₯΄λ λ°©λ² μ€ νλ, (DI μ DIP λ λ³κ°)
- ν΄λμ€μ μμ‘΄νμ§ λ§κ³ , μΈν°νμ΄μ€μ μμ‘΄νλΌλ λ»
- μ¦ μν μ μμ‘΄ν΄μΌ νλ€. (μν = μΈν°νμ΄μ€)
public class MemberServiceImpl implements MemberService{
// κΈ°μ‘΄
// private final MemberRepository memberRepository = new MemoryMemberRepository();
// λ³κ²½
private final MemberRepository memberRepository = new JdbcMemberRepository();
...
}
μ μ½λ μμ κ²°κ΅, μΈν°νμ΄μ€ λΏλ§ μλλΌ κ΅¬ν ν΄λμ€λ λμμ μμ‘΄ νλ μνμ΄λ€ (DIP μλ°) => MemoryMemberRepository(), JdbcMemberRepository()
κ°μ²΄ μ§ν₯μ ν΅μ¬μ λ€νμ±μ΄μ§λ§, λ€νμ±λ§μΌλ‘λ μ½κ² λΆν κ°μλΌλ― κ°λ°ν μ μλ€.
λ€νμ± λ§μΌλ‘λ OCP, DIP λ₯Ό μ§ν¬ μ μκΈ° λλ¬Έμ λ€λ₯Έ μ₯μΉκ° λ νμνλ€ => μ€νλ§
3. κ°μ²΄ μ§ν₯ μ€κ³μ μ€νλ§
μ€νλ§
μ μλ κΈ°μ μ μ¬μ©ν¨μΌλ‘ λ€νμ± + OCP, DIP
λ₯Ό κ°λ₯νκ² μ§μνλ€.
- DI (Dependency Injection) : μμ‘΄κ΄κ³, μμ‘΄μ± μ£Όμ
- DI 컨ν μ΄λ
그리νμ¬ ν΄λΌμ΄μΈνΈ μ½λ λ³κ²½μμ΄ κΈ°λ₯μ νμ₯ν μ μκ³ , λΆν κ΅μ²΄νλ― κ°λ°ν μ μλ€.
μ 리
- λͺ¨λ μ€κ³μ μν κ³Ό ꡬνμ λΆλ¦¬νμ.
- 곡μ°μ μ€κ³νλ―, λ°°μλ§ λ§λ€μ΄λκ³ λ°°μ°λ μΈμ λ μ§ μ μ°νκ² λ³κ²½ν μ μλλ‘ λ§λλ κ²μ΄ μ’μ κ°μ²΄μ§ν₯ μ€κ³.
- μ΄μμ μΌλ‘λ λͺ¨λ μ€κ³μ μΈν°νμ΄μ€λ₯Ό λΆμ¬νλ κ²μ΄ μ’λ€.
μ€λ¬΄ κ³ λ―Ό
- μΈν°νμ΄μ€λ₯Ό λμ νλ©΄ μΆμνλΌλ λΉμ©μ΄ λ°μ => κ°λ°μκ° μΈν°νμ΄μ€λ₯Ό νλ² λ νκ³ λ€μ΄κ°μΌνλ€. (μΌμ’ μ λ¨μ )
- κΈ°λ₯μ νμ₯ν κ°λ₯μ±μ΄ μλ€λ©΄ ꡬ체 ν΄λμ€λ₯Ό λ°λ‘ μ¬μ©νλ€.
- ν₯ν κΌ νμν λ 리ν©ν°λ§νμ¬ μΈν°νμ΄μ€λ₯Ό λμ νλ κ²λ λ°©λ²μ΄λ€.
- μ¦, λͺ¨λ κΈ°λ₯μ 무μμ μΈν°νμ΄μ€λ₯Ό λμ ν κ²μ΄ μλλΌ, μν©μ λ³΄κ³ μΆμνλ₯Ό ν κ²μΈμ§ νμ ν΄μΌνλ€.
'Backend > πΏ Spring' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
μ±κΈν€ 컨ν μ΄λ (0) | 2022.02.06 |
---|---|
μ€νλ§ μ»¨ν μ΄λμ μ€νλ§ λΉ (0) | 2022.02.04 |
[Spring] Service, ServiceImpl μ κ΄κ³ (feat. OCP) (1) | 2022.02.02 |
ResponseEntity λμ Custom DTO λ₯Ό 리ν΄ν λ μ£Όμν μ (feat. @ResponseBody) (0) | 2021.12.22 |
Spring-boot, postgresql μ°λ μ€ λ°μν μλ¬ (0) | 2021.07.11 |