타입리프 - DTO (데이터 전달객체) 필드명 설정 시 주의점

Jobmania·2023년 5월 22일
0

에러

목록 보기
4/5

스프링부트, 타임리프에서 회원 가입시 아래와 같은 DTO를 사용하는 과정에서 발생 하였던 에러에 대해서 추론해본다.

NotReadablePropertyException: Invalid property 'isAdmin' of bean class [com.example.test.dto.UserCreateForm]: Bean property 'isAdmin' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?

@Data
public class UserCreateForm {

//    private Boolean isAdmin ;
    private boolean isAdmin ;
    private String adminPassword ;

    @Size(min = 3, max = 25)
    @NotEmpty(message = "사용자ID는 필수항목입니다.")
    private String username;

    @NotEmpty(message = "비밀번호는 필수항목입니다.")
    private String password1;

    @NotEmpty(message = "비밀번호 확인은 필수항목입니다.")
    private String password2;

    @NotEmpty(message = "이메일은 필수항목입니다.")
    @Email
    private String email;

    public UserCreateForm(){

    }

}
  <div class="form-check">
        <input type="checkbox" id="admin" th:field="*{isAdmin}" class="form-check-input" onchange="toggleInput(this)">
        <label for="isAdmin" class="form-check-label">관리자 체크</label>
      </div>

boolean 타입을 lombok과 사용할시 문제점이 발생하게 된다.

TemplateInputException이 발생하는 이유는 boolean타입의 isAdmin이 변수 이름에 'is'가 붙어있어 lombok은 isAdmin()자체로 Getter 메소드도 isAdmin()으로 생성. 하지만 Thymeleaf는 보낸 요청을 맵핑하는 과정에서 isLiked라는 필드에 'get'을 붙인 getIsLiked()를 찾을 수 없는 것이다.

즉, isAdmin으로 필드명을 지었다면, isIsAdmin으로 생성되기를 기대하였으나 전혀! 그렇지 않고 isAdmin메소드가 생성된다.

다만 만약 Boolean을 사용한다면 타임리프에서 사용이 가능하다. 왜냐하면 lombok에서 getIsAdmin으로 get()메소드를 생성하기 때문이다.

결론!
Boolean 타입을 사용하거나
boolean타입에서 is...... 란 필드 메소드 사용을 피해야 한다.

profile
HelloWorld에서 RealWorld로

0개의 댓글