상세 컨텐츠

본문 제목

스프링 에러처리 @Valid validation @size 등 사용법 및 예제 에러 어노테이션

카테고리 없음

by shika 2022. 4. 3. 11:34

본문

스프링에서 파라미터 에러처리를 하는 어노테이션에 대해서 알아보도록 하자.

 

오늘 알아볼것은 @Valid 이다.

 

@Valid는 우선 컨트롤러 파라미터 안에 넣어주면서 사용하게 된다

@PostMapping("/join_pro")
//유효성검사를 위해 @Valid 어노테이션 추가
//유효성검사의 결과를 담고있는 BindingResult도 파라미터에 추가해준다
public String join_pro(@Valid @ModelAttribute("joinUserBean")UserBean joinUserBean, BindingResult result) {
    if(result.hasErrors()) {
        return "user/join";
    }
    return "user/join_success";
}

이런식으로 말이다.

 

@Valid는 나 @Valid와 반응하는 어노테이션과 에러 처리할꺼야 ! 라는 뜻이고

BindingResult는 @Valid로 유효성 검사를 한것의 결과값을 담고있는 객체이다.

 

그래서 if문에서 result.hasErrors() 로 에러가 있는지 없는지를 확인하는 것이다.

 

일단 java.validation 어노테이션 관련 친구들은 밑에 사진에서 살펴보자

 

나는 여기에서의 @Size와 @Pattern을 사용할 것이다.

 

public class UserBean {
	private int user_idx;
	//valid어노테이션과 반응(에러처리하는것)
	@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;
    }

에러처리 어노테이션으로 프로퍼티위에 어노테이션을 선언해서 사용하면 된다.

쉽게 사이즈는 4 ~ 20 자리에 들어와야하고

패턴은 영문이랑 숫자만 되고 이런식이다.

 

이제 valid검증처리에 대한 기본적인 세팅은 끝났고

검증에 대한 에러가 발생했을 때 에러메세지를 내가 설정해주자.

 

난 properties파일을 통해 valid에 대한 에러관련 메세지를 설정해줄것이다.

Size.joinUserBean.user_name = 사용자이름은 2~4글자여야 합니다.
Size.joinUserBean.user_id = 사용자이름은 2~4글자여야 합니다.
Size.joinUserBean.user_pw = 비밀번호는 4 ~ 20글자여야 합니다

Pattern.joinUserBean.user_name = 한글만 입력해야합니다.
Pattern.joinUserBean.user_id = 영문 , 숫자만 입력해야합니다.
Pattern.joinUserBean.user_pw = 영문 , 숫자만 입력해야합니다.

이런식으로 말이다.

 

여기서 주목할 것이 있다.

보통 Size.joinUserBean.user_id 이렇게 . 을 통해서 3개의 구조로 나뉜다.

자세히 살펴보면

검증어노테이션명 . 커멘드객체지정이름 . 프로퍼티이름 

이렇게 설정되게 된다.

 

만약 @Email 어노테이션을 사용하고 내가 보낸 커멘드객체이름이 aa이고 프로퍼티명이 email_name이면

Email.aa.email_name 이 될것이다.

그후 Email.aa.email_name = 이메일 이름이 틀렸어요 형님

이렇게 내가 원하는 에러메세지를 지정해주면 된다.

 

아 또 중요한것이

Vaild와 설정한 proeperites파일을 사용하려면 ServletAppContext.java 에 쓰겠다고 @Bean을 등록해주어야한다

등록방법은 

//에러 어노테이션을 위한 설정
//@Vaild 등을 사용하려면 밑에 메소드를 선언해야 한다.
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
    ReloadableResourceBundleMessageSource res = new ReloadableResourceBundleMessageSource();
    res.setBasenames("/WEB-INF/properties./error_message");
    return res;
}

바로 이렇게 ReloadableResourceBundleMessageSource의 객체를 만들고

proeperties파일의 위치를 지정해주면 된다.

 

하지만 문제가 하나 있다

 

바로 우리는 이미 db설정을 위해서 db.name db주소값 등을 이미 properties파일에서 받았다는 것이다.

 

지금의 properties파일을 설정해주면

properties파일이 2개가 넘어가게 되는데

 

그럴때는 오류가 발생하므로 2개이상 사용하려면 또 Bean을 설정해주어야한다.

그때는

//밑의 @Beann ReloadableResourceBundleMessageSource를 위해서 설정하는것
//위에 이미 db를 위한 properties파일을 어노테이션 설정했는데 또 밑에처럼 properties파일을 설정하면 에러 발생함
//이렇게 2개 이상의 어노테이션을 사용할때는 지금의 @Bean을 선언해주면 2개를 사용할 수 있다.
@Bean
public static PropertySourcesPlaceholderConfigurer PropertySourcesPlaceholderConfigurer() {
    return new PropertySourcesPlaceholderConfigurer();
}

그때는 PropertySourcesPlaceholderConfigurer 를 @Bean으로 지정해주자.

그렇게 된다면 2개 이상의 properties파일을 사용할 수 있게 된다.

 

사실 처음 하기에는 복잡한 부분이 존재하는 것 같다.

그래도 그냥 따라하자...

 

댓글 영역