@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(
@RequestParam String username,
@RequestParam int age) {
// 로그로 username과 age 출력
log.info("username = {} , age = {}", username, age);
return "ok";
}
3)@RequestParam 어노테이션 없이 요청 파라미터 처리 예제
@ResponseBody
@RequestMapping("/request-param-v4")
public String requestParamV4(String username, int age) {
// 변수명이 요청 파라미터 이름과 동일해야 한다
// 로그로 username과 age 출력
log.info("username = {} , age = {}", username, age);
return "ok";
}
`String` , `int` , `Integer` 등의 단순 타입이면 `@RequestParam` 도 생략 가능
4) 필수 요청 파라미터 처리 예제
@ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
@RequestParam(required = true) String username,
@RequestParam(required = false) Integer age) {
// age는 요청 파라미터에서 빠질 수 있음
// 빠질 경우 null 값이 들어가야 하기 때문에 Integer로 선언
log.info("username = {} , age = {}", username, age);
return "ok";
}
주의! - 파라미터 이름만 사용 /request-param-required?username=`
파라미터 이름만 있고 값이 없는 경우 빈문자로 통과
5) 요청 파라미터 기본 값 설정 예제
@ResponseBody
@RequestMapping("/request-param-default")
public String requestParamDefault(
@RequestParam(required = true, defaultValue = "guest") String username,
@RequestParam(required = false, defaultValue = "-1") Integer age) {
// 기본 값이 설정된 경우 파라미터가 없을 때 기본 값을 사용
log.info("username = {} , age = {}", username, age);
return "ok";
}
- 파라미터에 값이 없는 경우 `defaultValue` 를 사용하면 기본 값을 적용할 수 있다. 이미 기본 값이 있기 때문에 `required` 는 의미가 없다.
-`defaultValue` 는 빈 문자의 경우에도 설정한 기본 값이 적용된다.
6) 요청 파라미터를 Map으로 처리하는 예제
@ResponseBody
@RequestMapping("/request-param-map")
public String requestParamMap(@RequestParam Map<String, Object> paramMap) {
// 요청 파라미터를 Map으로 받아서 처리
log.info("username = {} , age = {}", paramMap.get("username"), paramMap.get("age"));
return "ok";
}
파라미터를 Map, MultiValueMap으로 조회할 수 있다.
`@RequestParam Map` , ` Map(key=value)` ` @RequestParam MultiValueMap` ` MultiValueMap(key=[value1, value2, ...] ex) (key=userIds, value=[id1, id2])` - 파라미터의 값이 1개가 확실하다면 `Map` 을 사용해도 되지만, 그렇지 않다면 `MultiValueMap` 을 사용하자.
@ModelAttribute
개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다. 보통 다음과 같이 코드를 작성할 것이다.
import lombok.Data;
@Data //`@Getter` , `@Setter` , `@ToString` , `@EqualsAndHashCode` , `@RequiredArgsConstructor`를 자동으로 적용해준다.
public class HelloData {
private String username;
private int age;
}
@ModelAttribute 사용하지 않는 경우
//@ModelAttribute 사용x
@ResponseBody
@RequestMapping("/model-attribute-v0")
public String modelAttributeV1(@RequestParam String username,
@RequestParam int age){
HelloData helloData =new HelloData();
helloData.setUsername(username);
helloData.setAge(age);
log.info("username = {} , age = {}", helloData.getUsername(),helloData.getAge());
return "ok";
}
@ModelAttribute 사용하는경우
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV2(@ModelAttribute HelloData helloData){
log.info("username = {} , age = {}", helloData.getUsername(),helloData.getAge());
return "ok";
}
마치 마법처럼 `HelloData` 객체가 생성되고, 요청 파라미터의 값도 모두 들어가 있다. 스프링MVC는 `@ModelAttribute` 가 있으면 다음을 실행한다. `HelloData` 객체를 생성한다. 요청 파라미터의 이름으로 `HelloData` 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다. 예) 파라미터 이름이 `username` 이면 `setUsername()` 메서드를 찾아서 호출하면서 값을 입력한다.
프로퍼티
객체에 `getUsername()` , `setUsername()` 메서드가 있으면, 이 객체는 `username` 이라는 프로퍼티를 가지고 있다.
username 프로퍼티의 값을 변경하면 `setUsername()` 이 호출되고, 조회하면 `getUsername()` 이 호출된다.
@ModelAttribute 생략하는 경우
@ResponseBody
@RequestMapping("/model-attribute-v2")
public String modelAttributeV3( HelloData helloData){
log.info("username = {} , age = {}", helloData.getUsername(),helloData.getAge());
return "ok";
}
스프링은 해당 생략시 다음과 같은 규칙을 적용한다. `String` , `int` , `Integer` 같은 단순 타입 = `@RequestParam` 나머지 = `@ModelAttribute` (argument resolver 로 지정해둔 타입 외)