[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)