[Spring] 실무에서 활용하는 @RequestParam 사용법

@RequestParam 어노테이션

@RequestParam 어노테이션은 주로 HTTP 요청의 파라미터를 읽어 메서드의 매개변수에 바인딩할 때 사용한다.

 

예를 들어 

 

https://www.code-lab1/v1/board?page=1&pageSize=10

 

위와 같이 API 호출을 한다고 하자.

@GetMapping("/v1/board")
public ResponseDto<BoardListRes> getBoardList( 
    @RequestParam(value="page") Integer page,
    @RequestParam(value="pageSize") Integer pageSize){
    
    System.out.println(page + ", " + pageSize);	// 1, 10 
    
}

 

@RequestParam 어노테이션은 value 속성으로 URL 속 쿼리 파라미터의 이름을 매칭시킬 수 있다.

즉, value="page"라는 옵션은 URL 속 page라는 이름의 쿼리 파라미터를 읽어 Integer page에 바인딩한다는 뜻이다.

 

하지만 실무에서 value 옵션은 잘 사용하지 않는다.

@GetMapping("/v1/board")
public ResponseDto<BoardListRes> getBoardList( 
    @RequestParam Integer page,
    @RequestParam Integer pageSize){
    
    System.out.println(page + ", " + pageSize);	// 1, 10 
    
}

 

위와 같이 쿼리 파라미터의 이름과 해당 값을 바인딩시킬 (Integer page, Integer pageSize) 변수의 이름이 같다면

value 속성을 생략해도 되기 때문이다.

 

따라서 보통 API 명세서를 보고 쿼리 파라미터의 이름과 바인딩시킬 변수의 이름을 맞추는 경우가 많다.

 

참고) @RequestParam도 생략 가능한데, 왜 생략하지 않을까?

참고로 쿼리 파라미터의 이름과 바인딩시킬 변수의 이름이 같다면 @RequestParam 어노테이션까지도 생략할 수 있다.

하지만 이렇게 하면 해당 파라미터가 쿼리 파라미터에서 값을 읽어온다는 것이 명확하게 보이지 않는다.

이 부분에 대해서는 논쟁이 있을 수 있지만, 개인적으로 쿼리 파라미터에서 값을 읽어오는 것을 명확히 표현하기 
위해 최소한 @RequestParam 어노테이션을 붙이는 게 맞다고 생각한다.

 

 

기본 사용법을 배웠으니 다양한 활용법을 알아보자.

 

 

필수값 지정

@GetMapping("/v1/board")
public ResponseDto<BoardListRes> getBoardList( 
    @RequestParam(required = true) Integer page,
    @RequestParam(required = false) Integer pageSize){
    
    System.out.println(page + ", " + pageSize);	// 1, 10 
    
}

 

해당 파라미터는 필수로 값을 넣어야 한다는 것을 나타내려면 어떻게 해야 할까?

 

@RequestParam에는 required 옵션이 있다. 해당 옵션의 값이 true라면 해당 파라미터를 누락할 경우 예외가 발생한다.

 

반면, required 옵션이 false라면, 해당 파라미터를 누락하더라도 매개변수에 null 값이 담기고 예외가 발생하지 않는다.

 

required 옵션은 기본적으로 true이다. 따라서 일부러 required=true 옵션을 주지 않아도 되지만, 명확하게 해당 파라미터가 필요함을 나타내고 싶다면 required=true를 작성해도 괜찮다. 해당 사항은 개발 취향에 따라 갈리는 듯하다.

 

참고로 required 옵션을 사용하고 싶다면 int 같이 null 값을 담지 못하는 타입대신 Integer와 같이 Wrapper 클래스를 사용해야 한다.

 

 

기본값 적용

@GetMapping("/v1/board")
public ResponseDto<BoardListRes> getBoardList( 
    @RequestParam(defaultValue = 1) Integer page,
    @RequestParam Integer pageSize){
    
    System.out.println(page + ", " + pageSize);	// 1, 10 
    
}

 

 

defaultValue 옵션을 적용하면 해당 파라미터가 누락됐을 때 기본값을 지정할 수 있다.

예를 들어 위 코드에서 page 파라미터가 누락되면 기본 값인 1을 적용하게 된다.

 

 

파라미터 값 여러 개 받기

https://www.code-lab1/v1/board?pages=1,2,3,4

 

위와 같이 pages라는 파라미터에 ',' 구분자를 통해 여러 값을 한 번에 보내는 경우는 어떻게 받을 수 있을까?

 

@GetMapping("/v1/board")
public ResponseDto<BoardListRes> getBoardList( 
    @RequestParam List<Integer> pages,
    ){
    
    System.out.println(pages);	// 1, 2, 3, 4
    
}

 

List 클래스를 이용하면 간단하게 받아올 수 있다.

 

 

https://www.code-lab1/v1/board?page=1&page=2&page=3&page=4 

 

위와 같이 같은 파라미터 이름으로 여러 개의 값을 보내는 경우는 어떨까?

 

@GetMapping("/v1/board")
public ResponseDto<BoardListRes> getBoardList( 
    @RequestParam("page") List<Integer> pages,
    ){
    
    System.out.println(pages);	// 1, 2, 3, 4
    
}

 

이런 경우에 메서드의 매개변수 이름은 보통 복수형(-s, -es)을 사용하는 경우가 많기 때문에 

@RequestParam에 이름을 명시해 주는 게 좋다.

반응형

댓글

Designed by JB FACTORY