
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에 주입했다.
그 결과 다른 필드에는 다 값이 정상적으로 넘어오는데 xPoint와 yPoint에만 자꾸 null값이 들어왔다.
뭐가 문젤까 싶어서 dto에 null이 들어오는 경우들을 검색해봤더니, 변수명이 원인일 수 있다는 글을 발견했다.
일단 거두절미하고 원인이 무엇이었는지를 말하자면, 변수명이 xPoint,yPoint 로, 첫 번째 글자가 소문자이고 두 번째 글자가 대문자라는 것에 있었다.
Spring 은 JSON 데이터를 매핑하기 위한 Message Converter 로 Jackson 을 사용한다. 그리고 Jackson 은 Getter 의 이름으로부터 Json Key 값을 만든다. (처음 알았다 😮)
여기서 주목해서 봐야 할 점은 Jackson이 메서드 이름( 즉, getter)에서 필드명을 추출할 때 사용하는 규칙이다.
- 맨 앞 두 글자가 모두 대문자인 경우 이어진 대문자를 모두 소문자로 변경한다.
- 나머지 모든 케이스에서는 맨 앞 글자만 소문자로 바꿔준다.
위 규칙을 내 코드의 xPoint에 어떻게 적용될 지 생각해보자.
xPoint인 경우, getter는 맨 앞글자를 대문자로 만든 getXPoint()로 생성된다.getXPoint()로 부터 JSON과 매핑할 필드명을 추출한다. getXPoint()에서 XPoint를 가져오고, 이 때 맨 앞 두 글자가 대문자로 이어지므로 위의 규칙 1번이 적용되어 추출된 필드명은 xpoint가 된다.xpoint이 기존 필드명 xPoint와 달라지므로 필드명 xPoint에 값이 들어가지 않는다.그런 .. 것이었다.
그래서 기존 필드명을 xPoint, yPoint에서 xpoint,ypoint로 바꿔주고, 그에 맞춰서 요청을 다시 보냈더니 값이 성공적으로 dto에 매핑되는 것을 확인했다.
https://bcp0109.tistory.com/309 에서 많은 도움을 얻음