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 매개 변수를 보내는 방법을 보여주었습니다.
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/spring-mvc-send-json-parameters
'Java' 카테고리의 다른 글
Spring 웹 컨텍스트 (0) | 2021.04.12 |
---|---|
Spring 선택적 경로 변수 (0) | 2021.04.12 |
커스텀 스프링 SecurityConfigurer (0) | 2021.04.12 |
Spring Security 5의 새로운 비밀번호 저장소 (0) | 2021.04.12 |
Spring Security 5의 기본 비밀번호 인코더 (0) | 2021.04.11 |