Whiteship's Note


[테스트] 스프링의 MappingJacksonJsonView 초간단 학습 테스트

모하니?/Coding : 2009.10.13 12:10


public class SpringJsonVIewTest {
   
    class SampleObject{
        private String name;

        public void setName(String name) {
            this.name = name;
        }

        public String getName() {
            return name;
        }
    }
   
    MappingJacksonJsonView jsonView;
   
    @Test
    public void result() throws Exception {
        jsonView = new MappingJacksonJsonView();
        Map<String, Object> model = new HashMap<String, Object>();
        SampleObject s1 = new SampleObject();
        s1.setName("기선");
        model.put("s1", s1);
        SampleObject s2 = new SampleObject();
        s2.setName("갑수");
        model.put("s2", s2);
       
        MockHttpServletRequest request = new MockHttpServletRequest();
        MockHttpServletResponse response = new MockHttpServletResponse();
        jsonView.render(model, request, response);
       
        System.out.println(response.getContentAsString());
    }

}

이렇게 작성해봤습니다. Assertion 안했습니다.

JSON이 어떤 모양으로 생기는지 그냥.. 눈으로 확인하려구요. why not?

아참.. 결과는

{"s2":{"name":"갑수"},"s1":{"name":"기선"}}

이래요.
top

Write a comment.


스프링 JSON view와 jQuery 이용하여 자동완성 기능 만들기 1

모하니?/Coding : 2009.07.13 23:29


간만에 11시에 집에 왔습니다. 음... 오랜만이네요.

오늘은 jQuery Ajax로 자동완성 기능을 만들다가 왔습니다. 스프링 JSONView를 이용해서 스프링이 보내준 JSON을 가지고 자동완성을 만드는 겁니다.

1. MappingJacksonJsonView 라는 클래스가 있는데, 좀 전까지만 해도 BindingJacksonJsonVIew였습니다. 아직은 배포된 버전에 이 클래스가 없고, 개발중인 프로젝트에 fisheye에 접속해서 보면 소스를 볼 수 있습니다. 또는 톱님이 배포하시는 최신 스프링을 사용하시면 이용할 수 있을 겁니다.

2. 일단 필요한 라이브러리를 구합니다. 최신 스프링 or 저 파일만 구하면 됩니다. 또 Jackson 관련 라이브러리를 추가합니다.

3. 컨트롤러를 만들고, ModelAndView를 반환합니다. ModelMap에는 컬렉션을 주던, 필요한 모델 객체를 주던 주면 되고, viewname에는 MappingJacksonJsonView의 빈 이름을 설정해 줍니다.

4. xxx-servlet.xml에서 MJJV 빈을 등록하고, 빈 이름은 jsonView라고 했습니다. 3번 컨트롤러에서도 jsonView란 이름을 사용했죠. 그리고 뷰리졸버를 하나 추가했습니다. BeanName머시기 뷰리졸버가 있죠. 그걸 추가했습니다.

5. jQuery.getJson(url, param, function)를 이용해서 저 컨트롤러에 요청을 보내고, 컨트롤러가 돌려주는 값을 확인해 봤습니다.

usernames:List<String> => {"userNames":["aaa", "vvv", "dddd"]}
users:List<User> => {"users":[["1", "기선", "whiteship@email.com"],["2", "toby", "toby@email.com"]]}
user:User => {"user":[name:"기선", "id":1, "email":email]}
user1:User, user2:User=> {"user1":[name:"기선", "id":1, "email":email],"user2":[name:"기선", "id":1, "email":email]}

이런 형태의 결과가 나왔습니다.(기억으로 적은거라 틀릴 수도 있습니다.) 주로 사용하게 될 첫 번째 형태를 보니, 맵(문자열-배열) 형태의 JSON으로 보입니다. 필드명이 없어서 인덱스로 접근해야 한다는게 불편해 보입니다. 세번째 결과를 보면 객체 하나를 줬을 때는 필드명까지 읽어서 넣어주는데 말이죠. 컬렉션도 그렇게 해주면 좋을텐데.. 좀 아쉽습니다.

