[Spring.2] Inversion of Control, IoC

IoC IoC 개념

정의

개발자가 작성한 프로그램이 재사용 라이브러리의 흐름 제어를 받게 되는 소프트웨어 디자인 패턴. Spring에서는 개발자가 코드상에서 자바 객체를 관리하는 것이 아니라 Spring에서 자바 객체를 관리해준다. 즉, Spring Contaier가 객체를 대신 생성해주고 초기화, 소멸해준다.
쉽게 생각하면, 개발자가

Object object = new Object();

위와 같이 new 연산자를 이용해 객체를 생성하던 것을 Spring Container가 대신 생성해준다고 생각하면 된다.

특성

IoC 디자인 패턴을 사용하는 이유는 Web의 특성 때문이다.
Web은 HTTP기반으로 수많은 request/response를 처리해야 하는데, request가 있을 때마다 자바 객체를 생성하면 처리 시간이 매우 길어지고 메모리를 많이 잡아먹게 된다.
그런데, 자바 객체를 Container가 관리하면 bean을 띄운 후 해당 bean을 재사용하여 속도와 효율을 높일 수 있다.

스프링 컨테이너는 일반적으로 최초의 콜이 들어온 시점에 컨테이너가 객체를 처음 띄우는 ‘lazy-loding’ 방식과 띄워진 객체를 재사용 하는 ‘singleton’ 패턴을 적용한다.
lazy-loading, singleton 이외에도 객체를 관리하는 데에 여러 방식과 패턴이 존재함으로써 객체의 관리를 돕는다.
thread와 container의 관계: thread 하나 당 컨테이너가 생성되는 방식과 하나의 Container에 여러 thread가 공유해서 사용하는 방식이 있다.
Spring Container : Java Bean을 관리하는 주체. 코드 상에는 ApplicationContext interface를 구현한 클래스로 구성되어 있다.
bean : Spring Container에 의해 관리되는 자바 객체.

사용법

1) bean 정의

2) Annotation

public class TheClientBean {
  
  @Resource("bean1")
  private TheBean theBean;
  
}