JVM/Spring

[Spring] Request Parameter (QueryString, Json) 데이터와 Annotation (@RequestParam, @RequestBody) 알고 쓰자

헹창 2022. 4. 5.
반응형

 선행지식

 쿼리스트링 (Query String) ?

사용자가 입력 데이터 전달하는 방법 중 하나로, URL 주소에 미리 협의된 데이터를 파라미터를 통해 넘기는 것으로

를 붙여 어러 개의 파라메터를 넘 길 수 있다.

key1=value1&key2=value2

 

 JSON (JavaScript Object Notation) ?

속성과 값 또는 키와 값을 쌍으로 이루어진 데이터 교환 형식을 의미한다.

key1:value1, key2:value2

 

이번 포스팅에서는 SpringMVC 구조에서 요청 파라메터 데이터 타입 이나 요청 타입을 고려하지 않고 Annotation 을 무분별하게 사용하는 것을 방지하고자한다.

 

클라이언트에서 요청하는 데이터 타입은 총 2가지 Query String 형태, Json 형태 로 살펴볼 것이다.

테스트 해본 경우의 수는 다음과 같다.

 테스트 

Http Method Type Client (Request) Server (Controller) 결과
GET Query String Map<String, String>  
Value Object (VO) O
HttpServletRequest  O
@RequestParam Map<String, String>  O
POST Query String
(form)
Map<String, String>  
Value Object (VO) O
HttpServletRequest  O
@RequestParam Map<String, String>  O
@RequestBody Map<String, String>   
@RequestBody Value Object(VO)  
POST Json (JSON.stringify)
- XMLHttpRequest 사용
Map<String, String>   
Value Object (VO)  
HttpServletRequest   
@RequestParam Map<String, String>   
@RequestBody Map<String, String>  O
@RequestBody Value Object(VO) O

 

 결과

GET 방식의 경우 쿼리스트링의 형태로 데이터가 오기 때문에 Value Object Request 로 데이터 접근이 가능하다. 

HashMap의 경우에는 빈 값으로 매핑이 제대로 되지 않았다.

 

하지만, @RequestParam 을 사용하여 HashMap으로 받은 경우에는 데이터를 꺼내올 수 있었다.

 POST 결과 요약

컨트롤러 / 데이터 타입 QueryString (Form data) 결과 Json 결과
Map 실패 빈 값 실패 빈 값
Value Object 성공   실패 빈 값
HttpServletRequest 일부 성공 배열을 넘겼을 때, 첫 번째 인덱스 값만 가져옴 실패 빈 값
@RequestParam
Map
일부 성공 배열을 넘겼을 때, 첫 번째 인덱스 값만 가져옴 실패 빈 값
@RequestBody 
Map
오류 415 Error 성공  
@RequestBody
Value Object
오류 415 Error 성공  

 

@RequestParam 은 일반적으로 단일 파라메터를 변환해줄 때 사용하는 것으로, 이렇게 ValueOject나 HttpServletRequest 까지 사용하는 것 자체가 알맞은 코딩은 아니지만,

 

어떤 데이터 타입을 어떤 객체에, 어떤 어노테이션을 사용해서 매핑이 되는지 전체적으로 테스트해보기 위해 사용하였다.

 


클라이언트와 컨트롤러에서 사용되는 객체의 데이터 구조는 다음과 같다.

 FORM 데이터

<form>
	<input name="id" value="haenny">
	<input name="pw" value="1234">
	<input name="name" value="heng">
	<input name="age" value="20">
	<input name="colors" value="red">
	<input name="colors" value="blue">
</form>

 JSON 데이터

{ 
	id : "haenny", 
	pw : "1234", 
	name : "heng", 
	age : 20, 
	colors: ["red", "blue"] 
};

 ValueObject 

public class TestVO {
	public String id;
	public String pw;
	public String name;
	public int age;
	public String[] colors;
}

 전체 요약

기본적으로 쿼리스트링 형태의 데이터는 Value Object 나  HttpServletRequest 에 자동적으로 데이터 매핑이 된다.

물론, 데이터 타입에 대한 설정은 필요하다.

 

@RequestParam 을 사용하여 String[] colors 로 데이터를 가져올 수 있지만, HashMap으로는 String[] 로 데이터 타입이 설정되지 않아 첫 번째 인덱스 데이터인 "red" 값만 가져와진다.

 

Json 데이터의 경우 직렬화가 필요한 데이터이기 때문에, @RequestBody 를 사용해야 데이터를 제대로 가져올 수 있다.

 

@RequestBody 를 사용해도 데이터가 제대로 매핑되지 않을 경우에는 Spring 설정문제일 수 있으니 다음 게시글을 참고하자

 

[Web] 415 (Unsupported Media Type) 오류 원인 살펴보기

415 Unsupported Media Type 한번쯤 만나봤을 이 골치아픈 415는 클라이언트(View)와 서버(Controller)의 요청/응답하는 데이터의 매개변수 설정이 잘못되었을 때 주로 발생한다. 오늘 해결방법으로 두 가지

haenny.tistory.com


 

참고자료

https://aljjabaegi.tistory.com/590

 

springboot form, ajax 데이터 타입별 Controller에서 받는 방법 @RequestParam, @RequestBody

springboot form, ajax 데이터 타입별 Controller에서 받는 방법 @RequestParam, @RequestBody 이번 포스팅에서는 springboot web project에서 form 과 ajax로 자주 사용되는 데이터타입을 전송하고 받는 방법을..

aljjabaegi.tistory.com

 

https://stir.tistory.com/43

 

[Spring] @RequestParam, @RequestBody, @ModelAttribute, HttpServletRequest 정리

선행 지식 Get 방식은 내에있는 input태그에 담기거나 주소 뒤에 ?name=test와 같은 형식으로 전달한다. Post 방식은 Json과 같은 데이터를 전송한다. HttpRequestServlet과는 다르게 어노테이션이 붙은 Spring

stir.tistory.com

 

728x90
반응형

댓글

추천 글