Java - 게시판 프로젝트(7)
2023.05.03 - 2023.05.12
게시판 프로젝트 (7)
유효성 검사
1. Validator
프로젝트 진행 중 회원가입 시 중복된 아이디라던지, 필수 입력 내용 확인 등 유효성 검사가 제대로 실행되지 않았다. 패스트캠퍼스 강의를 다시 듣던 중 그 이유를 알아내게 되었다. 두둥탁
일단 유효성 검사에 대한 지식이 부족하기에 정의와 설명을 한 뒤에 내가 구현한 내용을 설명하려고 한다. 해당 내용들은 블로그(https://midas123.tistory.com/187)를 참고했다.
스프링은 유효성 검사에 사용할 수 있는 Validator 인터페이스를 제공한다. 객체 검정, 에러 메시지 지원 등의 기능을 사용할 수 있다. Validator 인터페이스에서는 supports(), validate() 메서드를 구현할 수 있다.
- supports() : 검증하려는 객체의 타입 검증
- validate() : 유효성 검사 구현
@Override
public boolean supports(Class<?> clazz) {
// return User.class.equals(clazz); // 검증하려는 객체가 User타입인지 확인
return User.class.isAssignableFrom(clazz); // clazz가 User 또는 그 자손인지 확인
}
위에 코드는 내가 UserValidator.java에서 직접 작성한 코드이다. 단순하게 검증하려는 객체의 타입을 검증한다. 이제 코드에서 활용되는 주요 메소드를 소개하려고 한다.
BindingResult와 Errors 인터페이스의 주요 메소드
reject() - 객체에 대한 에러코드 및 메시지, 메시지 인자 전달 rejectValue() - 필드(객체의 프로퍼티)에 대한 에러정보 추가(에러코드 및 메시지, 메시지 인자 전달) boolean hasErrors() - 에러 발생 여부 확인 int getErrorCount() - 에러 갯수 리턴 boolean hasGlobalErrors() int getGlobalErrorCount() |
ValidationUtils의 메소드
rejectIfEmptyOrWhitespace(Errors errors, java.lang.String field, java.lang.String errorCode) errors - the Errors instance to register errors on field - the field name to check errorCode - the error code, interpretable as message key |
이제 유효성 검사하는 부분과 컨트롤러, jsp, 에러 메시지를 설명하려고 한다.
@Override
public void validate(Object target, Errors errors) {
System.out.println("UserValidator.validate() is called");
User user = (User)target;
String id = user.getId();
String pwd = user.getPwd();
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "id", "required");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "pwd", "required");
if(id!=null && !id.trim().isEmpty() && id.length() < 3 || id.length() > 12) {
errors.rejectValue("id", "invalidLength", new String[] {"", "3","12"}, null);
}
if(pwd!=null && !pwd.trim().isEmpty() && pwd.length() < 3 || pwd.length() > 12) {
errors.rejectValue("pwd", "invalidLength.pwd");
}
}
@InitBinder
public void toDate(WebDataBinder binder) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
binder.registerCustomEditor(Date.class, new CustomDateEditor(df, false));
binder.setValidator(new UserValidator()); // UserValidator를 WebDataBinder의 로컬 validator로 등록
}
@GetMapping("/add")
public String register() {
return "registerForm"; // WEB-INF/views/registerForm.jsp
}
@PostMapping("/add")
public String save(@Valid User user, BindingResult result, Model m, HttpServletResponse response) throws Exception {
System.out.println("result=" + result);
System.out.println("user=" + user);
// User객체를 검증한 결과 에러가 있으면, registerForm을 이용해서 에러를 보여줘야 함.
if (!result.hasErrors()) {
// 2. DB에 신규회원 정보를 저장
int rowCnt = userDao.insertUser(user);
if (rowCnt != FAIL) {
return "redirect:/";
}
}
return "registerForm";
}
위의 코드들을 보면, Controller에서 UserValidator를 WebDataBinder의 로컬 validator로 등록하였다. 해당 내용은 save() 메서드가 실행될 때 작동된다. User 객체를 사용할 것이기에 앞에 @Valid를 붙였다. User객체를 검증한 결과 에러가 있으면, registerForm을 이용해서 에러를 보여주었다. 아이디와 비밀번호가 3 이상 12 미만으로 작성될 수 있도록 유효성을 검사했다. 일단 기본적인 유효성만 검사하도록 하였다.
<input class="input-field" type="text" name="id" placeholder="3~12자리의 영대소문자와 숫자 조합">
<div id="msg" class="msg"><form:errors path="id"/></div>
<label for="">비밀번호</label>
<input class="input-field" type="text" name="pwd" placeholder="3~12자리의 영대소문자와 숫자 조합">
<div id="msg" class="msg"><form:errors path="pwd"/></div>
required=필수 항목입니다.
required.user.pwd=사용자 비밀번호는 필수 항목입니다.
required.user.id=사용자 아이디는 필수 항목입니다.
invalidLength.id=아이디의 길이는 {1}~{2}사이어야 합니다.
invalidLength.pwd=비밀번호의 길이는 3~12사이어야 합니다.
<beans:bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<beans:property name="basenames">
<beans:list>
<beans:value>error_message</beans:value> <!-- /src/main/resources/error_message.properties -->
</beans:list>
</beans:property>
<beans:property name="defaultEncoding" value="UTF-8"/>
</beans:bean>
순서대로 registerForm.jsp, error_message.properties, servlet-context.xml이다. 회원가입 폼에는 <form:errors path="id"/>, <form:errors path="pwd"/>를 입력하여 path 속성에 에러코드를 입력했다. 그리고 MessageSource를 스프링 설정에 등록하기 위해 세 번째 코드의 내용을 servlet-context.xml에 추가하였다. 그리고 MessageSource가 가져올 메시지를 담은 프로퍼티 파일을 resources 폴더에 추가하였다.
컨트롤러와 UserValidato.java 파일은 있었으나 error_message.properties가 없었고, servlet-context.xml에 해당 내용을 추가하지 않았어서 오류가 났던 것이다. 왜 파일이 없던 것인지는 잘 모르겠,,
어쨌든 강의를 다시 들으면서 이유를 뚝딱 해결하였고, 유효성 검사에 대해 더 잘 알게 되었다. ㅎㅎ 나름 뿌듯하네!
다음은... 이제 어떤 걸 할지 천천히 고민해야 할 것 같다..!!
