[Spring Boot] SpringBoot Validation 사용 시 유의사항

Woo Yong·2023년 5월 18일
1

Spring

목록 보기
2/15

SpringBoot를 이용하여 Q&A게시판 프로젝트 진행 시 발생한 이슈에 대해 정리한 내용입니다.


질문 생성 시, form 데이터 값들이 공백, 빈 문자열, null값이 저장되는 것을 방지하기 위해서 SpringBoot Validation을 이용하기 위해 QuestionForm 객체를 생성하였습니다.

그리고 @Valid 어노테이션을 이용해 QuestionForm의 값을 유효성 검증을 진행하는 코드를 작성했습니다.


< question_create.html코드 >

그리고 localhost:8080/question/create 경로로 접속한다면 ??

Caused by: java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'questionForm' available as request attribute. 문구가 출력이 된다. 그리고 오류 내용을 읽어보면 questionForm이 없다고 하는 것 같았다.

@Valid 어노테이션이 바인딩이 안된 것인지? 아니면 타입스크립트 문법을 잘못 사용했는지? 등 코드를 변경해보았다. 하지만 QuestionForm에 바인딩도 잘되었고, 타입스크립트 문법에도 문제가 없었다.

📌 해결방법

❗️문제점은 /question/create 경로를 통해 question_create.html에 접근할 경우에는 QuestionForm 객체가 전달되지 않아서 question_create.html에서 questionForm을 사용할 수 없어서 Exception이 발생한 것 이었다.

즉, question_create.html에 접근하는 방법이 총 2가지인 것이다.

  • 1./qeustion/create
  • 2./question/doCreate에서 bindingResult.hasErrors() == true일 경우

    그러므로 /qeustion/create 경로에 대해서도 매개변수에 QuestionForm을 기본 값으로 넣어주면 되는 것이다.
    정상적으로 /question/create 경로로 접속이 가능해진다... 생각보다 간단한 문제였다..
    앞으로는 해당 html파일에 사용되는 객체가 잘 전달되고 있는지 확인하는 습관을 들여야겠다.

📌 추가적으로 배운점

해당 문제를 해결했을 때, 굉장히 궁금한 점이 생겼었다. 그리고 이걸 알았다면 해당 문제를 금방 해결했을 수도 있을 것이라고 생각했다.

SpringBoot를 공부하면서 Controller 메소드의 매개변수에 객체가 있을 경우 사용자가 요청 시 전달하는 값을 자동으로 매핑해준다고 알고 있었다. 그리고 Model 객체를 통해 attribute메소드를 통해 view단으로 model을 전달하는 방식으로 코드를 작성하고있었다.

그래서 /question/create 경로에는 QuestionForm 객체의 변수(subject, content)가 전달되지 않기 때문에 매핑이 안된다고 생각하고 있었다.

참고자료를 통해 @ModelAttribute어노테이션이 붙거나, 파라미터 타입이 SimpleValueType(원시타입, Wrapper타입)이 아니라면 바인딩을 진행하게 된다는 것을 알게되었다.

따라서, /question/create 경로의 매개변수에 QuestionForm 추가를 통해 해결할 수 있었다.

profile
Back-End Developer

0개의 댓글