Spring Boot Validation

박민주·2024년 1월 10일
0

Validation이란?

Validation이란 프로그래밍에 있어서 가장 필요한 부분 입니다. 특히 java에서는 null 값에 대해 접근 하려고 할때 null pointer exception이 발생함으로, 이러한 부분을 방지하기 위해서 미리 검증을 하는 과정을 Validation이라고 합니다.

단순하게는 아래와 같은 코드를 보면 null값이나 0이 들어오는 조건을 거르는 코드를 작성해줘야한다.

public void run(String account, String pw, int age) {
	if(account == null || pw == null) {
    	return
    }
    
    if(age == 0) {
    	return
    }
    
    // 정상 logic
}

만약 비슷한 조건들이

참고사항

  1. 의존성
  implementation 'org.springframework.boot:spring-boot-starter-validation'
  1. bean validation spec
    https://beanvalidation.org/2.0-jsr380/

  2. 핸드폰 번호 정규식
    "^\d{2,3}-\d{3,4}-\d{4}$

코드

public class User {
    private String name;
    private int age;
    @Email
    private String email;
    private String phoneNumber;
    
    // getter, setter, toString
}

오류사항을 검사하고 싶은 객체에 @Valid 어노테이션을 붙여주면 Validation 어노테이션을 사용 할 수 있다.
Controller의 user메소드에서 User객체에 @Valid를 붙여주고
User클래스의 변수 email에 @email을 붙여주었다.

@RestController
@RequestMapping("/api")
public class ApiController {

    @PostMapping("/user")
    public User user(@Valid @RequestBody User user) {
        System.out.println(user);        
        return user;
    }
}

위와 같이 작성한 뒤 body에 json을 작성하여 요청을 보내면

2024-01-09T17:09:44.965+09:00 WARN 25480 --- [nio-9090-exec-2] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public com.example.validation.dto.User com.example.validation.validation.ApiController.user(com.example.validation.dto.User): [Field error in object 'user' on field 'email': rejected value [adadsf]; codes [Email.user.email,Email.email,Email.java.lang.String,Email]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [user.email,email]; arguments []; default message [email],[Ljakarta.validation.constraints.Pattern$Flag;@2451193a,.*]; default message [올바른 형식의 이메일 주소여야 합니다]] ]

위와 같은 형식의 에러가 뜬다. @email을 붙인 변수의 값이 형식에 맞지 않기 때문이다. 하지만 이렇게 확인하기엔 보기가 어렵다.

	@PostMapping("/user")
    public ResponseEntity user(@Valid @RequestBody User user, BindingResult bindingResult) {
        if(bindingResult.hasErrors()) {
            StringBuilder sb = new StringBuilder();
            bindingResult.getAllErrors().forEach(objectError -> {
                FieldError field = (FieldError) objectError;
                String message = objectError.getDefaultMessage();

                sb.append("field : " + field.getField() + "\n");
                sb.append("message : " + message);

            });

            return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(sb.toString());
        }
        System.out.println(user);
        return ResponseEntity.ok(user);
    }

user메소드에 BindingResult 객체를 파라미터로 받아주었다. 만약 에러가 있다면 field와 message를 body에서 보여주도록 해보았다.

저 코드를 실행하고 내가 지정한 Validation에 맞지않은 요청을 준다면

어떤 field에 어떤 문제가 있는지를 body에 담아서 보여준다.

profile
개발자 되고싶다..

0개의 댓글