본문 바로가기
JAVA

[Spring] @RequestBody, @ResponseBody의 사용

by 무사뎀벨레 2022. 10. 6.

 

 

 

 

스프링에서는
RequestBodyResponseBody 어노테이션을 사용하여
컨트롤러에서 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 형태로 만들어준 다음 반환하여 전송합니다.

반응형

댓글