Written by
Sunwoo Han
on
on
스프링 MVC 기본 기능 - HTTP 요청
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 공부하고 정리하는 포스트입니다.
HTTP 요청
기본, 헤더 조회
HttpServletRequest
/HttpServletResponse
: 서블릿 기반의 request / response 객체Httpmethod
: HTTP method 정보- Locale : 언어 정보
@RequestHeader
- 해당 어노테이션을 통해 HTTP Request Header 정보에 접근 가능
- Map 형식으로 조회 가능
- 특정 헤더를 지정해서 조회 가능
@CookieValue
- 특정 쿠키값을 조회 가능
- required : 쿠키 필수 값 여부
- defaultValue : 쿠키의 기본값 지정
MultiValueMap
: Map과 유사한데 하나의 키에 여러 값을 받을 수 있음- HTTP header, HTTP 쿼리 파라미터와 같이 하나의 키에 여러 값을 받을 때 사용
MultiValueMap<String, String> map = new LinkedMultiValueMap();
map.add("keyA", "value1");
map.add("keyA", "value2");
// [value1,value2]
List<String> values = map.get("keyA");
결과
- 필요에 따라 헤더 전체 정보를 가져온 뒤 파싱하거나 특정 필드를 직접 조회해서 사용하자
HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form
개요
-
클라이언트에서 서버로 요청 데이터를 전달할 때는 주로 다음 3가지 방법을 사용
- GET - 쿼리 파라미터
/url?Username=hello&age=20
- 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
- ex) 검색, 필터, 페이징 등에서 많이 사용하는 방식
- POST - HTML Form
- content-type:application/x-www-form-urlencoded
- 메시지 바디에 쿼리 파라미터 형식으로 전달
username=hello&age=20
- ex) 회원 가입, 상품 주문, HTML Form 사용
- HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용. JSON, XML, TEXT
- 데이터 형식은 주로 JSON
- POST, PUT, PATCH
쿼리 파라미터, HTML Form
- 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
- 주로 검색 / 필터 / 페이징 등에서 많이 사용하는 방식
- 정확한 명칭으로는 요청 파라미터(request parameter) 조회 라고 한다.
- HTML Form으로 넘어오는 데이터도 Query String방식으로 넘어오기 때문에 같은 방법으로 처리 가능
-
HTML Form을 통해 오는 요청은 반드시 HTTP Post로 오며 Http request Body에 쿼리스트링 형식으로 데이터가 담겨서 온다!
- Query String 형식의 데이터를 받는 방법은 2가지가 있다.
@RequestParam
: 데이터를 단일 필드에 매핑@ModelAttribute
: 데이터를 객체에 매핑
적용 - @RequestParam
- HttpServletRequest가 제공하는 방식
@RequestParam
: 파라미터 이름으로 바인딩@ResponseBody
: View 조회를 무시하고, HTTP message body에 직접 해당 내용 입력
-
HTTP 파라미터 이름이 변수 이름과 같으면
@RequestParam(name = "xxx")
생략 가능 - @RequestParam 어노테이션을 사용해서 QueryString 형식으로 오는 데이터를 매핑해서 받을 수 있음
-
단계적으로 데이터 받는 방법을 확인했지만 결국 실무에서 자주 사용할 방식은 V3
-
@ResponseBody 사용 -> Response 데이터를 문자로 인식
- 데이터 자료형이 기본형(primitive)에 null 입력시 오류 발생 :
@RequestParam(required = false) int age
일 때 데이터 없이 요청하면 null값이 기본형에 들어감 -> 오류 발생 -> int가 아닌 ‘Integer’를 쓰거나 ‘defaultValue’로 기본값을 지정해야 오류가 나지 않는다.
@RequestParma
애노테이션을 생략- 가시적으로 좋지 않아서 권장하지 않음
- String, int 등의 단순 타입이면 스프링은
@RequestParam
의 생략으로 인식 - 객체에 생략되어 있으면
@ModelAttribute
생략으로 스프링이 인식
파라미터 필수 여부 - requestParamRequired
기본 값 적용 - requestParamDefault
파라미터 Map으로 조회 - requestParamMap
적용 - @ModelAttribute
@ModelAttribute
애노테이션을 사용해서 데이터를 객체에 한번에 바인딩- 실무에서는 Request / Response 모두 DTO를 받아서 처리하기 때문에 데이터 변수가 많은 경우 자주 사용
- V2는
@ModelAttribute
를 생략한 것인데, 애노테이션의 생략은 가시적으로 좋지 않기 때문에 권장하지 않음 - 내부적으로 객체가 바인딩 될 수 있도록 스프링은 HTTP 메시지 컨버터가 동작
HTTP Request의 Body 데이터 받기
HTTP request
의 Message Body에 직접 데이터를 담아 보내는 경우 어떻게 추출하는지 알아보자- 주로 JSON 형태를 사용하지만, 단순 텍스트를 받는 방법도 있음
HTTP request
의 body를 사용하는 POST / PUT / PATCH method에서 사용HTTP message body
를 통해 오는 경우에는@RequestParam
/@ModelAttribute
사용 불가능! (별개의 처리 방법이기 때문!)
적용 - 단순 텍스트
- 단계적으로 String 처리 -> 결국 HttpEntity / @RequestBody 를 사용하면 됨!
- HttpEntity : Http header / body 정보를 편리하게 조회하는 객체
RequestEntity
: HttpEntity를 상속받았으며, Http Request 사용에 특화된 객체ResponseEntity
: HttpEntity를 상속받았으며, Http Response 사용에 특화된 객체
@RequestBody
: HTTP request message body 정보를 편리하게 조회하도록 도와주는 어노테이션
적용 - JSON
- 일반 텍스트를 처리하는 것과 동일하게 결국 HttpEntity / @RequestBody를 사용해서 해결
- 반드시 HTTP request의
Content-Type
이application/json
이어야 함 HttpEntity
/@RequestBody
를 사용하면 HTTP 메시지 컨버터가 동작하게 됨 -> HTTP 메시지 바디의 내용을 우리가 원하는 문자나 객체로 변환!
정리
- URL params 데이터 받기 -> @PathVariable 사용
- URL Query String 데이터 받기 -> @RequestParam / @ModelAttribute 사용
- HTML Form 데이터 받기 -> @RequestParam / @ModelAttribute 사용
-
HTTP Message Body에 데이터 받기 -> HttpEntity / @RequestBody 사용
- HTTP REST API개발을 할 때에는 @RestController 사용 (@RestController = @Controller + @ResponseBody)
Comments
SPRING 의 다른 글
-
스프링 타입 컨터버 24 Jun 2022
-
API 예외 처리 17 Jun 2022
-
예외 처리와 오류 페이지 12 Jun 2022
-
로그인 처리 - 인터셉터 08 Jun 2022
-
로그인 처리 - 필터 06 Jun 2022
-
로그인 처리 - 쿠키, 세션 31 May 2022
-
Bean Validation 22 May 2022
-
검증 22 May 2022
-
메시지, 국제화 21 May 2022
-
타임리프 - 스프링 통합과 폼 19 May 2022
-
타임리프 - 기본 기능 10 May 2022
-
스프링 MVC 기본 기능 - 웹 페이지 만들기 02 May 2022
-
스프링 MVC 기본 기능 - HTTP 응답 30 Apr 2022
-
스프링 MVC 기본 기능 - HTTP 요청 24 Apr 2022
-
스프링 MVC 기본 기능 - 요청 매핑 19 Apr 2022
-
스프링 MVC 기본 기능 19 Apr 2022
-
스프링 MVC 구조 이해 14 Apr 2022
-
MVC 프레임워크 만들기 - V4, V5 12 Apr 2022
-
MVC 프레임워크 만들기 - V1, V2, V3 09 Apr 2022
-
서블릿, JSP, MVC 패턴 05 Apr 2022
-
서블릿 29 Mar 2022
-
웹 애플리케이션 이해 24 Mar 2022
-
스프링 웹 계층이란? 05 Nov 2021
-
스프링 시큐리티 공식문서 번역 27 Sep 2021
-
스프링 AOP 총정리 : 개념, 프록시 기반 AOP, @AOP 27 Apr 2021
-
SpEL (스프링 Expression Language) 25 Apr 2021
-
데이터 바인딩 추상화 : Converter와 Formatter 21 Apr 2021
-
데이터 바인딩 추상화 : PropertyEditor 12 Apr 2021
-
Validation 추상화 10 Apr 2021
-
Resource 추상화 08 Apr 2021
-
IoC 컨테이너 9부 07 Apr 2021
-
IoC 컨테이너 8부 06 Apr 2021
-
IoC 컨테이너 7부 02 Apr 2021
-
IoC 컨테이너 6부 29 Mar 2021
-
IoC 컨테이너 5부 27 Mar 2021
-
IoC 컨테이너 4부 23 Mar 2021
-
IoC 컨테이너 3부 20 Mar 2021
-
IoC 컨테이너 2부 18 Mar 2021
-
IoC 컨테이너 1부 12 Mar 2021
-
스프링 PSA 07 Jan 2021
-
스프링 @AOP 실습 07 Jan 2021
-
프록시 패턴 06 Jan 2021
-
스프링 AOP 04 Jan 2021
-
의존성 주입(Dependency Injection) 04 Jan 2021
-
스프링 빈(Bean) 02 Jan 2021
-
스프링 IoC 컨테이너 01 Jan 2021
-
스프링 IoC 01 Jan 2021