<Spring> IOC 란?
IOC (Inversion of Control, 제어의 역전) 란 ?
제어권이 역전된 것
- 말 그대로 메소드나 객체의 호출작업을 개발자가 결정하는 것이 아니라, 외부에서 결정되는 것을 의미
IOC 적용 전
- 객체 생성
- 의존성 객체 생성
➡ 클래스 내부에서 생성 - 의존성 객체 메소드 호출
class OrderController {
private OrderRepository repository = new OrderRepository();
}
- 의존성에 대한 제어권을 개발자가 만들어서 자기가 가지고 있음
IOC 적용 후
- 객체 생성
- 의존성 객체 생성
➡ 스스로가 만드는것이 아니라 제어권을 스프링에게 위임하여 스프링이 만들어놓은 객체를 주입 - 의존성 객체 메소드 호출
class OrderController {
private final OrderRepository repo;
public OrderController(OrderRepository repo) {
this.repo = repo;
}
}
- ️OrderController 가 제어권을 만들어서 사용하는게 아니라 외부에서 주입받아서 사용함 -> 사용을 하지만 만들지는 않음
- 여기서 의존성을 주입해주는 일을 DI (Dependency Injection, 의존성 주입) 이라고 하는데 의존성 주입도 일종의 제어권 역전이기 때문에 IOC 에 속함
- 스프링의 IOC 컨테이너가 빈으로 등록을 해주고 의존성을 관리해준다
IOC 컨테이너
객체를 생성하고, 객체간의 의존성을 이어주는 역할
Bean Factory, Application Context (Bean Factory 상속)
이름 | 설명 |
---|---|
Bean Factory | IOC 컨테이너의 기능을 정의하고 있는 인터페이스 Bean의 생성 및 의존성 주입, 생명주기(lifecycle) 관리 등의 기능을 제공 |
Application Context | BeanFactory 상속 BeanFactory가 제공하는 기능 외에 AOP, 메세지처리, 이벤트 처리 등의 기능을 제공 |
- 모든 객체가 빈으로 등록되어 있는 건 아님
- 빈으로 등록되면 일단 스프링IDE 에서 앞에 콩아이콘으로 표시 으로 나타내주고 여기서 빈들의 의존성 주입을 IOC 컨테이너가 해줌
@Controller
class OwnerController {
private final OwnerRepository owner;
// IOC 컨테이너가 ownerRepository 를 찾아서 넣어줌
public OwnerController(OwnerRepository ownerRepository) {
this.owner = ownerRepository;
}
}
- 의존성 주입은 빈끼리민 가능
- 즉 스프링 IOC 안에 들어있는 객체들끼리만 의존성 주입을 해줌
@Autowired
ApplicationContext applicationContext;
@Test
public void getBean() {
// applicationContext 에 들어있는 모든 bean 이름 리턴
applicationContext.getBeanDefinitionNames();
// 파라미터로 bean class 넘기면 됨
applicationContext.getBean(OrdersController.class);
}