Login 유효성 검사 추가하기
@Valid 추가
implementation 'org.springframework.boot:spring-boot-starter-validation'
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;
}
}
@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);
}
}
그리고 다음과 같이 에러 배열을 만들어서 넣어주는 에러 핸들링을 작성해주었다.
{
}
다음과 같이 모두 빈 상태로 전송하게 되면
다음과 같이 우리가 반환하고 싶던 에러 리스트를 반환할 수 있게 되었다.
Author And Source
이 문제에 관하여(Login 유효성 검사 추가하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ililil9482/유효성-검사-추가하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)