일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 컨트리뷰팅
- n poem
- 상속모델
- bean-validator
- resilience4j
- cannot import name
- 운영체제
- Not Null constraint failed
- API문서화
- circuitbreaker
- circular dependency
- 객체비교
- 함수형프로그래밍
- 마이크로서비스패턴
- django
- DI
- 프로젝트설정
- 쿼리셋합치기
- SpringBoot
- 토이프로젝트
- 일급함수
- IOC
- 주니어개발자
- Java
- bulk_create
- Spring
- Npoem
- 2차원배열 정렬
- 좋은코드란
- GraphQL
- Today
- Total
코딩 하는 가든
spring - DI의 개념, 그리고 spring에서의 DI와 IoC (1) 본문
DI란?
DI는 Dependency injection(의존성 주입)의 줄임 말로 어떤 객체가 다른 객체의 의존성을 제공 하는 것입니다.
어떤 장난감이 있고, 그 장난감이 작동 하기 위해서는 건전지가 필요하다고 가정 해 보겠습니다.
위의 상황을 소스 코드로 표현 하면 다음과 같을것 입니다
Toy toy = new Toy();
Battery batteryA = new Battery();
// 배터리 A를 주입
toy.setBattery(batteryA);
위처럼 Toy가 정상 작동 하기 위해서는 Battery가 필요합니다. 다시 생각해 보면 Toy는 Battery에 의존적임을 알 수 있습니다.
이 상황을 그림으로 나타내보면 다음과 같습니다.
하지만 이같은 상황에는 문제점이 있는데, A 건전지를 B 건전지로 교체 하고 싶을 경우 다음과 같이 코드의 변경이 일어나게 됩니다.
Toy toy = new Toy();
Battery batteryB = new Battery();
// 배터리 B를 주입
toy.setBattery(batteryB);
매 번 건전지를 교체 하기 위해서는 매번 코드 수정이 일어날 것이며, 이것이 간단한 예제가 아니라 실 서비스 에서 매우 복잡한 비지니스 로직등이 얽혀 있다면 소스코드를 매번 수정하기에는 큰 부담이 될 것입니다.
건전지교체에 의해 장난감의 코드가 수정되는것은 장난감이 건전지에 의존 하고 있기 때문입니다.
다시 말하면 의존 받고 있는 쪽의 교체가 이루어 지면 의존 하는 쪽의 소스코드 변경이 일어날 가능성이 있게 됩니다.
우리는 이러한 상황을(한쪽이 변경되면 다른쪽의 코드가 변경되는것) 막기 위하여 소프트웨어 디자인 패턴 중 하나인 IoC(Inversion of Control)를 이용해야 합니다.
Spring 에서의 DI와 IoC 개념 알기
그리고 스프링에서는 해당 기능을 IoC컨테이너를 통해 구현합니다.
먼저, A 건전지와 B 건전지를 IoC컨테이너에 등록 할 수 있습니다. (Bean 이라고 불리우는 것)
장난감은 IoC 컨테이너를 통해 건전지를 주입 받을 수 있는데 이때 어떤 건전지를 주입 받을 것인지는 IoC설정 (xml, spring configuration 등...)로 조절 할 수 있게 됩니다. 결론적으로 우리는 장난감의 소스코드 변경 없이 건전지를 교체할 수 있게 됩니다.
그림으로 나타내면 아래와 같이 됩니다.
스프링에서는 이렇게 IoC컨테이너에서 관리해 주는 객체들을 Bean 이라고 합니다.
다음 글 에서는 이 IoC컨테이너를 통해 어떻게 의존성 주입이 일어나는지 알아보겠습니다.
'Spring (boot)' 카테고리의 다른 글
spring - 의존성 주입을 받는 여러 가지 방법 (0) | 2020.08.02 |
---|---|
spring - DI의 개념, 그리고 spring에서의 DI와 IoC (2) (0) | 2020.07.26 |
Spring - 스프링 프레임워크에 컨트리뷰트를 하다. (0) | 2020.06.17 |
SpringBoot - Swagger 설정해보기 (0) | 2020.03.22 |
SpringBoot - DTO 클래스에 대한 이해 (0) | 2020.03.09 |