1. 개요

이 짧은 예제에서는 Spring MVC에서 JSON 매개 변수로 작업하는 방법을 자세히 살펴볼 것입니다.

먼저, JSON 매개 변수에 대한 배경 지식부터 시작하겠습니다. 그런 다음 POST 및 GET 요청에서 JSON 매개 변수를 보내는 방법을 알아보기 위해 토끼 구멍으로 이동합니다.

2. Spring MVC의 JSON 매개 변수

JSON사용하여 데이터를 보내거나받는 것은 웹 개발자 사이에서 일반적인 관행입니다. JSON 문자열의 계층 구조는 HTTP 요청 매개 변수를 표현하는보다 간결하고 사람이 읽을 수있는 방법을 제공합니다.

기본적으로 Spring MVC는 String 과 같은 간단한 데이터 유형에 대해 즉시 사용 가능한 데이터 바인딩을 제공합니다 . 이를 위해 내부 에 내장 된 속성 편집기 List을 사용합니다 .

그러나 실제 프로젝트에서는 더 복잡한 데이터 유형을 바인딩 할 수 있습니다. 예를 들어 JSON 매개 변수를 모델 객체에 매핑하는 것이 편리 할 수 ​​있습니다.

3. POST에서 JSON 데이터 보내기

Spring은 POST 요청을 통해 JSON 데이터를 보내는 간단한 방법을 제공합니다. 내장 @RequestBody 어노테이션은 자동으로 특정 모델 객체로 요청 본문에 캡슐화 된 JSON 데이터를 역 직렬화 할 수 있습니다.

일반적으로 요청 본문을 직접 구문 분석 할 필요가 없습니다. 잭슨 라이브러리사용하여 무거운 짐을 모두 처리 할 수 있습니다 .

이제 Spring MVC에서 POST 요청을 통해 JSON 데이터를 보내는 방법을 살펴 보겠습니다.

먼저 전달 된 JSON 데이터를 나타내는 모델 객체를 만들어야합니다. 예를 들어 Product 클래스를 고려하십시오 .

public class Product {

    private int id;
    private String name;
    private double price;

    // default constructor + getters + setters

}

둘째, POST 요청을 받아들이는 Spring 핸들러 메서드를 정의 해보자 :

@PostMapping("/create")
@ResponseBody
public Product createProduct(@RequestBody Product product) {
    // custom logic
    return product;
}

보시다시피 @RequestBody제품 인수에 어노테이션 을 추가하면 클라이언트에서 보낸 JSON 데이터를 바인딩하기에 충분합니다 .

이제 cURL을 사용하여 POST 요청을 테스트 할 수 있습니다 .

curl -i \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-X POST --data \
  '{"id": 1,"name": "Asus Zenbook","price": 800}' "http://localhost:8080/spring-mvc-basics-4/products/create"

4. GET에서 JSON 매개 변수 보내기

Spring MVC는 @RequestParam제공 하여 GET 요청에서 쿼리 매개 변수를 추출합니다. 그러나 달리 @RequestBody, @RequestParam의 어노테이션 지원과 같은 단순 데이터 유형 INT문자열 .

따라서 JSON을 보내려면 JSON 매개 변수를 간단한 문자열로 정의해야합니다.

여기서 큰 질문은 : JSON 매개 변수 ( String )를 Product 클래스 의 객체 로 어떻게 변환 합니까?

대답은 아주 간단합니다! ObjectMapper의 클래스 잭슨 라이브러리 제공하여 자바 객체로 JSON 문자열을 변환하는 유연한 방법을 제공 .

이제 Spring MVC에서 GET 요청을 통해 JSON 매개 변수를 보내는 방법을 살펴 보겠습니다. 먼저 GET 요청을 처리하기 위해 컨트롤러에서 다른 핸들러 메서드를 만들어야합니다.

@GetMapping("/get")
@ResponseBody
public Product getProduct(@RequestParam String product) throws JsonMappingException, JsonProcessingException {
    Product prod = objectMapper.readValue(product, Product.class);
    return prod;
}

위에 표시된대로 readValue () 메서드를 사용하면 JSON 매개 변수 제품을 Product 클래스 의 인스턴스로 직접 역 직렬화 할 수 있습니다 .

JSON 쿼리 매개 변수를 String 객체 로 정의 합니다. 이제 @RequestBody를 사용할 때했던 것처럼 Product 객체 를 전달하려면 어떻게해야 합니까?

이 질문에 답하기 위해 Spring은 사용자 정의 속성 편집기를 통해 간결하고 유연한 솔루션을 제공합니다 .

먼저 문자열제공된 JSON 매개 변수 Product  객체 로 변환하는 로직을 캡슐화하기 위해 사용자 정의 속성 편집기를 만들어야 합니다 .

public class ProductEditor extends PropertyEditorSupport {

    private ObjectMapper objectMapper;

    public ProductEditor(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
    }

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        if (StringUtils.isEmpty(text)) {
            setValue(null);
        } else {
            Product prod = new Product();
            try {
                prod = objectMapper.readValue(text, Product.class);
            } catch (JsonProcessingException e) {
                throw new IllegalArgumentException(e);
            }
            setValue(prod);
        }
    }

}

다음으로 JSON 매개 변수를 Product 클래스 의 객체에 바인딩 해 보겠습니다 .

@GetMapping("/get2")
@ResponseBody
public Product get2Product(@RequestParam Product product) {
    // custom logic
    return product;
}

마지막으로 누락 된 퍼즐 조각을 추가해야합니다. Spring 컨트롤러에 ProductEditor등록 합시다 .

@InitBinder
public void initBinder(WebDataBinder binder) {
    binder.registerCustomEditor(Product.class, new ProductEditor(objectMapper));
}

마음에 베어는 것을 우리는 안전한 수송을 보장하기 위해 URL 인코딩에 JSON 매개 변수가 필요합니다 .

따라서 대신 :

GET /spring-mvc-basics-4/products/get2?product={"id": 1,"name": "Asus Zenbook","price": 800}

다음을 보내야합니다.

GET /spring-mvc-basics-4/products/get2?product=%7B%22id%22%3A%201%2C%22name%22%3A%20%22Asus%20Zenbook%22%2C%22price%22%3A%20800%7D

5. 결론

요약하자면 Spring MVC에서 JSON으로 작업하는 방법을 보았습니다. 그 과정에서 POST 및 GET 요청에서 JSON 매개 변수를 보내는 방법을 보여주었습니다.

항상 그렇듯이 예제의 전체 소스 코드는 GitHub에서 사용할 수 있습니다 .