Lombok @Getter boolean 필드 주의사항

jkky98·2024년 12월 6일
0

ProjectSpring

목록 보기
2/20
@Data
public class WriteForm {
    private String title;
    private String tags;
    private String content;
    private MultipartFile thumbnail;
    private String postSummary;
    private boolean isPrivate;
    private String url;
    private String series;
}

Form, Dto 사용시에는 @Data를 자주 사용한다. @Data는 클래스의 Getter, Setter, toString(), equals(), hashCode(), 필드 초기화를 위한 생성자를 자동으로 생성하는 Lombok의 편리한 어노테이션입니다. 단, 특정 필드를 제외하거나 민감한 데이터 관리에는 주의가 필요하다. 그렇기에 엔티티가 아닌 Data Transfer 목적으로 @Data는 훌륭한 도구이다.

위 처럼 사용하다가 boolean 필드에 해당하는 isPrivate 필드에 대한 에러가 발생했다.

Thymeleaf의 EL(Expression Language) 처리에 관련한 에러였고 문법이 틀린지 보았지만 그렇지 않았다.

Lombok과 boolean 필드의 Getter 메서드 생성 방식

Lombok은 boolean 타입 필드에 대해 다음과 같이 Getter 메서드를 생성한다.

Lombok boolean 타입에 대해 is 접두사를 사용
예: isPrivate 필드는 isPrivate() 메서드로 Getter가 생성된다.

본래는 Xxx라는 필드 이름에 대해 isXxx로 하여금 Getter를 만들어낸다. 하지만 필드 이름이 isXxx일 때 Lombok의 Getter는 isIsXxx가 아닌 필드이름과 동일하게 isXxx로 Getter 이름을 설정한다.

Thymeleaf의 Getter 탐색 방식

Thymeleaf는 JavaBean 표준에 따라 boolean 필드의 Getter를 찾는다.
JavaBean 표준은 다음과 같이 정의된다:

  1. is<FieldName>: boolean 필드에 대해 가장 먼저 찾는다.
  2. get<FieldName>: is 접두사가 없을 때 찾는다.

문제는 is<FieldName>가 필드 이름과 일치하지 않는 경우이다. Thymeleaf는 필드 이름을 기준으로 is<FieldName> 또는 get<FieldName>를 호출하려 시도한다.


충돌 시나리오

  1. isPrivate라는 boolean 필드를 Lombok이 isPrivate()로 Getter를 생성한다.
  2. Thymeleaf는 필드 이름 그대로 탐색하며 isIsPrivate()를 찾으려 하여 충돌이 발생한다.
<p th:text="${writeForm.isPrivate}">Is Private: true/false</p>
  1. 결과적으로 Thymeleaf는 메서드를 찾지 못하고 예외를 던지거나 예상치 못한 동작이 발생한다.

해결

boolean 필드에 절대 is로 시작하지 않도록 이름을 잘 설정하자.

profile
자바집사의 거북이 수련법

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN