헤르메스 LIFE

[Spring] Controller Parameters 본문

Spring Framework

[Spring] Controller Parameters

헤르메스의날개 2021. 3. 2. 09:31
728x90

HttpServletRequest

@PostMapping("/receive")
public String age(HttpServletRequest request) {
	String a = request.getParameter("a");
	String b = request.getParameter("b");
    return "result";
}

@RequestBody 

1. @RequestBody애노테이션은 HTTP Request body를 읽고 HttpMessageConverter를 통해서 deserialized시켜 Handler 메소드의 특정 인자 타입의 객체로 변환하기 위한 애노테이션이다.
MVC Config의 Message Converters 옵션을 사용함으로써 message conversion을 설정 및 customizing할 수 있다.
javax의 @valid, spring의 @validated 애노테이션을 사용함으로써 유효성 검사를 할 수 있다.
@PostMapping("/receive")
public String age(@RequestBody Person person) {
    System.out.println("통신 성공");
    System.out.println(">>> " + person);
    return "result";
}

@PostMapping("/receive")
public String age(@RequestBody Map<String,String> map) {
    System.out.println("통신 성공");
    System.out.println(">>> " + map.get("name"));
    System.out.println(">>> " + map.get("age"));
    return "result";
}

@RequestParam 

1. HTTP Request 파라미터를 Handler메소드의 파라미터 타입에 전달받을 때 사용하는 애노테이션이다.
2. Handler 메소드의 파라미터 타입이 Simple Type이고, 지원하는 인자 타입이 아닌 경우 @RequestParam으로 먼저 resolve되고 이후에 @ModelAttribute로 resolve된다.
3. @RequestParam이 붙여진 인자의 타입이 String이 아닌 경우 Type Conversion이 자동으로 적용된다. (사용자 정의 가능)

컨트롤러에서 @RequestMapping 을 지정한 메서드의 경우 메서드 인자에 @RequestParam 을 지정해 변수의 값을 메서드 인자로 할당 할 수 있다.
/*
 * 모든 요청 파라미터를 담은 맵으로 받을 수 있습니다.
 */
@RequestMapping(value = "/join", method = RequestMethod.POST)
public String userJoin(@RequestParam Map<String, String> param) {
	System.out.println("param : " + param);
	return "index";
}

@RequestMapping(value = "/join", method = RequestMethod.POST)
public String userJoin(@RequestParam MultiValueMap<String, String> param) {
	...
}

@RequestMapping(value = "/join", method = RequestMethod.POST)
public String userJoin(@RequestParam(value = "nonValue", required = false) String nonValue) {
	System.out.println("nonValue : " + nonValue);
	return "index";
}

/**
 * nonValue 의 Mapping되는 값이 없으면 HTTP 400 - Bad Request 오류를 발생합니다.
 * 오류를 발생하지 않기위해서는 defaultValue 를 넣어야 합니다.
 */
@RequestMapping(value = "/join", method = RequestMethod.POST)
public String userJoin(@RequestParam("nonValue") String nonValue) {
	System.out.println("nonValue : " + nonValue);
	return "index";
}

@RequestMapping(value = "/join", method = RequestMethod.POST)
public String userJoin(@RequestParam(value = "nonValue", defaultValue = "디폴트값입니다") String nonValue) {
	System.out.println("nonValue : " + nonValue);
	return "index";
}
  @RequestBody @RequestParam
객체생성 가능 불가능
각 변수별 데이터 저장 불가능 가능

@PathVariable

@PathVariable 은 메서드 인자에 사용되어 URI 템플릿 변수의 값을 메서드 인자로 할당하는데 사용된다.
@GetMapping("/user/{userName}")
public String user(@PathVariable String userName){
    System.out.println(userName);
    return "index";
}

@GetMapping("/user/{age}/{name}")
public String user(@PathVariable String age, @PathVariable String name) {
    System.out.println("나이는 " + age);
    System.out.println("이름은 " + name);
    return "index";
}

@GetMapping("/{name}")
public String user(@PathVariable Map<String,String> map) {
    System.out.println(map);
    return "index";
}

@GetMapping("/user/{age:\\d+}{name:\\D+}")
public String user(@PathVariable("age") String age, @PathVariable("name") String name) {
    System.out.println("나이는 " + age);
    System.out.println("이름은 " + name);
    return "index";
}

 

728x90