[Spring] Controller에서 다양한 타입으로 Request 요청( PathVariable, RequestParam, ModelAttribute, RequestBody)

이혜지·2020년 10월 13일
0

Spring

목록 보기
10/15
post-thumbnail

Spring에서 Client로 받은 요청을 객체로 바인딩하기 위해 사용하는 방법

1. Servlet API


  • ServletRequest, ServletResponse
  • HttpServletRequest, HttpServletResponse : 위에꺼를 상속받음
    • HttpServletRequest.getInputStream() : InputStream, Reader 등을 얻을 수 있다.
    • HttpSerrvletResopnse.getOutputStream() : OutputStream, Writer 등을 얻을 수 있따.
  • HttpSession : HttpServletRequest 에서 세션 관련한 것들만 있다.

2. Spring API


  • WebRequest : HttpServletRequest 와비슷하지만 Servlet 과 의존성이없다
    • org.springframework.web.context.request.WebRequest
  • MultipartRequest : 파일 업로드
    • org.springframework.web.multipart.MultipartRequest

3. Spring Annotation


  • 대부분 생략이 가능한 것들이 많은데 가독성을 위해 웬만하면 다 적어주는게 좋다.

  • 거의 org.springframework.web.bind.annotation 경로에 있다.

  • @PathVariable : 중괄호에 명시된 값을 변수로 받는다.

    • @RequestMapping("/user/{id}")
    • public String userInfo(@PathVariable("id") String id)
  • @RequestParam : http 요청 파라미터를 변수로 받는다.

    • @RequestParam(value = "page", required = false, defaultValue = "1") Integer page
    • required와 defaultValue 사용가능, required = true 인데 요청 필드가 없으면 400 에러
    • 요청예제) ?page=3
    • 원시타입일 경우 어노테이션 안붙여도 자동으로 알아먹음ㅋㅋ
  • @ModelAttribute : http 요청 파라미터를 VO로 받는다.

    • public ModelAndView search(@ModelAttribute User user)
    • 레퍼런스타입일 경우 어노테이션 안붙여도 자동으로 알아먹는다. 즉 원시타입은 RequestParam으로, 객체타입은 ModelAttribute로
    • 요청 파라미터가 많을 경우 VO로 받는게 가독성이나 코드효율 상 좋다.
    • 이걸 커맨드 객체라고도 한다.
    • 메소드 레벨에서 annotation을 선언하면 ModelMap.addAttribute와 같은 기능을 한다.
      • ex. @ModelAttribute("users")이면 ModelMap.addAttribute("users", 메소드의 리턴값)
  • @RequestBody : HTTP 요청의 body 부분을 그대로 변수에 넣는다. XML, JSON 일때 이것을 주로 사용한다.

    • public String message(@RequestBody KakaobotRequest request)
    • 예를들어 json 구조처럼 KakaobotRequest.java 를 맞춘다면 파싱해서 잘 들어갈 것이다.
  • @CookieValue : 요청의 쿠키정보를 가져온다.

  • @RequestHeader : 요청헤더 정보를 가져온다.

    • @RequestHeader("host") String host
profile
공유 문화를 지향하는 개발자입니다.

0개의 댓글