[SpringBoot] 스프링 controller에서 json 받기 (@RequestBody, @ResponseBody 어노테이션 사용)
@RequestBody, @ResponseBody 어노테이션을 사용하여 컨트롤러에서 JSON 데이터를 주고받을 수 있다.
api 요청 프로그램으로 사용한다면 Content-Type을 꼭 application/x-www-form-urlencoded 로 설정해주어야 한다.
1. @RequestBody로 JSON 정보 받기
JSON 형태의 정보를 Map과 커맨드 객체로 변환하기 위해 jackson 의존성 추가.
implementation('org.springframework.boot:spring-boot-starter-web')
2. Ajax 간단한 페이지 작성 (home.jsp)
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
<title>Home</title>
</head>
<body>
<button onclick="test()" type="button">Ajax</button>
<script>
var obj = {"name": "vita", "age": 25};
function test() {
$.ajax({
url: "<c:url value="/test" />",
type: "post",
data: JSON.stringify(obj),
dataType: "json",
contentType: "application/json",
success: function(data) {
alert("성공");
},
error: function(errorThrown) {
alert(errorThrown.statusText);
}
});
}
</script>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
</body>
</html>
컨트롤러로 요청을 보낼 ajax 함수.
JSON.stringify 함수를 이용하여 데이터를 보내고
contentType을 "application/json"으로 설정해주어야 한다.
그렇지 않으면 @RequestBody로 정보를 받을 수 없다.
home.jsp를 화면에 띄우고 Ajax 버튼을 눌러 요청을 보내보자.
3. JSON을 Map 형태로 변환
@Controller
public class MainController {
// home.jsp
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home() {
return "home";
}
@ResponseBody
@RequestMapping(value = "/test", method = RequestMethod.POST)
public void init(@RequestBody HashMap<String, Object> map) {
System.out.println(map);
// {name=vita, age=25} 출력
}
}
JSON 정보를 받을 변수를 Map 형태로 선언하고 @RequestBody를 붙여주면 컨트롤러로 전송된 JSON 정보가 자동으로 Map으로 변환되어 해당 변수에 저장된다.
4. JSON을 객체 형태로 변환
@Controller
public class MainController {
// home.jsp
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home() {
return "home";
}
@ResponseBody
@RequestMapping(value = "/test", method = RequestMethod.POST)
public void init(@RequestBody UserVO userVO) {
userVO.getName(); // "vita"
userVO.getAge(); // 25
}
}
이때 UserVO 클래스의 프로퍼티는 전송된 JSON 객체와 프로퍼티명이 일치해야 하고 getter, setter 가 있어야 한다.
5. @ResponseBody로 JSON 정보 전달하기
Map 정보 전송하기
@Controller
public class MainController {
// home.jsp
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home() {
return "home";
}
@ResponseBody
@RequestMapping(value = "/test", method = RequestMethod.POST)
public HashMap<String, Object> init(@RequestBody HashMap<String, Object> map) {
map.put("phone", "0000-0000");
return map;
// {"name": "vita", "age": 25, "phone": "0000-0000"}가 data로 바인딩
}
}
@ResponseBody가 붙은 메서드에서 Map을 반환하면 자동으로 Map 정보가 JSON 객체로 변환되어 전송된다.
6. 객체 정보를 전송
@Controller
public class MainController {
// home.jsp
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home() {
return "home";
}
@ResponseBody
@RequestMapping(value = "/test", method = RequestMethod.POST)
public HashMap<String, Object> init(@RequestBody UserVO userVO) {
HashMap<String, Object> map = HashMap<String, Object>();
map.put("userVO", userVO);
return map;
// {"userVO": {name: "vita", age: 25}}가 data로 바인딩
}
}
객체 정보는 그대로 전송하면 복잡하기 때문에 map 형태로 만들어준 다음 반환하여 전송한다.