Spring

[유튜브-메타코딩] - 스프링부트 동작원리 - 5. 스프링 컨테이너

그라가승훈 2022. 8. 3. 08:05

- DispatchServlet의 목적 (컴포넌트 스캔, 주소 분배)

1. 주소 분배

  • DispatchServlet은 FrontController 의 역할처럼 주소를 분배해준다.
  • 주소를 분배해줄 때는 메모리에 올라가있어야 분배를 해줄 수 있는데, 그것을 컴포넌트 스캔을 활용한다.

2. 컴포넌트 스캔

  • 스프링 부트 부터는 패키지 아래에 있는 자바파일들을 모두 컴포넌트 스캔한다.
  • 스캔할 때 어노테이션이 사용되는 자바파일이 있으면 IoC로 알아서 메모리에 올려준다.


- ApplicationContext

  • 개발자가 직접 new를 통해 객체를 생성하게 된다면 해당 객체를 가르키는 레퍼런스 변수를 관리하기 어렵다.
  • 그래서 스프링이 직접 객체를 관리하는 IoC로 수 많은 객체들이 ApplicationContext에 등록된다.
  • 필요할때마다 DI를 해서 ApplicationContext에 접근하여 객체를 가져올 수 있다.
  • ApplicationContext싱글톤으로 관리되기 때문에 어디에서 접근하든 동일한 객체라는 것을 보장한다.
  • ApplicationContext에는 root - applicationContext, servlet - ApplicationContext 2가지 종류가 있다
  • servlet - ApplicationContext
    • ViewResolver, Interceptor, MultipartResolver 객체를 생성하고, 웹과 관련된 어노테이션 Controller, RestController를 스캔한다.
    • 해당 파일은 DispatchServlet에 의해 실행된다.
  • root - applicationContext
    • 어노테이션 Service, Repository등을 스캔하고 DB관련 객체를 생성한다.
    • 해당 파일은 web.xml에 있는 ContextLoaderListner에 의해 실행되기 때문에, servlet - ApplicationContext보다 먼저 로드 된다.
    • 생성 시점이 다르기 때문에 servlet - ApplicationContext에서는 root - applicationContext가 로드한 객체를 참조 가능하지만, root - applicationContext는 servlet - ApplicationContext를 참조할 수 없다.


- Bean Factory

  • 필요한 객체를 Bean Factory에 등록할 수도 있다. 여기에 등록하면 초기에 메모리에 로드되지 않고 필요할 때 getBean() 메소드를 통하여 호출하여 메모리에 로드할 수 있다.
  • IoC이고 DI 하여 사용할 수 있다.
  • ApplicationContext와 다른점은 미리 메모리에 로드되지 않고 필요할때 getBean() 메소드로 로드하기 때문에 lazy-loading(게으른-로딩)이 된다는 점이다.
  • @Configuration 어노테이션 안에 메소드리턴되어지는 객체 값이 있다면, @Bean 어노테이션으로 메모리에 올릴 수 있다.