DI(Dependency InJection)
말 그대로 객체를 직접 생성하는 것이 아니라 외부에서 생성한 후 주입을 시켜주는 방식
스프링이 다른 프레임워크와 차별화되어 제공하는 의존 관계 주입 기능으로,
객체를 직접 생성하는 게 아니라 외부에서 생성한 후 주입 시켜주는 방식이다.
DI(의존성 주입)를 통해서 모듈 간의 결합도가 낮아지고 유연성이 높아짐
) 컨테이너가 bean 객체를 생성하고 종속성 주입 수행
DI를 사용하는 이유
- 객체 내부에서 다른 객체를 생성하는 것은 가장 결합도를 가지는 구조
- 객체를 주입받는 다는 것은 외부에서 생성된 객체를 인터페이스를 통해서 넘겨 받는 것이기 때문에 결합도를 낮출 수 있다. 런타임 시에 의존관계가 결정되기 때문에 유연한 구조를 가진다.
- new를 통해 직접 객체를 생성할 경우, 내용을 수정 할 때 코드를 수정해야함 ,하지만 DI를 사용할 경우 이를 정의하고 있는 파일만 수정하면 됨
첫번째 A객체가 B와 C객체를 NEW 생성자를 통해서 직접 생성하는 방법
두번째 외부에서 생성된 객체를 setter()를 통해 통해 사용하는 방법이다.
두번째 방법이 의존성 주입이다.
A객체에서는 B,C객체를 의존할때 A객체에서 직접 생성하는 것이 아니라
외부(IOC컨테이너)에서 생성된 B , C 객체를 주입시켜 setter 혹은 생성자를 통해 사용하는 방식이다.
일반적으로 의존성에 대한 제어권은 객체 자기 자신이 갖는다
class Sample {
private Aplle apple = new Apple();
}
의존관계는 간단히 말해 new라는 키워드를 통해 생성된다
SampleTest 라는 클래스에서 Apple 객체를 생성한 뒤 Sample 클래스의 생성자로 주입시켜 준다.
여기서는 Sample이 직접 Apple 을 생성하는 것이 아니라 생성자로 주입받는다.
class Sample {
private Apple apple;
public Sample(Apple apple){
this.apple = apple;
}
}
class SampleTest {
Apple apple = new Apple();
Sample sample = new Sample(apple);
}
Apple 객체의 제어권이 Sample 에게 있었다면 두 번째 예시에서는 Sample에게 있는 것이 아니라
SampleTest에게 있다. 이처럼 의존성을 역전시켜 제어권을 직접 갖지 않는 것을 IOC라 하고 하며
의존성을 외부에서 주입시켜 주는 것을 DI 라고 한다.
스프링 컨테이너는 스프링 프레임워크의 핵심부에 위치하며 , 종속객체 주입을 이용하여 애플리케이션을 구성하는 컴포넌트들을 관리한다. 이때 스프링 컨테이너에서 생성되는 객체를 Bean 이라고 한다.
스프링에서 객체를 Bean 이라고 부른다.
프로젝트가 실행될때 사용자가 Bean으로 관리하는 객체들의 생성과 소멸에 관련된 작업을 자동적으로 수행해주는데
객체가 생성되는 곳을 스프링에서 Bean 컨테이너 라고 부른다.
IOC(Inversion of Contorl)
IOC란 제어의 역전 이라는 말 그대로 메소드나 객체의 호출작업을 개발자가 정하는 것이 아니라 외부에서 결정되는 것을 의미한다.
IOC는 제어의 역전 이라고 말하며 간단히 말해 "제어의 흐름을 바꾼다."
객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성 할 수 있게 하여 가독성 및 코드 중복
유지 보수를 편하게 할 수 있게 한다.
기존에는 다음과 순서로 객체가 만들어지고 실행됨
1. 객체 생성
2. 의존성 객체 생성
3. 의존성 객체 메소드 호출
스프링에서는 다음과 같은 순서로 객체가 만들어지고 실행된다.
1. 객체 생성
2. 의존성 객체 주입 스스로 만드는 것이 아니라 제어권을 스프링에게 위임하여 스프링 만들어 놓은
객체를 주입한다.
3. 의존성 객체 메소드 호출
스프링이 모든 의존성 객체를 스프링이 실행될때 다 만들어주고 필요한 곳에 주입시켜줌으로써 Bean 들은
싱글턴 패턴의 특징을 가지며 , 제어의 흐름을 사용자가 컨트롤 하는 것이 아니라 스프링에게 맡겨 작업을 처리
Bean
의존성 주입을 통해 Bean 객체를 사용할 수 있도록 해준다.
Bean은 보통 싱글턴으로 존재
'BACKEND > 스프링 Spring' 카테고리의 다른 글
[spring2.5] 스프링 간단한 예제 (0) | 2022.03.23 |
---|---|
[Spring2.5] 스프링 2.5 환경 설정 (0) | 2022.03.22 |
[spring2.5]스프링 프레임워크 시작 (0) | 2022.03.22 |
[Spring2.5] 스프링 환경설정 (0) | 2022.03.22 |
[Spring] Spring 환경 세팅 (0) | 2022.03.21 |