태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

티스토리 툴바


"올바른 성장과 따뜻한 나눔"이 있는 넥스트리
우리는 Spring + Jersey (JAX-RS JSR311 구현체) 프레임워크를 이용하여 웹 애플리션을 구현하고 있습니다. JSR311에 충실한 웹프레임워크라 필요한 기능들은 좀 추가해야 합니다.
Flash scope를 지원하는 프레임워크도 있는데 우리가 쓰는 프레임워크에서는 지원하지 않아 추가해봅니다.
(이미지출처)


Flash 범위란?

기본 Java 웹 애플리케이션에서는 값을 전달하는 방법으로 page, request, session 그리고 application을 지원합니다. 그런데 웹 애플리케이션을 작성하다보면 페이지 리로드(F5)에 의해 여러 번 submit이 되는 것을 방지하기 위해 post/redirect/get 설계방식을 사용합니다. 



1. POST: 등록을 위해 post로 submit 한다.

2. Redirect: 조회페이지로 리다이렉트한다.

3. GET: 브라우저는 GET 방식으로 리다이렉트하는 페이지를 조회한다.


여기서 1.POST3.GET은 서로 다른 요청이기에 이 요청사이의 연결은 이어지지 않습니다. 그런데 등록 후 조회페이지에서 "등록되었습니다."라는 메시지를 출력하고 싶은 경우가 있습니다. Java 웹 애플리케이션에서 기본적으로 제공하는 scope이나 장치를 쓰면.

1. 우선 page, request로는 메시지를 다음 요청으로 넘길 수 없습니다.

2. parameter로 메시지를 넘기는 방법:

   긴 메시지가 URL에 나타나고 페이지 리로드(F5)하면 메시지가 또 출력됩니다.
   사용자가 혼란스러워 합니다.

3. session scope를 이용하면:

   session에 저장된 메시지를 매번 삭제해야 하고 혹 남아 있을 경우 오작동을 할 가능성이 있습니다.

   session 사용은 restful한 서비스 작성에 좋지 않을 뿐더러 전역변수 같은 성격이 있어 좋지 않습니다.

4. application scope??:

   이 놈은 전체가 공유하는 놈이라 쓸 수 없습니다. A 사용자의 메시지가 B 사용자에게도 보일 수 있습니다.
   -.-;


Rails나 Grails 같은 프레임워크는 이러한 경우를 위해 바로 다음 요청까지만 유효한 flash scope를 지원합니다.


구현방법

서블릿 필터를 이용하여 쉽게 구현할 수 있습니다. 구동방식을 아래와 같습니다.

POST

1-1. 먼저 Action 클래스같은 비즈니스 로직에서 등록 후 request scope에 "flash."로 시작하는 키값으로
      메시지를 저장하고 조회페이지로 redirect 합니다.

1-2. 서블릿 필터에서는 "flash."로 시작하는 값이 있을 경우 이를 잠시 session에 넣어둡니다.



Redirect 후 GET

2-1. 서블릿 필터에서는 session에서 위 값을 꺼내고 해당 요청의 request scope에 값을
      "flash." prefix는 제거하고 request scope에 저장합니다.

2-2. 그리고 이 session값은 지웁니다. (이 다음의 요청에서는 사용 못하도록)

2-3. 비즈니스 로직을 실행 후 JSP에서는 request scope에 저장된 메시지를 출력합니다.



예를 들어 등록 후 다음과 같이 메시지를 저장합니다.

다음 요청의 JSP에서는 다음과 같이 메시지를 출력합니다.

서블릿 필터 소스는 아래와 같습니다.


이 소스는 특정 웹 프레임워크와 관계없이 작동합니다. 그대로 사용하거나 본인이 사용하는 프레임워크에 맞게 고쳐 사용할 수 있습니다.


우리의 응용

우리는 비즈니스 로직을 수행하는 Action(Jersey에서는 Resource라고 함)을 POJO로 작성하기에 request 객체 접근이 부자연스럽습니다.(쉽긴 하지만) 그래서 서블릿 필터에서 request 객체를 ThreadLocal에 저장하고 비즈니스 로직에서는 투명하게 메시지를 저장할 수 있도록 변경했습니다. 물론 요청을 빠져 나올 때는 필터에서 ThreadLocal에 저장한 request 객체를 지워야 합니다.

Flash.java

FlashScopeFilter.java

...
if (request instanceof HttpServletRequest) {
 ...
 Flash.setRequest(httpRequest);


chain.doFilter(request, response);

if (request instanceof HttpServletRequest) {
  ...
  Flash.clearRequest();


POST: 등록 후



GET: 다음 요청 JSP에서 메시지 출력은 동일합니다.

참고원문: http://blog.smartkey.co.uk/2011/01/implementing-flash-scope-in-java-web-applications/

 
저작자 표시 비영리 변경 금지
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 행복한아빠