[Spring Error] Dto에 null이 들어오는 문제

subbni·2023년 5월 13일
post-thumbnail

문제

package com.lettrip.lettripbackend.controller.travel.dto;

import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@RequiredArgsConstructor
public class PlaceDto {
    @NotNull
    private String name;
    @NotNull
    private double xPoint;
    @NotNull
    private double yPoint;
    @NotNull
    private String categoryCode;
    @NotNull
    private String categoryName;
    @NotNull
    String province;
    @NotNull
    String city;
}

위처럼 요청을 보내고 @RequestBody를 통해 값을 PlaceDto에 주입했다.
그 결과 다른 필드에는 다 값이 정상적으로 넘어오는데 xPointyPoint에만 자꾸 null값이 들어왔다.

뭐가 문젤까 싶어서 dto에 null이 들어오는 경우들을 검색해봤더니, 변수명이 원인일 수 있다는 글을 발견했다.

원인

일단 거두절미하고 원인이 무엇이었는지를 말하자면, 변수명이 xPoint,yPoint 로, 첫 번째 글자가 소문자이고 두 번째 글자가 대문자라는 것에 있었다.

Spring 은 JSON 데이터를 매핑하기 위한 Message Converter 로 Jackson 을 사용한다. 그리고 Jackson 은 Getter 의 이름으로부터 Json Key 값을 만든다. (처음 알았다 😮)
여기서 주목해서 봐야 할 점은 Jackson이 메서드 이름( 즉, getter)에서 필드명을 추출할 때 사용하는 규칙이다.

  1. 맨 앞 두 글자가 모두 대문자인 경우 이어진 대문자를 모두 소문자로 변경한다.
  2. 나머지 모든 케이스에서는 맨 앞 글자만 소문자로 바꿔준다.

위 규칙을 내 코드의 xPoint에 어떻게 적용될 지 생각해보자.

  1. 일단, 내 코드에선 Lombok을 이용하여 getter를 자동생성하고 있다. 찾아본 결과 Lombok에서는 변수명의 첫 번째 글자를 무조건 대문자로 만들어 getter를 생성한다고한다. 즉 변수명이 xPoint인 경우, getter는 맨 앞글자를 대문자로 만든 getXPoint()로 생성된다.
  2. Jackson이 getter인 getXPoint()로 부터 JSON과 매핑할 필드명을 추출한다. getXPoint()에서 XPoint를 가져오고, 이 때 맨 앞 두 글자가 대문자로 이어지므로 위의 규칙 1번이 적용되어 추출된 필드명은 xpoint가 된다.
  3. 추출된 필드명 xpoint기존 필드명 xPoint와 달라지므로 필드명 xPoint에 값이 들어가지 않는다.

그런 .. 것이었다.
그래서 기존 필드명을 xPoint, yPoint에서 xpoint,ypoint로 바꿔주고, 그에 맞춰서 요청을 다시 보냈더니 값이 성공적으로 dto에 매핑되는 것을 확인했다.


https://bcp0109.tistory.com/309 에서 많은 도움을 얻음

profile
개발콩나물

0개의 댓글