-
요청 파라미터 - @RequestParam, @ModelAttribute스프링/스프링 MVC 패턴 2023. 2. 14. 14:18
쿼리 파라미터에 들어온 값들을 재사용하거나 출력해야할 때가 있다.
그럴 때 사용하는 것이 @RequestParam 애노테이션이다.
@RequestParam 사용 x
@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"); // return "ok"; 와 비슷 }
@RequestParam 애노테이션을 사용하기 전에는 HttpServlet에서 request와 response를 받아와서 사용했다.
@RequestParam 사용
@ResponseBody // ok라는 문자를 http에 바로 반환 @RestController와 같은 효과 @RequestMapping("/request-param-v2") public String requestParamV2( @RequestParam("username") String memberName, @RequestParam("age") int memberAge) { log.info("username={}, age={}", memberName, memberAge); return "ok"; }
@RequestParam을 메서드의 파라미터로 받으면 username은 memberName에 저장되고, age는 memberAge에 저장된다.
http://localhost:8080/request-param-v2?username=hello&age=20 이라는 url을 입력하면
username=hello, age=20 이라는 로그가 출력되는 것이다.
@RequestParam의 생략
@ResponseBody // ok라는 문자를 http에 바로 반환 @RestController와 같은 효과 @RequestMapping("/request-param-v3") public String requestParamV3(String username, int age) { // @RequestParam도 생략가능 log.info("username={}, age={}", username, age); return "ok"; }
username의 값을 위의 방식처럼 memberName 등 변수로 저장하지 않고 그냥 파라미터값과 똑같이 사용하려면 @RequestParam 애노테이션을 생략 가능하다.
하지만 저러면 명확하게 한 눈에 확인하기 어렵기 때문에 되도록 생략하지 않는게 좋다고 생각한다.
@RequestParma(required = true/false) 로 필수 값 지정
@ResponseBody // ok라는 문자를 http에 바로 반환 @RestController와 같은 효과 @RequestMapping("/request-param-required") public String requestParamRequired( @RequestParam(required = true) String username, @RequestParam(required = false) Integer age) { // required false로 설정하면 쿼리 파라미터에 age를 입력하지 않아도 오류나지 않음 // 하지만 자바에서 int는 null이 못들어가서 int를 Integer로 바꿔야함 (Integer는 객체라 null이 자동으로 들어감) log.info("username={}, age={}", username, age); return "ok"; }
애노테이션 안에 requried = true / false로 꼭 입력되어야 하는지 아니면 입력되지 않아도 되는지 설정할 수 있다.
http://localhost:8080/request-param-requried?username=hello로 url에 접근하면
username=hello, age=null로 로그가 출력된다.
@RequestParam 기본 값 지정
@ResponseBody @RequestMapping("/request-param-default") public String requestParamDefault( @RequestParam(defaultValue = "guest") String username, @RequestParam(defaultValue = "-1") int age) { log.info("username={}, age={}", username, age); return "ok"; }
defualt 값을 지정해두면 파라미터를 입력하지 않아도 자동으로 기본값이 지정이 된다.
username만 파라미터로 넘겨준다고 가정을 하면 username=hello, age=-1이라고 로그에 출력된다.
@RequestParam의 Map 이용
@ResponseBody @RequestMapping("/request-param-map") public String requestParamMap (@RequestParam Map<String, String> paramMap) { log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age")); return "ok"; }
여러 값들을 동시에 받고 싶을 때는 Map을 이용하면 된다.
paramMap이라는 Map을 만들었을 뿐인데 get() 메서드를 통해 username과 age를 받아올 수 있었다.
@ModelAttribute 애노테이션
HelloData class
package hello.springmvc.basic; import lombok.Data; @Data public class HelloData { private String username; private int age; }
HelloData를 만들고 @ModelAttribute 애노테이션을 사용해 볼 것이다.
@ResponseBody @RequestMapping("/model-attribute-v1") public String modelAttributeV1(@ModelAttribute HelloData helloData) { log.info("username={}, age={}", helloData.getUsername(), helloData.getAge()); return "ok"; } @ResponseBody @RequestMapping("/model-attribute-v2") public String modelAttributeV2(HelloData helloData) { // @ModelAttribute 생략 가능 log.info("username={}, age={}", helloData.getUsername(), helloData.getAge()); return "ok"; }
@RequetsParam과 비슷한 방식으로 파라미터 값들을 받아올 수 있다. @ModelAttribute도 생략이 가능하며 객체를 생성하고 set, get 방식으로 데이터를 설정, 조회할 때 많이 사용한다.
'스프링 > 스프링 MVC 패턴' 카테고리의 다른 글
HTTP 요청 메서드 - JSON (0) 2023.02.14 HTTP 요청 메시지 - 텍스트 (0) 2023.02.14 API 요청 매핑 타입 (0) 2023.02.14 특정 조건 매핑 (0) 2023.02.14 로그 출력 (0) 2023.02.13