Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

참새의 이야기

[MVC1] 스프링 MVC Request 본문

Spring

[MVC1] 스프링 MVC Request

참새짹짹! 2023. 8. 4. 15:09

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