프로젝트를 하던 중, 다음과 같은 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;
}
}
이렇게 해서 다음과 같이 요청처리 코딩을 완료해서 다음과 같이 날려보았다.
다 잘 들어오는줄 알았는데, 이상하게도 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 에게도 활용함에 있어서는 항상 주의해야 한다 !! 이 점을 정확하게 알고 사용할 수 있도록 하자!!!!