23.02,17

Kuno17·2023년 2월 18일
0

@Vaild의 사용법

자바 표준 검증 어노테이션이다. 컨트롤러의 메소드에 작성한다. 컨트롤러에서만 동작
다른 계층에서의 검증이 필요할 때는 @Validated와 결합해야 한다.
@Valid에 의한 예외 클래스는 MethodArgumentNotValidException이다.

@Validated

스프링에서 제공하는 검증 어노테이션이다.
@Validated를 클래스명 위에 작성하고, 유효성을 검증할 메소드에 @Valid를 작성해야 한다.
@Validated에 의한 예외 클래스는 ConstraintViolationException이다.


###t Dto의 유효성검사

@Getter
public class SignupRequestDto {

    @Pattern(regexp ="^[a-z0-9]{4,10}$", message = "아이디는 4자 이상 10자리 미만의 영소문자, 숫자만 사용이 가능합니다.")
    private String username;
    @Pattern(regexp ="^[a-zA-Z\\d`~!@#$%^&*()-_=+]{8,15}$", message = "비밀번호는 8자 이상 15자리 미만의 영대소문자, 숫자만 사용이 가능합니다.")
    private String password;
    private Boolean admin = false;
    
}

유효성 검사를 다음과 같이 진행한다면 Controller에서는 다음과 같이 @Valid를 사용할 수 있다.

Controller의 @valid 와 BindingResult

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/users")
public class UserController {
    private final UserService userService;
    @PostMapping("/signup")
    public ResponseEntity<Object> signup(@Valid @RequestBody SignupRequestDto userRequestDto, BindingResult bindingResult) {
        return userService.signup(userRequestDto,bindingResult);
    }

여기서 BindingResult
스프링이 제공하는 검증 오류 보관 객체이다
데이터에 유효하지 않은 속성이 있다면, 그에 대한 오류 정보가 담긴다.
해당 정보를 컨트롤러에 전달해 오류 페이지를 별도로 처리해 줄 수 있다.

단! Controller에 사용시 반드시 @Valid 뒤에 위치해야 한다.

BindingResult를 통한 예외처리

if (bindingResult.hasErrors()) {
            return ResponseEntity.badRequest() //status : BAD request
              .body(MessageResponseDto.builder()
              .message(bindingResult.getAllErrors().get(0).getDefaultMessage()));//vaild에서 예외 발생시 해당 메시지를 출력한다.
        }

이해하기 쉽지 않은 부분이나 다음과 같이 순서대로 분리해서 생각해 볼 수 있다.
BindingResult는

public interface BindingResult extends Errors

다음곽 같이 Errors 를 상속받는다
Errors 인터페이스는 다음과 같은 메소드를 가진다

public interface Errors {
/**
주어진 Errors 인스턴스의 모든 오류를 이 Errors 인스턴스에 추가합니다.
이것은 Errors 인스턴스를 다른 Errors 인스턴스로 병합하기 위한 반복된 reject(..) 호출을 피하기 위한 편리한 방법입니다.
전달된 Errors 인스턴스는 동일한 대상 개체를 참조하거나 최소한 이 Errors 인스턴스의 대상 개체에 적용되는 호환 가능한 오류를 포함해야 합니다.
매개변수:errors – 병합할 Errors 인스턴스
*/
void addAllErrors(Errors errors);
}

그리고 getDefaultMessage()는 다음곽 같다.

public class DefaultMessageSourceResolvable implements MessageSourceResolvable, Serializable {

public DefaultMessageSourceResolvable(
	@Nullable String[] codes, @Nullable Object[] arguments, @Nullable String defaultMessage) {

		this.codes = codes;
		this.arguments = arguments;
		this.defaultMessage = defaultMessage;
	}
    
    @Override
	@Nullable
	public String getDefaultMessage() {
		return this.defaultMessage;
	}

여기서

profile
자바 스터디 정리 - 하단 홈 버튼 참조.

0개의 댓글