Spring/Spring 기초 이론

[Spring 기초 이론] 애플리케이션 컨텍스트

jusung-c 2022. 4. 1. 20:24

스프링 컨테이너

 

DispatchServlet에 의해 생성되어지는 수 많은 객체들은 어디에서 관리될까? 

 

1. ApplicationContext

객체들이 DispatchServlet에 의해 컴포넌트 스캔이 될 때 ApplicationContext에 등록되는 것을 IoC(제어의 역전)이라고 한다. 직접 new를 통해 객체를 생성하면 해당 객체의 레퍼런스 변수를 관리하기 어렵기 때문에 스프링이 직접 해당 객체를 관리한다. 

 

우리는 이 객체의 주소를 몰라도 된다. 필요할 때 DI(의존성 주입)를 통해 사용하면 된다.

DI는 필요한 곳에서 ApplicationContext에 접근해 필요한 객체를 가져오는 방법이다. ApplicationContext는 싱글톤이므로 어디에서 몇번을 접근하든 동일한 객체를 보장한다. 

 

  • servlet-applicationContext 
    • ViewResolver, Interceptor, MultipartResolver 객체를 생성
    • 웹과 관련된 어노테이션 Controller, RestController 스캔 (메모리에 로딩)
    • DispatcherServlet에 의해 실행
  • root-applicationContext
    • 어노테이션 Service, Repository 등을 스캔(메모리에 로딩)하고 DB 관련 객체 생성
    • ContextLoaderListener에 의해 실행
    • ContextLoaderListener는 web.xml이 실행해주기 때문에 root-applicationContext는 servlet-applicationContext보다 먼저 로드

 

root-applicationContext가 먼저 로드되기 때문에 후에 로드된 servlet-applicationContext는 이를 참조할 수 있지만 그 반대는 불가능하다. 

출처 : https://minwan1.github.io/2018/11/21/2018-11-21-jsp-springboot-%EB%8F%99%EC%9E%91%EA%B3%BC%EC%A0%95/

 

 

2. Bean Factory

필요한 객체를 Bean Factory에 등록하면 초기에 메모리에 로드되지 않고 필요할 때 getBean()이라는 메소드를 통해 호출하여 메모리에 로드할 수 있다. 이것 또한 IoC이기 때문에 필요할 때 DI로 사용하는 방식이다. 

 

ApplicationContext와 다른 점은 Bean Factory에 로드되는 객체들이 미리 로드되지 않고 필요할 때 호출해서 로드하기 때문에 lazy-loading이 된다는 점이다.

 

 

 

 

 

 

 

 

 

 

 

 

 

[무료] 스프링부트 개념정리(이론) - 인프런 | 강의

스프링부트를 공부하며 헷갈리는 개념이 많았던 분 스프링부트에 대해 공부하고 싶었던 모든 분, - 강의 소개 | 인프런...

www.inflearn.com