[Spring]HttpServletRequest, @RequestParam에 대하여 알아보기

우니·2023년 9월 29일
1

서론

프로젝트를 하면서 Rest API를 만드는데 HttpServletRequest를 통해 사용자의 데이터를 서버로 받아왔다.
그러다 코드 리뷰를 받으면서 아래와 같은 질문을 받았다.
"HttpServletRequest 객체를 사용하는것보단 @RequestParam 혹은 @requestbody를 사용해보면 어떨까요?"

사실 RequestParam, RequestBody 등등..계속 헷갈리는데(나만 헷갈릴수도)
이참에 개념을 확실히 정리해보고자 한다.
그리고 HttpServletRequest 사용보다 @RequestParam, @RequestBody를 사용함으로써 얻는 이점이 무엇인지 알아보고자 한다.

클라이언트에서 서버로 데이터를 전달하는 방식

우선 데이터를 전달하는 방식에는 두가지가 있다.
1. 쿼리 파라미터
2. 메시지 바디

자세한 내용에 관해선 해당 글을 참고하는게 좋을것 같다.

HTML Form

프로젝트에서 내가 사용한 방식은 HTML Form으로 데이터를 전송하는 것이다.

위의 그림과 같이 버튼을 눌러 submit 이벤트가 발생하면, form 데이터를 읽어서 Http 메세지를 생성한다.
Form 데이터는 Http 메세지 바디에 쿼리 파라미터와 동일한 형식으로 서버에 전송된다.

데이터 조회 방법

HTML Form은 다음과 같은 방법으로 데이터를 조회할 수 있다.

  1. HttpServletRequest를 이용한 요청 파라미터 조회
  2. @RequestParam을 이용한 요청 파라미터 조회
  3. Map, MultiValueMap을 이용한 요청 파라미터 조회
  4. @ModelAttribute을 이요한 쿼리 파라미터 조회

그중에서도 1,2번인 HttpServletRequest와 @RequestParam 어노테이션을 비교해보겠다.

HttpServletRequest를 이용한 요청 파라미터 조회

@RestController
public class RequestParamController {

    @GetMapping("/request-param-v1")
    public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException, IOException {
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));
        log.info("username={}, age={}", username, age);
        response.getWriter().write("ok");
    }

}

@RequestParam을 이용한 요청 파라미터 조회

@RestController
public class RequestParamController {

    @GetMapping("/request-param-v2")
    public String requestParamV2(
            @RequestParam("username") String memberName,
            @RequestParam("age") int memberAge) {
        log.info("username={}, age={}", memberName, memberAge);
        return "ok";
    }

}

같은 요청 url /request-param-v2?username=userA&age=20 일때 요청 파라미터를 조회하는 방법이다.
HttpServletRequest를 사용하려면 HttpServletRequest 객체를 주입 받고 해당 쿼리 파라미터를 추출 및 타입 변환까지 모두 처리해줘야한다.
스프링이 제공하는 @RequestParam 어노테이션은 HttpServletRequest 객체를 이용하는것보다 요청 파라미터를 매우 쉽게 조회할 수 있다. 또한, 자동으로 형 변환을 해준다. 쿼리 파라미터 변수명과 매핑된 메서드 파라미터의 변수명이 같으면 어노테이션을 생략해도 되며 보통 일치시킨다.
그렇기에 스프링에서 제공하는 어노테이션을 사용하면 좀 더 편리하게 요청 파라미터를 조회할 수 있다.

0개의 댓글