티스토리 뷰

JSON은 JavaScript Object Notaion 의 약자로, 다른 시스템(다른 언어)와 어떤 정보를 교환하기 쉽도록 고안된 데이터 형식으로 다음과 같이 키:값 형태로 표현한다.

 

{
	"seq":1,	
	"title":"one"
}

 

바로 확인해보자.


1. JSON 형식

 

 1)  Jackson2 라이브러리  설치

 

pom.xml 에 dependency 를 추가하여 라이브러리를 설치한다.

 

◎pom.xml

<!--  Jackson2  -->
<dependency>
  <groupId>com.fasterxml.jackson.core</groupId>
  <artifactId>jackson-databind</artifactId>
  <version>2.7.2</version>
</dependency>

 2) HttpMessageConvertor 등록

 

일반적으로 브라우저에서 서블릿이나 jsp 파일을 요청하면, 서버는 클라이언트가 요청한 서블릿이나 jsp를 찾아서 실행한다. 그리고 그 실행 결과를 Http 응답 프로토콜 메시지 Body 에 저장하여 브라우저에 전송한다. 이 때, 이 응답 결과를 HTML이 아닌 JSON이나 XML로 변환하여 메시지 Body에 저장하려면 Spring에서 제공하는 컨버터를 사용해야한다.

 

◎presentation-layer.xml

 

<mvc:annotation-driven></mvc:annotation-driven>

위와 같이 설정하면 HttpMessageConvertter를 구현한 모든 컨버터가 생성된다.

 

 3) 링크 추가 및 Controller 수정

 

데이터를 JSON으로 변환하여 출력할 수 있도록 dataTransform.do 요청을 보낼 a 태그를 하나 생성하고, Controller를 수정해준다.

 

◎index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Main Page</title>
</head>

<body align="center">
	<h1>게시판 프로그램</h1>
	<hr>
	<div align="center">
		<a href="login.do">로그인</a><br /><br /><br />
		<a href="getBoardList.do">글 목록 바로가기</a>	
		<a href="dataTransform.do">글 목록 바로가기</a>	
	</div>
</body>
</html>

 

이때, @ResponseBody 어노테이션을 이용하여 자바 객체를 Http응답 프로토콜의 Body로 변환할 수 있다.

 

◎Controller

// 데이터 변환
@RequestMapping("/dataTransform.do")
@ResponseBody
public List<BoardVO> dataTransform(BoardVO vo){
  vo.setSearchCondition("TITLE");
  vo.setSearchKeyword("");

  List<BoardVO> boardList=boardService.getBoardList(vo);

  return boardList;
}

정상적으로 JSON 형식으로 데이터가 추출되는 걸 확인할 수 있다.

 

또한 다음과 같이 getter 메서드 상단에 @JsonIgnore를 추가하여 JSON 형식으로 변환하지 않을 맴버 변수도 지정할 수 있다.

 

◎BoardVO

@JsonIgnore
public String getSearchCondition() {
  return searchCondition;
}

public void setSearchCondition(String searchCondition) {
  this.searchCondition = searchCondition;
}

@JsonIgnore
public String getSearchKeyword() {
  return searchKeyword;
}

2. XML 형식

 

1), 2) 단계는 JSON과 동일하며, 붙여주는 어노테이션만 다르게 작성해주면 JSON 대신 XML 형식으로 데이터를 추출할 수 있다.

 

 3) 어노테이션 추가

XML 형식으로 데이터를 변환할 Command 객체 클래스 선언부 상단에 @XmlAccessorType(XmlAccessType.FIELD) 어노테이션을 작성한다. 또한 XML문서는 반드시 단 하나의 루트 엘리먼트를 가져야 하기 때문에, 만약 BoardVO 를 사용하여 게시글의 목록을 표현하려고 한다면, BoardListVO 객체를 생성해야 한다.

 

◎BoardListVO

package com.freeflux.biz.board;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "boardList")
@XmlAccessorType(XmlAccessType.FIELD)
public class BoardListVO {
	
	@XmlElement(name = "board")
	private List<BoardVO> boardList;
	
	public BoardListVO() {
	}

	public List<BoardVO> getBoardList() {
		return boardList;
	}

	public void setBoardList(List<BoardVO> boardList) {
		this.boardList = boardList;
	}

	@Override
	public String toString() {
		return "BoardListVO [boardList=" + boardList + "]";
	}

}

 

이후 전체를 감싸는 루트 엘리먼트의 이름을 @XmlRootElement(name=) 어노테이션을 사용하여 선언해주고, 태그로 사용할 변수명을 @XmlElement를 사용하여 선언한다.  @XmlElement는 생략이 가능하지만, 생략한다면, 변수명인 boardList로 설정된다.

 

이제 Controller부분만 List를 꺼낼 수 있게 설정해주면, 완료된다.

 

◎Controller

// 데이터 변환 : XML
@RequestMapping("/dataTransform.do")
@ResponseBody
public BoardListVO dataTransform(BoardVO vo){
  vo.setSearchCondition("TITLE");
  vo.setSearchKeyword("");

  List<BoardVO> boardList=boardService.getBoardList(vo);

  BoardListVO boardListVO=new BoardListVO();
  boardListVO.setBoardList(boardList);
  System.out.println("~~~~ => " +boardListVO.toString());		
  return boardListVO;
}

 

 

 

 

Comments