[6] 스프링 MVC (10) - HTTP request 데이터 조회 (@PathVariable / @RequestParam / HttpEntity 등)

김정욱·2021년 5월 22일
1

[6] 스프링 MVC

목록 보기
10/13
post-thumbnail

개요

  • 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변수 이름생략할 수 있음

Query String & HTML Form

[ 설명 ]

  • 메시지 바디 없이, 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 requestMessage Body직접 데이터를 담아서 보내는 경우 데이터 추출을 알아보자
  • 요즘은 주로 JSON 형태를 사용하지만, 추가적으로 단순 텍스트를 받는 방법도 알아보자
  • HTTP requestbody를 사용하는 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 requestContent-Typeapplication/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)
profile
Developer & PhotoGrapher

0개의 댓글