[Spring] MVC 기본 기능(2) HTTP 요청 파라미터

JJoSuk·2023년 6월 5일
0

본 프로젝트 자료는 김영한님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 참고 제작됐음을 알립니다.

HTTP 요청 - 기본, 헤더 조회

어노테이션 기반의 스프링 컨트롤러는 다양한 파라미터를 지원한다.
그 중 헤더 정보 조회하는 방법이다.

@Slf4j
@RestController
public class RequestHeaderController {

    @RequestMapping("/headers")
    public String headers(HttpServletResponse response,
                          HttpServletRequest request,
                          HttpMethod httpMethod,
                          Locale locale,
                          @RequestHeader MultiValueMap<String, String> headerMap,
                          @RequestHeader("host") String host,
                          @CookieValue(value = "myCookie", required = false) String cookie) {

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

        return "ok";
    }
}

많은 헤더 정보를 조회하는 방법이 있다.

정리

  • HttpMethod는 HTTP 메서드를 조회할 때 사용된다.
  • Locale는 Locale 정보를 조회할 때 사용된다.
  • 그 아래 어노테이션 세 가지 항목은 위에서부터 각각 모든 HTTP 헤더를 MultiValueMap 형식으로 조회하고 특정 HTTP 헤더를 조회하고 특정 쿠키를 조회하는데 사용된다.
  • MultiValueMap은 MAP과 유사한데 하나의 키에 여러 값을 받을 수 있고, HTTP header, HTTP 쿼리 파리미터와 같이 하나의 키에 여러 값을 받을 때 사용한다고 한다.

HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form

클라이언트에서 서버로 요청 데이터를 전달할 때 사용하는 주요 3가지 방법을 사용한다.

쿼리 파라미터, HTML Form는 둘 다 형식이 같으므로 구분 없이 HttpServletRequest 의 request.getParameter() 를 사용하면 두가지 요청 파라미터를 조회할 수 있다!
=> 요청 파라미터(request parameter) 조회 라고 한다.

1. GET - 쿼리 파라미터

  • /url?username=hello&age=20
  • 메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
  • 예) 검색, 필터, 페이징등에서 많이 사용하는 방식

2. POST - HTML Form

  • content-type: application/x-www-form-urlencoded
  • 메시지 바디에 쿼리 파리미터 형식으로 전달 username=hello&age=20
  • 예) 회원 가입, 상품 주문, HTML Form 사용

3. HTTP message body

  • HTTP message body에 데이터를 직접 담아서 요청
  • HTTP API에서 주로 사용, JSON, XML, TEXT
  • 데이터 형식은 주로 JSON 사용
  • POST, PUT, PATCH

팁) 요청 파라미터 - 쿼리 파라미터, HTML Form
HttpServletRequest 의 request.getParameter() 를 사용하면 다음 두가지 요청 파라미터를 조회할 수 있다.


HTTP 요청 파라미터 - @RequestParam

위에 제공하는 정보로 @RequestParam 을 활용해 요청 파라미터를 만들어보고자 한다.

v1

    /**
     * @RequestParam 사용
     * - 파라미터 이름으로 바인딩
     * @ResponseBody 추가
     * - View 조회를 무시하고, HTTP message body에 직접 해당 내용 입력
     * */
    @ResponseBody
    @RequestMapping("/request-param-v1")
    public String requestParamV1(
            @RequestParam("username") String memberName,
            @RequestParam("age") int memberAge) {

        log.info("username={}, age={}", memberName, memberAge);
        return "ok";
    }
  • @RequestParam : 파라미터 이름으로 바인딩
  • @ResponseBody : View 조회를 무시하고, HTTP message body에 직접 해당 내용 입력

@RequestParam의 name(value) 속성이 파라미터 이름으로 사용

  • @RequestParam("username") String memberName -> request.getParameter("username")

v2

	/**
     * @RequestParam 사용
     * HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx") 생략 가능
     * */
    @ResponseBody
    @RequestMapping("/request-param-v2")
    public String requestParamV2(
            @RequestParam String username,
            @RequestParam int age) {

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

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

v3

	/**
     * @RequestParam 사용
     * String, int 등의 단순 타입이면 @RequestParam 도 생략 가능
     * */
    @ResponseBody
    @RequestMapping("/request-param-v3")
    public String requestParamV3(String username, int age) {

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

String , int , Integer 등의 단순 타입이면 @RequestParam 도 생략 가능

  • @RequestParam 애노테이션을 생략하면 스프링 MVC는 내부에서 required=false 를 적용한다.
    required 옵션은 바로 다음에 설명한다.
  • 코드가 짧으면 없어도 상관 없지만 만약 코드가 길면 생략 안하는걸 추천한다

HTTP 요청 파라미터 - @ModelAttribute

개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다.

보통 다음과 같은 코드를 작성할 것이다.

  • @RequestParam String username;

  • @RequestParam int age;

  • HelloData data = new HelloData();

  • data.setUsername(username);

  • data.setAge(age);

하지만 스프링에서는 이 과정을 완전히 자동화 해주는 @ModelAttribute 기능을 제공한다.

위에 배운 내용들로 코드를 만들어 보자.

	/**
     * @ModelAttribute 사용
     * 참고: model.addAttribute(helloData) 코드도 함께 자동 적용됨, 뒤에 model을 설명할 때 자세히 설명
     */
    @ResponseBody
    @RequestMapping("/model-attribute-v1")
    public String modelAttributeV1(@ModelAttribute HelloData helloData) {
        log.info(
        "username={}, age={}", helloData.getUsername(), helloData.getAge()
        );
        
        return "ok";
    }

스프링MVC는 @ModelAttribute 가 있으면 다음을 실행한다.

  • HelloData 객체를 생성한다.
  • 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다.
  • 예) 파라미터 이름이 username 이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다.

프로퍼티

  • 객체에 getUsername() , setUsername() 메서드가 있으면, 이 객체는 username 이라는 프로퍼티를 가지고 있다.
  • username 프로퍼티의 값을 변경하면 setUsername() 이 호출되고, 조회하면 getUsername() 이 호출된다.
profile
안녕하세요

0개의 댓글