브라우저와 같은 클라이언트에서 서버로 HTTP 요청 메시지를 보낼 때, 서버로 데이터를 전달해야될 때가 있다. 특정 회원 정보 조회라던가, 로그인 정보, 게시판에서 글쓰기 등등 여러가지 경우가 있겠다.
그런 경우 보통 3가지 방법중 하나를 사용하게된다.
* GET - 쿼리 파라미터
- 메시지 바디 없이, URL에 직접 데이터를 적어서 전달
- 검색, 필터 등에서 주로 사용하는 가벼운 방식
* POST - HTML 폼
- POST 메시지의 바디에 쿼리 파라미터 방식으로 전달
- 로그인이나 상품 주문 등에 주로 사용
* HTTP message body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용하며 형식은 JSON을 많이 사용
Get 쿼리 파라미터
ex)
localhost:8080/request-param?username=hello&age=20
쿼리 파라미터 방식은 위와 같이 요청 URL안에 데이터를 써넣어서 전달하는 방식이다. 서버에서는 'username'과 'age'라는 값에대해 조회할 수 있다.
@Slf4j
@Controller
public class RequestParamController {
@RequestMapping("/request-param-v1")
public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
log.info("username={}, age={}", username, age);
response.getWriter().write("ok");
}
}
스프링의 경우 위의 코드와 같이 요청 URL안의 값을 추출하여 사용할 수 있으며, 특정 유저의 정보를 전달해주길 바란다면 추출된 값을 이용하여 DB를 조회하는 등 추가 작업을 수행하면 된다.
Post HTML 폼
* hello-form.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/request-param-v1" method="post">
username: <input type="text" name="username" />
age: <input type="text" name="age" />
<button type="submit">전송</button>
</form>
</body>
</html>
HTML 폼 방식은 말그대로 HTML의 폼을 이용하여 전달하는 방식으로 서버에서 받을 때는 Get 요청 파라미터 방식과 크게 다를 것이 없다.
보통 회원가입이나 로그인 시에 저런 화면을 많이 보게 되는데, HTML 폼을 제출하는 방식이기에 그러하다고 추측할 수 있을 것이다.
@RequestParam
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge) {
log.info("username={}, age={}", memberName, memberAge);
return "ok";
}
@RequestParam 노테이션을 사용하면 요청 데이터를 위와 같이 조회할 수 있다. 주의할 점으로 @ResponseBody 노테이션은 @RestController와 같이 응답 메시지에 스트링을 그대로 적어서 보내고 싶을 때 선언하여 사용한다.
@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4(String username, int age) {
log.info("username={}, age={}", username, age);
return "ok";
}
만약 데이터와 변수명을 맞춰주면 노테이션은 따로 필요가 없다. 필요에 따라 생략 가능하나 코드의 가시성을 고려한다면 굳이 생략할 필요는 없다고 생각이 든다.
'Backend > Spring' 카테고리의 다른 글
[백엔드/Spring] - mvc 패턴과 스프링 mvc (0) | 2024.02.14 |
---|---|
[백엔드/Spring] - 스프링 빈과 의존성 주입 (0) | 2024.02.12 |