@RequestParam

2024. 10. 9. 18:29Spring Framework/Web on Servlet Stack

@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 배열에 dogcat 값이 들어갑니다.

맵(Map) 사용

@RequestParamMap<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";
    }
}

이 코드를 통해 다양한 방법으로 요청 파라미터를 처리할 수 있습니다.

<참고> : https://docs.spring.io/spring-framework/reference/web/webmvc/mvc-controller/ann-methods/requestparam.html

'Spring Framework > Web on Servlet Stack' 카테고리의 다른 글

Mapping Requests  (0) 2024.10.09
Declaration  (1) 2024.10.09
Controller Advice  (0) 2024.10.09
Exceptions  (0) 2024.10.09
Validation  (0) 2024.10.09