Free Lines Arrow
본문 바로가기
Spring/spring mvc 1 스터디

[Spring] HTTP 요청파라미터

by skahn1215 2021. 11. 13.
728x90
반응형

HTTP 요청파라미터 

클라이언트에서 서버로 데이터를 전송하는 방법을 알아보자.

HTTP 요청 파라미터를 다뤄보자

 

 

HTTP header 값 가져오기

  • 아래 처럼 헤더값을 가져올수 있다.
  • @RequestHeader MultiValueMap<String, String> headerMap: 맵으로 모든값을 담아서 가져온다.
  • @RequestHeader ("host") String host: 특정 헤더값을 가져온다.
  • @CookieValue(value = "myCookie", required = false) String cookie: 쿠기 를 가져온다.
@Slf4j
@RestController
public class RequestHeaderController {
    @RequestMapping("/headers")
    public String headers(HttpServletRequest req,
                          HttpServletResponse resp,
                          HttpMethod httpMethod,
                          Locale locale,
                          //MultiValueMap map 과 유사하지만 하나의 키의 여러가지 값을 받을수 있다.
                          @RequestHeader MultiValueMap<String, String> headerMap,
                          @RequestHeader ("host") String host,
                          @CookieValue(value = "myCookie", required = false) String cookie
                          ) {

        log.info("request={}", req);
        log.info("response={}", resp);
        log.info("httpMethod={}", httpMethod);
        log.info("locale={}",locale);
        log.info("headerMap={}",headerMap);
        log.info("header host={}", host);
        log.info("myCookie={}",cookie);

         return "ok";
    }
}

 

요청 파라미터 받는 방법

1. Get 쿼리 파라미터

  • /url?username=hello&age=20

2. POST HTML Form

  • content-type: application/x-www-form-urlencoded
  • 메시지 바디에 쿼리 파라미터 형식으로 전달 username=hello&age=20

3. HTTP message-body에 데이터를 직접 담아서 요청

  • HTTP API에서 주로 사용 JSON 사용
  • POST, PUT, PATCH

 

HTTP 요청파라미터 다루기

HTTP 요청파라미터 1

  • HttpServletRequest, HttpServletResponse 를 이용하여 파라미터 가져오기
  • getParameter 로 요청 파라미터를 가져올수 있다.
    @RequestMapping("/request-param-v1")
    public void requestParamV1(HttpServletRequest req, HttpServletResponse res) throws IOException {
        String username = req.getParameter("username");
        int age = Integer.parseInt(req.getParameter("age"));
        
        log.info("username={}, age={}",username, age);
        res.getWriter().write("Ok");
    }

 

HTTP 요청파라미터 2

  • @RequestParam 으로 바인딩 해서 데이터를 가져온다.
  • @ResponseBody:
     - Controller 에서 리턴 타입 String 은 뷰를 조회하는 것이기 때문에 HTTP Message Body 직접 입력하기 위해 사용
     - request.getParameter("username") 과 동일하다.
    @ResponseBody // 문자를 그대로 응답메시지에 넣는다.
    @RequestMapping("/request-param-v2")
    // controller 의 string 은 url을 찾는다.
    public String requestParamV2(
            @RequestParam("username") String memberName,
            @RequestParam("age") int memberAge
    )
    {
        log.info("username={}, age={}",memberName, memberAge);
        return "ok";
    }

 

HTTP 요청파라미터 3

HTTP 파라미터 이름과 변수 이름이 같으면  @RequestParam(name="xx") 생략 가능하다.

    @ResponseBody // 문자를 그대로 응답메시지에 넣는다.
    @RequestMapping("/request-param-v3")
    // 변수명이 동일 하면 생략이 가능하다.
    // param  안에 변수명 생략이 가능하다.
    public String requestParamV3(
            @RequestParam String username,
            @RequestParam int age
    )
    {
        log.info("username={}, age={}",username, age);
        return "ok";
    }

 

 

HTTP 요청파라미터 4

  • HTTP 파라미터 이름과 변수 이름이 같으면  @RequestParam 애노테이션 까지 생략이 가능하다.
  • 하지만 명확하게 사용하기 위해 애노테이션을 붙여주는걸 선호한다.
@ResponseBody // 문자를 그대로 응답메시지에 넣는다.
@RequestMapping("/request-param-v4")
// 요청 파라미터와 변수명이 동일 하면 아예 @RequestParam 생략이 가능하다.
// 하지만 @RequestParam 애노테이션 을 쓰는걸 권장한다.
public String requestParamV4(String username, int age)
{
    log.info("username={}, age={}",username, age);
    return "ok";
}

 

 

