스프링 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-Typeapplication/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)