[Spring] IoC, DI 란?
스프링의 중요한 컨셉 4가지
- IoC(제어의 역전)
- DI(의존성 주입)
- AOP(관점 지향 프로그래밍)
- PSA(이식 가능한 서비스 추상화)
IoC란?
: Inversion of Control(제저의 역전). 일반적인 자바 코드를 작성해 객체를 생성할 때는 객체가 필요한 곳에서 직접 객체를 생성합니다.
ex) 클래스 A에서 클래스 B 객체 생성
public class A{
b = new B(); // new 키워드를 이용해 B의 객체 생성
}
제어의 역전은 다른 객체를 직접 생성하거나 제어하는 것이 아니라, 외부에서 관리하는 객체를 가져와 사용하는 것을 의미
(위 예제에 제어의 역전 사용)
ex) 스프링 컨테이너가 객체를 관리하는 방식
public class A{
private B b; // 객체를 생성하지 않고, 어디선가 받아온 객체를 b에 할당
}
이전과는 다르게 클래스 B 객체를 직접 생성하는 방식이 아니라, 어딘가에서 받아와서 사용하고 있다고 추측. 이처럼 제어의 역전을 적용하면 객체를 외부에서 관리하게 되고, 실제로 사용할 때는 외부에서 제공해주는 객체를 받아오게 됨. 스프링에서는 제어의 역전 개념을 중요한 컨셉으로 삼고 있으며, 이 설명에서 외부(=객체를 관리하는 주체)를 "스프링 컨테이너" 라고 합니다.
DI
: Dependency Injection(의존성 주입). 앞서 설명한 듯이, 스프링에서는 객체를 관리하기 위하여 제어의 역전을 사용합니다. 그리고 제어의 역전을 구현하기 위해 사용하는 방법이 DI입니다.
DI는 어떤 클래스가 다른 클래스에 의존한다는 뜻.
ex) 객체를 주입 받는 모습
public class A{
// A에서 B를 주입받음
@Autowired
B b;
}
@Autowired 라는 어노테이션은 스프링 컨테이너에 있는 Bean 이라는 것을 주입함.
(Bean : 스프링 컨테이너에서 관리하는 객체)
위 코드에서도 객체를 생성하지는 않고, B b; 라고만 선언합니다. 즉, 객체를 주입받고 있습니다. 이렇게 코드를 작성해도 프로그램은 잘 동작합니다.
why? -> 스프링 컨테이너라는 곳에서 객체를 주입했기 때문. (스프링 컨테이너가 B 객체를 만들어 클래스 A 에게 줌)
빈과 스프링 컨테이너
스프링은 스프링 컨테이너를 제공함. 스프링 컨테이너는 빈을 생성하고 관리한다. 즉, 빈이 생성되고 소멸되기까지의 생명주기를 스프링 컨테이너가 관리. 또한 개발자가 @Autowired 어노테이션을 사용해 빈을 주입받을 수 있게 DI를 지원하기도 함.
빈(Bean)
스프링 컨테이너가 생성하고 관리하는 객체. (-> 스프링의 객체)
@Component 어노테이션을 사용하면 클래스를 빈으로 등록할 수도 있음. -> 스프링 컨테이너가 관리
@Component // 클래스 MyBean을 빈으로 등록
public class MyBean{
}