2009년 8월 18일 화요일

스프링에서 Ajax 사용 하기 (Use JsonLib)

몇년전만 해도 Ajax 사용은 몇몇 프로젝트에서만 사용했지만
최근에는 Ajax가 점점 필수 사항인 듯 합니다.
하지만 스프링에서 Ajax 지원에 대해서는 다소 미미한 편입니다.
제가 SimpleFormController에서 ajax를 적용한적이 있는데
좀 고생을 한기억이 있었습니다.그때 springsource에서
본 내용을 보면 아무리 스프링이 자유롭다지만 어느정도 J2EE에
대한 스펙을 생각하고 있고 그런 의미에서 Ajax는 아직 스펙이라
말하기가 어렵다고 합니다.
물론 그렇다고 스프링에서 Ajax를 전혀 지원하지 않는냐
그렇지는 않습니다. 서브 프로젝트 중애서 Spring WebFlow 2.0에서
"Spring JavaScript"를 번들을 제공 합니다.
개인적으로 스프링을 좋아하는 저로써는 "Spring Javascript"는
권하고 싶지 않습니다.
이유인즉 첫째 내부적으로 특정 라이브러리 (Dojo)를 사용합니다.
Dojo의 무거움은 경험하신분들은 아실겁니다.
(차라리 jQuery로 했으면..)
둘째로 DWR처럼 강한 결한 형태는 유지보수와 UI 변경을
복잡하게 합니다.
여러 이유가 있겠지만 크게 두가지네요
제 개인적인 Ajax 모델은 일단 클라이언트(Html)와
서버(Spring)가 느슨 결합이 되어야 하고 UI변경시
수정이 최소화 해야 한다고 생각합니다.
UI라이브러리는 기존에 훌륭한 (Extjs,jQuery,YahooUI..)중
플젝에 적합한 라이브러리를 사용하고 서버단은
AbstractView를 상속 받아서 Ajax 전용 뷰를 만들어서
서로간의 간섭이 없도록 구성해야 한다고
생각합니다.

여기서는 스프링에서 ajax를 처리 하기 위한 서버 설정을
설명 드리며 클라이언트 코드는 Json 패킷으로 대체
하는걸로 하겠습니다.
  • JsonLib 다운 받기
서버에서 클라이언트로 리턴할 오브젝트를 Json형태로 변환 하거나 또는 그반대로
Json 데이터를 해당 오브젝트로 변환하는 라이브러리가 필요 합니다. 그중에서
Json-lib를 사용 합니다 .
(해당 사이트에 접속하면 다양한 json 라이브러리를 다운 받을 수 있습니다. ).
여기서 최신 버전으로 다운로드를 받습니다.
다운로드 후 이클립스 프로젝트에
라이브러리를 추가 합니다.
웹 사이트 : http://json-lib.sourceforge.net/
다운로드 : http://sourceforge.net/projects/json-lib/files/
사용법은 해당 사이트를 참고 하시면 됩니다.
  • 스프링 전용 JsonView 다운 받기
아래의 사이트로 접속 후 화면 맨 하단을 보면 "json-lib-ext-spring" 가 있습니다.
거기서 최신 버전의 라이브러리를 다운로드 후 이클립스 프로젝트에
추가 합니다.
다운로드 : http://sourceforge.net/projects/json-lib/files/

  • JsonView 스프링 빈 설정
아래와 같이 JsonView를 빈으로 설정 합니다.
<bean id="jsonView" class="net.sf.json.spring.web.servlet.view.JsonView"/>

  • ViewResolver 설정

JsonView를 인식 하기 위해서 "BeanNameViewResolver"를 설정 합니다.
WebApplication에서는 여러 Resolver가 존재 할수 있기 때문에
우선 순위를 "0"으로 설정해서 최우선으로 설정 합니다.
    <bean id="beanNameResolver"
class="org.springframework.web.servlet.view.BeanNameViewResolver"
p:order="0" />


  • Controller Code
아래의 코드를 보면 매우 평범합니다. 어떤한 라이브러리 참조도
없이 평소처럼 코딩 하면 됩니다. 모든 ajax 처리는 JsonView가
처리 함으로써 단지 JsonView가 선언된 스프링 빈 id를
ModelAndView의 "setViewName" 메서드에 선언만
하면 됩니다.


public final ModelAndView handlerRequest(final HttpServletRequest request,
final HttpServletResponse response) throws Exception {
ModelAndView modelAndView = new ModelAndView();

DummyMember dummyMember1 = new DummyMember();
dummyMember1.setId("xxxxxxx");

DummyMember dummyMember2 = new DummyMember();
dummyMember2.setId("yyyyyy");

List list = new ArrayList();
list.add(dummyMember1);
list.add(dummyMember2);

Map resultMap = new HashMap();
resultMap.put("result1", list);
resultMap.put("result2", dummyMember1);

modelAndView.addAllObjects(resultMap);
modelAndView.setViewName("jsonView");
return modelAndView;
}

※ 샘플 도메인
public class DummyMember {
private String id;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}
}


  • 결과 JSON 패킷

{"result2":{"id":"xxxxxxx"},"result1":[{"id":"xxxxxxx"},{"id":"yyyyyy"}]}

customizing이 필요하면 JsonView 클래스를 상속 받은 후에 "renderMergedOutputModel"
메서드를 override 하시거 아니면 직접 다운로드 사이트에서
소스를 받은 후에 수정 후 적용 하시면 됩니다.

댓글 없음:

댓글 쓰기