Spring, Dispatcher Servlet

infoqoch·2021년 5월 24일
0

스프링

목록 보기
4/5

디스패처 서블릿이란?

  • url,
  • 통신 과정에서 발생하는 데이타,
  • view
  • 를 통제하는 스프링의 핵심 기능 중 하나.
  • 디스패처 서블릿이 제공하는 다양한 기능 덕분에, 컨트롤러는 컨트롤러의 핵심기능에 집중하면 됨. 그리고 그것은 POJO의 방식으로 가능.
  • 물론 스프링이 컨트롤러에 요구하는 설정을 존재하므로, 어떤 측면에서는 스프링에 대한 의존성이 높아진다고 볼 수 있다.

디스패처 서블릿의 생성과 설정

web.xml
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>
  • web.xml 에서 디스패처 서블릿을 생성함.
  • 디스패처 서블릿에 대한 설정 파일 필요. "(webapp)/WEB_INF/{이름}-servlet.xml" 을 기본값으로 함.
  • servlet-mapping을 통해 url을 통제.
dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<beans:bean name="/testing" class="com.spring.test.TestController">
	
	</beans:bean>
</beans:beans>
		
  • 설정 파일에서 객체를 생성. 객체의 이름은 url임.

HandlerRequest

  • 빈으로 사용하는 클래스는 handlerRequest를 상속해야함. 우리가 자주 사용하는 Controller가 handlerRequest 중 하나임.
  • Controller이 구현(override)해야 하는 객체는 ModelAndView 임. Model은 데이타이며 View는 클라이언트라 볼 수 있음. 서버에서 생산한 데이타가 view로 전달되고, 디스패처는 view의 호출까지 담당함. 이러한 전반적인 업무를 하기 때문에, 디스패처를 Front Controller 라고도 부른다.
package com.spring.test;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class TestController implements Controller {

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		System.out.println("작동 중");
		ModelAndView mv = new ModelAndView();
		mv.addObject("test", "테스트 중");
		mv.setViewName("test.jsp");
		return mv;
	}
}

view

  • jsp(view)의 기본 경로는 "/webapp/{이름}.jsp" 임.
  • 서블릿의 url-mapping 을 모든 경로 (/*)로 선언할 때 주의해야 함. 왜냐하면 setViewName에서 "test.jsp"로 호출하면, url은 /test.jsp 가 됨. 그러면 디스패처 서블릿을 호출하게 되고, 이를 name으로 하는 컨트롤러가 존재하기 때문에, 어떤 값도 출력할 수 없음.
<url-pattern>/*</url-pattern>
    ->     <url-pattern>/</url-pattern>
  • 그 다음 문제는 /test.jsp로 view에 직접 접근하도록 해서는 안 됨. 이를 위한 작업이 필요.

view와 /WEB-INF

-/WEB-INF는 클라이언트에서 절대로 접근할 수 없는 경로임. view 혹은 중요한 파일, 설정 파일은 해당 패스에 위치한다.

  • 보통 view는 /WEB-INF/views를 경로로 한다.
mv.setViewName("/WEB-INF/views/test.jsp");
  • 상대경로 "WEB-INF/" 와 절대경로 "/WEB-INF/" 중 절대경로를 사용한다. "/WEB-INF"의 위치가 동적으로 변할 이유가 없기 때문이다.

나아가며

  • MVC를 명쾌하게 이해할 수 있었다. controller, model, view 모든 것이 디스패처의 통제 아래에 정리된다. 그래서 디스패처 서블릿이 MVC의 처음과 끝이 아닌가? 라는 생각이 들었다.
  • webapp과 WEB-INF 의 차이를 분명하게 알 수 있어서 좋았다.
  • bean의 이름이 url의 주소라니. 이 부분도 놀랍다. 보통 component-scan으로 처리해서 몰랐던 사실이었다.

뉴렉(https://www.youtube.com/user/newlec1)을 많이 참고했습니다! 매우 강추 유튜브 입니다!

profile
JAVA web developer

0개의 댓글