본문 바로가기

Logging/Spring

[문제기록] Lombok @Getter 사용시 boolean 값 처리에 대하여

728x90

프로젝트를 하던 중, 다음과 같은 Request DTO 를 만들어야 할 일이 있어서 만들었다. 

 

 

@Getter
@Setter
@NoArgsConstructor
public class ACreateReqDto {

    private String name;
    
    // ... 
    
    private boolean hasRule;
    
    @JsonProperty("rule")
    private RuleCreateReqDto ruleDto;
    
    @Getter
    @Setter
    public class RuleCreateReqDto{
        
        private String ruleName;
        
        private boolean isAgeRule;
        
    }
}

 

 

이렇게 해서 다음과 같이 요청처리 코딩을 완료해서 다음과 같이 날려보았다. 

 

 

보낸 POST 요청 BODY JSON

 

 

다 잘 들어오는줄 알았는데, 이상하게도 isAgeRule 이 계속 false 로 들어오는 것을 발견하였다.  이상한 점은 RuleCreateReqDto 객체가 다 못들어오는게 아니라, [ruleName] 은 잘 받는데 [isAgeRule] 만 안들어오는 것이였다. 

 

 

이는 Data 매핑해주는 예외임이 너무 자명한 상황이라, ObjectMapper 가 Getter, Setter 를 통해서 만들어 줄 때 뭔가 실패하고 있는 것임을 직감할 수 있었다.  따라서 Lombok 의 Getter, Setter 가 boolean 값을 대상으로 어떤 함수를 만들어주는지 확인을 해보았다. 

 

 

먼저, ACreateReqDto.java 의 boolean 은 hasRuleJoin 이다. 관례적으로 boolean 은 is 로 시작하기 때문에, Lombok 에서 @Getter / @Setter 를 만들면 is 를 빼고 만들어준다. 따라서, 해당 클래스의 boolean 은 has 로 시작하기 때문에 Setter 가 다음과 같이 생성이 된 상태이다. 

 

 

// ACreateReqDto 의 Setter
public void setHasRuleJoin(boolean hasRuleJoin){
    return this.hasRuleJoin;
}

 

 

반면, RuleCreateReqDto 의 boolean 은 관례적인 isAgeRule 의 이름으로, is 로 시작하는 boolean 을 취했다. 이에 따라 Lombok 의  Setter 는 다음과 같이 set method 를 만들어주는 것을 확인했다. 

 

 

// RuleCreqteReqDto 의 Setter
public void setAgeRule(boolean isAgeRule){
    this.isAgeRule = isAgeRule;
}

 

 

따라서, ObjectMapper 가 필드 이름에 맞춰서 Setter 를 사용해서 매핑을 해줄 때, ACreateReqDto 의 것만 정상적으로 진행을 해줄 수 있었던 것이였다. 내가 직접 custom setter 를 다음과 같이 만들어주니 정상적으로 매핑되는 것을 확인할 수 있었다. 

 

 

// 직접 추가한 Setter
public void setIsAgeRule(boolean isAgeRule){
    this.isAgeRule = isAgeRule;
}

 

 

Lombok 의 @Getter / @Setter 를 boolean 에게도 활용함에 있어서는 항상 주의해야 한다 !! 이 점을 정확하게 알고 사용할 수 있도록 하자!!!!

 

 

그래도 롬복은 짱짱맨이다 힝

728x90