YONG-MIN

Spring3 JSON 사용하기(JACKSON)

개발언어/Java, Spring 2017. 6. 4. 18:00

Spring에서 Jackson 라이브러리를 사용해서 JSON 형식으로 응답(Response)하는 방법에 대해 포스팅하겠습니다.


JACKSON 라이브러리 사용 설정하기

Jackson 라이브러리를 사용하기 위한 설정을 진행하겠습니다.

1. Maven을 통해 라이브러리를 Setting하기 위해 아래 관계를 pom.xml에 추가 합니다.

<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.13</version>
</dependency>

2. mvc-config.xml에 bean을 등록하는 작업을 진행합니다.

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>

이 두가지를 진행하면 Jackson 라이브러리를 이용하여 

JSON 형식으로 데이터를 Response하는 JSON API를 만들어 볼 수 있습니다.


JSON을 활용하여 API 구조 구성하기 


이제 @ResponseBody Annotation을 활용해서 간단하게 API 구조를 만들도록 하겠습니다.

크게 Java에서 기본 제공하는 Map 객체와 VO(Value Object)를 이용하는 방법 두가지가 있습니다.


1. Map 객체를 이용한 JSON API 구조 만들기

1.1 TestController.java : 컨트롤러에 다음 코드를 작성하여 줍니다.

@RequestMapping(value="/getJsonByMap") public @ResponseBody Map<String , Object> getJsonByMap() { Map<String, Object> jsonObject = new HashMap<String, Object>(); Map<String, Object> jsonSubObject = null; ArrayList<Map<String, Object>> jsonList = new ArrayList<Map<String, Object>>(); //1st Data jsonSubObject = new HashMap<String, Object>(); jsonSubObject.put("idx", 1); jsonSubObject.put("Data", "1st Data"); jsonSubObject.put("create_date", new Date()); jsonList.add(jsonSubObject);

//2nd Data jsonSubObject = new HashMap<String, Object>(); jsonSubObject.put("idx", 2); jsonSubObject.put("Data", "2nd Data"); jsonSubObject.put("create_date", new Date()); jsonList.add(jsonSubObject); jsonObject.put("success", true); jsonObject.put("json_list", jsonList); return jsonObject; }

/getJsonByMap Request에 대해 데이터를 아래 구조로 Response하는 코딩입니다.

@ResponseBody Annotation의 경우 리턴되는 값을 View를 통하지 않고 

HTTP Response Body에 직접 작성하는 방법으로 API 설계시 유용합니다.


위 작성된 @ResponseBody Annotation을 활용한 코드의 결과 페이지는 다음과 같습니다.



2. VO(Value Object)를 이용한 JSON API 구조 만들기 

Map을 활용해서 JSON 구조를 만든 것처럼 이번엔 VO를 이용해 JSON 구조를 생성하겠습니다.

위와 다른 점은 데이터를 어디에 담아 넘겨주는 차이(Map, VO)밖에 없습니다.

MAP은 Java에서 제공하는 객체를 이용해 VO 생성없이 간단하게 사용할 수 있습니다.

반면에 VO는 사용할 VO를 개발자가 만들어줘야 하는 번거로움이 있지만,

보다 세부적으로 커스텀하고, 공동개발시 탬플릿을 제공하는 장점이 있습니다.

이 방법을 설명하기 위해   test.vo 패키지를 만들고 다음의 VO를 생성하겠습니다.

- DataVO : 넘겨줄 Data LIst를 구성할 단위 VO (idx, data, create_date)

- ObjectVO : DataVO로 만들어진 List와 성공값(success)를 담는 최종 객체


2.1. DataVO.java

public class DataVo {
	private int idx;
	private String data;
	private String create_date;

	public int getIdx() {
		return idx;
	}
	public void setIdx(int idx) {
		this.idx = idx;
	}
	public String getData() {
		return data;
	}
	public void setData(String data) {
		this.data = data;
	}
	public String getCreate_date() {
		return create_date;
	}
	public void setCreate_date(String create_date) {
		this.create_date = create_date;
	}
}

2.2. ObjectVO.java

package com.devks.test.vo;

import java.util.ArrayList;

public class ObjectVo {
	private boolean success;
	private ArrayList<DataVo> list;
	
	public boolean isSuccess() {
		return success;
	}
	public void setSuccess(boolean success) {
		this.success = success;
	}
	public ArrayList<DataVo> getList() {
		return list;
	}
	public void setList(ArrayList<DataVo> list) {
		this.list = list;
	}
}

2.3. TestController.java

	@RequestMapping("/getJsonByVo")
	public @ResponseBody ObjectVo getJsonByVo() {
		Calendar cal = Calendar.getInstance();
		ArrayList<DataVo> list = new ArrayList<DataVo>();
		DataVo vo = null;
		ObjectVo objectVo = new ObjectVo();
		
		//1st Data
		vo = new DataVo();
		vo.setIdx(1);
		vo.setData("1st Data with VO");
		vo.setCreate_date(cal.get(Calendar.YEAR)+"-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.DAY_OF_MONTH));
		list.add(vo);
		
		//2nd Data
		vo = new DataVo();
		vo.setIdx(1);;
		vo.setData("2nd Data with VO");
		vo.setCreate_date(cal.get(Calendar.YEAR)+"-"+(cal.get(Calendar.MONTH)+1)+"-"+cal.get(Calendar.DAY_OF_MONTH));
		list.add(vo);
		
		objectVo.setList(list);
		objectVo.setSuccess(true);
		
		return objectVo;
	}

2.4. 실행 결과 (Map을 사용할 때와 동일합니다. 데이터를 어디에 담아 넘겨주는지만 다를뿐...)