본문 바로가기
코틀린

[코틀린] @RequestParam 에 기본값 넣어주기

by kdohyeon (김대니) 2023. 1. 29.
반응형

Kotlin 으로 RESTful API 를 생성하는데, @RequestParam 으로 입력받는 파라미터에 기본값이 제대로 주입이 안되는 이슈를 겪었습니다. 이에 대한 솔루션을 정리하고자 합니다.

구현하고자 했던 기능

페이징 처리가 가능한 조회 API 를 생성하는 과정에서 일반적으로 pagesize 에 대해 입력을 받게 됩니다. 보통은 첫 페이지에 10개, 20개씩 등 정해진 값으로 조회를 많이 하기 때문에 굳이 입력을 받지 않더라도 기본값을 설정해두는고 개발을 진행하게 됩니다.

예상

Kotlin 에 입문한지 얼마 되지 않아 아무것도 몰랐던 저는.. 위 기능을 구현하기 위해 아래와 같이 사용하면 기본값을 입력받을 수 있을 줄 알았습니다.

@GetMapping('/api/v1/order/{orderItemId}')  
fun getOrdersByOrderItemIds(  
    @PathVariable orderItemId: Long,  
    @RequestParam page: Int? = 1,  
    @RequestParam size: Int? = 10
) {
    ...
}

Kotlin 에서는 보통 nullable 필드에 대해서 ? 를 활용하여 표현한다고 알고 있었기 때문에 값이 입력되지 않았을 때 자체적으로 page 는 1, size 는 10 으로 주입받을 줄 알았습니다.

막상 실행해보니 제가 기본값으로 설정했던 1, 10 이 넘어오는게 아니라 null 이 넘어왔습니다.

원인

검색을 해보니 원인은 스프링에서 API 가 호출이 되면 ArgumentResolver를 거치게 되는데 이 때 pagesizenull 으로 이미 채워져서 전달이 되기 때문에 기본값이 설정되지 않는다고 합니다. (RequestParamMethodArgumentResolver)

해결 방법

따라서 이 때는 @RequestParam 어노테이션 자체의 설정 (defaultValue 속성)을 활용하면 의도한대로 작동하게 됩니다.

@GetMapping('/api/v1/order/{orderItemId}')  
fun getOrdersByOrderItemIds(  
    @PathVariable orderItemId: Long,  
    @RequestParam(defaultValue = "1") page: Int,  
    @RequestParam(defaultValue = "10") size: Int,  // RequestParam 어노테이션의 defaultValue 활용
)  
반응형

'코틀린' 카테고리의 다른 글

[코틀린] 삼항연산자 사용하기  (0) 2023.03.07

댓글