스프링연동하기/spring3 기타설정

스프링3(Spring3) - @ResponseBody + jackson을 이용하여 심플하게 JSON 구현하기

개발로짜 2014. 7. 30. 10:49

기존에 Spring프로젝트를 하면서 jackson json이 있는거는 알고 설정법까지 알고 있었지만 

기존 json 파싱 라이브러리와 별차이없을거라 생각하고 대수롭지 않게 생각했었다.

json-simple이나 json json-lib + ezmorph 를 사용하여 json object를 생성햇었다.. 

하지만 포스팅을 위하여 jackson을 사용해보았는데.. 맙소사!! 

그동안 삽질을 해왔던거였음... 안습


기존 json 파싱보다 jackson 라이브러리를 사용하는것이 최적인듯... 

앞으로 jackson으로 파싱하리~~신나2


자 우선 기존 세팅에서 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을 사용해주리라~~ 슬퍼3



슈퍼맨슈퍼맨슈퍼맨



도움이 되셨다면 공감클릭! 궁금하신점은 댓글!!