코드 그라데이션

HTTP 요청 파라미터 - @RequestParam 본문

Spring/MVC 1

HTTP 요청 파라미터 - @RequestParam

완벽한 장면 2023. 10. 8. 13:10

RequestParamController 中

requestparamV2

    /**
     * @RequestParam 사용
     * - 파라미터 이름으로 바인딩
     * @ResponseBody 추가
     * - View 조회를 무시하고, HTTP message body에 직접 해당 내용 입력
     */

// @RequestParam 어노테이션을 사용하여 파라미터를 바로 메서드 매개변수로 받는 방법.
    @ResponseBody // 메서드의 반환 값이 HTTP 응답 본문에 직접 쓰여야 함을 나타냄.
    @RequestMapping("/request-param-v2")
    public String requestParamV2(
            @RequestParam("username") String memberName,
            @RequestParam("age") int memberAge) {

        log.info("username={}, age={}", memberName, memberAge); // 파라미터를 로깅.
        return "ok";
    }

 

@ResponseBody 어노테이션이 사실상 @RestController 역할을 한다.

왜? 컨트롤러 어노테이션이 있고 메서드의 반환타입이 String이고, return 이 있으면, 스프링은 쟈연스럽게 이 리턴을

뷰 이름으로 인식하고 랜더링 한다고 했음.

 

실행 결과

 

 

즉 이게 무슨 말이냐면, 

"username" 과 "age" 가 http 메시지의 키와 매핑이 된다.

그림으로 비교하면

이렇게 된다는 이야기.

변수명은 아무거나 써도 된다.

 

 

requestparamV3

    /**
     * @RequestParam 사용
     * HTTP 파라미터 이름이 변수 이름과 같으면 @RequestParam(name="xx") 생략 가능
     */
    
    // @RequestParam 어노테이션을 사용하되, 파라미터 이름과 메서드 매개변수 이름이 동일한 경우.
    @ResponseBody
    @RequestMapping("/request-param-v3")
    public String requestParamV3(
            @RequestParam String username,
            @RequestParam int age) {
        log.info("username={}, age={}", username, age);
        return "ok";
    }

궁극적으로 이 코드랑 위의 v2 코드랑 같다는 의미가 된다.

 

 

requestparamV4

더 없앨 수도 있다.

    /**
     * @RequestParam 사용
     * String, int 등의 단순 타입이면 @RequestParam 도 생략 가능
     */
     
     // @RequestParam 어노테이션 없이 파라미터를 바로 메서드 매개변수로 받는 방법
    @ResponseBody
    @RequestMapping("/request-param-v4")
    public String requestParamV4(String username, int age) {
        log.info("username={}, age={}", username, age);
        return "ok";
    }

String , int , Integer 등의 단순 타입이면 @RequestParam 도 생략 가능

실행 결과 화면

 

 

 

 

파라미터 필수 여부 - requestParamRequired

/**
     * @RequestParam.required /request-param-required -> username이 없으므로 예외
     * <p>
     * 주의!
     * /request-param-required?username= -> 빈문자로 통과
     * <p>
     * 주의!
     * /request-param-required
     * int age -> null을 int에 입력하는 것은 불가능, 따라서 Integer 변경해야 함(또는 다음에 나오는
     * defaultValue 사용)
     */
     
    // @RequestParam 어노테이션을 사용하여 파라미터를 받고, 
    // 필수 파라미터와 선택적 파라미터를 다루는 방법
    @ResponseBody
    @RequestMapping("/request-param-required")
    public String requestParamRequired(
            @RequestParam(required = true) String username,
            @RequestParam(required = false) Integer age) {
        log.info("username={}, age={}", username, age);
        return "ok";
    }

이렇게 되어야 하나

필수값 하나 빠뜨린다면 결과는

400 에러가 나옴.

 

-> 요청 파라미터와 스펙이 맞지 않기 때문에. 400에러

 

 

500에러, int는 null을 쓸 수 없다. 

이런 경우

Integer은 객체형. 객체형에는 null이 들어갈 수 있으니까.

500에러

그래서 Integer 등으로 바꿔서 쓴다는 말.

 

 

빈 문자로 통과하는 경우는 뭐냐

이러한 경우. 이래도 ok 정상적으로 출력된다는 소리.

"" 라는 뜻.

 

 

 

기본 값 적용 - requestParamDefault

// @RequestParam 어노테이션을 사용하여 파라미터를 받고, 기본값을 설정하는 방법.
	/**
     * @RequestParam
     * - defaultValue 사용
     *
     * 참고: defaultValue는 빈 문자의 경우에도 적용
     * /request-param-default?username=
     */
    @ResponseBody
    @RequestMapping("/request-param-default")
    public String requestParamDefault(
            @RequestParam(required = true, defaultValue = "guest") String username,
            @RequestParam(required = false, defaultValue = "-1") int age) {
        log.info("username={}, age={}", username, age);
        return "ok";
    }

 

1) 정상적으로 값 집어넣은 경우

 

값을 누락시킨 경우

기본값 출력됨.

 

참고.

defaultValue가 있는 경우

            @RequestParam(required = true, defaultValue = "guest") String username,
            @RequestParam(required = false, defaultValue = "-1") int age)

required가 필요 없음(어차피 기본값이 들어갈 테니까. 안 적어도 된다는 이야기.)

 

defaultValue의 경우, 

 

 

파라미터를 Map으로 조회하기 - requestParamMap

    /**
     * @RequestParam Map, MultiValueMap
     * Map(key=value)
     * MultiValueMap(key=[value1, value2, ...]) ex) (key=userIds, value=[id1, id2])
     */
     // @RequestParam 어노테이션을 사용하지 않고 Map을 사용하여 파라미터를 받는 방법.
    @ResponseBody
    @RequestMapping("/request-param-map")
    public String requestParamMap(@RequestParam Map<String, Object> paramMap) {
        log.info("username={}, age={}", paramMap.get("username"),
                paramMap.get("age"));
        return "ok";
    }

파라미터를 Map, MultiValueMap으로 조회할 수 있다.

 

그런데 보통 파라미터 1개가 일반적이긴 하다고 한다.

728x90
Comments