빅토리 코딩
article thumbnail
Published 2023. 3. 17. 16:08
Spring Validation (@Valid, @Validated) Spring
728x90
반응형
전 프로젝트를 할 때 우리가 맡은 부분은 화면단이 었다. 안정화 기간에 오류가 나는것을 수정할려고 찾아보면 api단에 데이터를 정확하게 안준다는것었다... 확인결과 우리쪽에서 api로 던질때 Validation 체크가 정확하게 되어 있지 않아 빈값이나 이상한값이 넘어 갔는데 api에서 그걸 그대로 받아서 저장한것이다.... 그러면서 나는 오류가 정말 많았다.. 이 사태로 느낀점은 Validation는 화면단도 확인하고 뒷단도 무조건 확인해야한다는것을....,,, 해서 spring Validation에 대해서 알아본다.

 

개요

Spring Validation은 Spring Framework에서 유효성 검사 기능다.  Spring Validation을 사용하면 데이터가 정확한지 검증하고 이로 인해 예상치 못한 오류를 방지할 수 있으며, 보다 안정적인 어플리케이션을 개발할 수 있다.

설명

spring validation은 spring-boot-starter-validation 라이브러리를 사용하여 쓴다 검사할 객체나 클래스엔 @Valid, @Validated를 붙여서 사용한다. 두개의 차이점은 적용 대상 이다. @Validated는 메서드, 리턴 값, 클래스 수준에서 사용할 수 있고, @Valid는 메서드 매개변수에서만 사용할 수 있다.

 

구현

1. pom.xml

...
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.8</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
...
	<properties>
		<java.version>11</java.version>
	</properties>
...
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-validation</artifactId>
	</dependency>
      
...

 

2. java 파일

- model(Vo)

일반적으로 많이 사용하는 vaildation

@NotNull : Null 불가

@NotEmpty : Null, 빈 문자열 불가

@NotBlank : Null, 빈 문자열, 스페이스만 있는 문자열 불가

@Size(min= , max= ) : 해당 객체(list,Map 등등) 크기

@Pattern(regex= ) : 정규식

@Max(숫자) : 지정 값 이하
@Min(숫자) : 지정 값 이상

@Email : 이메일 형식만 가능

@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TestVo {

	@JsonProperty("name")
	@Pattern(regexp = "^[ㄱ-ㅎ가-힣]*$", message = "한글이 아닙니다.")
	private String name;

	@JsonProperty("email")
	@Email(message = "email 형식이 아닙니다.")
	private String email;

	@JsonProperty("phone")
	@Pattern(regexp = "/^01([0|1|6|7|8|9]?)-?([0-9]{3,4})-?([0-9]{4})$", message = "핸드폰번호 11자리를 정확히 입력해주세요.")
	private String phone;

	@JsonProperty("test1")
	@NotNull(message = "null이면 안됩니다.")
	private String test1;

	@JsonProperty("test2")
	@NotBlank(message = "blank이면 안됩니다.")
	private String test2;

	@JsonProperty("test3")
	@NotEmpty(message = "empty이면 안됩니다.")
	private String test3;

}

 

- ExceptionHandler

해당 validation에서 나오는 오류는 모두 MethodArgumentNotValidException가 나온다. 해서 해당 Exception이 발생 시 위에서 설정한 메세지를 포함하여 나오게 하면된다.

@Slf4j
@RestControllerAdvice
public class ExceptionAdviceHandler {

	@ExceptionHandler(MethodArgumentNotValidException.class)
	public ResponseEntity<String> jsonParameterEmptyException(MethodArgumentNotValidException e) {

		log.error(e.getMessage());

		BindingResult result = e.getBindingResult();

		String resultString = "";
		if (result.hasErrors()) {
			List<FieldError> list = result.getFieldErrors();
			resultString = "bad request\n";
			for (FieldError fe : list) {
				resultString  +=" Validation error"  +  e.getObjectName()+"." + fe.getField() + "  : " + fe.getDefaultMessage() + "\n";
			}
		}

		return new ResponseEntity<>(resultString, HttpStatus.BAD_REQUEST);
	}
}

 

-Controller

/test 요청시 들어오는 requestParamd은 @Valid로 인해 validation 체크가 된다.

@Slf4j
@RestController
public class TestController {

	@PostMapping(value = "/test")
	public Map<String, Object> test(@RequestBody @Valid TestVo param) throws Exception {

		log.debug("param : " +  param);
		Map<String, Object> result = new HashMap<>();

		result.put("resultKey","resultValue");

		return result;

	}
    
 }

해당 /test에 담기는 param을 이상하게 넣으면

Handler에서 설정내용으로 String이 날라온다.!

 

https://github.com/victory940209/springValidation.git

 

GitHub - victory940209/springValidation

Contribute to victory940209/springValidation development by creating an account on GitHub.

github.com

 

728x90
반응형

'Spring' 카테고리의 다른 글

Srping AOP 설정(LogAspect)  (0) 2023.03.28
Swagger 3.x 와 spring doc [2]  (0) 2023.03.15
Swagger 3.x 와 spring doc [1]  (0) 2023.03.14
profile

빅토리 코딩

@빅토리 코딩

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그