-
서블릿과 디스패처서블릿 이해하기TIL 2021. 3. 7. 12:31
서블릿 : url 요청을 처리해 주는 것 extends HTTPservlet
서블릿 3.0 버전 밑 버전에서는 web.xml에 직접 하나하나 서블릿을 등록해 줘야 했다. 위치라던지, 이름이라던지 (중간지 역할) web.xml 에서하는 일은 특정 url로 들어오면 내가 정의한 서블릿으로가! 를 해준다.
그 서블릿은 http리퀘스트를 받아서 리스폰스를 돌려준다.
근데 3.0 버전 부터는 어노테이션으로 해당 서블릿에 간단히 등록이 가능해졌다.
서블릿의 생명주기
url입력 -> web.xml에서 해당 서블릿을 찾아서 들어감 -> 해당 서블릿 객체 생성 -> init 메서드 호출 -> service 메서드 호출
서비스 메소드는 http의 요청 메서드를 보고 doGet, doPost등의 메서드를 호출한다.
doGet, doPost는 매개변수로 request, response를 받아 사용한다.
리퀘스트와 리스폰스는 was(톰캣)가 사용자로부터 요청이 들어오면 httpServletRequest, httpServletReponse를 만들어 서블릿에 전송을 한기에 매개변수로 받을 수 있다.
do~ 메서드에서는 다음과 같은 일을 한다.
리퀘스트에서 getparmeter를 통해 값을 꺼내오고 값들은 헤더, url, 쿠키 등의 정보가 담겨있다.
리스폰스를 사용해 파일 형식, 문자 형식, 보낼 값들을 정의를 한다.
스프링 mvc
프런트 컨트롤러는 디스패처 서블릿이라고 부른다.
디스패처 서블릿을 web.xml에 정의하고 그곳에서 해당 서블릿 class로 오면
디스패처 서블릿은 이제 컨트롤러의 위치를 알려준다. @ComponentScan(basePackages = {"fullstack2week.controller"})
컨트롤러의 위치를 알면 거기 가서 행동을 하고 모델을 리턴을 하면 디스패처에서 뷰 리졸버나 다른 것을 정의 해 놨기에 그것을 타고 클라이언트에게 뷰를 반환을 한다.
디스패처 서블릿 연습
디스패처 서블릿
스프링 mvc 기본 흐름 위에 한글 이미지와 동일하다.
디스패처 서블릿은 frontController의 역할을 한다.
-> 역할을 하게 설정을 해줘야 한다. web.xml에 설정하거나 WebApplicationInitializer interface를 구현하거나 해야 한다.
-> spring boot에서는 자동으로 구성해준다
이번에 spring boot로 maven 빌드로 예제를 만들고 web.xml을 고쳐보려 했는데 없었다.
spring boot에서는 war 파일로 만들면 자바 형태로 web.xml을 대체하고 있다. ServletInitializer class가 존재한다.
ServletInitializer는 WebApplicationInitializer의 구현체이다.
stackoverflow.com/questions/43225549/dispatcherservlet-and-web-xml-in-spring-boot
그래도 이전 버전의 코드를 보자 web.xml
(디스패처 서블릿 등록하기)
<servlet>
// 서블릿의 이름은 class이름을 따라간다.
<servlet-name>dispatcherExample</servlet-name>
//기능은 스프링이 제공하는 디스패처 서블릿을 사용할 거야
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
//실제로 내가 하고 싶은 일
<param-name>contextConfigLocation</param-name>
//하고 싶은 일을 정의 xml이거나 class 파일이 올 수 있다.
<param-value>~~.xml or class</param-value>
// ex )<param-value>fullstack2week.config.WebMvcContextConfiguration</param-value>
</init-param>
<init-param> <param-name>contextClass</param-name> // 기반은 bean이니 빈공장을 등록해야 한다. <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value> </init-param>
<load-on-startup>1</load-on-startup> </servlet>
// /로 들어오는 것은 dispatcherExample이름의 서블릿으로 매핑해줘
//근데 dispatcherExample가 디스 패쳐 서블릿이니까 frontController 역할이 된다.
<servlet-mapping>
<servlet-name>dispatcherExample</servlet-name>
<url-pattern>/</url-pattern> <!-- url이 /로 들어오면 dispatcherExample 실행해 위쪽에 있어 -->
</servlet-mapping>www.boostcourse.org/web326/lecture/258535/?isDesc=false
위처럼 디스패처 서블릿이라고 알려주는 역할을 web.xml에 설정을 하고
디스패처 서블릿이 해야 할 일들은 xml이나 class로 정의해야 한다.
디스패처 서블릿으로 사용될 calss
@Configuration //자바 설정파일이야 @EnableWebMvc //web에 필요한 빈들을 대부분 자동으로 설정해준다. 리퀘스트매핑핸들러매핑,어뎁터.. 등등.. @ComponentScan(basePackages = {"fullstack2week.controller"}) //어디에 컨트롤러가 있는지 찾는다. public class WebMvcContextConfiguration extends WebMvcConfigurerAdapter{ //EnableWebMvc만고 기능이 더 필요하다면 상속을 받아 사용한다.
~~
}web.xml에 /로 시작한 모든 설정이 디스패처 서블릿으로 오게 했으니 css나 js 요청사항도 여기로 온다.
그래서 다음을 설정해 줘야 한다. 어디로 갈지.
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) { //뭐 css나 js 갈 곳을 정해줌 registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(31556926); registry.addResourceHandler("/css/**").addResourceLocations("/css/").setCachePeriod(31556926); registry.addResourceHandler("/img/**").addResourceLocations("/img/").setCachePeriod(31556926); registry.addResourceHandler("/js/**").addResourceLocations("/js/").setCachePeriod(31556926); } 디폴트 서블릿 핸들러를 사용하기
@Override public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { //기본 핸들러 정하기 configurer.enable(); } /로 들어올 때 main을 보여줘
근데 리졸버는 prefix와 suffix는 밑에서 정의했으니까 그곳에 맞게 가
@Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("index"); //처음 들어오는 곳 } //빈 등록 @Bean public InternalResourceViewResolver resolver() { InternalResourceViewResolver resolver=new InternalResourceViewResolver(); resolver.setPrefix("/WEB-INF/views/");//앞의 위치 resolver.setSuffix(".jsp");//뒤의 위치 return resolver; } 굉장히 어지러운데 spring boot는 모든것 자동으로 해준다. 갓
스프링 부트에서의 서블릿 컨테이너
'TIL' 카테고리의 다른 글
2021.03.08 기록장 (0) 2021.03.07 레이어드 아키텍쳐 (0) 2021.03.07 2021.03.07 기록장 (0) 2021.03.07 @RequestParam과 @PathVariable (0) 2021.03.06 2021.03.06 기록장 (0) 2021.03.05