기존 코드에 controller에서 json형태로 데이터를 보내는 부분이 있었는데, 이때 modelAndView로 데이터를 저장하고 있었다.
ModelAndView mv = new ModelAndView("jsonView")식으로 적치하고 있었는데 이 jsonView가 어디서 오나 봤더니 jackson을 이용해서 jsonView를 bean으로 등록했기 때문에 사용할 수 있는 것이더라.
나는 @Configuation을 붙인 class도 딱히 없고해서 다른 방법이 없을까 하다가 Gson 라이브러리를 이용하는 방법이 있다는 것을 알게되었다.
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
이렇게 dependency를 등록한다.
이 포스팅에서 참고함
mapper에서 얻은 데이터를 List<VO>형태로 받고 있는데, 나는 이 데이터를 클라이언트로 넘겨주어야 했기 때문에 List -> JSON작업이 필요했다.
이를 위해서 JSON OBJECT에 JSON화한 LIST를 적치해야했음.
클라이언트에서 ajax를 사용할 때 dataSrc가 "result"로 되어있기 때문에(키값 설정) JSON형태도 {"result" : { List형 데이터 }}로 넘겨주어야 했다.
JsonObject obj = new JsonObject();로 JsonObject를 만들어준다. JsonObject라는 객체도 Gson에서 가져온 거 같음.
여기에 List데이터를 적치해야하는데, 이 List를 바로 JsonObject에 적치할 수가 없고, JsonElement 형태로 만들어줘야한다.
List를 JsonElement로 만들기 위한 과정:
1. List를 Json형태로 직렬화한다. (직렬화라는 말이 너무 어려운데 그렇다니까 그런줄 알게요..)
2. Json형태로 직렬화된 데이터를 JsonElement로 만든다.
1번 과정은 String jsonList = new Gson().toJson(list);와 같이 진행한다. 직렬화되는 list라는 녀석은 service-mapper를 거쳐서 VO형태의 list로 만들어진 데이터임.
2번 과정은 JsonElement elem = JsonParser.parseString(jsonList)와 같이 진행함. 원래는 JsonElement elem = new JsonParser().parse(jsonList)방식으로 가능했다고 하는데 이건 deprecated이므로 전자를 쓰는 게 낫다.
첫번째 과정에서 만든 JsonObject를 기억하는지.
이제 여기에 JsonElement형태가 된 list를 적치할 수가 있다.
obj.add("result", elem)과 같이 담아준다. 여기서 "result"는 클라이언트 ajax에서 설정해준 dataSrc와 같다.
이렇게 담아주기까지는 이 포스팅이 아주 도움이 되었다.
넘겨줄 때는 Json형태 자체로 넘겨주는 게 아니라 이걸 또 string으로 만들어서 넘겨준다. 그러니까 controller에서 선언한 method도 string을 반환하도록 만든 다음, 위에서 만들어준 최종 json형태인 obj를 string화하여 return한다.
return obj.toString();이렇게.
나의 경우 controller -> 클라이언트였지만 클라이언트 -> controller하는 방법은 여기
Object를 JsonObject로 만들기(Gson말고 그냥 Json이용한듯?)
Object obj = jsonParser.parse(strJson); JSONObject jsonObj = (JSONObject) obj;
근데 가끔 캐스팅이 될 때가 있고 안될 때가 있던데.. 나중에는 더 잘 알게 될까.
List<Map<String, Object>> 를 이용하는 방법?
이것도 시도해보려고는 했는데.. mapper에서 result형태 선언시에 조금 복잡해서 접어뒀던 기억..