프로젝트를 하면서 Rest API를 만드는데 HttpServletRequest를 통해 사용자의 데이터를 서버로 받아왔다.
그러다 코드 리뷰를 받으면서 아래와 같은 질문을 받았다.
"HttpServletRequest 객체를 사용하는것보단 @RequestParam 혹은 @requestbody를 사용해보면 어떨까요?"
사실 RequestParam, RequestBody 등등..계속 헷갈리는데(나만 헷갈릴수도)
이참에 개념을 확실히 정리해보고자 한다.
그리고 HttpServletRequest 사용보다 @RequestParam, @RequestBody를 사용함으로써 얻는 이점이 무엇인지 알아보고자 한다.
우선 데이터를 전달하는 방식에는 두가지가 있다.
1. 쿼리 파라미터
2. 메시지 바디
자세한 내용에 관해선 해당 글을 참고하는게 좋을것 같다.
프로젝트에서 내가 사용한 방식은 HTML Form으로 데이터를 전송하는 것이다.

위의 그림과 같이 버튼을 눌러 submit 이벤트가 발생하면, form 데이터를 읽어서 Http 메세지를 생성한다.
Form 데이터는 Http 메세지 바디에 쿼리 파라미터와 동일한 형식으로 서버에 전송된다.
HTML Form은 다음과 같은 방법으로 데이터를 조회할 수 있다.
그중에서도 1,2번인 HttpServletRequest와 @RequestParam 어노테이션을 비교해보겠다.
@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");
}
}
@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 객체를 이용하는것보다 요청 파라미터를 매우 쉽게 조회할 수 있다. 또한, 자동으로 형 변환을 해준다. 쿼리 파라미터 변수명과 매핑된 메서드 파라미터의 변수명이 같으면 어노테이션을 생략해도 되며 보통 일치시킨다.
그렇기에 스프링에서 제공하는 어노테이션을 사용하면 좀 더 편리하게 요청 파라미터를 조회할 수 있다.