쌓고 쌓다

@RequestParam + required / defaultValue / Map 본문

프로그래밍/spring

@RequestParam + required / defaultValue / Map

승민아 2023. 8. 10. 16:15

클라이언트에서 서버로 데이터를 전달할 때 다음과 같은 방법이 있다.

1. GET 쿼리 파라미터

  • /url?username=LSM&age=7
  • 바디 없이 URL의 쿼리 파라미터에 데이터를 포함해 전달하는 방법이다.

2. POST (HTML Form)

  • html의 form 태그를 통해 데이터를 전송.
  • content-type: application/x-www-form-urlencoded (폼으로 전송시 타입)
  • 메시지 바디에 쿼리 파라미터 형식으로 전달한다. ( /url?username=LSM&age=7 )

 

@RequestParam - HTTP 요청 파라미터 

@RequestParam을 통해서 HTTP 요청 데이터를 처리할 수 있다.

 

html form

<input type="text" name="username"/>
<input type="text" name="age"/>

input 태그의 name 속성 값으로 서버에서 파라미터로 받아 처리한다.

 

기본 형태  @RequestParam(name="username") -> @RequestParam("username")

@Slf4j
@Controller
public class RequestParamController {

    @RequestMapping("/request-param-v2")
    @ResponseBody
    public String requestParamV2(@RequestParam("username") String memberName,
                                 @RequestParam("age") int memberAge){
        log.info("username={}, age={}", memberName, memberAge);
        return "ok";
    }
    
    ...
}

@RequestParam("username")에서 HTTP 파라미터 이름 "username"으로 바인딩을한다.

파라미터 "username"의 값은 memberName 변수에 담긴다.

 

+ @Controller이다. 메서드의 String 리턴 값을 통해 뷰를 찾는다.

하지만 @ResponseBody가 있어 뷰를 반환하지 않고 "ok"가 메시지 바디에 직접 들어가 응답한다.

@RestController라면 반환 값으로 뷰를 찾지 않고 HTTP 메시지 바디에 바로 입력한다.

 

파라미터 이름 생략

@RequestMapping("/request-param-v3")
@ResponseBody
public String requestParamV3(@RequestParam String username, @RequestParam int age){
    log.info("username={}, age={}", username, age);
    return "ok";
}

파라미터의 이름과 변수의 이름이 동일하다면 생략하고 @RequestParam만 써줘도 바인딩이 가능하다.

 

@RequestParam 생략

@RequestMapping("/request-param-v4")
@ResponseBody
public String requestParamV4(String username, int age){
    log.info("username={}, age={}", username, age);
    return "ok";
}

파라미터의 이름과 변수의 이름이 동일하고.

String, int, Integer과 같이 단순 타입이라면 @RequestParam도 생략할 수 있다... ㅋㅋ

*@RequestParam 생략시 require=false를 적용한다.

 

파라미터 필수 여부 지정 - required

@RequestMapping("/request-param-v5")
@ResponseBody
public String requestParamV5(@RequestParam(required = true) String username,
                             @RequestParam(required = false) Integer age){
    // int는 null을 가질 수 없다.
    log.info("username={}, age={}", username, age);
    return "ok";
}

require 속성으로 필수 여부를 지정할 수 있다. 기본값은 require=true이다.

여기서 int age -> Integer age로 수정이 필요하다.

age의 필수 여부를 false로 했다.

age 값을 넣어주지 않으면 null 값을 가지게 되는데 int는 null 값을 가질 수 없으므로

Integer로 수정이 필요하다.

 

필수 파라미터에 이름만 있고 값은 없이 절다되면 어떻게 될까?

/request-param?username=

널 값이 아닌 빈 문자열 ""로 처리되어 통과된다.

 

기본 값 설정 - defaultValue

@RequestMapping("/request-param-v6")
@ResponseBody
public String requestParamV6(@RequestParam(required = true, defaultValue = "guest") String username,
                             @RequestParam(required = false, defaultValue = "-1") int age){
    log.info("username={}, age={}", username, age);
    return "ok";
}

파라미터에 값이 없을 때 기본 값을 넣어줄 수 있다.

기본 값이 설정되어 있어 required는 의미가 없긴하다.

 

빈 문자열이 들어가면 기본 값을 넣어줄까?

http://localhost:8080/request-param-v6?username=

위와 같이 빈 문자열을 넣어도 username에는 기본 값이 들어간다.

 

파라미터 Map으로 조회하기

@RequestMapping("/request-param-map")
@ResponseBody
public String requestParamV6(@RequestParam Map<String, Object> paramMap){
    log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
    return "ok";
}

 

key에 Value가 여러개라면 MultiValueMap을 쓰자.

@RequestParam MultiValueMap<String, Object> paramMap

key=userIds, value=[id1, id2] 형태로 값을 갖는다.

MultiValueMap

 

Comments