문제상황
트렌드 설문 조사를 Get 요청하는 api에 참여 여부에 따라 설문 참여 페이지, 이미 참여한 페이지로 네비게이팅을 해야 하는데 그것을 판단할 수 있는 응답이 추가되어야 한다는 프론트 개발자 분의 요청이 있었다. 그래서 나는 응답으로 유저가 참여한 설문인지를 나타내는 boolean 형 변수 isParticipated를 추가했다. 포스트맨으로 테스트를 진행해 보니
항상 isParticipated에는 false만 담겼다. 프로젝트 막바지에 일어난 예상치 못한 에러는 멘탈에 상당한 데미지를 입혔다.. 정신 차리고 구글링을 해보니 생각해보지도 못한 정보들을 와르르 보게 되었다.
원인
java에는 원시 타입(int, short, char, double)과 참조 타입(Double, Integer, String, 클래스로 작성한 엔티티 객체)이 존재한다. 원시 타입 -> null값을 가질 수 없다. 참조 타입 -> null값을 갖을 수 있다. 라는 특징이 있고 여기까지는 원래 알고 있던 지식 이였다. 하지만 내가 맞이한 문제는 여기서 시작된 것이었다.
1. boolean도 참조 타입인 Boolean이 존재한다.
(boolean이 갖을 수 있는 값 : true, false(default 값) / Boolean이 갖을 수 있는 값 : true, false, null(default 값))
2. boolean 값에는 @Getter를 사용할 경우 get이 아닌 is를 prefix(접두사, 예시 => boolean teho인 필드에 getter가 적용되면 getTeho()가 아닌 IsTeho()가 생성된다.)로 사용한다.
3. 2번을 근거로 내가 선언한 boolean isParticipated 필드에 getter 메서드를 찾아보았다. 예상대로라면 isIsParticipated()가 되어야 한다(느낌만 봐도 이상하군). 모든 케이스를 비교해 보기 위해 boolean/Boolean 타입의 접두사가 is/is가 아닌 변수들을 생성한 후 getter/setter 메서드를 호출해 보았다. 하지만 실제 생성된 boolean isPrticipated의 getter 메서드는 isIsParticipated()가 아닌 isParticipated()였다.
4. 직렬화(자바 객체 -> JSON) 과정에서 내가 선언한 boolean isParticipated의 getter가 isParticipated()이기 때문에 json의 Key값이 participated라고 objectMapper(직렬화, 역직렬화를 수행하는 jackson 라이브러리의 구현체)는 판단한다. 결과적으로 실제 key값인 isParticipated에는 아무것도 매핑되지 않는다. (내가 isParticipated의 값을 true로 입력하는 코드를 짜도 내부에서 participated에 값을 넣으려고 한다.)
5. 결과적으로 isParticipated에는 값이 할당되지 않았고 그로 인해 booelan의 default 값인 false만 반환되는 것이었다.
나의 해결
여러 가지 방법이 있었지만 나는 변수명에 is를 접두사로 붙이지 않는 방법을 선택했다. isParticipated -> participated로 변수명을 변경하였다. 이렇게 되면 getter 메서드는 isParticipated()가 되고 objectMapper가 판단한 key 값인 participated는 나의 변수명과 일치해서 원하는 값을 넣을 수 있다.
더 찾아본 다른 해결 방법
1. Boolean 사용하기 : Boolean은 getter의 접두사로 get을 사용하기에 변수명이 is로 시작해도 상관없다.
2. lombok 옵션 변경하기 : Lombok config 파일을 생성한 후 lombok.getter.noIsPrefix=true를 설정한다(default로 false가 설정되어 있다). getter의 prefix를 is로 쓰지 않겠다는 뜻이다. 이렇게 하면 boolean형태도 getter의 접두사가 get으로 바뀐다.
3. 해당 변수의 getter만 override : boolean 타입이고 is로 시작하는 이름으로 선언된 변수의 getter 메서드만 따로 직접 override 해준다.
4. @JsonProperty 사용하기 : @JsonProperty("isParticipated")를 사용하고 변수 명은 participated로 작성한다.
마무리
Boolean이라는 참조 타입이 존재하는지 몰랐었는데 덕분에 알게 되었다. 아무 생각 없이 사용하던 @Getter, @Setter의 동작 과정도 새롭게 알게 되었다. 역시 직접 코드로 써서 눈으로 확인해 보는게 마음이 편하다~
'My project > Univey' 카테고리의 다른 글
Spring security + jwt 동작방식 이해하기 (2) | 2024.02.05 |
---|---|
잇타 대학생연합 IT동아리 it’s time 4기 활동 간단 후기, 회고(Feat. 팀 불사조 - Univey) (3) | 2024.01.29 |