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 계층 구조란, 하나의 Root WebApplicationContext가 여러 DispatcherServlet(또는 다른 서블릿)과 공유되고, 각 서블릿마다 자체적인 자식 WebApplicationContext을 가지는 구조이다.
- Context 계층 구조
- Root WebApplicationContext
- Root WebApplicationContext는 데이터 저장소, 비즈니스 서비스와 같이 여러 서블릿에서 공유해야 하는 인프라 빈을 포함
- Root WebApplicationContext의 빈은 자식 WebApplicationContext에서 상속됨
- Servlet WebApplicationContext (자식 WebApplicationContext)
- 각 서블릿에 특화된 빈을 포함
- Root 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