프로필사진
RESTful(2) - XML/JSON 변환처리(@RequestBody, @ResponseBody, HttpMessageConverter)

2019. 11. 25. 11:13🔴 Spring

300x250
  • HTTP기반 API형태로 제공하는 서비스 → XML/JSON형식 사용 (REST의 응답형태)
  • JSON이란? = JavaScript Object Notation :
    경량의 데이터 교환 형식,  JS에서 객체를 만들때 사용하는 표현식임
    특정 언어에 종속되지 않으며, 용량이 작아서  최근에는  XML을 대체해서 데이터 전송 등에 많이 사용됨
  • XML이란? =  Extensible Markup Language :
    HTML과 유사한 문자 기반의 마크업 언어, 사람과 기계가 동시에 읽기 편한 구조로 되어있음
    하지만 HTML과 달리 데이터를 보여주는 목적이 아닌 데이터를 저장하고 전달하는 목적으로만 만들어졌음
  • @RequestBody & @ResponseBody 사용해서 쉽게 구현
    • @RequestBody : JSON형식의 요청 → 자바 객체로 변환
    • @ResponseBody : 자바 객체 → JSON 이나 XML형식의 문자열로 변환
  • HttpMessageConverter를 이용 → 자바객체 & HTTP요청/응답 사이를 변환처리


예제

<form.jsp>

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

	<form method="post">
		이름<input type="text" name="name"><br>
		나이<input type="text" name="age"><br>
		<input type="submit">
	</form>
</body>
</html>

<SimpleConverterController.java>

package com.bitcamp.mvc;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/mc/simple")
public class SimpleConverterController {
	
	@RequestMapping(method=RequestMethod.GET)
	public String form() {
		return "form";
	}
	
	@ResponseBody // 자바 객체 → JSON 이나 XML형식의 문자열로 변환
	
	@RequestMapping(method = RequestMethod.POST)
	public String simple(@RequestBody String body)
	// @ResponseBody ---> String을 보고 객체 형태 판단함
	// @RequestBody ---> String을 보고 객체 형태 판단함
	// !!view를 return할 것인지, 그 외의 것을 return할 것인지를 생각하고 @ResponseBody를 사용하자!!
	// JSON형식의 요청 → 자바 객체로 변환
	// 요청 HTTP데이터 -> String body로 전달 
  {
		
		System.out.println(body);
		
		return body;
	}
}

⇒ content-type text/html → text/html 으로 받아짐 (입력 전 → submit 후)

이는 AnnotationMethodHandlerAdapter 클래스에 의해 콘텐츠 타입이 지정되었기 때문이다.
하지만 만약에 JSON형태로 보낸 것이라면? 콘텐츠 타입이 text/html이면 application입장에서는 JSON형태인지 인지하지 못한다.
따라서 setContentType으로 바꿔주던가, JAXB2의 lib를 이용해서 xml이라는 것을 명시해줘야 한다!!
jackson-databind : DATA를 JSON 형태로 바꿔주는것,
하지만 AnnotationMethodHandlerAdapter : 콘텐츠 타입을 바꿔주는 것

300x250