Intro.
- μ€νλ§ νλ μμν¬(Spring Framework) λ μλ°(Java) κ°λ°μ μ ν리μΌμ΄μ νλ μμν¬λ‘ μν°νλΌμ΄μ¦κΈ μ ν리μΌμ΄μ μ κ°λ°νκΈ° μν λ€μν κΈ°λ₯μ μ 곡ν©λλ€.
- μ€νλ§μ λͺ©μ μ λ°λΌ λ€μν νλ‘μ νΈλ₯Ό μ 곡νλλ°, κ·Έμ€ νλκ° μ€νλ§ λΆνΈ(Spring Boot) μ λλ€.
μ΄λ² ν¬μ€ν μμλ λ¨Όμ μ€νλ§ λΆνΈμ κΈ°λ°μΈ μ€νλ§ νλ μμν¬λ₯Ό μμλ³΄κ³ , μ€νλ§μ΄ μ 곡νλ λ€μν νλ‘μ νΈ μ€ νλμΈ μ€νλ§ λΆνΈμ νΉμ§μ μ€λͺ νκ² μ΅λλ€.
μ€νλ§ νλ μμν¬.
μ€νλ§ νλ μμν¬(μ΄ν μ€νλ§) λ μλ°μμ κ°μ₯ λ§μ΄ μ¬μ©νλ νλ μμν¬μ
λλ€.
μ€νλ§μ μλ° μΈμ΄λ₯Ό μ΄μ©ν΄ μν°νλΌμ΄μ¦κΈ κ°λ°μ νΈλ¦¬νκ² λ§λ€μ΄μ£Όλ βμ€νμμ€ κ²½λκΈ μ ν리μΌμ΄μ
νλ μμν¬βλ‘ λΆλ¦¬κ³ μμ΅λλ€.
μ½κ² λ§ν΄μ μλ°λ‘ μ ν리μΌμ΄μ
μ κ°λ°νλ λ° νμν κΈ°λ₯μ μ 곡νκ³ μ½κ² μ¬μ©νλλ‘ λλ λꡬμ
λλ€.
TIP: βμν°νλΌμ΄μ¦κΈ κ°λ°?β
βμν°νλΌμ΄μ¦κΈ κ°λ°βμ κΈ°μ νκ²½μ λμμΌλ‘ νλ κ°λ°μ λ»ν©λλ€.
λ€μ΄λ²λ μΉ΄μΉ΄μ€ν‘ κ°μ λκ·λͺ¨ λ°μ΄ν°λ₯Ό μ²λ¦¬νλ νκ²½μ μν°νλΌμ΄μ¦ νκ²½μ΄λΌκ³ λΆλ¦ λλ€.
μ€νλ§μ μ΄ νκ²½μ μλ§κ² μ€κ³λμ΄ μμ΄ κ°λ°μλ μ ν리μΌμ΄μ μ κ°λ°ν λ λ§μ μμλ₯Ό νλ μμν¬μ μμνκ³ λΉμ¦λμ€ λ‘μ§μ ꡬννλ λ° μ§μ€ν μ μμ΅λλ€.
μ€νλ§μ ν΅μ¬ κ°μΉλ βμ ν리μΌμ΄μ κ°λ°μ νμν κΈ°λ°μ μ 곡ν΄μ κ°λ°μκ° λΉμ¦λμ€ λ‘μ§ κ΅¬νμλ§ μ§μ€ν μ μκ²λ νλ κ²β μ λλ€.
μ μ΄ μμ (IoC)
μΌλ°μ μΈ μλ° κ°λ°μ κ²½μ° κ°μ²΄λ₯Ό μ¬μ©νκΈ° μν΄ μλμ μμ μ½λμ κ°μ μ½λλ₯Ό μ¬μ©ν©λλ€.
@RestController
public class NoDIController {
private MyService service = new MyServiceImpl();
@GetMapping("/no-di/hello")
public String getHello() {
return service.getHello();
}
}
μ¦, μ¬μ©νλ €λ κ°μ²΄λ₯Ό μ μΈνκ³ ν΄λΉ κ°μ²΄μ μμ‘΄μ±μ μμ±ν ν κ°μ²΄μμ μ 곡νλ κΈ°λ₯μ μ¬μ©ν©λλ€.
κ°μ²΄λ₯Ό μμ±νκ³ μ¬μ©νλ μΌλ ¨μ μμ
μ κ°λ°μκ° μ§μ μ μ΄νλ ꡬ쑰μ
λλ€.
νμ§λ§ μ μ΄ μμ (IoC: Inversion of Controller) μ νΉμ§μΌλ‘ νλ μ€νλ§μ κΈ°μ‘΄ μλ° κ°λ° λ°©μκ³Ό λ€λ₯΄κ² λμν©λλ€.
IoCλ₯Ό μ μ©ν νκ²½μμλ μ¬μ©ν κ°μ²΄λ₯Ό μ§μ μμ±νμ§ μκ³ κ°μ²΄μ μλͺ
μ£ΌκΈ° κ΄λ¦¬λ₯Ό μΈλΆμ μμν©λλ€.
μ¬κΈ°μ βμΈλΆβ λ μ€νλ§ μ»¨ν
μ΄λ(Spring Container) λλ IoC 컨ν
μ΄λ(IoC Container) λ₯Ό μλ―Έν©λλ€.
βκ°μ²΄μ κ΄λ¦¬λ₯Ό 컨ν μ΄λμ 맑겨 μ μ΄κΆμ΄ λμ΄κ° κ²βμ μ μ΄ μμ μ΄λΌκ³ λΆλ₯΄λ©°, μ μ΄ μμ μ ν΅ν΄ μμ‘΄μ± μ£Όμ (DI: Dependency Injection), κ΄μ μ§ν₯ νλ‘κ·Έλλ°(AOP: Aspect-Oriented Programming) λ±μ΄ κ°λ₯ν΄μ§λλ€.
μ€νλ§ μ μ¬μ©νλ©΄ κ°μ²΄μ μ μ΄κΆμ 컨ν μ΄λλ‘ λκΈ°κΈ° λλ¬Έμ βκ°λ°μλ λΉμ¦λμ€ λ‘μ§μ μμ±νλ λ° λ μ§μ€β ν μ μμ΅λλ€.
μμ‘΄μ± μ£Όμ (DI)
μμ‘΄μ± μ£Όμ (DI: Dependency Injection)μ΄λ βμ μ΄ μμ μ λ°©λ² μ€ νλβλ‘, μ¬μ©ν κ°μ²΄λ₯Ό μ§μ μμ±νμ§ μκ³ μΈλΆ 컨ν μ΄λκ° μμ±ν κ°μ²΄λ₯Ό μ£Όμ λ°μ μ¬μ©νλ λ°©μμ μλ―Έν©λλ€.
μ€νλ§μμ μμ‘΄μ±μ μ£Όμ λ°λ λ°©λ²μ 3κ°μ§κ° μμ΅λλ€.
- μμ±μλ₯Ό ν΅ν μμ‘΄μ± μ£Όμ
- νλ κ°μ²΄ μ μΈμ ν΅ν μμ‘΄μ± μ£Όμ
- setter λ©μλλ₯Ό ν΅ν μμ‘΄μ± μ£Όμ
μ€νλ§μμλ @Autowired
λΌλ μ΄λ
Έν
μ΄μ
(annotation)μ ν΅ν΄ μμ‘΄μ±μ μ£Όμ
ν μ μμ΅λλ€.
μ€νλ§ 4.3 μ΄ν λ²μ μ μμ±μλ₯Ό ν΅ν΄ μμ‘΄μ±μ μ£Όμ
ν λ @Autowired
μ΄λ
Έν
μ΄μ
μ μλ΅ν μλ μμ΅λλ€.
νμ§λ§ μ€νλ§μ μ²μ λ€λ£° λλ κ°λ
μ±μ μν΄ μ΄λ
Έν
μ΄μ
μ λͺ
μνκΈ°λ₯Ό κΆμ₯ν©λλ€.
μ€νλ§μμ μμ‘΄μ±μ μ£Όμ λ°λ κ° λ°©λ²μ λν μμ μ½λλ μλμ κ°μ΅λλ€.
// μμ±μλ₯Ό ν΅ν μμ‘΄μ± μ£Όμ
@RestController
public class DIController {
// <-- μμ‘΄μ±μ μ£Όμ
λ°λ μ£ΌμλΆλΆ
MyService myService;
@Autowired
public DIController(MyService myService) {
this.myService = myServicel
}
// -->
@GetMapping("di/hello")
public String getHello() {
return myService.getHello();
}
}
// νλ κ°μ²΄ μ μΈμ ν΅ν μμ‘΄μ± μ£Όμ
@RestController
public class FieldInjectionController {
// <-- μμ‘΄μ±μ μ£Όμ
λ°λ μ£ΌμλΆλΆ
@Autowired
private MyService myService;
// -->
}
// setter λ©μλλ₯Ό ν΅ν μμ‘΄μ± μ£Όμ
@RestController
public class SetterInjectionController {
// <-- μμ‘΄μ±μ μ£Όμ
λ°λ μ£ΌμλΆλΆ
MyService myService;
@Autowired
public void setMyService(MyService myService) {
this.myService = myService;
}
// -->
}
μ€νλ§ κ³΅μ λ¬Έμμμ κΆμ₯νλ μμ‘΄μ± μ£Όμ
λ°©λ²μ βμμ±μλ₯Ό ν΅ν΄ μμ‘΄μ±μ μ£Όμ
λ°λ λ°©μβ μ
λλ€.
λ€λ₯Έ λ°©μκ³Όλ λ€λ₯΄κ² μμ±μλ₯Ό ν΅ν΄ μμ‘΄μ±μ μ£Όμ
λ°λ λ°©μμ βλ νΌλ°μ€ κ°μ²΄ μμ΄λ κ°μ²΄λ₯Ό μ΄κΈ°νν μ μκ² μ€κ³ν μ μκΈ° λλ¬Έμ
λλ€.β
κ΄μ μ§ν₯ νλ‘κ·Έλλ°(AOP)
κ΄μ μ§ν₯ νλ‘κ·Έλλ°(μ΄ν AOP: Aspect-Oriented Programming) μ μ€νλ§μ μμ£Ό μ€μν νΉμ§μ
λλ€.
AOPλ OOPλ₯Ό λμ± μ μ¬μ©νλλ‘ λλ κ°λ
μΌλ‘ 보λ κ²μ΄ μ’μ΅λλ€.
μ€ν°λ κ°μ΄λ
OOPλ₯Ό μμ½νμλ©΄ κ° κΈ°λ₯μ μ¬μ¬μ© κ°λ₯ν κ°λ³ κ°μ²΄λ‘ ꡬμ±ν΄ νλ‘κ·Έλλ°νλ κ²μ λ»ν©λλ€.
λ€μκ³Ό κ°μ OOPμ ν΅μ¬ν€μλλ₯Ό μ΄ν΄νλ€λ©΄ λ λμ κ°μ²΄μ§ν νλ‘κ·Έλλ°μ΄ κ°λ₯ν©λλ€.
- μΆμν(abstraction)
- μΊ‘μν(encapsulation)
- μμ(inheritance)
- λ€νμ±(polymorphism)
βAOPλ κ΄μ μ κΈ°μ€μΌλ‘ λ¬Άμ΄ κ°λ°νλ λ°©μμ μλ―Έν©λλ€.β
μ¬κΈ°μ βκ΄μ (aspect)β μ΄λ βμ΄λ€ κΈ°λ₯μ ꡬνν λ κ·Έ κΈ°λ₯μ βν΅μ¬ κΈ°λ₯βκ³Ό βλΆκ° κΈ°λ₯βμΌλ‘ ꡬλΆν΄ κ°κ°μ νλμ κ΄μ μΌλ‘ 보λ κ²μ μλ―Έβ ν©λλ€.
-
βν΅μ¬κΈ°λ₯β
- λΉμ¦λμ€λ‘μ§μ ꡬννλ κ³Όμ μμ λΉμ¦λμ€ λ‘μ§μ΄ μ²λ¦¬νλ €λ λͺ©μ κΈ°λ₯μ λ§ν©λλ€.
- μλ₯Ό λ€λ©΄, ν΄λΌμ΄μΈνΈλ‘λΆν° μν μ 보 λ±λ‘ μμ²μ λ°μ λ°μ΄ν°λ² μ΄μ€μ μ μ₯νκ³ , κ·Έ μν μ 보λ₯Ό μ‘°ννλ λΉμ¦λμ€ λ‘μ§μ ꡬννλ€λ©΄
- (1) μν μ 보λ₯Ό λ°μ΄ν°λ² μ΄μ€μ μ μ₯νκ³ ,
- (2) μ μ₯λ μν μ 보 λ°μ΄ν°λ₯Ό 보μ¬μ£Όλ μ½λκ° ν΅μ¬ κΈ°λ₯μ λλ€.
- μλ₯Ό λ€λ©΄, ν΄λΌμ΄μΈνΈλ‘λΆν° μν μ 보 λ±λ‘ μμ²μ λ°μ λ°μ΄ν°λ² μ΄μ€μ μ μ₯νκ³ , κ·Έ μν μ 보λ₯Ό μ‘°ννλ λΉμ¦λμ€ λ‘μ§μ ꡬννλ€λ©΄
- λΉμ¦λμ€λ‘μ§μ ꡬννλ κ³Όμ μμ λΉμ¦λμ€ λ‘μ§μ΄ μ²λ¦¬νλ €λ λͺ©μ κΈ°λ₯μ λ§ν©λλ€.
κ·Έλ°λ° μ€μ μ ν리μΌμ΄μ
μ κ°λ°ν λλ ν΅μ¬ κΈ°λ₯μ λΆκ° κΈ°λ₯μ μΆκ°ν μν©μ΄ μκΉλλ€.
βν΅μ¬ κΈ°λ₯μΈ λΉμ¦λμ€ λ‘μ§ μ¬μ΄μ λ‘κΉ
μ²λ¦¬λ₯Ό νκ±°λ νΈλμμ
μ μ²λ¦¬νλ μ½λλ₯Ό μλ‘ λ€ μ μμ΅λλ€.β
μΌλ°μ μΈ OOP νμμΌλ‘ λΉμ¦λμ€ λ‘μ§μ μμ±νλ©΄ μλ κ·Έλ¦Όκ³Ό κ°μ΄ λΉμ¦λμ€ λμ νλ¦μ΄ λ°μν©λλ€.
OOP λ°©μμ μ ν리μΌμ΄μ
λ‘μ§μμλ μ κ·Έλ¦Όκ³Ό κ°μ΄ κ°μ±λ§λ€ ν΅μ¬ κΈ°λ₯μ μννκΈ° μν βλ‘μ§β κ³Ό ν¨κ» λΆκ° κΈ°λ₯μΈ βλ‘κΉ
β, βνΈλμμ
β λ±μ μ½λλ₯Ό μμ±ν©λλ€.
μ κ·Έλ¦Όμ μνμ 보 λ±λ‘ κΈ°λ₯κ³Ό μνμ 보 μ‘°ν κΈ°λ₯μ μμ°ν λ€λ₯Έ κΈ°λ₯μΌλ‘, κ°μ λ‘μ§μ΄ ꡬνλΌ μμ΅λλ€.
νμ§λ§ μ μ§λ³΄μ λͺ©μ μ΄λ λ°μ΄ν°λ² μ΄μ€ μ κ·Όμ μν΄ μμ±λ βλ‘κΉ β κ³Ό βνΈλμμ β μμμ μνμ 보λ₯Ό λ±λ‘ν λλ μνμ 보λ₯Ό μ‘°νν λ λμΌν κΈ°λ₯μ μνν νλ₯ μ΄ λμ΅λλ€.
μ¦, ν΅μ¬ κΈ°λ₯μ ꡬνν λ λ‘μ§μ λμΌν μ½λκ° ν¬ν¨λλ€λ κ²μ μλ―Έν©λλ€.
AOPμ κ΄μ μμλ λΆκ° κΈ°λ₯μ ν΅μ¬ κΈ°λ₯μ΄ μ΄λ€ κΈ°λ₯μΈμ§μ ꡬκ΄νκ² λ‘μ§μ΄ μνλκΈ° μ λλ νμ μνλκΈ°λ§ νλ©΄ λ©λλ€.
κ·Έλμ μλ κ·Έλ¦Όκ³Ό κ°μ ꡬμ±μΌλ‘ λ§λ€ μ μμ΅λλ€.
μ΄μ²λΌ μ¬λ¬ λΉμ¦λμ€ λ‘μ§μμ λ°λ³΅λλ λΆκ° κΈ°λ₯μ νλμ βκ³΅ν΅ λ‘μ§μΌλ‘ μ²λ¦¬νλλ‘ λͺ¨λνν΄ μ½μ νλ λ°©μβ μ βAOPβ λΌκ³ ν©λλ€.
μ΄λ¬ν AOPλ₯Ό ꡬννλ λ°©λ²μ ν¬κ² μΈ κ°μ§κ° μμ΅λλ€.
- μ»΄νμΌ κ³Όμ μ μ½μ νλ λ°©μ
- λ°μ΄νΈμ½λλ₯Ό λ©λͺ¨λ¦¬μ λ‘λνλ κ³Όμ μ μ½μ νλ λ°©μ
- νλ½μ ν¨ν΄μ μ΄μ©ν λ°©μ
μ΄ κ°μ΄λ° μ€νλ§μ λμμΈ ν¨ν΄ μ€ νλμΈ βνλ½μ ν¨ν΄β μ ν΅ν΄ βAOPβ κΈ°λ₯μ μ 곡νκ³ μμ΅λλ€.
μ€νλ§ AOPμ λͺ©μ μ OOPμ λ§μ°¬κ°μ§λ‘ λͺ¨λνν΄μ μ¬μ¬μ© κ°λ₯ν ꡬμ±μ λ§λλ κ²μ΄κ³ , λͺ¨λνλ κ°μ²΄λ₯Ό νΈνκ² μ μ©ν μ μκ² ν¨μΌλ‘μ¨ κ°λ°μκ° λΉμ¦λμ€ λ‘μ§μ ꡬννλ λ°λ§ μ§μ€ν μ μκ² λμμ£Όλ κ²μ λλ€.
μ€νλ§ νλ μμν¬μ λ€μν λͺ¨λ
μ€νλ§ νλ μμν¬λ κΈ°λ₯λ³λ‘ ꡬλΆλ μ½ 20μ¬ κ°μ λͺ¨λλ‘ κ΅¬μ±λΌ μμ΅λλ€.
μλ κ·Έλ¦Όμ μ€νλ§ κ³΅μ λ¬Έμμμ μ 곡νλ λ€μ΄μ΄κ·Έλ¨μ λλ€.
μ€νλ§ νλ μμν¬ κ³΅μ λ¬Έμμμλ μ€νλ§ λ²μ λ³λ‘ λ€λ₯Έ λ€μ΄μ΄κ·Έλ¨μ μ μνκ³ μμ§λ§ ν° νμ μ μ¬ν©λλ€.
κ·Έλ¦¬κ³ μ€νλ§ νλ μμν¬λ₯Ό μ¬μ©νλ€κ³ ν΄μ λͺ¨λ λͺ¨λμ μ¬μ©ν νμλ μμ΅λλ€.
μ ν리μΌμ΄μ
κ°λ°μ νμν λͺ¨λλ§ μ νν΄μ μ¬μ©νκ²λ μ€κ³λΌ μμΌλ©°, μ΄λ₯Ό βκ²½λ 컨ν
μ΄λ μ€κ³βλΌκ³ λΆλ¦
λλ€.