🔹
@RequestParam란?
- 쿼리 파라미터(Query Parameter)를 메서드 파라미터에 바인딩해 주는 방식
- 주로 GET 방식에서 사용하지만, POST에서도 사용 가능
GET /v1/request-param?name=wonuk&age=100
📌 기본 사용법
@GetMapping("/v1/request-param")
@ResponseBody
public String paramV1(@RequestParam("name") String userName,
@RequestParam("age") int userAge) {
log.info("name={}, age={}", userName, userAge);
return "success";
}
→ "name"이라는 키값을 가진 파라미터가 userName에 바인딩됨
→ @Controller + @ResponseBody는 @RestController와 동일 효과
✨ 생략 가능 예시
1. 속성값 생략
@GetMapping("/v2/request-param")
public String paramV2(@RequestParam String name, @RequestParam int age) {
...
}
2. 어노테이션 자체 생략 (권장 X)
@GetMapping("/v3/request-param")
public String paramV3(String name, int age) {
...
}
⚠️ 변수명과 파라미터명이 정확히 일치해야 하며, 명시적이지 않아 혼동될 수 있어 실무에서는 사용을 지양함
📌 required 속성
@GetMapping("/v4/request-param")
public String paramV4(@RequestParam(required = true) String name,
@RequestParam(required = false) Integer age) {
...
}
→ required = true(기본값): 파라미터 없으면 400 Bad Request
→ required = false: 없어도 OK, 단 int는 null을 받을 수 없어 Integer로 선언해야 함
❗ 주의: ?name=처럼 값이 없는 경우는 null이 아닌 ""(빈 문자열)로 들어옴 → 예외 없이 통과됨
🎯 defaultValue 속성
@GetMapping("/v5/request-param")
public String paramV5(@RequestParam(defaultValue = "sparta") String name,
@RequestParam(defaultValue = "1") int age) {
...
}
→ 값이 없거나 빈 문자열이면 기본값 사용
→ 이 설정이 있으면 required는 자동으로 false처럼 작동
📦 Map으로 받기
@GetMapping("/v6/request-param")
public String paramV6(@RequestParam Map<String, String> paramMap) {
log.info("name={}, age={}", paramMap.get("name"), paramMap.get("age"));
return "success";
}
→ 여러 파라미터를 한 번에 받아올 때 유용
→ 값이 여러 개인 경우는 MultiValueMap<String, String> 사용
@RequestParam MultiValueMap<String, String> paramMap
🔹
@ModelAttribute
- 파라미터들을 객체의 필드에 자동으로 매핑해 주는 방식
주로 POST +x-www-form-urlencoded요청에서 사용
📌 기본 개념
@PostMapping("/v1/tutor")
public String createTutor(@RequestParam String name, @RequestParam int age) {
Tutor tutor = new Tutor();
tutor.setName(name);
tutor.setAge(age);
...
}
@ModelAttribute 사용 시:@PostMapping("/v2/tutor")
public String createTutor(@ModelAttribute Tutor tutor) {
...
}
→ Spring이 Tutor 객체를 만들고, 필드 이름과 동일한 파라미터를 찾아 setter()로 자동 주입
→ 필드 이름과 파라미터 키 이름이 완전히 일치해야 함
✨ 생략 가능
@PostMapping("/v3/tutor")
public String createTutor(Tutor tutor) {
...
}
@RequestParam 처리@ModelAttribute로 자동 처리됨⚠️ 예외 상황
1. setter 없음
@Getter
public class Tutor {
private String name;
private int age;
}
→ 객체 필드에 값이 set 되지 않음 값 → 바인딩 실패 → null
2. 파라미터 타입 불일치
ex) http://localhost:8080/v2/tutor + x-www-form-urlencoded
POST /v2/tutor
content-type: application/x-www-form-urlencoded
name=wonuk&age=nbcamp
→ BindException 발생 → Validation(검증) 필요