[SPRING] dispatcherServlet, ViewResolver, Controller
이전 포스트에서 스프링을 설치하고, 기본적인 프로젝트 초기 설정을 마쳤다.
오늘은 초기 설정을 이용하여, 웹 브라우저에서 URL 요청이 들어오면
어떤 흐름으로 브라우저에 데이터를 전송할 수 있는지에 대해 포스팅 하려고 한다.
web.xml
웹 브라우저에서 사용자의 URL 요청이 들어오면
스프링 프로젝트에서는 제일 먼저 web.xml 파일을 찾는다.
web.xml에 매핑 되어 있는 servlet, filter 등의 프로젝트 초기 설정을 먼저 읽어 들인 뒤
다음 작업을 실행하는데 오늘은 dispatcherServlet 이라는 servlet만 위와 같이 추가해보려고 한다.
( * dispatcherServlet : URL 요청이 들어오면 제일 먼저 그에 맞는 컨트롤러로 위임해주는 Front Controller)
servlet-context.xml
servlet-context.xml에서 주목할 점은 viewResolver라는 클래스이다.
dispatcherServlet은 웹 브라우저에서 URL 요청이 들어오면
그 URL과 매핑되는 컨트롤러가 있는지 확인한 뒤
매핑되는 컨트롤러가 있다면 해당 메소드를 실행하고
해당 메소드의 return 값을 viewResolver에게 전달하는데
이해가 잘 되지 않는다면 아래의 이미지를 참고하면 된다.
그림과 같이 웹 브라우저에서 /hello 라는 URL 요청이 들어오면
dispatcherServlet이 해당 URL과 매핑 되는 Controller가 있는지 찾는다.
helloController에서 매핑 되는 메소드를 찾고, 메소드를 실행 후 return 값을 viewResolver에게 넘기면
viewResolver는 결과 값을 브라우저에 출력하게 된다.
그래도 잘 이해가 되지 않는다면 코드와 함께 살펴보자.
helloController
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello() {
System.out.println("HelloController hello()");
return "hello"; // hello.jsp로 이동
}
}
@RequestMapping("/hello") 는 URL이 /hello로 들어오면 아래의 메소드를 실행해라와 같다.
그리고 return hello라고 입력하면 viewResolver에 의해서 hello.jsp를 웹 브라우저에 출력할 수 있다.
단 hello.jsp는 servlet-context.xml에 작성한 것처럼 /WEB-INF/views 디렉토리 안에 존재해야 한다.
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="hello">hello로 이동</a>
</body>
</html>
welcome-page와 같은 index.jsp를 webapp 디렉토리 안에 생성하고,
<a> 클릭 시, hello로 이동하게 작성하였다.
hello.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>hello.jsp</h1>
</body>
</html>
<a>를 클릭 시, Controller를 통해 viewResolver가 hello.jsp를 찾아서 실행한 모습이다.
이와 같은 형상을 정적 컨텐츠라고 하는데 우리의 주 목적은 데이터를 주고 받는 것이므로
다음 포스트에서는 그와 관련된 내용을 다뤄보려고 한다.