봄싹2009.10.27 13:21
스프링의 훌륭한 바인딩 기술로 인해서 .. 삽질좀 했다...
ModelMap 이나 Model 객체에 .. 컨트럴에서 사용하는 command 객체나 SessionAttributeStore에 들어 있는 객체를
자동으로 담아주기 때문이다..

이 문제는 곧...
Json String을 만들때.. model 안에 있는 모든 Object를 (물론 BindingResult 관련한 객체는 지워주고.. ) 대상으로 ..
만들어 버리기 때문이다.

이게 무슨 문제인가 하면.. ;; 원치 않는 객체를 Json String으로 만들면서 오버헤드가 일어날뿐만아니라..
개발자가 의도 하지 않은 예외가 발생할 수 있다..  이걸 단위 테스트로 잡아 내기도 .. 쉽지도 않다.. (기준은 나처럼 허접탱이에게 국한된 이야긴 하지만..ㅋ)

머머 이래 저러한 이유로 인해서.. 전에 만들다가 만 .. Jsonview를 다시 만드는 중이다.. ;;
view 를 만들긴 정말 쉽다.. 원하는 데로 동작을 안해서 그렇치..ㅋ

무튼 이번에 다시 만들게 되는건 Spring3.0에서 릴즈된 .. MappingJacksonJsonView 이라는 놈을 상속 받아 필터 기능을 추가했다.. 기존의 filterModel가 있긴헌데.. 오버라이딩이 만만치 않다.. 아니 지저분해진다..

    protected Map<String, Object> filterModel(Map<String, Object> model) {
        Map<String, Object> result = new HashMap<String, Object>(model.size());
        Set<String> renderedAttributes =
                !CollectionUtils.isEmpty(this.renderedAttributes) ? this.renderedAttributes : model.keySet();
        for (Map.Entry<String, Object> entry : model.entrySet()) {
            if (!(entry.getValue() instanceof BindingResult) && renderedAttributes.contains(entry.getKey())) {
                result.put(entry.getKey(), entry.getValue());
            }
        }
        return result;
    }

this.renderedAttributes 이놈이 문제이다.. ;;
private Set<String> renderedAttributes; 이렇게 선언되어 있고.. Set 메소드만 제공하고.. get은 제공하지 않는다..
그래서 확장이 불가능하다. 제길쓴..;;
리플렉션을 써써 쉽게 갈까 햇는데... 너무 어거지로 하는것 같아서 .. 택하지 않앗다..
* @author Jeremy Grelle * @author Arjen Poutsma 이 두사람이 이걸 만들었는데.. ;; get메소드만 추가 해줘도 ..
fillterModel를 충분히 변형해서 쓸수 있을것을... ;; 확장 하지 말라는 의도인가;;

머 무튼.. 그래서 다른 방법으로 ;; 필터를 추가 했다..

그리고 Test를 했는데.. 실패다... ;;;
시나리오의 실패 & 명확하지 않은 코딩 .. 이 두가지 이유로.. 젝일.. ;;

다시 시나리오 짜서 .. 다시 명확한 코딩을 ㄱㄱㄱㄱㄱ ..
쉬운 방법 두고 삽질 이빠심 하는거 일 수도 잇는데..
Jsonview를 호출 하려면 기본 시그너처에 modelMap을 꼭 적어줘야 하고 ..
addObject 하기전에 modelMap.clear() 해주는 .. 단순 코딩을 싫으니까;; 
이짓하는거다... ;;





Posted by is윤군

댓글을 달아 주세요

  1. 혜경

    저도 똑같은 고민(null인 객체는 구지 표시 하지 않는 방법)을 하고 있습니다. 이것의 해결 방법을 찾으셨나요?

    2010.11.04 15:07 [ ADDR : EDIT/ DEL : REPLY ]
    • 널인 객체는 구지 표시 하지 않는 방법이라고 한다면..
      널인놈은 아예 json string만들때 제외 하는것을 이야기 하는건가요 ? @.@

      3.0에서 AnnotationMethodHandlerAdapter을 보면 넘겨주는 모델에 대해서 변형을 한번 할 수있는 포인트가 있답니다.. (일년전 기준 @.@)

      암턴 ModelAndViewResolver 이놈을 구현해서 customModelAndViewResolver 이라는 프로퍼티 이름으로 말이죠~~ 고거 잘 이용하시면 원하시는 것을 이룰 수 있을꺼라고 생각해요~

      혹시 코드가 어떻게 생겨먹었는지 궁금하시다면 봄싹코드참고 하시면 될꺼라고 생각합니다!! (주의 ; 구리다는거;;)

      그럼~ good luck.!

      2010.11.04 19:26 신고 [ ADDR : EDIT/ DEL ]