728x90

우선 회원가입 jsp파일을 수정하자.

기존의 <input>태그를 이용해 정보를 입력하던 방식에서 spring의 form 태그를 이용해서 입력을 관리하도록 하자.

<form:form action="${root }user/signIn_pro" method="post" modelAttribute="signInUserBean">
	<div class="form-group">
		<form:label path="user_name">이름</form:label>
		<form:input path="user_name" class="form-control"/>
		<form:errors path="user_name" style='color:red'/>
	</div>
	<div class="form-group">
		<form:label path="user_id">아이디</form:label>
		<div class="input-group">
			<form:input path="user_id" class="form-control"/>
				<div class="input-group-append">
					<form:button class="btn btn-dark">중복확인</form:button>
				</div>
		</div>
		<form:errors path="user_id" style='color:red'/>
	</div>
	<div class="form-group">
		<form:label path="user_email">이메일</form:label>
		<form:input path="user_email" class="form-control"/>
		<form:errors path="user_email" style='color:red'/>
	</div>
	<div class="form-group">
		<form:label path="user_nickname">닉네임</form:label>
		<div class="input-group">
			<form:input path="user_nickname" class="form-control"/>
			<div class="input-group-append">
				<form:button class="btn btn-dark">중복확인</form:button>
			</div>
		</div>
		<form:errors path="user_nickname" style='color:red'/>
	</div>
	<div class="form-group">
		<form:label path="user_pw">비밀번호</form:label>
		<form:password path="user_pw" class="form-control"/>
		<form:errors path="user_pw" style='color:red'/>
	</div>
	<div class="form-group">
		<form:label path="user_pw2">비밀번호 확인</form:label>
		<form:password path="user_pw2" class="form-control"/>
		<form:errors path="user_pw2" style='color:red'/>
	</div>
	<div class="form-group">
		<div class="text-md-right">
			<form:button class="btn btn-primary">회원가입</form:button>
			<a href="${root }user/signIn_cancel" class="btn btn-danger">취소</a>
		</div>
	</div>
</form:form>

각 입력값에 대해 유효값 검사를 하자.

UserBean에 가서 각 필드별로 검사 항목을 써준다.

public class UserBean {

	private int user_idx;
	
	@Size(min=2, max=4)
	@Pattern(regexp="[가-힣]*")
	private String user_name;
	
	@Size(min=4,max=20)
	@Pattern(regexp="[a-zA-z0-9]*")
	private String user_id;
	
	@Size(min=4,max=20)
	@Pattern(regexp="[a-zA-z0-9]*")
	private String user_pw;
	
	@Size(min=4,max=20)
	@Pattern(regexp="[a-zA-z0-9]*")
	private String user_pw2;
	
	@Size(min=6,max=30)
	@Pattern(regexp="^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$")
	private String user_email;
	
	@Size(min=2,max=5)
	@Pattern(regexp="[0-9a-zA-Z가-힣]*")
	private String user_nickname;
    
    ...중략

size와 pattern을 검사하기로 한다.

 

UserController에서 signIn_pro에 대한 매핑을 해줌과 동시에 유효값 검사도 하도록 하자.

	@PostMapping("user/signIn_pro")
	public String signIn_pro(@Valid @ModelAttribute("signInUserBean") UserBean signInUserBean, BindingResult result) {
		if(result.hasErrors()) {
			return "user/signIn";
		}
		return "user/signIn_success";
	}

@Valid 를 통해 modelAttribute로 들어온 signInUserBean에 대해서 유효값을 검사한다.

BindingResult에서 에러가 있다면 돌아오고 없다면 가입을 성공시키자.

 

검사를 제대로 하는 것을 확인했고, 이제 에러 메세지를 직접 커스텀하자.

properties 폴더 하위에 error_message.properties 파일을 만든다.

검사하는 방법과 검사하는 개체이름, 개체의 필드를 통해 각 메세지를 세팅할 수 있다.

다음과같이 세팅하고 ServletAppContext에 에러 메세지를 등록하자.

Size.signInUserBean.user_name = 사용자 이름은 2 ~ 4글자여야 합니다.
Size.signInUserBean.user_id = 사용자 아이디는 4 ~ 20글자여야 합니다.
Size.signInUserBean.user_pw = 비밀번호는 4 ~ 20글자여야 합니다.
Size.signInUserBean.user_pw2 = 비밀번호 확인은 4 ~ 20글자여야 합니다.
Size.signInUserBean.user_email = 사용자 이메일은 6 ~ 30글자여야 합니다.
Size.signInUserBean.user_nickname = 사용자 닉네임은 2 ~ 5글자여야 합니다.
Pattern.signInUserBean.user_name = 사용자 이름은 한글만 허용합니다.
Pattern.signInUserBean.user_id = 사용자 아이디는 영어, 숫자만 허용합니다.
Pattern.signInUserBean.user_pw = 비밀번호는 영어, 숫자만 허용합니다.
Pattern.signInUserBean.user_pw2 = 비밀번호는 영어, 숫자만 허용합니다.
Pattern.signInUserBean.user_email = 이메일 양식을 준수하여 주십시오.
Pattern.signInUserBean.user_nickname = 닉네임은 한글, 영어, 숫자만 허용합니다.

 

	@Bean
	public ReloadableResourceBundleMessageSource messageSource() {
		ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
		res.setBasenames("/WEB-INF/properties/error_message");
		return res;
	}

이렇게 메세지를 등록한다.

이대로 실행하면 에러가 발생한다.

왜냐하면 이전에 @PropertySource를 통해 등록한 db.properties와 충돌하기 때문인데, 따라서 아래 코드를 추가해 충돌을 방지한다.

	@Bean
	public static PropertySourcesPlaceholderConfigurer PropertySource() {
		return new PropertySourcesPlaceholderConfigurer();
	}

이제 실행해보면 아래와 같이 제대로 검사함을 알 수 있다.

 

이제 비밀번호와 비밀번호 확인에 대한 검사를 추가하자.

두 비밀번호는 일치해야한다.

validator라는 패키지를 추가하고 UserValidator라는 클래스를 선언하자.

validator라는 인터페이스를 상속받아 함수를 overriding한다.

public class UserValidator implements Validator{

	@Override
	public boolean supports(Class<?> clazz) {
		return UserBean.class.isAssignableFrom(clazz);
	}

	@Override
	public void validate(Object target, Errors errors) {
		UserBean userBean = (UserBean)target;
		if(userBean.getUser_pw().contentEquals(userBean.getUser_pw2())== false) {
			errors.rejectValue("user_pw", "NotEquals");
			errors.rejectValue("user_pw2", "NotEquals");
		}
	}
}

supports는 사용법이 정해져있으니 그대로 쓰면 되고, validate는 우리가 검사하고 싶은 내용을 적는다.

user_pw와 user_pw2가 같은지를 검사해서 다르면 NotEquals라는 이름으로 오류를 검사하게한다.

 

error_message.properties에 아래 메세지를 등록한다.

NotEquals.signInUserBean.user_pw = 비밀번호가 일치하지 않습니다.
NotEquals.signInUserBean.user_pw2 = 비밀번호가 일치하지 않습니다.

 

등록한 메세지와 validator를 사용하기 위해 UserController에 코드를 추가한다.

	@InitBinder
	public void initBinder(WebDataBinder binder) {
		UserValidator validator1 = new UserValidator();
		binder.addValidators(validator1);
	}

initBinder까지 추가하면 추가로 validator가 실행된다.

728x90

+ Recent posts