Home > Spring > (Spring) - Spring 살펴보기 (+WebApplicationContext)

(Spring) - Spring 살펴보기 (+WebApplicationContext)
spring

Spring MVC와 DispatcherServlet

  • Spring MVC는 프론트 컨트롤러 패턴을 중심으로 설계되었으며, DispatcherServlet은 Spring MVC에서 프론트 컨트롤러 기능을 담당하는 서블릿이다.
    • DispatcherServlet은 모든 HTTP 요청을 받아서 공통 기능을 처리한다. 즉, 핸들러(컨트롤러)에서 공통으로 처리해야 하는 부분을 DispatcherServlet에서 핸들러(컨트롤러) 호출 전에 먼저 처리한다.(수문장 역할)
    • 클라이언트로부터 요청이 오면 DispatcherServlet이 직접 모든 작업을 수행하는 것이 아니라, 요청을 적절한 구성 요소(delegate componenets = special beans)로 전달하여 작업을 위임한다.
  • 위임(delegation)
    • 위임은 한 객체가 자신이 직접 작업을 수행하지 않고, 다른 객체가 그 작업을 수행하도록 맡기는 설계 패턴을 의미한다.
    • 간단히 말해서, A 객체가 B 객체를 가지고 있고, A 객체에서 B 객체의 메서드를 호출하여 B 객체가 작업을 수행하면, 이는 A 객체가 B 객체에게 작업을 위임하는 것이다.
  • 특별한 빈(special bean)
    • 특별한 빈(special bean)이란 스프링이 관리하는 객체인 빈(bean) 중에서, 스프링 프레임워크에서 정해진 역할이나 기능을 수행하기 위해 구현된 빈(bean)을 말한다.
    • ex) HandlerMapping, HandlerAdapter, viewResolver, HandlerExceptionResolver 등

ApplicationContext, WebApplicationContext, AnnotationConfigWebApplicationContext

  • ApplicationContext
    • ApplicationContext 인터페이스를 구현한 객체(ex) AnnotationConfigWebApplicationContext)를 스프링이 관리하는 빈들이 담겨 있는 컨테이너(스프링 컨테이너 = IoC 컨테이너 = DI 컨테이너)라고 한다.
    • 스프링 컨테이너는 빈의 생명주기 관리, 빈의 의존성 주입(DI) 등을 담당한다.
    • ApplicationContext 인터페이스를 구현한 클래스는 여러 종류가 있다.

  • WebApplicationContext
    • DispatcherServlet은 자체 설정을 위해 WebApplicationContext를 필요로 한다.
    • WebApplicationContext는 ApplicationContext에 getServletContext() 메소드 등이 추가된 인터페이스로, 자신이 속한 ServletContext와 서블릿에 대한 링크를 가지고 있다.

  • AnnotationConfigWebApplicationContext
    • AnnotationConfigWebApplicationContext는 WebApplicationContext 인터페이스를 구현한 클래스이다.
    • AnnotationConfigWebApplicationContext 클래스를 사용할 때 어노테이션 기반의 자바 코드 설정을 넘기면 된다. 자바 코드로된 설정에서는 @Configuration, @Bean 등의 어노테이션을 사용하여 빈을 정의하고 구성한다.
    • XmlWebApplicationContext는 어노테이션 기반의 자바 코드 설정이 아닌, xml 설정 파일을 사용한다.

  • AnnotationConfigWebApplicationContext 예시
      @Configuration
      public class AppConfig 
      {
          @Bean
          public MemberRepository memberRepository() 
          { return new MemoryMemberRepository(); }
            
          @Bean
          public MemberService memberService() 
          { return new MemberServiceImpl(memberRepository()); }
      }
    
      public class Example 
      {
          public static void main(String[] args) 
          {
              // ApplicationContext ac 
              //    = new AnnotationConfigWebApplicationContext();
                
              // AnnotationConfigWebApplicationContext : 어노테이션 기반 자바 코드 사용 
              AnnotationConfigWebApplicationContext ac 
                  = new AnnotationConfigWebApplicationContext();
              ac.register(AppConfig.class);
              ac.refresh(); // 컨텍스트를 초기화하여 등록된 클래스들이 처리되도록 함
              // WebApplicationInitializer를 사용한다면 refresh() 메소드를 직접 호출할 필요가 없음
    
              MemberService memberService 
                  = ac.getBean("memberService", MemberService.class);
    
              Member member = new Member("A", 20);
              memberService.join(member);
          }
      }
    
    • 위 코드에서, AnnotationConfigWebApplicationContext 객체를 스프링 컨테이너라고 한다.

Context Hierarchy(계층 구조)

  • 대부분의 웹 애플리케이션은 하나의 웹 애플리케이션에서 단일 WebApplicationContext를 사용하는 것으로 충분하다. 그러나, 더 복잡한 경우에는 Context 계층 구조를 사용할 수 있다.
    • Context 계층 구조란, 하나의 Root WebApplicationContext가 여러 DispatcherServlet(또는 다른 서블릿)과 공유되고, 각 서블릿마다 자체적인 자식 WebApplicationContext을 가지는 구조이다.

  • Context 계층 구조
    1. Root WebApplicationContext
      • Root WebApplicationContext는 데이터 저장소, 비즈니스 서비스와 같이 여러 서블릿에서 공유해야 하는 인프라 빈을 포함
      • Root WebApplicationContext의 빈은 자식 WebApplicationContext에서 상속됨
    2. Servlet WebApplicationContext (자식 WebApplicationContext)
      • 각 서블릿에 특화된 빈을 포함
      • Root WebApplicationContext의 빈을 상속함
      • 필요에 따라 Root WebApplicationContext의 빈을 재정의 가능

참고 자료

https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet.html https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet/special-bean-types.html https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet/context-hierarchy.html https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-servlet/container-config.html https://www.inflearn.com/questions/226425/servletcontext%EC%99%80-webapplicationcontext%EC%9D%98-%EA%B4%80%EA%B3%84-%EC%A7%88%EB%AC%B8 https://blog.naver.com/kitepc/221314687808 https://escapefromcoding.tistory.com/174 https://mangkyu.tistory.com/18 https://kimcoder.tistory.com/511 https://recordsoflife.tistory.com/490 https://blog.naver.com/PostView.nhn?blogId=inho1213&logNo=220516464519&parentCategoryNo=&categoryNo=19&viewDate=&isShowPopularPosts=false&from=postView https://live-everyday.tistory.com/164 https://velog.io/@ruinak_4127/Context https://dev-wnstjd.tistory.com/440 https://devlogofchris.tistory.com/71 https://unordinarydays.tistory.com/131