Container
개발자를 대신하여, Bean 을 생성 / 관리 / 제거합니다.
Container 가 Bean 을 관리해주기 때문에, 개발자는 모듈 간에 의존 및 결합으로 인해 발생하는 문제로부터 자유로워 졌습니다.
아래와 같이 독립적인 코드를 작성해서 Annotaion 만 남겨주면 Container 가 개발자가 원하는 상황에 코드를 실행합니다.
따라서 개발자는 메서드가 언제, 어디서 호출되어야 하는지 그리고 메서드를 호출하기 위해 필요한 매개 변수를 준비해서 전달하지 않습니다. Container 가 개발자 대신 알아서 호출합니다.
Container 가 개발자를 대신하여 메서드가 호출될 때와 메서드가 필요한 자원을 전달하는 설계 구조를 Inversion of Control (IOC)
IOC 는 메서드가 필요로 하는 자원을 코드가 실행되는 타임에 전달하는데, 이를 Dependency Injection (DI)
Container가 알아서 greeting 메서드가 필요로 하는 name 매개변수를 전달하는 과정과 run 메서드가 필요로 하는 RestTemplate 매개변수를 전달하는 과정 모두 Dependency Injection (DI)
Bean
Spring framework 에서 앱을 구성하는 기본적인 객체입니다.
개발자는 Bean 을 정의하고 활용하고, Container 는 개발자가 정의한 Bean 을 객체로 만들어 관리하고 개발자가 필요로 할 때 제공합니다. 따라서 개발자는 Bean 을 어떻게 정의하고 사용하는지 알고 있어야만 Spring framework 를 사용할 수 있습니다.
--------------------------------------------------------------------------------
스프링 컨테이너(Spring Container)
먼저 Spring Container를 이해하기 위해서는 IOC와 DI를 이해해야 한다. Spring Container는 Bean들의 생명주기를 관리한다. Spring Container는 어플리케이션을 구성하는 Bean들을 관리하기 위해 IoC를 사용한다. Spring Container종류에는 BeanFactory와 이를 상속한 ApplicationContext가 존재한다. 이 두개의 컨테이너로 의존성 주입된 빈들을 제어하고 관리할 수 있다. 아래는 스프링 웹 애플리케이션 동작 원리이다.
- 웹 애플리케이션이 실행되면 Tomcat(WAS)에 의해 web.xml이 로딩된다.(load-on-startup으로 톰캣 시작시 servlet생성 가능하도록 설정 가능)
- web.xml에 등록되어 있는 ContextLoaderListener(Java class)가 생성된다. ContextLoaderListener 클래스는 ServletContextListener 인터페이스를 구현하고 있으며, ApplicationContext를 생성하는 역할을 수행한다.
- 생성된 ContextLoaderListener는 applicationContext.xml을 로딩한다.
- applicationContext.xml에 등록되어 있는 설정에 따라 Spring Container가 구동된다. 이때 개발자가 작성한 비즈니스 로징에 대한 부분과 DAO, VO 객체들이 생성된다.
- 클라이언트로부터 웹애플리케이션 요청이 온다.
- DispatcherServlet(Servlet)이 생성된다. DispatcherServlet은 FrontController의 역할을 수행한다. 클라이언트로부터 요청 온 메시지를 분석하여 알맞은 PageController에게 전달하고 응답을 받아 요청에 따른 응답을 어떻게 할지 결정만 한다. 실질적인 작업은 PageControlle에서 이뤄지기 때문이다. 이러한 클래스들을 HandlerMapping, ViewResolver클래스라고 한다.
- DispatcherServlet은 servlet-context.xml(spring-mvc.xml)을 로딩한다.
- 두 번째 Spring Container가 구동되면 응답에 맞는 PageController들이 동작한다. 이때 첫 번째 Spring Container가 구동되면서 생성된 DAO, VO, ServiceImpl 클래스들과 협업하여 알맞은 작업을 처리하게 된다.
string mvc continer bean
DispatcherServlet -> 설정 파일 로딩 -> 스프링 컨테이너 생성 -> 스프링 컨테이너 안에 빈으로 설정된 HandlerMapping, HandlerAdapter, 컨트롤러, ViewResolver 객체 이용 그리고 이렇게 생성되는 스프링 컨테이너는 WebApplicationContext 컨테이너이다.
'JAVA > Spring Framework' 카테고리의 다른 글
spring HandlerMapping - DispatherServlet설정 (0) | 2021.06.01 |
---|---|
spring viewResolver - DispatherServlet설정 (0) | 2021.06.01 |
java spring mvc (0) | 2021.06.01 |
생성자 주입을 @Autowired를 사용하는 필드 주입보다 권장하는 하는 이유 (0) | 2021.05.31 |
SOLID (0) | 2021.01.19 |