본문 바로가기

개발일지

20231213 - 유효성 검사 클라이언트로 반환하기

회원가입 기능을 구현하면서 유효성 검사를 통해 의도하지 않은 값이 들어올 경우, 메서드가 실행되지 않게 하기로 했다.

@Getter
public class SignupRequestDto {
    @NotBlank(message = "아이디를 입력해주세요.")
    @Pattern(regexp = "^[0-9A-Za-z]*$", message = "아이디는 8~16자 영어 소문자와 숫자만 입력 가능합니다.")
    @Size(min =3, max = 16)
    private String username;

    @NotBlank(message = "비밀번호를 입력해주세요.")
    @Pattern(regexp = "^[!-~]*$",
            message = "비밀번호는 8~16자 영어 대 소문자, 숫자, 특수문자만 입력 가능합니다.")
    @Size(min =4, max = 16)
    private String password;

    @NotBlank(message = "비밀번호 확인을 입력해주세요.")
    private String checkedPassword;

    @Email(message = "옳지 않은 형식 입니다.")
    private String email;
}

 

다음과 같이 Validation 어노테이션과 정규식을 이용해 Dto클래스를 구성해서 유효성 검사를 할 수 있도록 했다. 하지만 컨트롤러단 코드를 구현하면서 어떻게 텍스트로 반환할 것인지 생각을 해야 했다. 처음에는 message가 유효성 검사를 통과하지 못하면 자동으로 출력되는 줄 알았지만 따로 코드를 짜줘야 했다.

// Controller.java
@PostMapping("/signup")
    public ResponseEntity<?> signup(@Valid @RequestBody SignupRequestDto requestDto, Errors errors){
        if(errors.hasErrors()){
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(userService.refineErrors(errors));
        }
        LoginResponseDto loginResponseDto = userService.signup(requestDto);
        return ResponseEntity.status(loginResponseDto.getCode()).body(loginResponseDto.getMsg());
    }

 

우선 Errors 객체를 사용해보기로 했다. 유효성 검사에서 오류가 생긴다면 Errors객체에 담기게 될 것이고, 메서드를 통해 클라이언트에서 확인할 수 있도록 해주었다.

// Service.java
public LinkedHashMap<String, String> refineErrors(Errors errors){
        LinkedHashMap<String, String> error = new LinkedHashMap<>();
        error.put(errors.getFieldError().getField(),errors.getFieldError().getDefaultMessage());

        return error;
    }

 

서비스단에서 작성한 메서드를 살펴보면 Errors에 담겨있는 오류들을 HashMap에 넣어서 반환해준다. 처음에는 HashMap도 리스트에 넣어 발생한 오류 전부를 반환해 주었으나, 실제 사이트에서 가입할 때 여러 가지 오류가 한 번에 출력된 적은 없었던 것으로 기억해서 발생한 오류를 하나씩만 반환하기로 했다. 이렇게 하면 의도한 대로 데이터가 넘어올 때까지 하나씩 오류가 출력되고, 모든 데이터가 알맞게 넘어온다면 정상적으로 회원가입 메서드가 실행이 된다.