Back-End/Spring Boot

[Spring] @RequestBody 사용 시 boolean 변수 바인딩 에러 (Boolean variable binding error in requestbody annotation)

koh1018 2023. 1. 5. 18:55
반응형

 

위 테스트 코드를 작성하던 중 발생한 문제였다.

 

post를 하기 전 requestDto에서는 분명히 isActive라는 변수의 값이 true였으나 post 한 후 isActive의 값이 false로 나오는 것이었다.

다른 변수의 값들은 멀쩡히 잘 나와서 참 이해하기 어려운 버그였다...

 

코드를 더 살펴보니 dto에는 문제가 없어보였고 repository의 test 코드는 성공했다.

이에 controller단의 버그라 생각하고 디버깅을 진행하였다.

 

진행해보니 확실히 Controller에서 문제가 있었다. Controller에서 requestDto를 받는 과정에서 값이 위와 같이 바뀌는 것 같았다.

그렇다면 왜 다른 값들은 멀쩡한데 isActive 값만 버그가 나는걸까?

 

 

 


 

 

https://projectlombok.org/features/GetterSetter

 

@Getter and @Setter

 

projectlombok.org

구글링을 통해 찾아보니 위 링크에 따르면 lombok에서 제공하는 @Getter 혹은 @Setter 어노테이션을 사용할 경우 자동으로 getter/setter 메서드를 생성해주는데, 이 때 boolean 타입의 변수에 붙는 prefix는 get이 아닌 is이므로 @RequestBody에서 찾을 수 없어 바인딩 되지 않아 발생하는 문제였다.

 

변수에 is prefix를 붙여놓은 상태에서 @Getter 어노테이션을 사용하니, 내부적으로 isIsTestCase() 같은 이상한 네이밍의 메서드가 생성되서 @RequestBody에서 바인딩에 사용하는 Jackson 라이브러리의 ObjectMapper에서 필드를 찾을 수 없어서 바인딩 되지 않아 DTO에 정상적으로 값이 입력되지 않았던 것이다.

 

 

해결법

이를 해결하기 위한 두 가지 방법이 있는데,

1. 변수명에서 is prefix를 제거하기

2. default값이 false인 lombok.getter.noIsPrefix를 true로 바꾸기 (이렇게 하면 booelan 변수도 get prefix를 사용한다.)

3. boolean이 아닌 Boolean 사용하기

4. boolean 변수의 getter만 override해서 작성하기(아래 링크 참고)

https://stackoverflow.com/questions/18139678/lombok-how-to-customise-getter-for-boolean-object-field

 

필자는 이 중 3번의 방법을 사용하기로 했다.

 

Bool 변수 이름 제대로 짓기 위한 최소한의 영어 문법 · Soojin Ro

Background 프로그래머의 가장 어려운 업무가 이름 짓기라는 설문 결과도 있듯이 변수에 적절한 이름을 지어주는 것은 어렵고 오래걸리는 일이다. 영어가 모국어가 아닌 사람들에게는 더 어려울

soojin.ro

위 링크에서 bool 변수 이름 짓는 법에 대해 조금 찾아보았는데 아무래도 bool 변수는 is를 사용하는 것이 더 자연스럽게 이해되기 때문이다. (상황에 따라 is가 쓰이지 않을 수 있다.)

 

 

Boolean을 사용하면 해결되는 이유는 아래 링크를 참고하면 좋다.

https://ratseno.tistory.com/101

 

[Lombok]"is"prefix가 붙은 boolean, Boolean

어노테이션만 붙이면 자동으로 getter, setter, 생성자 등등 여러 가지를 생성해주는 Lombok을 자주 사용합니다. IDE에서 자동생성으로 작성하는 경우도 있지만, 개발 편의성을 위해 Lombok을 쓰는 편입

ratseno.tistory.com

 

 

반응형