[6] 스프링 MVC (10) - HTTP request 데이터 조회 (@PathVariable / @RequestParam / HttpEntity 등)
개요
HTTP request 메시지
를 통해 클라이언트
에서 서버
로 데이터
를 전달
하는 방법
을 알아보자
HTTP request
의 다양한 요청 데이터
를 처리
하는 방법
을 알아보자
- 목록
URL params 데이터
받기
URL Query String 데이터
받기
HTML Form 데이터
받기
HTTP Message Body에 데이터
받기
URL params 데이터 받기
[ 설명 ]
@PathVariable
어노테이션을 사용해서 URL 경로
에 있는 데이터
를 추출
할 수 있음
- 요즘은
Query String
보다 리소스 경로에 식별자를 넣는 스타일
을 선호함
/mapping/{userId}
/users/{userId}
[ 적용 ]
받는 필드명
과 동일한 경우
아래처럼 @PathVariable
에 변수 이름
을 생략
할 수 있음
[ 설명 ]
메시지 바디 없이
, URL의 쿼리 파라미터
에 데이터를 포함
해서 전달
- 주로
검색
/ 필터
/ 페이징
등에서 많이 사용
하는 방식
정확한 명칭
으로는 요청 파라미터(request parameter) 조회
라고 한다.
HTML Form으로 넘어오는 데이터
도 Query String방식
으로 넘어오기 때문에 같은 방법으로 처리 가능
HTML Form을 통해 오는 요청
은 반드시 HTTP Post
로 오며 Http request Body
에 쿼리스트링 형식
으로
데이터가 담겨서 온다!
Query String 형식
의 데이터
를 받는 방법
은 2가지
가 있다.
@RequestParam
: 데이터
를 단일 필드
에 매핑
@ModelAttribute
: 데이터
를 객체
에 매핑
[ 적용 - @RequestParam ]
( 기본 )
@RequestParam
어노테이션을 사용해서 QueryString 형식
으로 오는 데이터
를 매핑
해서 받을 수 있음
단계적
으로 데이터 받는 방법
을 설명
했지만 결국 실제 자주 사용할 방식
은 V3
@ResponseBody
사용
--> Response 데이터
를 문자로 인식
데이터 자료형
이 기본형(primitive)
에 null
입력시 오류 발생
: @RequestParam(required = false) int age
일 때 데이터 없이 요청
하면 null값
이 기본형
에 들어감
--> 오류 발생
--> int
가 아닌 Integer
를 쓰거나 / defaultValue
로 기본값을 지정
해야 오류가 나지 않는다.
( 추가 )
Map
을 이용해서 데이터
를 한번에 받을 수도 있음
V4
는 암묵적
으로 @RequestParam 어노테이션
자체를 생략
- 가시적으로 좋지 않아서
권장하지는 X
String, int
등의 단순 타입
이면 스프링
은 @RequestParam
의 생략
으로 인지
객체에 생략
되어 있으면 @ModelAttribute 생략
으로 스프링
이 인지함
( 속성 : required / defaultValue )
[ 적용 - @ModelAttribute ]
@ModelAttribute
어노테이션을 사용해서 데이터
를 객체에 한번에 바인딩
실제 실무
에서는 Request / Response
모두 DTO를 받아서 처리
하기 때문에 데이터 변수
가
많은 경우
실무에서 자주 사용
된다.
V2
는 @ModelAttribute
를 생략
한 것인데, 어노테이션의 생략
은 가시적으로 좋지 않음
--> 권장하지 X
내부적으로 객체가 바인딩
될 수 있도록 스프링
은 HTTP 메시지 컨버터
가 동작
(Argument Resolver
+ 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 메시지 바디의 내용
을 우리가 원하는 문자
나 객체
로 변환!
@RestController
HTTP Response 반환 값
이 뷰(View)
가 아닌 특정 데이터
인 경우 @ResponseBody
가 꼭 필요
했다
- 매번 컨트롤러에
@ResponseBody
를 적용
하는 것은 매우 번거롭다.
--> @RestController
등장
@RestController
= @Controller
+ @ResponseBody
를 의미한다.
- 즉,
HTTP REST API개발
을 할 때에는 @RestController
를 사용하자!
정리
- 목록
URL params 데이터 받기
--> @PathVariable
사용
URL Query String 데이터 받기
--> @RequestParam
/ @ModelAttribute
사용
HTML Form 데이터 받기
--> @RequestParam
/ @ModelAttribute
사용
HTTP Message Body에 데이터 받기
--> HttpEntity
/ @RequestBody
사용
HTTP REST API개발
을 할 때에는 @RestController
사용
(@RestController
= @Controller
+ @ResponseBody
)