728x90
스프링에서 요청 파라미터를 편리하게 조회할 수 있도록 지원해주는 애노테이션 @RequestParam, @ModelAttribute를 알아보도록 하겠습니다.
참고 : 요청 응답 결과를 간편하게 보기 위해 POSTMAN 프로그램을 사용하였습니다.
@RequestParam
@RequestParam을 사용해서 컨트롤러 메서드 파라미터로 요청 파라미터를 편리하게 사용할 수 있습니다.
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello(@RequestParam("name") String memberName,
@RequestParam("age") int memberAge) {
return "Hello" + name + "," + age;
}
}
요청 응답 결과를 보면 name과 age값이 정상적으로 전달된 것을 확인할 수 있습니다.
- @RequestParam의 속성으로 전달한 name(value) 속성은 요청에서 전달한 파라미터 이름입니다.
요청 파라미터의 이름과 컨트롤러 메서드의 변수명이 같으면 name(value) 속성 생략 가능
@GetMapping("/hello")
public String hello(@RequestParam String name, @RequestParam int age) {
...
}
required 속성 : 파라미터의 필수 여부를 설정(기본값은 필수 true)
- true이면 필수, false이면 선택
required=false
로 설정시 해당 요청 파라미터가 전달되지 않으면 null이 전달되는데, int형과 같이 null을 넣을 수 없는 타입의 파라미터에 요청 파라미터 값이 전달되지 않으면 500 예외가 발생합니다.
@GetMapping("/hello")
public String hello(@RequestParam(required = false) int age) { ... }
- null을 넣을 수 없는 프리미티브 타입을
required=false
로 설정하려면 래퍼 타입을 사용하거나 defaultValue 옵션을 사용하여 기본 값을 지정해 주면 됩니다.
defaultValue 속성 : 파라미터의 기본값 설정
- 파라미터의 값이 전달되지 않거나 빈문자가 전달된 경우 defaultValue 속성을 사용하여 기본값을 적용할 수 있습니다.
@GetMapping("/hello")
public String hello(@RequestParam(defaultValue = "-1") int age) {
return "age(default -1) :" + age;
}
요청 파라미터를 Map 자료구조로 받아서 전체 요청 파라미터를 한 번에 받아올 수 있다.
@GetMapping("/hello")
public String hello(@RequestParam Map<String, Object> params) {
return "name: " + params.get("name") + ", age: " + params.get("age");
}
@ModelAttribute
- @ModelAttribute 를 사용하여 요청 파라미터를 객체 형태로 받아올 수 있습니다.
//예제 코드의 양을 줄이기 위해 편의상 Lombok의 @Data 애노테이션을 사용하였습니다.
@Data
class Person {
String name;
int age;
}
@RestController
public class HelloController {
@PostMapping("/hello")
public String hello(@ModelAttribute Person person) {
return person.toString();
}
}
스프링 MVC는 @ModelAttribute 애노테이션이 있으면 Person 객체를 생성하고, Person 객체에 들어갈 요청 파라미터를 찾아서 setXXX()를 호출하여 값을 채웁니다.(예를 들어 요청 파라미터의 이름이 name이라면 setName() 호출)
@ModelAttribute, @Requestparam 생략 가능
스프링은 String이나 프리미티브 타입같은 단순한 타입에 생략되어있으면 @RequestParam이 생략된 것으로 판단하고, 그 나머지(argument resolver로 지정된 타입 제외)들은 @ModelAttribute가 생략된 것으로 판단합니다.
//@ModelAttribute 생략 예
@PostMapping("/hello")
public String hello1(Person person) {
...
}
//@RequestParam 생략 예
@GetMapping("/hello")
public String hello2(String name, int age) {
...
}
참고
'Spring' 카테고리의 다른 글
[스프링 MVC] 모델에 공통 데이터 자동으로 넣기 - @ModelAttribute (0) | 2021.07.12 |
---|---|
[스프링] 프록시(Proxy) (0) | 2021.03.08 |
[스프링] 의존관계 조회(Dependency Lookup) : ObjectFactory, ObjectProvider, JSR-330 Provider (0) | 2021.03.08 |
스프링 @Autowired : 같은 타입의 빈이 여러개라면?(@Qualifier, @Primary) (0) | 2021.02.26 |
[스프링] 빈 초기화, 소멸 메소드 사용하기 (0) | 2021.01.12 |
댓글