지금까지 요청 매핑을 알아보았다.
1. 리소스와 HTTP 메소드를 통해 큰 틀을 설계해보았다.
2. GET, POST 등의 메소드 사용 방법을 알아보았다.
하지만, 실질적으로 그 메소드를 사용할 때 어떻게 데이터를 다루는지에 대해서는 아직 모른다.
이제부터 데이터를 다루는 방법을 알아본다.
-데이터를 다루는 방법을 알아본 후 설계된 매핑과 같이 사용을 하는 방법을 알아보겠다.(이번 글은 데이터를 다루는 방법만)
코드를 보기에 앞서, 클라이언트에서 서버로 요청 데이터를 전달할 때 주로 사용하는 방법이 있다.
1. GET - 쿼리 파라미터를 통한 데이터 전달
ex)localhost:8080/mapping/users?username=jeong&age=20
-?뒤에 들어가는 부분이 쿼리 파라미터이다.
-GET방식은 주로 body에 데이터를 넣어 전달하는 POST 방식과는 다르게, URL의 쿼리 파라미터에 데이터를 넣어 전달한다.
-검색, 조회, 필터, 페이징 등으로 주로 사용된다.
2. POST - HTML form
ex) form 태그를 통한 데이터 전달(content-type:application/x-www-form-urlencoded)
-body 부분에 application/x-www-form-urlencoded라는 형식으로 데이터를 담아 요청 전달한다.
-주로, 회원 가입, 상품 주문, HTML Form을 사용한다.
3. HTTP message body
ex) HTTP message body에 데이터를 직접 담아 요청한다.
-POST방식과 다른 점은 application/x-www-form-urlencoded라는 form 형식과 다르게, json, xml, text등의 형식으로 보낼 수 있다는 점이다.
-주로 json( {username:kim} )형식으로 사용된다.
-POST, PUT, PATCH
===========================================================================================
===========================================================================================
1.getParameter
일반적으로, HTML form 데이터나, get방식을 통한 쿼리 파라미터 데이터는 application/x-www-form-urlencoded라는 컨텐츠 타입을 따른다. 이는 key1=value&key2=value라는 방식을 뜻하는데, get과 post 방식이 데이터를 전달하는 부분이 url이냐 body냐만 다른것이지, application/x-www-form-urlencoded 둘다 이 형식으로 들어오는 것은 같다.getParameter()는 이러한 application/x-www-form-urlencoded형식을 다루는데에 사용된다.
우선 form을 통한 parameter 요청을 위해 간단한 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>
그 후 request-param-v1에서 데이터를 getParameter()로 받아주겠다.
@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");
}
form으로 username, age를 보내든, get방식으로 보내든, 둘 다 String username과 int age로 들어온다.
-모든 파라미터는 String형으로 들어오기 때문에 형변환을 시켜줘야한다.
-form을 통해 post방식으로 요청
-쿼리 파라미터를 통해 get방식으로 요청
위의 방법을 변형해서 더 쉽게 사용해 보자.
1. @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";
}
위에 코드를 보면 request.getParameter 메소드를 사용하지 않고, 파라미터에
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge
로 변수에 바로 받아준 것을 볼 수 있다.
***@ResponseBody는 @RestController와 같은 기능이다.(ok를 바로 보여줌)
2. @RequestParam 변수명 맞춰주기
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(
@RequestParam String username,
@RequestParam int age){
log.info("username={}, age={}", username, age);
return "ok";
}
위의 코드를 보면
@RequestParam("username") String memberName이
@RequestParam String username으로 바뀐 것을 볼 수 있다.
스프링은 알아서 username이라는 변수명의 값을 받아온다.
3. @RequestParam 중복 제거
@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4(String username, int age){
log.info("username={}, age={}", username, age);
return "ok";
}
@RequestParam을 아예 없애주었다.
-그래도 후에 유지보수를 위해 하나쯤은 써주자
@RequestParam String username, int age
4. required=true/false 필수 파라미터
@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
@RequestParam(required = true) String username,
@RequestParam(required = false) int age){
log.info("username={}, age={}", username, age);
return "ok";
}
@RequestParam 뒤에
@RequestParam(required = true/false) 가 붙었다.
true는 필수이고, false는 선택이다.
즉, true가 붙은 username에 아무것도 들어오지 않으면 400 error가 난다.
하지만, false에는 아무것도 들어오지 않아도 괜찮다.
***이때 주의할점
***false의 특성상, null이 들어가야할 때가 있다. 이떄 int에는 null이 들어갈 수 없다.
***int age --> Integer age로 바꿔서 써주는 것이 좋다.
5. defaultValue
@ResponseBody
@RequestMapping("/request-param-default")
public String requestParamDefault(
@RequestParam(required = true, defaultValue = "guest") String username,
@RequestParam(required = false, defaultValue = "-1") int age){
log.info("username={}, age={}", username, age);
return "ok";
}
defaultValue는 값이 파라미터로 들어오지 않았을 때, 부여되는 값이다.
즉, defaultValue를 쓰면 required = true에서도 400 에러가 뜨지 않는다.
============================================================================================
지금까지 RequestParam으로 들어온 값을 받고 다루는 방법을 알아보았다. 하지만, 우리는 자바를 사용하다보면 데이터를 그저 변수에 담아서 사용하는 것보다는, 캡슐화를 통해 객체에 데이터를 넣고 Getter, Setter등의 메소드를 이용하여 데이터를 다룬다. 이를 스프링에서는 쉽게 할 수 있도록 해놓았다. 이제 이 방법을 배워볼 것이다.
package hello.springmvc.basic;
import lombok.Data;
@Data
public class HelloData {
private String username;
private int age;
}
우선, HelloData라는 유저객체를 만들어 주었다.
롬복의 기능 중 하나인 @Data 에노테이션을 통해 getter와 setter를 작성하지 않고도 사용할 수 있게 해주었다.
이제, RequestParam의 값을 여기에 넣어줄 것이다.
지금까지 배운것을 활용하여 만들어본다면, 아래와 같은 코드가 작성될 것이다.
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@RequestParam String username, int age) {
HelloData helloData = new HelloData();
helloData.setUsername(username);
helloData.setAge(age);
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
위의 코드를 보면 parameter를 받아 일일이 helloData 객체를 만든 후 넣어주었다.
하지만 스프링의 기능을 이용하면 이를 더 짧게 줄일 수 있다.
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
@ModelAttribute 에노테이션을 사용하면 클래스를 찾아 자동으로 객체를 만들어준 후 username과 age에 넣어준다.
그 객체의 필드명과 RequestParam으로 들어온 변수명이 일치해야한다.
@ModelAttribute는 생략이 가능하다.
이로써 RequestParam으로 들어온 데이터를 다루는 방법을 알아보았다. 다음 글부터는 Param이 아닌 Body로 들어온 글을 다루는 방법을 알아보겠다.
<본 글은 김영한님의 강의를 듣고 작성되었습니다.>
'스프링 프레임 워크' 카테고리의 다른 글
스프링 mvc의 전체적인 동작 과정(argument resolver, returnvalue handler) (0) | 2023.10.10 |
---|---|
HTTP 응답 다루기(HTML-정적, 동적) (0) | 2023.10.09 |
HTTP 요청 메시지(데이터를 다루기) (0) | 2023.10.05 |
요청 매핑 (0) | 2023.09.19 |
로깅 (1) | 2023.09.18 |