@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 타입에 대해 is 접두사를 사용
예: isPrivate 필드는 isPrivate() 메서드로 Getter가 생성된다.
본래는 Xxx
라는 필드 이름에 대해 isXxx
로 하여금 Getter를 만들어낸다. 하지만 필드 이름이 isXxx
일 때 Lombok의 Getter는 isIsXxx
가 아닌 필드이름과 동일하게 isXxx
로 Getter 이름을 설정한다.
Thymeleaf는 JavaBean 표준에 따라 boolean 필드의 Getter를 찾는다.
JavaBean 표준은 다음과 같이 정의된다:
is<FieldName>
: boolean 필드에 대해 가장 먼저 찾는다.get<FieldName>
: is
접두사가 없을 때 찾는다.문제는 is<FieldName>
가 필드 이름과 일치하지 않는 경우이다. Thymeleaf는 필드 이름을 기준으로 is<FieldName>
또는 get<FieldName>
를 호출하려 시도한다.
isPrivate
라는 boolean 필드를 Lombok이 isPrivate()
로 Getter를 생성한다.isIsPrivate()
를 찾으려 하여 충돌이 발생한다.<p th:text="${writeForm.isPrivate}">Is Private: true/false</p>
boolean 필드에 절대 is로 시작하지 않도록 이름을 잘 설정하자.