상세 컨텐츠

본문 제목

스프링 Validator 내가 만들어서 사용하는 방법

카테고리 없음

by shika 2022. 4. 3. 14:18

본문

Validator는 @Valid 어노테이션을 사용해서 쓰는 파라미터 검증기?이다.

 

그런데 @Valid와 반응하는것을 내가 생성할 수 도 있다.

 

예를 들어 프로퍼티 위에 사용하는

@Size(min=2, max=4)
@Pattern(regexp = "[가-힣]*")
private String user_name;

이 경우 사이즈가 2 ~ 4 사이이고 한글만 사용하고 이런것인데

 

예를 들어 비밀번호와 비밀번호 확인이 서로 같을때만 회원가입이 가능하고

둘이 다를때는

에러 메세지를 출력한다고 쳐보자.

 

하지만 이경우에는

알맞은 어노테이션이 없다.

 

그래서 내가 원하는대로 어노테이션을 생성해주어야 한다.

 

그렇다면 이제 그 방법에 대해서 알아보자.

먼저 Validator를 구현한 클래스를 하나 생성해주어야 한다.

public class UserValidator implements Validator {
	// 구현한 Validetor종류가 여러가지인데 org.springfamework.validation 를 골라주도록 하자
	// 밑에 2개의 메소드는 알아서 나온다.

	@Override
	public boolean supports(Class<?> clazz) {
		// 밑에 코드는 정해져있는것이므로 그냥 이렇게 쓰자.
		// return 바로뒤에 클래스만 내가 만든것으로 바꾸면 된다.
		return UserBean.class.isAssignableFrom(clazz);
	}

	@Override
	public void validate(Object target, Errors errors) {
		// TODO Auto-generated method stub
		UserBean userBean = (UserBean)target;
		
		if(userBean.getUser_pw().equals(userBean.getUser_pw2()) == false) {
			errors.rejectValue("user_pw", "NotEquals");
			errors.rejectValue("user_pw2", "NotEquals2");
		}
	}

바로 이런식으로 말이다 implements

 

그리고 메소드를 자동임포트? 시켜주면 2개의 메소드가 자동으로 튀어나온다.

여기서 supports메소드는 그냥 외워서 사용하는것 같고(return 뒤의 클래스명만 내가 변경해야한다)

 

validate메소드가 이제 내가 본격적으로 작성해야 되는데

자바 메소드로 비밀번호가 다를 때를 if문으로 구현하고

errors.rejectValue("user_pw", "NotEquals");
errors.rejectValue("user_pw2", "NotEquals2");

이렇게 내가 validator 명을 지정해주자.

그렇게 되면 오른쪽에 값이 마치

@Size 처럼 @NotEquals 가 새로 생성되었다고 생각하면 되고

왼쪽값에는 필드명을 써주자.

 

properties파일에도

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

이런식으로 추가해주면 된다.'

 

다 완료한다면

이제 비밀번호가 일치하지 않을 때 바로 위의 메세지가 출력되게 될 것이다.

 

 

이런식으로 말이다.

 

++추가로 중요한 사항을 언급하지못했다.

내가 만든 Validator를 사용하기 위해서는 꼭 @InitBinder 어노테이션을

추가시켜주어야 한다.

어디에다가?

컨트롤러 안에다가 @GetMapping 이런데 밑에다가

추가적으로 @InitBinder 어노테이션을 사용해주도록 하자.

바로 이렇게 말이다

//내가만든 Vaildator를 사용하기 위해서 사용
	@InitBinder
	public void initBinder(WebDataBinder binder) {
		UserValidator validator1 = new UserValidator();
		binder.addValidators(validator1);
	}

댓글 영역