Spring Thymeleaf 환경에서 개발을 하다 간단한 에러를 겪어 이를 공유해보고자 합니다.

평소와 다름없이 필요한 Entity를 만들고 (문제 상황에 집중하기 위해 간단히 구현합니다.)

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Post {
  private boolean isLiked;
}

컨트롤러에 PostMapping을 추가한 뒤

@PostMapping("/post/like")
public String setLike(Post post) {
  /* Post like process */
  return "redirect:/main";
}

Thymeleaf View에서 Form 요청을 보냈습니다.

<form th:object="${post}" th:action="@{/post/like}" th:method="post">
    <input type="text" th:field="*{isLiked}">
</form>

당연히 setLike() 핸들러에 like가 저장된 Post 객체가 맵핑될거라고 예상했지만

Bean property 'isLiked' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

갑자기 발생한 에러에 당황했습니다. 혹시 뭐가 문제인지 아시겠나요?

다행히 에러 메시지를 읽어보니 Post의 Getter를 참조해서 객체를 맵핑하는데 isLiked 필드에 해당하는 Getter를 찾지 못해 발생한 에러인 것 같습니다. 하지만 Post 객체에 Lombok @Getter 애노테이션을 달아 주었는데도 왜 이런 에러가 발생했을까요?

Lombok의 Getter는 일반적으로 'get'+'변수이름()' 이라는 규칙으로 이름이 정해지는데 boolean의 경우 'get'이 아닌 'is'+'변수이름()'로 생성됩니다. 그런데 이미 변수 이름에 'is'가 붙어있어 Getter 메소드도 isLiked()로 생성된 것입니다.

하지만 Thymeleaf에서 보낸 요청을 맵핑하는 과정에서 isLiked라는 필드에 'get'을 붙인 getIsLiked()를 찾는데 실패하고 위의 에러를 발생시켰습니다.

확인을 위해 Thymeleaf의 th:field 값을 liked로 바꾸거나 Post에 getIsLiked() getter를 추가하면 의도한대로 동작하는 것을 볼 수 있습니다.

따라서 Lombok을 사용할 때는 필드의 타입에 따라 이런 상황이 발생할 수 있다는 것을 인지하면서 코딩해야 할 것 같습니다.