Whiteship's Note


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

모하니?/Coding : 2010.08.04 04:42


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>

끝이다. 잘 돌아간다.



top

Write a comment.


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

모하니?/Coding : 2010.08.03 14:51


http://code.google.com/intl/ko-KR/appengine/docs/java/gettingstarted/uploading.html

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

https://appengine.google.com/

일단 저기에 접속해서 계정을 만들고 애플리케이션 ID를 생성합니다. 해당 ID를 웹 프로젝트의 appengine-web.xml의 <application> 엘리먼트에 설정해 줍니다.

그리고 이클립스나 인텔리J 같은 IDE에서 직접 업로드 하거나.. 콘솔에서 업로드 할 수도 있습니다. 저는 콘솔에서 해봤습니다. 

http://whiteshipgb.appspot.com



top

TAG GAE, 배포

Write a comment.


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

모하니?/Coding : 2010.08.03 14:23


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


top

Write a comment.


[GAE 시리즈] 4. JDO

모하니?/Coding : 2010.08.03 13:15


http://code.google.com/intl/ko-KR/appengine/docs/java/gettingstarted/usingdatastore.html

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

GAE의 datastore도 그러한 서비스 중 하나인데 두 종류 API를 지원한다. 하나는 JDO 하나는 JPA. JDO는 오래전부터 표준이었고 JPA는 하이버네이트 영향으로 생긴 EJB 3의 표준인데... 어째 둘이 생긴게 비슷하다. JDO가 JPA를 따라서 변형된 것 같은 모습인데 실제로 그런건진 모르겠다. 그러거나 말거나.. 쓰기 편하고 기능이 좋으면 그만이다.

JPA를 쓸때 persistence.xml 설정 파일 만들듯이 JDO를 쓸땐 jdoconfig.xml 파일을 만든다. 이 파일에 대한 자세한 설명은 생략;

http://code.google.com/intl/ko-KR/appengine/docs/java/datastore/usingjdo.html

난 JPA를 쓰고 싶은데, 아니 사실은 하이버네이트를 직접 사용하고 싶은데;; 예제가 JDO라 어쩔 수 없이 일단은 따라해 보기로 했다. 

다음은 도메인 클래스를 만들고 매핑 정보를 애노테이션으로 설정한다. JPA랑 똑같다.  그 다음도 사실 똑같다. PersistenceManagerFactory에서 PersistenceMaanger를 가져가다 사용하면 된다. 하이버네이트로 치자면 SessionFactory에서 Session 가져다 쓰는거랑 비슷하다. JDO에도 HQL 같은 JDOQL이라는 쿼리 언어가 있다. 도무지;; JDO랑 JPA랑 구분이 되지 않는다. 똑같아 보인다. 이럴바엔 하나로 합치는 표준을 하나 만들고 그 API를 쓰게 하는게 좋치 않을까.. 



top

TAG GAE, JDO

Write a comment.


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

모하니?/Coding : 2010.08.03 06:53


http://code.google.com/intl/ko-KR/appengine/docs/java/gettingstarted/usingjsps.html

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

달랑 요거;


 


top

Write a comment.


[GAE 시리즈] 2. 구글 로그인

모하니?/Coding : 2010.08.03 06:22


http://code.google.com/intl/ko-KR/appengine/docs/java/gettingstarted/usingusers.html

        UserService userService = UserServiceFactory.getUserService();
        User user = userService.getCurrentUser();
        if(user != null) {
            resp.setContentType("text/plain");
            resp.getWriter().println("Hello, " + user.getNickname());
        } else {
            resp.sendRedirect(userService.createLoginURL(req.getRequestURI()));
        }

이 코드가 핵심인데.. 많은 것들을 해준다.

1. 우선 무척이나 간단하다. 이렇게 쉽게 구글 로그인을 연동할 수 있다니... API도 직관적이라 어떤 일을 하는지 쉽게 알 수 있다. 마지막 줄의 코드가 로그인 한 다음 바로 로그인을 요청한 페이지로 이동하기 위한 API 인데 흠.. 괜찮은 것 같다. 권한 관리는 어떻게 하는지..  실제론 스프링 시큐리티랑 연동해서 쓰는지 아님 구글에서 제공하는 인증/권한 관리 API가 있는 것인지.. 있다면 권한 관리 설정은 편리한지 궁금하다.

2. 로그인 화면 자동생성. 로그인이 필요할 때 guestbook 예제에서 봤던 로그인 화면이 등장하는데 나는 그런 JSP 파일을 만든적도 없는데 알아서 만들어줬다. 편리하다.

3. 간편할 뿐 아니라 이 코드는 개발 환경과 배포 환경에 따라 동작 방식이 바뀐다. 오.. 놀라워라; 즉 개발환경에서는 아무런 아이디만 넣어도 로그인이 되고, 관리로 로그인하기 체크 박스가 존재한다. 하지만 GAE에 배포하는 순간 실제 구글 계정으로 로그인 한단다. 아직 GAE에 배포는 안해봤다. 그런데.. 개발할 때 실제 구글 계정으로 테스트해보고 싶으면 어쩌지?? 

4. 로그아웃 URL로 제공한다. userService.createLogoutURL()을 사용하면 된다.


top

TAG GAE, Java

Write a comment.


[GAE 시리즈] 1. 구글 앱 엔진 + 메이븐 + IntelliJ 프로젝트 세팅

모하니?/Coding : 2010.08.03 05:21


구글 앱 엔진 시작하기 메뉴얼을 보며 예제를 실습해봤다. 그러나.. 내 입맛에 맞지 않는 구석이 몇개 있었다.

1. 라이브러리를 맘대로 추가할 수 있으니 코딩하는데는 문제가 안되는데 빌드가 보통 앤트를 사용하는 듯하다. 이건 불편하다. 그래서 메이븐을 썼다. GAE가 원하는 프로젝트 구조를 건드리지 않으면서도 필요한 라이브러리는 쉽게 가져다 쓸 수 있도록 메이븐을 설정했다. 이전에도 계속 써오던 형태라 대충 복사해서 붙여넣기고 당장 필요없는 라이브러리는 뺐다. (사실 스프링은 남겨뒀다;;)

2. 이클립스 종속적인 가이드였다. 인텔리J도 GAE 플러긴이 있으며 업데이트 사이트를 추가하는 귀찮은 작업 없이도 간편하게 플러그인을 찾아서 설치할 수 있었다.

3. 배포 설정

웹 서버에 배포할 때 프로젝트 이름/out 폴더 밑으로 웹 컨텐츠를 전부 복사해서 배포하게 되어 있는데 난 프로젝트/web에 배포하게 설정했다. 이래야 재배포 하지 않고도 JSP를 수정할 때 마다 바로바로 적용된다. 


top

TAG GAE, IntelliJ, Java

Write a comment.