본문 바로가기
Programming/Java_Spring

조건부 Validation.

by 곰네Zip 2022. 9. 30.

조건부 Validation.

Validation 애노테이션을 사용하면, 검증하는 코드를 하나하나 다 넣을 필요가 없다.

근데.. 특정한 경우에만 해당 속성을 검증해야 할 필요가 있다.

예를들어.. 어느 사이트에 가입한 후, 회원 정보 수정에서 이메일 주소를 등록해야하는 경우를 예로들자.  

(예를 들기 위함으로. 가입 시점에는 이메일을 등록 못하는 형태라고 가정한다.. 웃기지만.. 심지어 이메일주소가 필수라면 더더욱!)

 

아래와 같이 DTO를 작성했다. (회원정보 수정 시 이메일이 필요하므로..)

@Getter
@Setter
public myDTO{
	@NotEmpty
	private String userId;
    @NotEmpty
    private String userEmail;
}

근데 위에서 언급한 대로, regi email을 넣는 필드가 없었으므로 userEmail은 사용자 등록 시, Validation에서 걸린다! (물론, 가입시 이메일 받으면 되는데.. 그게 맞고.. 여기선 그냥 넘어가자.. 예시를 위함이니까)

 

저 validation중 userEmail에 걸린 @NotEmpty를 사용자 등록시에는 하지 않고, 사용자 정보 갱신시에는 검사하도록 하려면 Validate할 항목에 Groups를 주어야한다. 근데 그 그룹은?

public interface NotTempData{
}

 먼저 위와 같이 마커로 사용할 interface를 하나 만들고 (딱 저거.. 인터페이스 선언만할것)

 DTO에서 validation할 항목에 대해서 적용해주자.

@Getter
@Setter
public myDTO{
	@NotEmpty
	private String userId;
    @NotEmpty(groups = {NotTempData.class, B.class})
    private String userEmail;
}

그리고 Valid를 요청할 Controller는 다음과 같이 애노테이션을 추가해주면 된다.

@Validated //추가
public class MyController{
	...
    @Validated //추가
    @RequestMapping("/My/URL")
    public @ResponseBody Object myURL(
    	@Validated(NotTempData.class) //마커 추가        
        MyDTO param1){
        ...
    }
    
    @RequestMapping("/My/URL2")
    public @ResponseBody Object myURL2(
    	@Valid
        MyDTO param1){
        ...
    }
}

 추가할 곳에 추가해주면 된다.

 myURL이 호출되면 MyDTO의 userId와 userEmail을 validate하고

myURL2가 호출되면 MyDTO의 userId만 validate한다.

 

아.. 그리고 Validated로 발생된 exception은 org.springframework.validation.BindException이 아닌, javax.validation.ValidationException이 발생한다. 그에 따른 예외처리는 아래 포스팅 참고

https://gomnezip.tistory.com/435

 

List에 속한 Class의 Validation.

데이터의 유효성을 검증하기 위한 @Valid애노테이션을 사용할 수 있다. 관련된 내용은 여기. https://gomnezip.tistory.com/421?category=943736 @Valid시 Data Validation시 예외처리 남기기 @Valid 애노테이션을..

gomnezip.tistory.com

 

반응형

댓글