Login 유효성 검사 추가하기

26752 단어 msamsa

@Valid 추가

implementation 'org.springframework.boot:spring-boot-starter-validation'

Spring Boot에 validation의 의존성을 추가해준다.

@AllArgsConstructor
@Getter
@ToString
public class RequestUser {
    @NotEmpty
    @Length(min = 4, max = 12)
    private String userId;
    @NotEmpty
    @Length(min = 6, max = 12)
    private String pw;
    @NotEmpty
    private String name;
    @NotEmpty
    private String address1;    //우편번호
    @NotEmpty
    private String address2;    //도로명 주소
    @NotEmpty
    private String address3;    //상세 주소
    @NotEmpty
    private String tel;         //전화번호
}

그리고 다음과 같이 validator package에 존재하는 NotEmpty와 Length 조건을 주어 값들을 체크하도록 해놓고

@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/")
@Slf4j
public class UserController {

    private final UserService userService;

    @PostMapping("/join")
    public ResponseEntity<CommonApi<Object>> join(@Valid @RequestBody RequestUser user, BindingResult bindingResult){
        if(bindingResult.hasErrors()){
            log.error(bindingResult.toString());
            throw new RuntimeException("일부러 발생");
        }

        ResponseUser responseUser = userService.join(user);
        CommonApi<Object> response = new CommonApi(CommonEnum.OK, responseUser);
        return ResponseEntity.status(HttpStatus.CREATED).body(response);
    }

}

다음 코드로 실제로 에러가 발생하는지 확인해보자.

{
    "userId" : "",
    "pw" : "test1234",
    "name" : "tester",
    "address1" : "123-321",
    "address2" : "경기도 성남시",
    "address3" : "우리집",
    "tel" : "010-1234-5678"
}

다음과 같이 id를 빼서 보내보자.

놀랍게도 한글로 반환해준다.

@AllArgsConstructor
@Getter
@ToString
public class RequestUser {
    @NotEmpty(message = "아이디는 비어있을 수 없습니다.")
    @Length(min = 4, max = 12, message = "아이디는 4~12 글자입니다.")
    private String userId;
    @NotEmpty(message = "비밀번호는 비어있을 수 없습니다.")
    @Length(min = 6, max = 12, message = "비밀번호는 6~12 글자입니다.")
    private String pw;
    @NotEmpty(message = "이름은 비어있을 수 없습니다.")
    private String name;
    @NotEmpty(message = "우편번호는 비어있을 수 없습니다.")
    private String address1;    //우편번호
    @NotEmpty(message = "주소는 비어있을 수 없습니다.")
    private String address2;    //주소
    @NotEmpty(message = "상세주소는 비어있을 수 없습니다.")
    private String address3;    //상세 주소
    @NotEmpty(message = "연락처는 비어있을 수 없습니다.")
    private String tel;         //연락처
}

하지만 이렇게 message 옵션을 설정해주면 메세지의 내용도 우리 마음대로 변경할 수 있다.

우리가 설정한대로 메세지가 출력됨을 알수 있다. 그럼 이제 errors를 담아서 반환해보도록 Exception를 처리해보자!

🔨ValidErrorApi 생성

@Getter
public class ValidErrorApi<T> extends ErrorApi{
    private T errors;

    public ValidErrorApi(String code, String msg, T errors) {
        super(code, msg);
        this.errors = errors;
    }
}

error를 List로 받을 수 있는 ValidErrorApi를 정의하고 기존의 ErrorApi를 상속받게 한다.

@AllArgsConstructor
@Getter
public class ValidError {
    private String field;
    private String msg;
}

에러 정보를 저장할 객체도 만들어두자

@NoArgsConstructor
@Getter
public class UserException extends CommonException {

    private BindingResult bindingResult;

    public UserException(UserCode uc) {
        super(uc.getCode(), uc.getMsg(), uc.getStatus());
    }

    public UserException(String code, String msg, HttpStatus status) {
        super(code, msg, status);
    }

    public UserException(String code, String msg, HttpStatus status, BindingResult bindingResult) {
        super(code, msg, status);
        this.bindingResult = bindingResult;
    }
    public UserException(UserCode uc, BindingResult bindingResult) {
        super(uc.getCode(), uc.getMsg(), uc.getStatus());
        this.bindingResult = bindingResult;
    }
}

Exception을 작성하고

@RestControllerAdvice
public class CommonAdvice {
    ...
    @ExceptionHandler(UserException.class)
    public ResponseEntity<Object> userExceptionAdvice(UserException ue){

        BindingResult bindingResult = ue.getBindingResult();
        List<FieldError> fieldErrors = bindingResult.getFieldErrors();
        List<ValidError> errorApiList = new LinkedList<>();
        for(FieldError e: fieldErrors){
            String field = e.getField();
            String defaultMessage = e.getDefaultMessage();
            ValidError errorApi = new ValidError(field, defaultMessage);
            errorApiList.add(errorApi);
        }

        ErrorListApi error = new ErrorListApi(ue.getCode(), ue.getMsg(), errorApiList);
        return ResponseEntity.status(ue.getStatus()).body(error);
    }
}

그리고 다음과 같이 에러 배열을 만들어서 넣어주는 에러 핸들링을 작성해주었다.

{
    
}

다음과 같이 모두 빈 상태로 전송하게 되면

다음과 같이 우리가 반환하고 싶던 에러 리스트를 반환할 수 있게 되었다.

좋은 웹페이지 즐겨찾기