이번 시간에는 Dispatcher Servlet 라이브러리를 설정하기 위한 작업을 수행해보고자 한다.
우선 지난 시간과 마찬가지로 Maven Repository(https://mvnrepository.com/) 페이지에 들어가 검색창에 'springframework'를 검색한다.
검색 결과로 나온 항목들 중 'Spring Web MVC'를 클릭하여 버전을 선택한 뒤, 코드를 복사한다.
이후 pom.xml 파일에 다음과 같이 코드를 붙여넣기 하고 저장한다.
라이브러리를 준비했으니 이제 스프링이 제공하는 프론트 컨트롤러를 이용하기 위한 xml 파일을 준비해야한다.
먼저 Project Explorer에서 아래 사진과 같은 경로를 따라 목록을 펼치면 DispatherServlet.class 파일이 보일텐데, 해당 파일을 우클릭하여 'Copy Qualified Name'을 클릭한다.
이후 서블릿 설정을 위해 web.xml 파일을 열어 아래와 같이 코드를 추가해준다.
<servlet-name>의 경우 본인이 원하는 이름으로 작성하면 된다.
<servlet>
<!-- 매핑을 위해 서블릿을 연관 짓기 위한 서블릿 이름 지정 -->
<servlet-name>dispatcher</servlet-name>
<servlet-class> * </servlet-class>
</servlet>
<!-- 사용자의 서블릿 요청을 위한 서블릿 매핑 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<!-- 모든 url에 대해서 적용 -->
<url-pattern>/*</url-pattern>
</servlet-mapping>
애스터리스크(*)로 표시된 부분에 이전에 복사했던 것을 붙여넣기 하면 패키지 경로와 함께 클래스 이름이 보일 것이다.
여기서 붙여넣기 할 경우 끝에 '.class'라는 확장자 명이 함께 삽입될 텐데, 해당 부분은 지워주어야 한다.
다음으로 WEB-INF 폴더 안에 본인이 지정한 서블릿 이름에 따라 *-servlet.xml의 형태의 이름을 갖는 xml 파일을 생성한다.
이제 아래 사이트로 이동하여 기본적인 xml 구문을 복사한 뒤, 이전에 생성한 xml 파일에 붙여넣어 준다.
MVC에서는 <bean> 태그의 id 속성에 url을 대입한다. 사용자의 요청이 url의 형태로 오기 때문이다. 즉, 다음과 같이 사용할 수 있다.
<bean id="/index" class="com.newlecture.web.controller.IndexController">
<!-- collaborators and configuration for this bean go here -->
</bean>
우선 컨트롤러 클래스를 생성하지 않았으니 하나 생성해준다.
이제 스프링의 프론트 컨트롤러가 위에서 만든 클래스를 Ioc 컨테이너에서 꺼내 해당 클래스가 가지고 있는 기능을 호출할 수 있도록 해야한다.
이를 위해 아래와 같이 클래스를 구현해준다.
package com.newlecture.web.controller;
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 IndexController implements Controller{
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mv = new ModelAndView();
mv.addObject("data", "Hello Spring MVC");
mv.setViewName("index.jsp");
return mv;
}
}
현재 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>
<h1>HI ${data}</h1>
</body>
</html>
이제 잘 작동하는지 확인하기 위해 컨트롤러에서 서버를 실행시켜본다.
위 처럼 404 에러가 발생하는 것을 확인할 수 있다. 이유는 톰캣이 모르는 클래스이다보니 주소 요청 자체를 클래스가 아닌 소스코드를 반환한 것이다. 따라서 url을 ...8080/webprj/index로 바꾸어보자.
여전히 동작하지 않는다. 문제가 발생하는 부분을 확인해보기 위해 컨트롤러 클래스에 다음과 같이 콘솔 출력 구문을 추가하였다.
이제 서버를 재시작 시켜보겠다.
여전히 404 오류가 뜨지만, 콘솔창을 열어보면 위와 같이 출력이 된 것을 확인할 수 있다. 즉 사용자의 요청에 따라 url에 맞게 컨트롤러가 잘 실행되었다는 뜻이다. 문제는 사용자 요청 다음으로 컨트롤러에서 요청하는 'index.jsp'를 찾지 못하였다는 것이다.
위의 문제를 해결하기 위해 web.xml 파일을 열어 <url-pattern> 부분을 수정해준다.
서버를 재시작하여 결과를 확인해본다.
참고사항
필자의 경우 톰캣 버전을 10.0.20을 다운로드 받아 사용했었는데 컨트롤러 부분에서 강의 영상과 다르게 404, 500 오류가 계속 발생하였음.
해결 방법은 그냥 톰캣 버전을 다운그레이드 시키는 것. 10에서 9 버전으로 바꾸니 해결되었음.
'🍃 Spring, Spring Boot > 스프링 프레임워크 기초' 카테고리의 다른 글
[Java / Spring] 13. 정적 파일 서비스하기 (0) | 2022.04.20 |
---|---|
[Java / Spring] 12. View 페이지를 위한 위치 (0) | 2022.04.20 |
[Java / Spring] 10. 메이븐을 이용한 기본 웹 프로젝트 생성하기 (0) | 2022.04.17 |
[Java / Spring] 0. 메이븐 프로젝트 생성시 pom.xml 오류 해결 (0) | 2022.04.17 |
[Java / Spring] 9. Point Cut(Weaving, Join Point) (0) | 2022.04.17 |