본문 바로가기
Spring

[스프링 MVC] 요청 파라미터 조회하기 - @RequestParam, @ModelAttribute

by jeonghaemin 2021. 7. 7.
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) {
    ...
}

참고

댓글