6. 다음은 jQuery Ajax로 JSON 데이터를 받아왔으니, 이제 자동완성 기능만 구현하면 됩니다.

6-1. 텍스트 박스에 어떤 값을 입력하면, 서버로 요청을 보내고 그 결과를 리스트로 뿌리고, 그 중에 하나를 선택하면 텍스트 박스에 채워주고, 텍스트 박스 옆에 기타 자세한 정보를 뿌려줍니다.

6-2. 텍스트 박스에 값을 입력해서 검색 리스트가 나왔을 때, 키보드의 화살표로 상하 이동이 가능해야 합니다.

6-3. 캐시 설정을 통해 같은 검색어의 경우 매번 요청을 보내는 것이 아니라, 특정 시간동안은 캐시에서 데이터를 읽어서 보여줍니다. 캐시 유효 시간을 설정할 수 있어야겠네요.

대략 이정도 기능인데, 여기서 좀 시간이 많이 걸리고 있네요. 내일은 꼭 마무리 해야겠습니다.
비도 오는데 허리가 쑤실만큼 앉아있었지만 결과는 좀 허무하네요.
에잇... 내일은 파이팅.
top

  1. Favicon of https://helols.tistory.com BlogIcon is윤군 2009.07.14 01:20 신고 PERM. MOD/DEL REPLY

    오홋;;; 야근을 ?
    자동완성의 꽃은 검색하는 자료에 대한 인덱싱을 얼마나 잘 해놓느냐 인데..;;
    뭐~ 많은 내용의 정보가 아니라면 상관없지만요 ;;ㅋㅋ
    잘못하면 트래픽이 ㄷㄷㄷㄷㄷ ㅋㅋ

    마니 바쁜데~ 스터디 장소도 좀 ^^ 알아봐주시면 탱삼해요 ~~
    파이팅 하3333333 ㅋ

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.14 16:05 신고 PERM MOD/DEL

    자동완성 어렵더라 어려워..
    스터디 장소 마련했어. 공지할께.

  2. Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.07.14 01:26 PERM. MOD/DEL REPLY

    아... 스프링에 JSONView도 있었군요. JSON을 안 써서 몰랐습니다...^^;
    얼마전에 로드 존슨이 트위터에 마이클잭슨 언급한걸로 봐서 혹시
    MappingJackson 이란 이름은 '마이클잭슨'의 느낌을 살리기 위한
    로드 존슨의 지시가 아니었을까 하는 생각이... @_@;;;

    기존에 만든 어플은 잘 알려진 자바스크립트 라이브러리나 프레임워크 없이
    같이 일하는 친구가 직접 만든 자바스크립트 라이브러리를 사용하고
    저는 server-side에서 XML로 자료를 전송해서 JSON 쓸일이 없었는데,
    (XML 없는 Ajax는 Ajax가 아니다 라는 신념으로... :D )
    jQuery 쓰면서 JSON 지원하길래 한번 써봐야겠다 생각하다가
    마침 엊그제 jQuery용 트리를 찾다가 발견한 jsTree가 JSON 지원하는걸 보고
    JSON을 써야겠구나 하고 살펴보고 있었는데,
    마침 기선님께서 이런 좋은 글을...:)
    고맙습니다.

    그나저나 5번같은 문제가 있다면, AbstractView 상속해서 개인적으로
    만든 JSON 라이브러리 같은걸 이용하는 View를 따로 만들어도 좋지 않을까 싶군요.
    Annotation을 써서 원하는데로 변환 할수 있게 만든다거나...
    저의 경우는 비슷한 이유로 XML Serialisation을 하는데,
    JAXB나 XStream 혹은 XOM 같은
    Object-XML Mapping이나 Bindding 기술을 사용하지 않고,
    직접 만든 간단한 XML generator를 사용하고 있습니다.
    JAXP에 DOM API를 쓰다가 성능이 더 잘 나오는 SAX쪽으로 바꿨구요.

    Annotation으로 가능한거 보다 더 많은 제어를 원해서
    Annotation대신 Template Method Pattern을 사용해서
    XML Object을 만들고 Object 별로 설정된대로 Serialisation을 하는거죠.
    별도로 원하는 XML형태에 따라 class 작성이 필요해서,
    XStream 같은 걸로 이미 있는 JavaBean이나 Domain Object을
    그대로 그냥 XML로 변환하는것처럼은 안 되지만,
    XML Object class 작성할때 XML 형태를
    원하는데로 마음대로 할수 있기 때문에 좋죠.
    (e.g. JavaBean에 없던 필드를 attribute에 추가한다거나
    합계 attribute를 XML 생성시 계산해서 추가한다거나 등등)

    암튼 기선님께서 언급하신 JSONView도 한번 써봐야겠네요.
    정보 고맙습니다. :)

    Favicon of https://whiteship.tistory.com BlogIcon 기선 2009.07.14 16:12 신고 PERM MOD/DEL

    ㅎㅎㅎ맵핑잭슨가 마이클잭슨..캬.. 이전 이름이 빌딩XXX뷰였는데. 맵핑도 사실 그닥.. 그냥 잭슨제이손뷰 또는 라고 해도 될 것 같은데 그 안에서 해주는 일 때문에 빌딩이니 맵핑이니 고민하는 것 같아요.

    JSON이 무척이나 편할 줄 알았는데, JSON도 여러 형태가 있어서 제가 원하는 형태로 JSON을 편집해서 보낼 수 있다면 편하겠지만, 지금 스프링이 지원하는 MJJV가지고는... 좀 불편하더라구요. 그냥 MJJV가 만들어주면 거기에 맞게 jQuery 플러긴 만들고 지지고 볶고.. 그런 생쑈를 했네요. @_@

    네 JSON을 제가 원하는 형태로 만들어 보내고 싶다면, AbstractControlle를 사용하던 @Controller를 사용해서 직접 만들어 보내는 방법도 괜찮을 것 같네요. 하지만 이미 전 스프링 JSON 뷰에 맞춰서 뷰쪽 코드를 개발해버렸네요. 이젠 마무리 해야 할 시간이라 더이상 다른 시도는 ... 나중으로 기약하는 수밖에... ㅋ

    스프링에서 OXM도 지원하니까 그걸 한 번 사용해 보시죠.

    Favicon of http://toby.epril.com BlogIcon 2009.07.14 19:54 PERM MOD/DEL

    JacksonJsonView이라는 이름은 Jackson(http://jackson.codehaus.org/)이라는 Json 라이브러리를 사ㅇ해서 변환했기 때문에 붙은 이름입니다.

    Favicon of http://blog.lckymn.com BlogIcon Kevin 2009.07.14 20:28 PERM MOD/DEL

    아, 전 Jackson이란 이름에 촛점을 둔게 아니라...
    Binding을 굳이 Mapping으로 바꾼이유가
    Michael Jackson처럼 느껴지게
    M쪽 사운드를 만들기 위한거 아닌가? 하는 농담이었는데,
    농담이 재미가 하나도 없어서 그런지 아무도 이해를 못 하신듯 ㅠ_ㅠ
    죄송합니다. 썰렁한 농담을 해서...@_@;;;
    근데 썰렁한 농담덕에 Jackson이란 라이브러리를 알게 됐네요. :)
    고맙습니다. Toby님

    아, 그리고 스프링에서 지원하는 OXM도 살펴봤는데,
    제가 원하는게 없더군요. 제가 좀 까다로워요... :)
    단순히 annotation만 가지고 가능했어도
    그냥 XStream 같은걸 썼을텐데...

Write a comment.