Back-End/Spring

validation사용하기(단일항목검사)

EverJunior Minjoo 2022. 10. 7. 11:31
이번에는 좀 기억에 남겨둬야하는 예시 인것 같아서 기록을 해두기로 했다... 자세한 설명이나 뭐 이런 저런건 꼭 책을 참고해라 이책 좋은책이다... 보스도 이책 버릴것이 없고 군더더기 없다고 했으니 최고의 칭찬인셈.. 저번 책은 쓰레기라 평했던것에 비해.. 아주 좋은 평이다. (스프링프레임워크첫걸음 - 위키북스 -) 광고는 아니고,, 

개발환경

InteliJ , Gradle, SpringBoot, Lombok , Thymeleaf 사용 .. 이외에도 쓴거 있긴한데 그냥 넘어가겟삼 아 validation 이거 이거때매 기록한다

 


1. 어플리케이션 레이어 생성

- Form 클래스 생성

src/main/java  밑에 com.example.demo 폴더 밑에 form 패키지 만들고 그 밑에 Form클래스를 생성한다.

lombok의 Data어노테이션을 이용해서 getter/setter만들어주고, 유효성 검사어노테이션두개를 각각 걸어준다. 

유효성검사에 걸렸을 경우 에러메시지를 설정하려면, 단일항목검사 어노테이션에 message속성을 추가하고, 에러메시지 내용을 설정한다. 에러메시지 안에 {속성명} 을 사용하면 ㅅ속성값을 넣을수 있다. 이번에 {min} {max}한것 처럼 가능

 

- 컨트롤러 생성

※ 와웅 깜빡하고 컨트롤러 클래스명을 그냥 Controller 로 생성했는데 이러면 안된다. (controller패키지 생성하고 그 밑애 클래스 생성) 그러면 @Controller 로 선언해서 컴포넌트 스캔하게끔 해야하는데 애초에 이 클래스 이름이 Controller이니까 어노테이션이 그냥 심플하게 저렇게 생성되는게 아니고 @뒤로 길고긴 그 임포트 되는 경로가 붙고나서 Controller로 붙고 임포트 문은 안생긴다. 아마 이름이 같아서 그런듯하다.. 주의하자

 

유효성 검사를 하기 위해서는 form-backing-bean의 설정이 필요하다. HTML의 <form>태그에 바인딩되는 Form클래스 인스턴스를 form-backing-bean 이라고 부르고 @ModelAttribute 어노테이션을 사용해서 연결한다.

form-backing-bean 의 초기화는 @ModelAttribute 어노테이션을 부여한 메소드에서 작성한다.

 

☆ 작성방법은 @ModelAttribute어노테이션을 부여하고 HTML 의 <form> 태그에 바인딩할 Form클래스를 초기화 해서 리턴값으로 돌려준다. 

@ModelAttribute어노테이션이 부여된 메소드는 이 클래스의 요청바인딩 메소드가 실행되기 전에 호출되어 요청스코프(request scope)로 Model에 저장된다. Model에 저장될때 명시적으로 일므을 지정하지 않으면, Form클래스의 이름은 소문자 카멜표기법이 적용되 Model에 저장된다.

 

- 뷰 생성(입력화면)

th:object 속성을 설정하고 값으로 Model에 저장된 Form클래스의 소문자 카펠표기로된 이름을 설정한다. Form클래스의 필드와 관계를 설정하기 위해 th:field속성에 *{필드명} 을 설정한다.

th:field 속성 을 이용하면 HTML로 표시되었을때 id속성, name속성, value속성이 생성된다.

 

- 컨트롤러 추가

@Validated 어노테이션을 단일항목검사 어노테이션을 설정한 Form클래스에 부여하면, 유효성 검사가 실행된다.

Form클래스 만들때 각각 필드 두개에다 항목검사용 어노테이션을 부했었으니 그거랑 @Validated를 인수로 넣은 CalcForm 클래스에 부여하면 유효성 검사가 실행되는것인듯

실행한 결과(에러정보)는 BindingResult 인터페이스에 보관된다.

BindingResult 인터페이스의 hasErrors 메소드의 반환값으로 에러의 유무(true/ false)를 확인할수있다. 에러가 발생한 경우, 입력화면entry로 이동한다.

또 유효성 검사를 실행할때 @Validated 어노테이션을 부여한 클래스와 BindingResult인터페이스를 함께 인수로 사용하고, 반드시 @Validated →BindingResult 순으로 명시해서 사용해야한다.

 

- 뷰에 추가(입력화면)

entry 에 추가

에러를 표시하고 싶은 부분에 추가한다.

아직 타임리프 문법이 이해가 잘 가지 않는다....  다시 공부해야지

#fields.hasErrors메소드에서 에러가 발생했는지 판단한다.

#fields.errors메소드에서 에러 메세지를 배열로 돌려주기때문에 th:each속성을 이용해서 표시했다. 여기선 모든 필드의 에러를 받아서 출력하기 때문에#fields.errors메소드의 인수로 * 을 전달했지만, 특정 필드으 ㅣ에러를 받아서 출력하고 싶을때는 인수에 필드명 을 설정하면된다. 

 

- 뷰 생성(확인화면)

[[${calcForm.leftNum}]]+[[${calcForm.rightNum}]]=[[${result}]]

calcForm을 이용해 객체.필드 에 저장된 결과를 표시하고, result에 계산결과를 표시한다.

 

 

출처 : 스프링프레임워크 첫걸음 -위키북스-