스프링에서는
RequestBody와 ResponseBody 어노테이션을 사용하여
컨트롤러에서 JSON 데이터를 주고받을 수 있습니다.
@RequestBody로 JSON 정보 받기
JSON 형태의 정보를 Map과 커맨드 객체로 변환하기 위해, jackson 라이브러리를 pom.xml에 입력합니다.
pom.xml
<!--JSON-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.3</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.13</version>
</dependency>
Ajax(main.jsp)
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
<title>Home</title>
</head>
<body>
<button onclick="goTest()" type="button">Ajax Button</button>
<script>
var obj = {"player": "kane", "age": 30};
function goTest() {
$.ajax({
url: "<c:url value="/goTest" />",
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 함수인 goTest()를 확인할 수 있습니다.
여기서 중요한 점 두 가지는 다음과 같습니다.
1.JSON.stringify 함수를 이용하여 데이터를 보내야 된다.
2. contentType을 "application/json"으로 설정해주어야 한다.
위 두가지 사항을 지키지 않는다면, @RequestBody로 정보를 받을 수 없습니다.
main.jsp를 화면에 띄우고 Ajax 버튼을 눌러 요청을 보내준 뒤 컨트롤러로 넘어온 데이터를 확인합니다.
컨트롤러로 넘어온 JSON 데이터를 변환하는 방법은 다음과 같습니다.
방법 1. 컨트롤러로 넘어온 JSON 데이터를 Map 형태로 변환
@Controller
public class MainController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String main() {
return "main";
}
@ResponseBody
@RequestMapping(value = "/goTest", method = RequestMethod.POST)
public void init(@RequestBody HashMap<String, Object> map) {
System.out.println(map);
// {player=kane, age=30} 출력
}
}
JSON 정보를 받을 변수를 Map 형태로 선언하고, @RequestBody를 붙여주면
컨트롤러로 전송된 JSON 정보가 자동으로 Map형태로 변환되어 해당 변수에 저장됩니다.
방법 2. 컨트롤러로 넘어온 JSON 데이터를 객체 형태로 변환
@Controller
public class MainController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String main() {
return "main";
}
@ResponseBody
@RequestMapping(value = "/goTest", method = RequestMethod.POST)
public void init(@RequestBody PlayerVO playerVO) {
userVO.getPlayer(); // "kane"
userVO.getAge(); // 30
}
}
이때 PlayerVO 클래스의 프로퍼티는 전송된 JSON 객체와 프로퍼티명이 일치해야 하고
getter, setter 가 있어야 합니다.
@ResponseBody로 JSON 정보 전달하기
JSON 데이터를 전달하는 방법은 다음과 같습니다.
방법 1. Map 정보를 전송
@Controller
public class MainController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String main() {
return "main";
}
@ResponseBody
@RequestMapping(value = "/goTest", method = RequestMethod.POST)
public HashMap<String, Object> init(@RequestBody HashMap<String, Object> map) {
map.put("goal", 30);
return map;
// {"player": "kane", "age": 30, "goal": 30}가 data로 바인딩
}
}
@ResponseBody가 붙은 메서드에서 Map을 반환하면 자동으로 Map 정보가 JSON 객체로 변환되어 전송됩니다.
방법 2. 객체 정보를 전송
@Controller
public class MainController {
@RequestMapping(value = "/", method = RequestMethod.GET)
public String main() {
return "main";
}
@ResponseBody
@RequestMapping(value = "/goTest", method = RequestMethod.POST)
public HashMap<String, Object> init(@RequestBody PlayerVO playerVO) {
HashMap<String, Object> map = HashMap<String, Object>();
map.put("playerVO", playerVO);
return map;
// {"playerVO": {player: "kane", age: 30}}가 data로 바인딩
}
}
객체 정보는 그대로 전송하면 복잡하기 때문에 map 형태로 만들어준 다음 반환하여 전송합니다.
반응형
'DEV > JAVA' 카테고리의 다른 글
[JAVA] split 메소드와 "|"으로 문자 자르기 (2) | 2022.12.06 |
---|---|
[JAVA] 반복문의 제어(break, continue) (2) | 2022.11.04 |
[JAVA] Log4j의 정의와 설정 (2) | 2022.09.06 |
[JAVA] 날짜 비교하기(Date, Calendar, LocalDate, LocalDateTime) (3) | 2022.06.13 |
[JAVA] Get 방식과 Post 방식 (2) | 2022.06.03 |
댓글