HTTP 요청 데이터
HTTP 요청 메시지를 통해 클라이언트에서 서버로 데이터를 전달하는 다양한 방법이 있다. 그 중 아래의 3가지 방식이 주로 사용된다.
- GET - 쿼리 파라미터
- POST - HTML Form
- HTTP message Body
GET - 쿼리 파라미터
클라이언트에서 서버로 데이터를 전달하는 방법중의 하나는 Url 주소에 파라미터를 명시하여 전달하는 방법이 있다.
예) http://localhost/member?memberId=admin&memberNm=관리자
?memberId=admin&memberNm=관리자
와 같이 물음표 뒤에 연결된 key
와 value
를 쿼리 파라미터라고 한다. 주로 검색, 필터, 페이징에서 많이 사용되는 방식이다.
전달 데이터
- memberId = admin
- memberNm = 관리자
서버에서는 HttpServletRequest
가 제공하는 메서드들을 통해 쿼리 파라미터를 편리하게 조회할 수 있다.
1
2
3
4
String memberId = request.getParameter("memberId"); //단일 파라미터 조회(memberId 조회)
Enumeration<String> parameterNames = request.getParameterNames(); //파라미터 이름들 모두 조회
Map<String, String[]> parameterMap = request.getParameterMap(); //파라미터를 Map으로 조회
String[] memberIds = request.getParameterValues("memberId"); //복수 파라미터 조회
POST - HTML Form
HTML의 Form을 활용하여 Url이 아닌 Message Body에 쿼리 파라미터 형식으로 전달하는 방식이다.
application/x-www-form-urlencoded
형식은 Url이 아닌 Message Body를 사용할 뿐 쿼리 파라미터의 형식은 동일하다. 이 방식 또한 GET의 쿼리파라미터 조회 메서드를 그대로 사용하면 된다.
HTTP message Body
이 방식은 HTTP Message body에 데이터를 직접 담아서 요청하는 방식으로 HTTP API
(JSON, XML, TEXT)에서 주로 사용되는 방식이다.
사용하는 데이터 형식에서 차이가 있기 때문에 서버에서 조회할 때는 위의 두 방식과는 다른 방식으로 조회를 해야한다. (HttpServletRequest
의 inputStream
을 사용하여 HTTP 메시지 바디의 데이터를 직접 읽을 수 있다.)
1
2
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
Spring Annotation
스프링은 HTTP 요청 파라미터를 편리하게 조회할 수 있는 다양한 어노테이션을 지원한다.
@RequestParam
@RequestParam
어노테이션은 Get과 Form 방식에서 사용된 쿼리 파라미터를 편리하게 조회할 수 있도록 지원한다.
?memberId=admin&memberNm=관리자
에서 memberId를 조회하기 위해 request.getParameter("memberId")
와 같은 방식을 사용하였다. 이는 어노테이션을 활용하여 아래와 같이 작성할 수 있다.
1
2
3
4
5
6
@PostMapping("/save")
public String save(@RequestParam("memberId") String memberId,
@RequestParam("memberNm") String memberNm) {
Member member = new Member(memberId, memberNm);
...
}
@ModelAttribute
@RequestParam
어노테이션을 활용하면 편리하게 요청 파라미터를 받을 수 있다. 위의 예제를 보면 요청 파라미터를 받아 새로운 객체를 만드는 것을 볼 수 있다. 실무에서는 이렇게 요청 파라미터를 통해 새로운 객체를 만들어야 하는 경우가 빈번하다. @ModelAttribute
는 이러한 과정을 자동화 해준다. 아래의 코드는 @RequestParam
의 예제와 동일하게 동작한다.
1
2
3
4
5
6
@PostMapping("/save")
public String save(@ModelAttribute Member member) {
System.out.println(member.getMemberId()); //admin
System.out.println(member.getMemberNm()); //관리자
...
}
@RequestBody
@RequestBody
를 사용하면 HTTP 메시지 바디 정보를 편리하게 조회할 수 있다. 이는 위의 RequestParam
과 @ModelAttribute
와 같이 요청 파라미터를 조회하는 방식과는 차이가 있다. 주로 JSON 형식의 데이터를 처리할 때 사용한다.
- 요청 파라미터 조회:
@RequestParam
,@ModelAttribute
- HTTP 메시지 바디 직접 조회:
@RequestBody
Comments powered by Disqus.