참새의 이야기
[MVC1] 스프링 MVC Request 본문
HTTP 요청 - 기본, 헤더 조회
@RequestHeader MultiValueMap<String, String>
헤더에 담긴 모든 정보를 Map으로 받을 수 있다.
MultiValueMap을 사용하면 하나의 key에 복수의 value를 받을 수 있다는 장점이 있다.
@RequestHeader(”host”)
“host"라는 특정 헤더의 value를 받을 수 있다.
해당 값의 필수 여부를 required 속성으로 설정할 수 있고, null 값인 경우를 방지하기 위해 defaultValue를 설정할 수 있다.
@CookieValue
위에서는 특정 헤더의 값을 받아왔다면, 이번에는 쿠키를 받아올 수 있다.
이 역시 required와 defaultValue를 설정할 수 있다.
HTTP 요청 개요
클라이언트가 서버에게 데이터를 요청하는 방법은 크게 세 가지로 나뉜다.
GET - 쿼리 파라미터
message body 없이 url의 쿼리 파라미터에 데이터를 담아서 보낸다.
POST - HTML Form
message body에 쿼리 파라미터 형식으로 전달한다.
HTTP Message body
API에서 주로 사용하는 방식으로, 주로 JSON 형태이다.
HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form
위의 GET 쿼리 파라미터 방식과 POST HTML Form 방식 모두 쿼리 파라미터 방식이므로 같은 방법으로 조회가 가능하다.
HTTP 요청 파라미터 - @RequestParam
@RequestParam("username") String username
위와 같이 파라미터 이름으로 바인딩이 가능하다.
변수의 이름과 name 속성이 일치한다면 name은 생략해도 되지만, 아래와 같이 일치하지 않는다면 name 속성을 생략할 수 없다.
@RequestParam("username") String memberName
name 속성이 있어야 memberName에 request.getParameter(”username”)의 값을 넣어주기 때문이다.
변수의 이름이 name 속성과 일치한다면 @RequestParam을 아예 생략해 버려도 되지만, 코드를 이해하기 쉽게 하기 위해서는 생략하지 않는 것이 좋다.
required 속성을 설정하여 필수인 파라미터를 정해줄 수 있다.
필수인 파라미터가 안 들어올 경우에는 BAD REQUEST를 의미라는 400번 code를 반환한다.
HTTP 요청 파라미터 - @ModelAttribute
개발을 하다보면 String이나 int와 같은 단순 타입이 아닌 객체를 받아야 하는 일도 생긴다.
예를 들어 String username과 int age를 멤버 변수로 가지는 User 객체를 쿼리 파라미터로 받아야 한다고 하자.
@Data
public class User{
private String username;
private int age;
}
@ModelAttribute를 모른다면 각각을 받아와 하나씩 setter로 담아 객체를 완성했을 것이다.
@ModelAttribute를 사용하면 아래와 같이 간단하게 바인딩할 수 있다.
@ModelAttribute User user
username=hello&age=20
는 자동으로 각각 User의 username과 User의 age에 바인딩된다.
다만, int age와 같이 정수가 들어가야 할 곳에 문자가 들어간다면 BindException이 발생한다.
HTTP 요청 메시지 - 단순 텍스트
HttpServletRequest를 사용하거나 Stream을 사용하는 방법도 있지만, 주로 사용하는 것은 HttpEntity나 @RequestBody이다.
HttpEntity는 getBody() 메서드를 통해 body 정보를 편리하게 조회할 수 있고 자주 사용하는 RequestEntity와 ResponseEntity는 HttpEntity를 상속받은 객체들이다.
@RequestBody가 있음에도 HttpEntity를 사용하는 이유는 헤더 정보도 가져올 수 있기 때문이다.
이 두 가지 방법 모두 view를 이용하지 않고 HTTP message body에 직접 담아서 전달한다.
HTTP 요청 메시지 - JSON
앞서 언급한 HttpEntity와 @RequestBody를 사용하면 우리가 원하는 문자나 객체로 변환해 주기 때문에 JSON도 쉽게 다룰 수 있다.
reference
이 글은 김영한님의 '스프링 MVC 1편'을 듣고 작성했습니다.
'Spring' 카테고리의 다른 글
[MVC1] HTTP 메시지 컨버터 (0) | 2023.08.04 |
---|---|
[MVC1] 스프링 MVC Response (0) | 2023.08.04 |
[MVC1] Slf4j를 사용한 logging (0) | 2023.08.03 |
[MVC1] 스프링 MVC 활용 (0) | 2023.08.02 |
[MVC1] MVC 프레임워크의 구성 (0) | 2023.08.02 |