Spring

Spring의 HTTP 요청파라미터 - @RequestParam

MKJo 2023. 8. 17. 02:00

스프링에서 제공하는 RequestParam 어노테이션을 사용하면 클라이언트의 요청 파라미터를 매우 편리하게 사용이 가능하함.

 

예제의 클래스에선 스프링에서 지원하는 Controller 어노테이션을 사용

@Controller
public class RequestParamController {
	private final Logger log = LoggerFactory.getLogger(getClass());
    //println() 메소드가아닌 로그로 기록을 남김
    
	... 내용
}

로그 출력형태

2023-08-17 01:49:37.197  INFO 13452 --- [nio-8080-exec-7] s.s.b.request.RequestParamController     : NAME: 홍길동 AGE : 50

 

 

 

@RequestParam을 사용하기 이전 쿼리 파라미터 정보를 서블릿을 통해 받아옴

@RequestMapping("/request-param-classic")
    public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));
		//localhost:8080/request-param-classic?username=홍길동&age=50
        log.info("NAME: {} AGE : {}", username, age);

        response.getWriter().write("OK! Classic");
        //Return을 하지않고 response의 Writer를 받아와 직접 HTTP 바디에 응답
    }

 

 

 

서블릿을 사용하지않고 @RequestParam 어노테이션을 통해 쿼리 파라미터를 매개인자로 바로 받아옴

// @Controller 어노테이션사용시 String 반환은 View를 찾기때문에 ResponseBody 어노테이션을통해 뷰로 가지않고 Body로 바로 응답
    @ResponseBody
    @RequestMapping("/request-param-v2")
    public String requestParamV2(
            @RequestParam(value = "username") String memberName,
            @RequestParam(value = "age") int memberAge
            //Servlet의 HttpServletRequest request.getParameter()와 동일
    ) {
        log.info("NAME: {} AGE : {}", memberName, memberAge);

        return "OK! V2";
    }

 

 

 

@RequestParam의 value값과 받아올 매개변수명이 동일하면 value값은 생략이 가능함

@ResponseBody
    @RequestMapping("/request-param-v3")
    public String requestParamV3(
            @RequestParam String username,
            @RequestParam int age
            //쿼리 파라미터와 매개변수명이 동일하면 @RequestParam의 value값 생략가능
    ) {
        log.info("NAME: {} AGE : {}", username, age);

        return "OK! V3";
    }

 

 

 

추가적으로, @RequestParam 어노테이션 자체도 생략이 가능하나 직관적이지않아보일 수 있음

@ResponseBody
    @RequestMapping("/request-param-v4")
    public String requestParamV4(
            String username,
            int age
            // String, int, Integer 등의 단순타입이면 @RequestParam또한 생략가능하나 너무 간소화하는것도 좋아보이진 않음
    ) {
        log.info("NAME: {} AGE : {}", username, age);

        return "OK! V4";
    }

 

 

 

@RequestParam 어노테이션의 required 속성을통해 파라미터 필수 여부 설정 가능

기본값 = 필수(true)

 @ResponseBody
    @RequestMapping("/request-param-required")
    public String requestParamRequired(
            // required는 기본값 true, 이 파라미터들이 넘어오지않으면 Client에서 Bad Request(400) 오류가남
            @RequestParam(required = true) String username,
            @RequestParam(required = false) Integer age
            // false로 설정후 요청파라미터가 넘어오지않으면 null값이 들어옴
            // 기본자료형(primitive type)일 경우 null값이 들어올 수 없어 서버오류(500)가 나므로 따로 처리를 해주어야함
    ) {
        log.info("NAME: {} AGE : {}", username, age);

        return "OK! Required";
    }

 

 

 

@RequestParam의 defaultValue 속성을 통해, 값이 넘어오지 않아도 값을 할당가능.

결과적으로 이 속성이 적용되면 required 속성은 의미가 없어짐

@ResponseBody
    @RequestMapping("/request-param-default")
    public String requestParamDefault(
            @RequestParam(required = true, defaultValue = "guest") String username,
            @RequestParam(required = false, defaultValue = "-1") int age
            //defaultValue값을 설정해놓으면 required는 사실상 필요가 없어서 생략이 가능함
            //defaultValue는 null이 아닌 빈 문자열도 defaultValue로 치환해줌.
            //ex) http://localhost:8080/request-param-default?username=
    ) {
        log.info("NAME: {} AGE : {}", username, age);

        return "OK! Default";
    }

 

 

 

파라미터들을 Map으로 받아오기

@ResponseBody
    @RequestMapping("/request-param-map")
    public String requestParamMap(
            //하나의 키에 복수개의 밸류값이 들어가있는 경우 MultiValueMap으로 받으면 됨
            @RequestParam Map<String, Object> paramMap
            ) {
        log.info("NAME: {} AGE : {}", paramMap.get("username"), paramMap.get("age"));

        return "OK! Map";
    }