본문 바로가기

수업 & 공부

Spring boot Request DTO 에 null값

 

Spring Request DTO 에 null 값이 들어가는 이유 (Jackson, Lombok)

Overview Spring Boot 로 REST API 를 테스트 하다가 이상한 이슈에 직면했습니다. 클라이언트에서 @RequestBody 로 요청을 받기 위한 DTO 클래스를 만들고 값을 입력 받았는데 null 값이 입력되는 겁니다. 처

bcp0109.tistory.com

위 블로그를 참고하여 수정

 

오타나 동작에 문제가 없는데 Spring boot Request DTO 에 null값이 들어온다면

변수명을 우선적으로 확인해야한다.

 

Object -> Json 으로 변환 하면  Getter의 이름 기준으로 바뀐다

Object 의 필드명을 Getter 로 바꿀 때 일반적으로 맨 앞 글자를 대문자로 바꿔준다

ex) name -> getName()

 

Jackson 은 Getter 를 기준으로 변환시키기 때문에 Jackson 내부적으로도 나름의 기준을 갖고 변환

기본적으로는 JavaBeans 규약을 따르지만 다른 부분이 있다.

 

 

JavaBeans 규약

 

  • 클래스의 이름은 일반적으로 대문자로 시작하지만, 개발자들은 식별자가 소문자로 시작하는 것에 익숙하기 때문에 첫 번째 글자를 소문자로 변환
  • 다만, 모든 문자를 대문자로 사용하는 경우도 있기 때문에 이런 경우는 예외
  • 예외 케이스를 판별하기 위해 첫 두 문자가 모두 대문자인지를 확인

맨 앞 두개가 전부 대문자라면 그대로 리턴하고 아니라면 맨 앞 문자 하나만 소문자로 바꿔서 리턴한다.

 

 

 

그렇다면 Jackson 에서는?

 

JavaBeans 규약에서는 앞 두 글자가 대문자인 경우 그대로 사용한다고 했으나 Jackson 은 맨 앞부터 이어진 대문자를 모두 소문자로 변경

 

  • AAaa -> aaaa : 앞 두 글자가 대문자라서 소문자로 변경
  • BBBb -> bbbb : 앞 두 글자가 대문자라서 이어진 세번째 문자까지 소문자로 변경
  • CCcC -> cccC : 앞 두 글자를 소문자로 변경하지만 맨 뒤의 대문자는 이어져 있지 않아서 그대로 사용
  • DDDD -> dddd : 앞 두 글자부터 이어진 대문자를 모두 소문자로 변경

 

 

DTO 의 필드명이 대문자로 시작하면 Request 요청 시 값이 제대로 들어오지 않는다

필드명이 대문자로 시작하면 Getter 도 대문자로 시작하는 수밖에 없다

Jackson 의 규칙에 따라서 get 이후가 대문자로 시작하면 최소한 첫 글자는 항상 소문자로 바뀐다

 

따라서 기존에 사용한 bTitle 같은 컬럼명을 bookTitle 식으로 바꿔주었다..

 

'수업 & 공부' 카테고리의 다른 글

lambda  (0) 2022.10.01
Wrapper Class란  (0) 2022.09.29
Java - Collection  (0) 2022.09.29
동적 계획법 알고리즘 (Dynamic Programming)  (0) 2022.09.06
시간 복잡도 관련 참고할 글  (0) 2022.08.25