HTTP 요청파리미터 5

  • required: 를 넣어 주면 파라미터값에 해당 값이 필수 또는 필수 값이 아닌걸 지정 할수 있다.
     - required = true 면 요청 파라미터에 반드시 해당값이 있어야 한다.
     - 없다면 에러 발생
    @ResponseBody
    @RequestMapping("/request-param-required")
    // (required = false) 가 붙으면 해당 값이 없어도 에러가 발생하지 않는다.
    // username 은 필수 이다, age 는 필수 값이아니다.
    // 하지만 age 를 안넣어주면 null 값이 들어가는데 int 에는 null 을 넣을수 없기 때문에
    // 500 에러가 발생한다.
    public String requestParamRequired(
            @RequestParam(required = true) String username,
            @RequestParam(required = false) int age
    )
    {
        log.info("username={}, age={}",username, age);
        return "ok";
    }

 

 

HTTP 요청파라미터 6

  • @RequestParam 에 default 값을 써주면 값이 없는 경우 해당 값을 사용한다. 
  • 만일 요청 파라미터에 age 값이 없다면?
     - required=false 이더라도 에러가 발생한다.
     - 값이 지정 되지 않으면 null 로 되는데 int 형에는 null이 들어 올수 없다.
    @ResponseBody
    @RequestMapping("/request-param-default")
    // defaultValue 로 기본값 설정이 가능하다.
    public String requestParamDefault(
            @RequestParam(required = true, defaultValue = "guest") String username,
            @RequestParam(required = false, defaultValue = "-1") int age
    )
    {
        log.info("username={}, age={}",username, age);
        return "ok";
    }

 

HTTP 요청파라미터 7

  • Map 으로도 받을수 있다
    @ResponseBody
    @RequestMapping("/request-param-map")
    // map 으로도 받을수 있다.
    public String requestParamMap(@RequestParam Map<String,Object> paramMap
    )
    {
        log.info("username={}, age={}",paramMap.get("username"), paramMap.get("age"));
        return "ok";
    }

 

 

 

HTTP ModelAttribute 다루기

HTTP ModelAttribute 1

  • @ModelAttribute 를 쓰면 객체를 생성해주고 값도 알아서 넣어준다.
  • @ModelAttribute 동작방식:
     - 객체를 생성한다.
     - 요청 파라미터에서 객체의 프로퍼티를 찾는다.
     - setter 를 찾아서 값을 넣어준다.
  • 프로퍼티:
     - getUsername() -> username(프로퍼티)
     - getAge() -> age(프로퍼티)
  • 바인딩 오류
     - age 에 문자 값이 들어가면 타입이 맞지 않아 바인딩이 되지 않는다. 에러가 발생한다.
    @ResponseBody
    @RequestMapping("/model-attribute-v1")
    //public String modelAttributeV1(@RequestParam String username, @RequestParam int age)
    // @ModelAttribute 를 쓰면 HelloData 객체가 생성되고 값도 들어가게 된다.
    public String modelAttributeV1(@ModelAttribute HelloData helloData)
    {
        /*
        HelloData helloData = new HelloData();
        helloData.setUsername(username);
        helloData.setAge(age);

        log.info("username={}, age={}",helloData.getUsername(), helloData.getAge());
        */

        log.info("helloData={}", helloData);
        return "ok";
    }

 

HTTP ModelAttribute 2

@ModelAttribute 도 생략이 가능하다.

    @ResponseBody
    @RequestMapping("/model-attribute-v2")
    //public String modelAttributeV1(@RequestParam String username, @RequestParam int age)
    // @ModelAttribute 도 생략이 가능하다.
    public String modelAttributeV2(HelloData helloData)
    {
        /*
        HelloData helloData = new HelloData();
        helloData.setUsername(username);
        helloData.setAge(age);

        log.info("username={}, age={}",helloData.getUsername(), helloData.getAge());
        */

        log.info("helloData={}", helloData);
        return "ok";
    }

 

 

참고사항

  • ModelAttribute 도 생략이 가능하고 @RequestParam 도 생략이 가능하다.
    그렇다면 어떻게 구별하는가?
  • @RequestParam: String, Int, Integer 를 처리해준다.
  • @ModelAttribute: 나머지 타입을 처리해준다.
     - 단 argument resolver 로 지정해둔 타입은 예외로 둔다.

 

 

 

참고

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/lecture/71216?tab=curriculum

 

 

 

728x90
반응형

'Spring > spring mvc 1 스터디' 카테고리의 다른 글

[Spring] Message Converter  (0) 2021.11.25
[Spring] HTTP 응답  (0) 2021.11.21
[Spring] HTTP 요청메세지 TEXT, JSON  (0) 2021.11.16
[Spring] 요청매핑  (0) 2021.11.10
[Spring] Spring Controller 다루기  (0) 2021.11.06

댓글