티스토리 뷰

728x90
반응형

Kotlin에서 Double 타입은 기본적으로 null이 들어올 수 없지만, JSON → DTO 변환 시 생각보다 큰 함정이 있다.
이번 글에선 Double? + @Field NotNull 조합이 언제 꼭 필요한지 정리해봤다.

 


🤔 문제의 시작: JSON 필드 누락

예를 들어, 아래와 같은 API 요청 DTO가 있다고 하자.

data class CreatePoiRequest(
    val latitude: Double,
    val longitude: Double
)
 

클라이언트가 아래처럼 요청을 보낸다면?

{
  "longitude": 126.9769
}

→ latitude 필드가 빠져 있다.

 


Kotlin primitive 타입(Double)은 절대 null이 안 들어온다.

Kotlin에서 Double은 primitive 타입이다. 즉,

  • null이 올 수 없음
  • 하지만 JSON 필드가 없다고 해서 에러가 나는 게 아니다.

⚠️ 스프링 MVC가 기본값을 채워버린다

스프링은 JSON → DTO 변환 시, primitive 타입에 대해 이렇게 동작한다.

“필드가 JSON에 없으면, primitive 타입은 0.0으로 채워준다.”

즉, 위 요청처럼 latitude가 누락되면:

val latitude: Double = 0.0

→ 아무런 에러도 안 나고, 0.0이 채워져 버린다.

 


 

.

🚫 왜 위험할까?

latitude = 0.0 은 좌표계상 아프리카 대서양 한가운데다.

  • 서울 좌표 저장하려다 엉뚱한 곳이 찍혀버린다.
  • 지도 서비스에서 잘못된 POI 표시
  • 비즈니스 로직이 오작동함.

이처럼 누락을 무시하고 0.0을 집어넣는 건 매우 큰 문제다.

 


✅ 해결책: Double? + @field:NotNull

그래서 Double? + @NotNull 조합이 필요하다.

data class CreatePoiRequest(
    @field:NotNull(message = "위도는 필수입니다.")
    val latitude: Double?
)

 

  • JSON에서 latitude 누락 → null
  • validation에서 즉시 400 Bad Request 발생
  • 더 이상 0.0으로 채워지지 않음

검증 흐름

Controller에서 아래처럼 validation을 붙이면,

@PostMapping
fun createPoi(@RequestBody @Valid request: CreatePoiRequest) { ... }

 

 

  • 스프링이 DTO 검증 수행
  • latitude가 null → 즉시 에러 발생
  • 안전하게 잘못된 요청 차단

💡 결론

  • Kotlin의 primitive 타입(Double)은 null을 허용하지 않음
  • 하지만 JSON 필드 누락 시 0.0으로 채워져 매우 위험
  • Double?로 nullable 선언 + @field:NotNull 적용이 정답

✅ 한 줄 요약

POI 도메인에서는 0.0이 의미있는 값이므로

“Kotlin Double 필드? 무조건 nullable + @NotNull 조합으로 사용해라.
누락되면 기본값 0.0으로 들어와서 진짜 큰일 난다.” 


 

 

POI도메인에서는 일반적인 CRUD 데이터와 달리, 0이 (default value) 의미하는 바가 명확한 숫자값이고, null과 0의 구분이 엄격이 필요해서, nullable과 기본값을 어떻게 처리해야할지 훨씬 신중해야하고, 검증 로직도 더 철저해야 한다는 것을 깨달았다.

728x90
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함
반응형
250x250