스프링3(Spring3) - @ResponseBody + jackson을 이용하여 심플하게 JSON 구현하기
기존에 Spring프로젝트를 하면서 jackson json이 있는거는 알고 설정법까지 알고 있었지만
기존 json 파싱 라이브러리와 별차이없을거라 생각하고 대수롭지 않게 생각했었다.
json-simple이나 json json-lib + ezmorph 를 사용하여 json object를 생성햇었다..
하지만 포스팅을 위하여 jackson을 사용해보았는데.. 맙소사!!
그동안 삽질을 해왔던거였음...
기존 json 파싱보다 jackson 라이브러리를 사용하는것이 최적인듯...
앞으로 jackson으로 파싱하리~~
자 우선 기존 세팅에서 pom.xml에 dependency를 추가해주도록 하자
<dependency> <groupId>org.codehaus.jackson</groupId> <artifactId>jackson-mapper-asl</artifactId> <version>1.9.13</version> </dependency>
라이브러리추가를 해주었다면 다음은 mvc-config.xml에 jackson을 위한 bean 설정을 해주도록 하자
<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
다음은 흔히들 말하는 vo 클래스 하나를 생성하여 다음과 같이 선언을 해주도록 해보자
public class JSONTest { private int id; private String txt; private ArrayList<String> list; private String[] arr; public String[] getArr() { return arr; } public void setArr(String[] arr) { this.arr = arr; } public ArrayList<String> getList() { return list; } public void setList(ArrayList<String> list) { this.list = list; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getTxt() { return txt; } public void setTxt(String txt) { this.txt = txt; } }
VO에 배열과 리스트를 선언해본이유가 json array객체를 어떻게 출력시키는지 궁금해서
둘다 생성해보았음.
마지막으로 @responsebody를 이용한 컨트롤러를 생성하여 vo객체에 데이터들을 담은 후, 브라우저에 컨트롤러 URL을 호출해보도록 하자
. @RequestMapping(value="/jsonTest") public @ResponseBody JSONTest jsonTest() { //가상의 배열및 리스트에 데이터 add ArrayList<String> arraylist = new ArrayList<String>(); arraylist.add("a"); arraylist.add("b"); String[] array = {"a","b","c"}; //VO객체에 SET한후 vo객체자체를 return JSONTest test = new JSONTest(); test.setId(1); test.setTxt("textTxt"); test.setList(arraylist); test.setArr(array); return test; }
실행을 해보도록 하자
※ IE에서는 URL 호출시 JSON 데이터일경우 파일다운로드를 받게끔 되있으므로
크롬에서 컨트롤러 호출을 해보았음
흑흑 ㅠㅠ 잘나온다,.. array / arraylist 상관없이 json array에 알아서 담아서 출력해준다....
코드를 보니 json array가 잘못 출력되는것 확인하였다.
아무래도 그냥 list/array타입의 key/value로 지정이 되야하는데 그냥 문자열만 넣어서 그런가보다.
그래서 다시 list형식의 key/value를 적용하여 간단하게 게시물상세내용 + 다중파일첨부를 가상의 예를 들어서 다시 작성해보았음.
DB통신을 통하여 쿼리 작성을 하려하였으나 그냥 VO에 가상의 데이터를 넣어보기로 하였음
1. VO 클래스를 두개를 작성한다.
- Board.java
public class Board { private int seq; private String title; private String content; private Date regdate; private ArrayList<BoardFile> filelist; public ArrayList<BoardFile> getFilelist() { return filelist; } public void setFilelist(ArrayList<BoardFile> filelist) { this.filelist = filelist; } public int getSeq() { return seq; } public void setSeq(int seq) { this.seq = seq; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public Date getRegdate() { return regdate; } public void setRegdate(Date regdate) { this.regdate = regdate; } }
- BoardFile.java
public class BoardFile { private int fileSeq; private String fileName; private int fileSize; public int getFileSeq() { return fileSeq; } public void setFileSeq(int fileSeq) { this.fileSeq = fileSeq; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public int getFileSize() { return fileSize; } public void setFileSize(int fileSize) { this.fileSize = fileSize; } }
다음은 기존 /jsonTest 컨트롤러내에 set 데이터를 한번 다음과 같이 처리해주도록 하자
@RequestMapping(value="/jsonTest") public @ResponseBody Object jsonTest() { Board board = new Board(); board.setSeq(1); board.setTitle("제목"); board.setContent("내요내용내용"); board.setRegdate(new Date()); ArrayList<BoardFile> filelist = new ArrayList<BoardFile>(); BoardFile boardFile = null; boardFile = new BoardFile(); boardFile.setFileSeq(1); boardFile.setFileName("파일명1"); boardFile.setFileSize(1000); filelist.add(boardFile); boardFile = new BoardFile(); boardFile.setFileSeq(2); boardFile.setFileName("파일명2"); boardFile.setFileSize(25645); filelist.add(boardFile); board.setFilelist(filelist); return board; }
컨트롤러에 대해서 설명을 하자면 게시판의 뷰페이지를 예로 든것이다.
상세보기 클릭시 제목과 내용이나오고, 여러개의 파일목록들에 대한 json 객체를 return!!!
위와같이 작성하고 /jsonTest 를 브라우저에서 호출하게 되면 ...
이번엔 정상적으로 json object 부터 json array까지 정상적으로 잘나오는것을 확인할 수 있었다...
그동안 난 뭘한건지... ㅋ
앞으로 jackson을 사용해주리라~~
도움이 되셨다면 공감클릭! 궁금하신점은 댓글!!