선행지식
쿼리스트링 (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 설정문제일 수 있으니 다음 게시글을 참고하자
참고자료
https://aljjabaegi.tistory.com/590
'JVM > Spring' 카테고리의 다른 글
[Spring] @Valid 와 @Validated 활용한 유효성 검증 (Feat. Custom Valid Annotation 생성) (2) | 2023.10.04 |
---|---|
[Spring] 스프링 5.0 WebFlux 에 대해 (0) | 2022.05.11 |
[MyBatis] Dynamic Query Map(or Value Object) 파라메터 foreach 문법에 key, value 사용하기 (0) | 2022.03.15 |
[Spring] Spring Scheduler 간단하게 설정하기 (1) | 2022.03.07 |
[Web] 415 (Unsupported Media Type) 오류 원인 살펴보기 (1) | 2022.02.18 |
댓글