Dependency Injection (의존성 주입)
- 객체가 자체적으로 필요로 하는 의존성을 생성하는 것이 아니라, 외부에서 주입받는 디자인 패턴입니다.
- 객체간의 결합도를 낮추기 위해 사용합니다.
- 주로 Contructor 기반 주입, Field 기반 주입, Setter 기반 주입이 있습니다.
DI를 사용하지 않을 경우
package org.example.ChickenStore
class ChickenStoreWithoutDI {
private val chicken: Chicken = FriedChicken()
fun getCookedChicken(): Chicken {
chicken.cook()
return chicken
}
}
class ChickenStoreWithoutDI2 {
private val chicken: Chicken = BakedChicken()
fun getCookedChicken(): Chicken {
chicken.cook()
return chicken
}
}
fun main() {
val store = ChickenStoreWithoutDI()
val chicken = store.getCookedChicken()
val store2 = ChickenStoreWithoutDI2()
val bakedChicken = store2.getCookedChicken()
}
결합도가 높기 때문에, 구운치킨 (Baked Chicken)을 추가하려면 새롭게 클래스를 추가해야하는 문제가 발생한다.
DI를 사용한 경우
class ChickenStoreWithDI(private val chicken: Chicken) {
fun getCookedChicken(): Chicken {
chicken.cook()
return chicken
}
}
fun main() {
val chicken = FriedChicken()
val bakedChicken = BakedChicken()
val store = ChickenStoreWithDI(bakedChicken)
val cookedchicken = store.getCookedChicken()
}
단순히 main 에 bakedchicken을 정의하고 bakedchicken을 넘겨주기만 하면 된다.
결합도를 낮추고 외부에서 명시적으로 클래스의 인스턴스를 생성할 때, 같이 주입이 되어야한다고 표기해주면
훨씬 유연하게 코드작성을 할 수 있고 재활용가능성이 높아지게 된다.
constructor 기반 주입, Field 기반 주입, Setter 기반 주입 중 Constructor기반 주입을 많이 사용한다.
생성자 기반 주입을 사용하는 이유는 다음과 같다.
- 의존되는 객체의 불변성 확보
- Field나 Setter 기반 주입은 var를 사용한다. 생성자는 val을 사용함
- 순환참조 방지
- 테스트 코드 작성의 용이
IoC (Inversion of Control, 제어의 역전)
- 객체의 생성과 생명주기를 외부에서 제어하는 디자인 패턴이다.
- IoC는 굉장히 넓은 의미로, DI를 포함하는 개념이다.
- Ioc Container, 혹은 최근 DI개념을 주로 사용하기 때문에 DI Container라고도 불린다.
- 이 DI Container를 통해서, 우리가 작성한 Class를 Spring에게 관리를 맡긴다고 이해하면 되겠다.
Spring Bean이란?
- DI Container가 관리하는 객체를 Spring Bean이라고 한다.
- Annotation을 통해 이루어진다. (@로 시작되며 프로그램 코드에 부가적인 정보를 제공한다.)
- Bean은 기본적으로 Singleton으로 설정된다. (변경이 필요한 경우 변경이 가능함)
연휴 기간동안 학습이 부족했던 기초 문법강의를 마쳤다.
어느정도 이해를 하긴 한 것 같은데, 사실 급한게 숙련과제인 CRUD todo list 구현인데.. 시간낭비를 한게 아닌가 걱정된다.
오늘 학습시간동안에 입문강의를 끝내고, 야간에 숙련강의를 들을 예정이다.
아직 시작하지 않았지만 기대 반, 두려움 반이다.
불면증이 점점 더 심해진다. 오늘은 한 2~3시간정도밖에 못잔 것 같다.
생체리듬이 완전 개박살이 났다. 낮 시간에 제 정신을 유지하기가 너무 힘들다....
국산 식물성 멜라토닌이라고 해서 쿠팡에서 주문했는데, 효과가 단 하나도 없다. 직구로 구입해야겠다..
오늘은 12시까지만 학습하고 일찍 누워서 쉬어야 할 것 같다.
내일까지 숙련 강의 완강하는게 목표인데, 완강을 목표로 잡으면 공부가 잘 될지........
연휴때 스프링 강의를 들었어야 됬나 후회되려고 한다..ㅋㅋ;
오늘은 꼭 일찍 잠들길.................. :(
'Spring' 카테고리의 다른 글
스프링 - IoC (0) | 2025.02.05 |
---|---|
Maven 이란? (0) | 2024.08.28 |
Path Variable과 Request Param (0) | 2024.08.06 |
Redis를 사용한 선착순 쿠폰발급 시스템 (0) | 2024.03.21 |
Oauth2.0 소셜로그인 구현 (0) | 2024.02.17 |