🍃 𝗦𝗽𝗿𝗶𝗻𝗴 𝗕𝗼𝗼𝘁

[SpringBoot] 스프링 controller에서 json 받기 (@RequestBody, @ResponseBody 어노테이션 사용)

비타민찌 2022. 10. 25. 16:04
728x90

@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 형태로 만들어준 다음 반환하여 전송한다.

 

 

 

 

 

참고: https://lifejusik1004.tistory.com/entry/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-RequestBody-ResponseBody-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

728x90