(Kotlin) Request에서 Nullable? Non-Null?

코틀린의 장점을 하나 꼽자면 Non-null 타입을 지원한다는 것이다.
모든 곳에 null을 없앨 수 있는데(100% 순수 코틀린 코드로만 짠다면)
통제할 수 없는 부분은 클라이언트로부터 받는 Request이다.

그래서 Request에는 어떤 타입을 써야할지 삽질을 해봤다.

기본값을 사용하자.

1
2
3
4
5
6
7
class DTO(val name: String? = null)

@RestController
class Controller {
@PostMapping
fun test(@RequestBody dto: DTO) {}
}

위와 같을 때 request body의 name에 아무런 내용도 입력하지 않으면 name에 기본값 null이 잘 세팅된다.
기본값이 전부 존재하면 default constructor가 생성돼서 객체를 손쉽게 생성할 수 있다보니 테스트 할 때 용이하다.

무조건 nullable 타입을 사용하자.

1
2
3
4
5
6
7
class DTO(val name: String = "123")

@RestController
class Controller {
@PostMapping
fun test(@RequestBody dto: DTO) {}
}

위와 같을 때 클라이언트에서 의도적으로 {"name": null}을 보내는 순간
failed for JSON property name due to missing (therefore NULL) value for creator parameter name which is a non-nullable type
라는 오류와 함께 400 에러를 뱉는다. (타입에 관련된 에러임)
따라서 nullable 타입을 사용하자.

Header와 Parameter의 default value는 어노테이션에 있는 설정을 쓴다.

1
2
3
4
5
@RestController
class Controller {
@GetMapping
fun test(@RequestHeader(required = false, defaultValue = "11") test: Int?) {}
}

이 때 헤더에 아무런 값도 보내지 않으면 11이 세팅된다.
하지만 아래와 같이 변수에 기본값을 세팅했다면 null이 세팅된다.

1
2
3
4
5
@RestController
class Controller {
@GetMapping
fun test(@RequestHeader(required = false) test: Int? = 11) {}
}