[GAE 시리즈] 7. 스프링 @MVC

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>
끝이다. 잘 돌아간다.

[GAE 시리즈] 6. 배포하기

드디어 GAE 시작하기 매뉴얼로는 마지막이군요. 하지만 아직 스프링 도입하기가 남았으니 GAE 시리즈는 계속 이어지겠지만 오늘은 오후에 일이 있어서 오늘로는 마지막 포스팅이 될듯 하군요.

일단 저기에 접속해서 계정을 만들고 애플리케이션 ID를 생성합니다. 해당 ID를 웹 프로젝트의 appengine-web.xml의 <application> 엘리먼트에 설정해 줍니다.
그리고 이클립스나 인텔리J 같은 IDE에서 직접 업로드 하거나.. 콘솔에서 업로드 할 수도 있습니다. 저는 콘솔에서 해봤습니다. 

[GAE 시리즈] 5. 정적 자원

CSS 파일, JS 파일, 이미지, 플래시, 음악, 무비 등 정적 자원은 서블릿 컨테이너가 아닌 별도의 웹서버로 서비스를 사용해서 서비스 해준다. 

이때 WAR로 패키징되는 애플리케이션의 모든 자원 중 /WEB-INF 밑에 있는 JSP 파일들을 제외하고는 모두 정적 자원으로 처리해준다. 따라서 별도의 설정을 할 필요 없지만.. 만약에 별도로 정적 파일을 지정하고 싶다면 web.xml 근처에 있는 appengine-web.xml 파일에 설정해주면 된다.
appengine-web.xml에 설정파일에 대한 자세한 내용은 http://code.google.com/intl/ko-KR/appengine/docs/java/config/appconfig.html

[GAE 시리즈] 4. JDO

 분산 웹 애플리케이션을 만들려면 고민할께 많은데 GAE를 사용하면 그럴 걱정은 할 필요 없단다. 매력적이다. 하지만 손수 분산 웹서버, 분산 DB 환경을 구축해보고 싶긴하다. 머 어쨋건;; 지금은 GAE 공부 중이니깐;; GAE가 알아서 분산, 복제, 로드 밸런싱을 해주기 때문에 개발자는 그냥 심플한 API만 사용해서 개발하면 분산 환경은 알아서 사용하게 된다.

GAE의 datastore도 그러한 서비스 중 하나인데 두 종류 API를 지원한다. 하나는 JDO 하나는 JPA. JDO는 오래전부터 표준이었고 JPA는 하이버네이트 영향으로 생긴 EJB 3의 표준인데… 어째 둘이 생긴게 비슷하다. JDO가 JPA를 따라서 변형된 것 같은 모습인데 실제로 그런건진 모르겠다. 그러거나 말거나.. 쓰기 편하고 기능이 좋으면 그만이다.
JPA를 쓸때 persistence.xml 설정 파일 만들듯이 JDO를 쓸땐 jdoconfig.xml 파일을 만든다. 이 파일에 대한 자세한 설명은 생략;
난 JPA를 쓰고 싶은데, 아니 사실은 하이버네이트를 직접 사용하고 싶은데;; 예제가 JDO라 어쩔 수 없이 일단은 따라해 보기로 했다. 
다음은 도메인 클래스를 만들고 매핑 정보를 애노테이션으로 설정한다. JPA랑 똑같다.  그 다음도 사실 똑같다. PersistenceManagerFactory에서 PersistenceMaanger를 가져가다 사용하면 된다. 하이버네이트로 치자면 SessionFactory에서 Session 가져다 쓰는거랑 비슷하다. JDO에도 HQL 같은 JDOQL이라는 쿼리 언어가 있다. 도무지;; JDO랑 JPA랑 구분이 되지 않는다. 똑같아 보인다. 이럴바엔 하나로 합치는 표준을 하나 만들고 그 API를 쓰게 하는게 좋치 않을까.. 

[GAE 시리즈] 3. JSP와 로깅

GAE라고 해서 JSP에 특별한 머시기를 해주는건 아니고 그냥 일반적인 Servlet&JSP 코딩하듯이 코딩하면 된다.

JSP는 web 폴더 밑에 두면 자동으로 매핑 되니까 guestbook.jsp 같은걸 만들고, 그 안에서 직접 자바 코드 호출해서 사용하고 있다. (빨리 스프링 MVC 적용해서 걷어내고 싶다.)  그 다음엔 폼을 추가하고 그 폼 서브밋을 처리할 서블릿을 하나 만들고 (그안에서 로그인 확인 중복 코드 발생한다.) 로그인 여부에따라 java.util.logging.Logger를 사용해서 로그 메시지를 남기고 있다. 그 서블릿 매핑 정보를 web.xml에 추가한다. (이부분도 역시 어서 스프링 MVC를 도입하고 싶게 해주는 부분이다. 귀찮게 맨날 web.xml에 대여섯줄 씩 매핑 정보를;; @_@;)
자.. 이제 끝이 아니라. 로깅을 설정하는게 이게 조금 재밌다.
web/WEB-INF 폴더 밑에 보면 appengine-web.xml이 있는데 드디어 이녀석이 하는 일 중 하나가 밝혀진다. 바로 환경 변수 설정이다. 
    <system-properties>
        <property name=”java.util.logging.config.file” value=”WEB-INF/logging.properties”/>
    </system-properties>
이런식으로 로깅 파일 위치를 설정해주면 GAE에서 해당 위치에 로깅 파일을 사용하여 어드민 콘솔 이라는 앱으로 GAE에 배포한 앱의 로그 메시지를 기록하고 간편하게 찾아볼 수 있는 서비스를 제공해준다. log4j 설정만 써보고 자바 Logger 설정은 안써봤는데; 의외로 간편하다.
.level = WARNING
whiteship.level = INFO
달랑 요거;