GAE 시작하기 메뉴얼을 따라하면서 들었던 생각은 스프링을 어서 도입해봐야겠다는 것이었다. 특히 PMF 라는 클래스를 만들때 간절했다. JDO의 PersistenceManagerFacotry를 싱글톤으로 사용하려고 만든 클래스인데.. 전혀 좋은 코드가 아니었다. 그뿐아니라 자바 코드와 HTML이 섞여있는 guestbook.jsp도 마찬가지이고, HttpServlet을 직접 상속해서 구현한 GurestbookServlet과 SignGuestbookServlet도 스프링 @MVC 컨트롤러로 고치고 싶었다.

그래서 일단해야 할 일은 스프링의 초간단 @MVC 컨트롤러를 추가하고 그게 동작하는지 확인하는 일이었다. 이전에 라이브러리는 넣어둔 상태라 간단하게 설정만 조금 추가하면 됐다.
web.xml
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext*.xml</param-value>
    </context-param>
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>spring</servlet-name>
        <url-pattern>/app/*</url-pattern>
    </servlet-mapping>
spring-servlet.xml
<context:component-scan base-package="whiteship" use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
applicationContext.xml
<context:component-scan base-package="whiteship">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
그리고 컨트롤러
@Controller
@RequestMapping("/hello")
public class GreetingController {
    @RequestMapping("/{name}")
    public String hello(@PathVariable String name, Model model){
        model.addAttribute("name", name);
        return "/WEB-INF/views/hello.jsp";
    }
}
그리고 뷰
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page isELIgnored="false" %>
<html>
  <head><title>Simple jsp page</title></head>
  <body>잘잤니~ ${name}</body>
</html>
끝이다. 잘 돌아간다.