728x90
반응형
HTTP 요청파라미터
클라이언트에서 서버로 데이터를 전송하는 방법을 알아보자.
HTTP 요청 파라미터를 다뤄보자
HTTP header 값 가져오기
- 아래 처럼 헤더값을 가져올수 있다.
- @RequestHeader MultiValueMap<String, String> headerMap: 맵으로 모든값을 담아서 가져온다.
- @RequestHeader ("host") String host: 특정 헤더값을 가져온다.
- @CookieValue(value = "myCookie", required = false) String cookie: 쿠기 를 가져온다.
@Slf4j
@RestController
public class RequestHeaderController {
@RequestMapping("/headers")
public String headers(HttpServletRequest req,
HttpServletResponse resp,
HttpMethod httpMethod,
Locale locale,
//MultiValueMap map 과 유사하지만 하나의 키의 여러가지 값을 받을수 있다.
@RequestHeader MultiValueMap<String, String> headerMap,
@RequestHeader ("host") String host,
@CookieValue(value = "myCookie", required = false) String cookie
) {
log.info("request={}", req);
log.info("response={}", resp);
log.info("httpMethod={}", httpMethod);
log.info("locale={}",locale);
log.info("headerMap={}",headerMap);
log.info("header host={}", host);
log.info("myCookie={}",cookie);
return "ok";
}
}
요청 파라미터 받는 방법
1. Get 쿼리 파라미터
- /url?username=hello&age=20
2. POST HTML Form
- content-type: application/x-www-form-urlencoded
- 메시지 바디에 쿼리 파라미터 형식으로 전달 username=hello&age=20
3. HTTP message-body에 데이터를 직접 담아서 요청
- HTTP API에서 주로 사용 JSON 사용
- POST, PUT, PATCH
HTTP 요청파라미터 다루기
HTTP 요청파라미터 1
- HttpServletRequest, HttpServletResponse 를 이용하여 파라미터 가져오기
- getParameter 로 요청 파라미터를 가져올수 있다.
@RequestMapping("/request-param-v1")
public void requestParamV1(HttpServletRequest req, HttpServletResponse res) throws IOException {
String username = req.getParameter("username");
int age = Integer.parseInt(req.getParameter("age"));
log.info("username={}, age={}",username, age);
res.getWriter().write("Ok");
}
HTTP 요청파라미터 2
- @RequestParam 으로 바인딩 해서 데이터를 가져온다.
- @ResponseBody:
- Controller 에서 리턴 타입 String 은 뷰를 조회하는 것이기 때문에 HTTP Message Body 직접 입력하기 위해 사용
- request.getParameter("username") 과 동일하다.
@ResponseBody // 문자를 그대로 응답메시지에 넣는다.
@RequestMapping("/request-param-v2")
// controller 의 string 은 url을 찾는다.
public String requestParamV2(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge
)
{
log.info("username={}, age={}",memberName, memberAge);
return "ok";
}
HTTP 요청파라미터 3
HTTP 파라미터 이름과 변수 이름이 같으면 @RequestParam(name="xx") 생략 가능하다.
@ResponseBody // 문자를 그대로 응답메시지에 넣는다.
@RequestMapping("/request-param-v3")
// 변수명이 동일 하면 생략이 가능하다.
// param 안에 변수명 생략이 가능하다.
public String requestParamV3(
@RequestParam String username,
@RequestParam int age
)
{
log.info("username={}, age={}",username, age);
return "ok";
}
HTTP 요청파라미터 4
- HTTP 파라미터 이름과 변수 이름이 같으면 @RequestParam 애노테이션 까지 생략이 가능하다.
- 하지만 명확하게 사용하기 위해 애노테이션을 붙여주는걸 선호한다.
@ResponseBody // 문자를 그대로 응답메시지에 넣는다.
@RequestMapping("/request-param-v4")
// 요청 파라미터와 변수명이 동일 하면 아예 @RequestParam 생략이 가능하다.
// 하지만 @RequestParam 애노테이션 을 쓰는걸 권장한다.
public String requestParamV4(String username, int age)
{
log.info("username={}, age={}",username, age);
return "ok";
}
HTTP 요청파리미터 5
- required: 를 넣어 주면 파라미터값에 해당 값이 필수 또는 필수 값이 아닌걸 지정 할수 있다.
- required = true 면 요청 파라미터에 반드시 해당값이 있어야 한다.
- 없다면 에러 발생
@ResponseBody
@RequestMapping("/request-param-required")
// (required = false) 가 붙으면 해당 값이 없어도 에러가 발생하지 않는다.
// username 은 필수 이다, age 는 필수 값이아니다.
// 하지만 age 를 안넣어주면 null 값이 들어가는데 int 에는 null 을 넣을수 없기 때문에
// 500 에러가 발생한다.
public String requestParamRequired(
@RequestParam(required = true) String username,
@RequestParam(required = false) int age
)
{
log.info("username={}, age={}",username, age);
return "ok";
}
HTTP 요청파라미터 6
- @RequestParam 에 default 값을 써주면 값이 없는 경우 해당 값을 사용한다.
- 만일 요청 파라미터에 age 값이 없다면?
- required=false 이더라도 에러가 발생한다.
- 값이 지정 되지 않으면 null 로 되는데 int 형에는 null이 들어 올수 없다.
@ResponseBody
@RequestMapping("/request-param-default")
// defaultValue 로 기본값 설정이 가능하다.
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";
}
HTTP 요청파라미터 7
- Map 으로도 받을수 있다
@ResponseBody
@RequestMapping("/request-param-map")
// map 으로도 받을수 있다.
public String requestParamMap(@RequestParam Map<String,Object> paramMap
)
{
log.info("username={}, age={}",paramMap.get("username"), paramMap.get("age"));
return "ok";
}
HTTP ModelAttribute 다루기
HTTP ModelAttribute 1
- @ModelAttribute 를 쓰면 객체를 생성해주고 값도 알아서 넣어준다.
- @ModelAttribute 동작방식:
- 객체를 생성한다.
- 요청 파라미터에서 객체의 프로퍼티를 찾는다.
- setter 를 찾아서 값을 넣어준다. - 프로퍼티:
- getUsername() -> username(프로퍼티)
- getAge() -> age(프로퍼티) - 바인딩 오류
- age 에 문자 값이 들어가면 타입이 맞지 않아 바인딩이 되지 않는다. 에러가 발생한다.
@ResponseBody
@RequestMapping("/model-attribute-v1")
//public String modelAttributeV1(@RequestParam String username, @RequestParam int age)
// @ModelAttribute 를 쓰면 HelloData 객체가 생성되고 값도 들어가게 된다.
public String modelAttributeV1(@ModelAttribute HelloData helloData)
{
/*
HelloData helloData = new HelloData();
helloData.setUsername(username);
helloData.setAge(age);
log.info("username={}, age={}",helloData.getUsername(), helloData.getAge());
*/
log.info("helloData={}", helloData);
return "ok";
}
HTTP ModelAttribute 2
@ModelAttribute 도 생략이 가능하다.
@ResponseBody
@RequestMapping("/model-attribute-v2")
//public String modelAttributeV1(@RequestParam String username, @RequestParam int age)
// @ModelAttribute 도 생략이 가능하다.
public String modelAttributeV2(HelloData helloData)
{
/*
HelloData helloData = new HelloData();
helloData.setUsername(username);
helloData.setAge(age);
log.info("username={}, age={}",helloData.getUsername(), helloData.getAge());
*/
log.info("helloData={}", helloData);
return "ok";
}
참고사항
- ModelAttribute 도 생략이 가능하고 @RequestParam 도 생략이 가능하다.
그렇다면 어떻게 구별하는가? - @RequestParam: String, Int, Integer 를 처리해준다.
- @ModelAttribute: 나머지 타입을 처리해준다.
- 단 argument resolver 로 지정해둔 타입은 예외로 둔다.
참고
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/lecture/71216?tab=curriculum
728x90
반응형
'Spring > spring mvc 1 스터디' 카테고리의 다른 글
[Spring] Message Converter (0) | 2021.11.25 |
---|---|
[Spring] HTTP 응답 (0) | 2021.11.21 |
[Spring] HTTP 요청메세지 TEXT, JSON (0) | 2021.11.16 |
[Spring] 요청매핑 (0) | 2021.11.10 |
[Spring] Spring Controller 다루기 (0) | 2021.11.06 |
댓글