본 프로젝트 자료는 김영한님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 참고 제작됐음을 알립니다.
어노테이션 기반의 스프링 컨트롤러는 다양한 파라미터를 지원한다.
그 중 헤더 정보 조회하는 방법이다.
@Slf4j
@RestController
public class RequestHeaderController {
@RequestMapping("/headers")
public String headers(HttpServletResponse response,
HttpServletRequest request,
HttpMethod httpMethod,
Locale locale,
@RequestHeader MultiValueMap<String, String> headerMap,
@RequestHeader("host") String host,
@CookieValue(value = "myCookie", required = false) String cookie) {
log.info("request={}", request);
log.info("response={}", response);
log.info("httpMethod={}", httpMethod);
log.info("locale={}", locale);
log.info("headerMap={}", headerMap);
log.info("header host={}", host);
log.info("myCookie={}", cookie);
return "ok";
}
}
많은 헤더 정보를 조회하는 방법이 있다.
클라이언트에서 서버로 요청 데이터를 전달할 때 사용하는 주요 3가지 방법을 사용한다.
쿼리 파라미터, HTML Form는 둘 다 형식이 같으므로 구분 없이 HttpServletRequest 의 request.getParameter() 를 사용하면 두가지 요청 파라미터를 조회할 수 있다!
=> 요청 파라미터(request parameter) 조회 라고 한다.
/url?username=hello&age=20
content-type: application/x-www-form-urlencoded
팁) 요청 파라미터 - 쿼리 파라미터, HTML Form
HttpServletRequest 의 request.getParameter() 를 사용하면 다음 두가지 요청 파라미터를 조회할 수 있다.
위에 제공하는 정보로 @RequestParam 을 활용해 요청 파라미터를 만들어보고자 한다.
v1
/**
* @RequestParam 사용
* - 파라미터 이름으로 바인딩
* @ResponseBody 추가
* - View 조회를 무시하고, HTTP message body에 직접 해당 내용 입력
* */
@ResponseBody
@RequestMapping("/request-param-v1")
public String requestParamV1(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge) {
log.info("username={}, age={}", memberName, memberAge);
return "ok";
}
v2
/**
* @RequestParam 사용
* HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx") 생략 가능
* */
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(
@RequestParam String username,
@RequestParam int age) {
log.info("username={}, age={}", username, age);
return "ok";
}
HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx") 생략 가능
v3
/**
* @RequestParam 사용
* String, int 등의 단순 타입이면 @RequestParam 도 생략 가능
* */
@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(String username, int age) {
log.info("username={}, age={}", username, age);
return "ok";
}
String , int , Integer 등의 단순 타입이면 @RequestParam 도 생략 가능
개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다.
보통 다음과 같은 코드를 작성할 것이다.
@RequestParam String username;
@RequestParam int age;
HelloData data = new HelloData();
data.setUsername(username);
data.setAge(age);
하지만 스프링에서는 이 과정을 완전히 자동화 해주는 @ModelAttribute 기능을 제공한다.
위에 배운 내용들로 코드를 만들어 보자.
/**
* @ModelAttribute 사용
* 참고: model.addAttribute(helloData) 코드도 함께 자동 적용됨, 뒤에 model을 설명할 때 자세히 설명
*/
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
log.info(
"username={}, age={}", helloData.getUsername(), helloData.getAge()
);
return "ok";
}