[Spring] IoC Container

­Valentine·2022년 2월 6일
1

CS

목록 보기
18/23

CS 공부 15일차. 오늘부터는 토비의 스프링 3.1을 읽고 내용을 정리하며 이전 spring 프로젝트를 리팩토링 해보려고 합니다.

  • IoC Conatiner : Spring Application에서는 Bean의 생성, 관계설정, 사용, 제거 등의 작업을 코드 대신 독립된 Container가 담당합니다. 이를 Container가 코드 대신 제어권을 가지고 있다고 해서 IoC(Inversion of Control)이라고 부릅니다. 그래서 Spring Container를 IoC Container라고도 부르며, Bean Factory, ApplicationContext라고도 부릅니다.

  • Bean Factory : Bean과 Bean 사이의 런타임 관계를 설정하는 DI 작업을 하는 Spring Container

  • ApplicationContext : Bean Factory에서 Enterprise Application을 개발하는데 필요한 여러 기능을 추가한 Container. Spring boot에서는 AnnotationConfigApplicationContext을 기본으로 사용하며, Web이라면 AnnotationConfigEmbeddedWebApplicationContext을 기본으로 사용합니다. 아래와 같이 ApplicationContextAware를 구현하여 ApplicationContext를 불러올 수 있습니다.

@Component
public class ApplicationContextProvider implements ApplicationContextAware{
    
    private static ApplicationContext applicationContext;
    
    @Override
    public void setApplicationContext(ApplicationContext ctx) throws BeansException {
        applicationContext = ctx;
    }
    
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }
 
}

또한 설정 메타정보를 읽어들인 뒤에 이를 참고하여 Bean Object를 생성하고 생성자를 통해 의존 오브젝트를 주입(DI)해줍니다. 이를 통해 만들어지고 DI로 연결되는 Bean들이 모여서 하나의 Application을 구성하고 동작하게 하는 것이 Container의 목적입니다.

  • ApplicationContext의 종류

    • StaticApplicationContext : 코드를 통해 빈 메타정보를 등록하기 위해 사용되며 학습용으로만 사용.
    • GenericApplicationContext : XML파일같은 외부의 리소스에 있는 빈 설정 메타정보를 XMLBeanDefenitionReader등을 사용하여 읽어들입니다.
    • GenericXMLApplicationContext : GenericApplicationContext + XMLBeanDefenitionReader의 형태로 초기화까지 자동으로 이행해줍니다.
    • WebApplicationContext : 가장 많이 사용되며, 웹 환경에서 사용할 때 필요한 기능이 추가된 ApplicationContext입니다. 애노테이션을 이용한 설정 리소스만 사용하면 AnnotationConfigWebApplication이 사용됩니다.
  • 부모 ApplicationContext : 자신이 관리하는 Bean중에 필요한 빈이 없으면 부모 Context에 조회를 요청할 수 있습니다. 트리 형태의 계층 구조를 따라 루트 Context까지 요청이 전달됩니다.

  • @Autowired : Container에서 Bean을 찾아서 주입.

  • Configuration metadata(설정 메타정보) : Bean을 어떻게 만들고 동작하게 할 것인가에 관한 정보. BeanDefinition 인터페이스로 표현되는 순수한 추상 정보. 빈 아이디, 클래스 이름, 스코프, 프로퍼티, 파라미터 등을 담고 있습니다.

  • Front Controller Pattern : 많은 웹 요청을 받을 수 있는 대표 Servlet을 등록해두고, 공통적인 선행 작업을 수행한 후에 각 요청의 기능을 담당하는 핸들ㄹ러를 호출하는 방식.

  • DispatcherServlet : Front Controller로서 Client로부터 들어오는 요청마다 ApplicationContext에 조회하여 적절한 Bean을 찾아서 이를 실행해줍니다. Web.xml에 등록하거나 Spring boot의 경우 spring-boot-starter-web을 통해 DispatcherServlet을 자동으로 등록해줍니다. application.properties 파일에서 설정을 변경할 수 있습니다.

  • Root ApplicationContext : Web Application level에 등록되는 Container. 전체 Application에서 웹 기술에 의존적인 부분과 그렇지 않은 부분을 구분하기 위해서 Servlet ApplicationContext와 Root ApplicationContext로 나누어 계층구조를 형성하고 있습니다. 단, Spring Boot에서는 두 Context에 대한 구분이 없습니다. 디폴트로 single web application context를 생성합니다. @SpringBootApplication이 붙은 클래스가 Application의 진입점이 됩니다.

profile
천체관측이 취미

0개의 댓글