User 정보 수정 기능 구현 중 DTO에 Null값이 담기는 문제가 생겼다.
이 문제의 경우 아래의 이유때문에 Jackson 규칙을 알아야한다.
1. Spring의 Json Message Converter는 Jackson 라이브러리를 사용
2. Request 요청 시 JSON의 키 값은 getter의 이름으로 설정된다.
3. 이때, getter의 네이밍은 getAge() 이런 식으로 get 다음이 대문자로 시작하게 되므로, Jackson 라이브러리는
Json의 키 값을 Age -> age로 바꿔서 설정한다.
javabean 규약
- JavaBeans 는 메서드 이름에서 필드명을 추출할 때 일정한 규칙이 존재합니다.
- 맨 앞 두개가 전부 대문자라면 그대로 리턴하고 아니라면 맨 앞 문자 하나만 소문자로 바꿔서 리턴합니다
jackson은 기본적으로 Javabeans 규약을 따르지만 차이점이 있다.
Jackson 규칙
1. 맨앞 두글자가 모두 대문자인 경우 이어진 대문자를 모두 소문자로 변경
2. 위의 경우가 아닐시 맨 앞글자만 소문자로 변경
위 규칙에 따라 DTO의 필드명이 일치하지 않아 null값으로 들어왔을 가능성이 있다.
+Jackson 은 Getter 의 이름을 기반으로 Json Key 값을 만든다
Jackson 은 Object -> Json 으로 변환시 필드명기준이 아니라 Getter의 이름 기준으로 바뀐다.
public class JacksonDto {
private String name;
public String getNameChange() {
return name;
}
}
- 필드명은 name 이지만 Getter 이름은 getNameChange() 입니다.
+Lombok 의 Getter 생성 규칙
Lomobk 의 @Getter 어노테이션을 붙이면 클래스의 Getter 메소드를 자동으로 생성해줍니다.
그런데 @Getter 의 생성 규칙은 굉장히 단순합니다.
get 다음에 무조건 필드명의 맨 앞 글자를 대문자로 바꿔서 만들어줍니다.
lombok 의 Github Issue 에도 이 내용에 대한 문의가 있습니다.
예를들어 필드명이 aCount 이면.
Lombok 이 getACount 로 생성해주고 Jackson 을 거치니 acount 가 되어서 필드명이 일치하지 않아 문제가 발생한다.
반면 aaCount 는 getAaCount 가 되고 Jackson 을 거쳐도 aaCount 가 되어서 정상적으로 값이 들어온다.
Conclusion
- Spring 의 Json Message Converter 는 Jackson 라이브러리를 사용
- lombok 의 Getter 는 필드명 맨 앞을 항상 대문자로 만듬
- Jackson 라이브러리는 Getter 의 맨 앞 두글자가 전부 대문자인 경우 필드명과 Json key 값이 달라짐
- aCount 라는 필드명을 lombok 을 사용해서 Getter 를 만들면 getACount() 가 되기 때문에 이슈가 발생
위 문제를 해결하려면 필드명을 작성할 때 첫 번째는 소문자, 두 번째는 대문자인 케이스로 만들지 않으면 된다.
그래도 꼭 사용해야 한다면 lombok 의 @Getter 대신 직접 Getter 를 만들거나, @JsonProperty 를 사용하면 됩니다.
나의 경우에는 위의 문제와는 관련이 없었다...
@RequestBody 어노테이션을 빼먹었었다........
'Project > BDSR로그북(App,BackEnd)' 카테고리의 다른 글
bulk delete시 Rest Url (0) | 2023.07.25 |
---|