https://sundaland.tistory.com/344
[ ▶ @RequestParam ]
RequestParam 애노테이션은 서블릿 요청 파라미터(쿼리 파라미터 또는 폼 데이터)를 컨트롤러 메서드의 아규먼트와 바인딩하는 데 사용된다. 이를 통해 클라이언트가 요청한 URL이나 폼 데이터에 포함된 값을 쉽게 메서드로 전달할 수 있다.
△ @RequestParam 기본 사용법
RequestParam을 사용하여 요청 파라미터를 메서드 아규먼트에 바인딩하는 기본적인 예시는 아래와 같다.
▼ 컨트롤러 예시
@Controller
@RequestMapping("/pets")
public class EditPetForm {
@GetMapping
public String setupForm(@RequestParam("petId") int petId, Model model) {
Pet pet = this.clinic.loadPet(petId);
model.addAttribute("pet", pet);
return "petForm";
}
}
위 코드에서 @RequestParam("petId")는 클라이언트가 petId라는 쿼리 파라미터로 전달한 값을 setupForm 메서드의 petId 파라미터에 바인딩한다. 예를 들어, GET /pets?petId=5라는 요청이 들어오면 petId 파라미터는 5로 설정된다.
△ @RequestParam 기본 동작
기본적으로 @RequestParam으로 선언된 메서드 파라미터는 필수이다. 즉, 클라이언트가 해당 파라미터를 전달하지 않으면 오류가 발생한다. 그러나, 파라미터가 선택 사항인 경우, @RequestParam(required = false)로 설정하거나, java.util.Optional을 사용하여 선택적으로 처리할 수 있다.
▼ 선택적 파라미터 예시
@GetMapping
public String setupForm(@RequestParam(value = "petId", required = false) Integer petId, Model model) {
if (petId != null) {
Pet pet = this.clinic.loadPet(petId);
model.addAttribute("pet", pet);
} else {
// petId가 없을 경우 처리
model.addAttribute("message", "No pet ID provided");
}
return "petForm";
}
위 코드에서 petId 파라미터는 선택 사항이므로, 요청에 petId가 없으면 null이 할당된다.
△ 타입 변환
@RequestParam을 사용하여 기본적으로 문자열 파라미터를 메서드 아규먼트에 바인딩하지만, Spring은 자동으로 타입 변환을 수행한다. 예를 들어, int, double, boolean 등의 기본 타입 또는 다른 객체 타입으로 변환이 가능하다.
△ 배열 및 리스트 처리
파라미터가 여러 개일 경우 배열이나 리스트로 처리할 수도 있다. 동일한 파라미터 이름이 여러 번 전달되는 경우, 아래와 같이 배열로 받을 수 있다.
@GetMapping("/search")
public String searchPets(@RequestParam("type") String[] types, Model model) {
model.addAttribute("types", types);
return "searchResults";
}
이 경우, 요청 URL이 /search?type=dog&type=cat과 같이 여러 개의 type 파라미터를 포함할 때, types 배열에 dog와 cat 값이 들어간다.
△ 맵(Map) 사용
@RequestParam을 Map<String, String> 또는 MultiValueMap<String, String>으로 선언하면, 요청 파라미터 이름과 값을 모두 받아올 수 있다. 이렇게 하면 모든 요청 파라미터를 한 번에 처리할 수 있다.
@PostMapping(path = "/process", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String processForm(@RequestParam MultiValueMap<String, String> params) {
for (String key : params.keySet()) {
System.out.println("Key: " + key + ", Value: " + params.get(key));
}
return "formProcessed";
}
위 코드에서 params는 폼에서 전달된 모든 파라미터를 포함한 맵이다. 각 파라미터 이름이 맵의 키가 되고, 값은 해당 파라미터의 값이다.
△ @RequestParam은 선택 사항
@RequestParam 애노테이션은 선택적으로 사용할 수 있다. 기본적으로 단순 타입(문자열, 숫자 등)인 메서드 파라미터는 @RequestParam이 생략된 경우에도 자동으로 쿼리 파라미터로 처리된다. 예를 들어, 아래와 같은 메서드는 @RequestParam 없이도 page 파라미터를 처리할 수 있다.
@GetMapping("/list")
public String listPets(int page, Model model) {
// 페이지 번호를 기반으로 리스트 로직 처리
model.addAttribute("page", page);
return "petList";
}
위 경우, GET /list?page=2라는 요청이 오면 page 파라미터는 2로 자동 바인딩된다.
△ 요약
- @RequestParam은 쿼리 파라미터나 폼 데이터를 메서드 아규먼트로 바인딩하는 데 사용된다.
- 기본적으로 필수 파라미터로 동작하지만, required=false로 설정하거나 Optional을 사용해 선택적으로 만들 수 있다.
- 배열, 리스트, 맵을 사용하여 여러 파라미터 값을 처리할 수 있다.
- 기본적으로 단순 타입 파라미터는 @RequestParam을 생략해도 자동으로 처리된다.
△ 샘플 코드
@Controller
@RequestMapping("/pets")
public class EditPetForm {
@GetMapping
public String setupForm(@RequestParam(value = "petId", required = false) Integer petId,
Model model) {
if (petId != null) {
Pet pet = this.clinic.loadPet(petId);
model.addAttribute("pet", pet);
} else {
model.addAttribute("message", "No pet ID provided");
}
return "petForm";
}
@PostMapping(path = "/process", consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String processForm(@RequestParam MultiValueMap<String, String> params) {
for (String key : params.keySet()) {
System.out.println("Key: " + key + ", Value: " + params.get(key));
}
return "formProcessed";
}
}
이 코드를 통해 다양한 방법으로 요청 파라미터를 처리할 수 있다.
'Web on Servlet Stack' 카테고리의 다른 글
Handler Method : @SessionAttributes (0) | 2024.10.11 |
---|---|
Annotated Controllers[3] - @CookieValue (0) | 2024.10.11 |
@RequestHeader (0) | 2024.10.11 |
Method Arguments (0) | 2024.10.11 |
Servlet (0) | 2024.10.08 |