회원가입 기능을 구현하면서 유효성 검사를 통해 의도하지 않은 값이 들어올 경우, 메서드가 실행되지 않게 하기로 했다.
@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도 리스트에 넣어 발생한 오류 전부를 반환해 주었으나, 실제 사이트에서 가입할 때 여러 가지 오류가 한 번에 출력된 적은 없었던 것으로 기억해서 발생한 오류를 하나씩만 반환하기로 했다. 이렇게 하면 의도한 대로 데이터가 넘어올 때까지 하나씩 오류가 출력되고, 모든 데이터가 알맞게 넘어온다면 정상적으로 회원가입 메서드가 실행이 된다.
'개발일지' 카테고리의 다른 글
20231217 - Errors (1) | 2023.12.18 |
---|---|
20231214 - 프로그래머스/42840 (0) | 2023.12.14 |
20231212 - JWT를 Header가 아닌 Cookie로 반환하기 (0) | 2023.12.12 |
20231211 - 백오피스 프로젝트 KPT 회고 (0) | 2023.12.11 |
20231211- QueryDSL사용해보기 (0) | 2023.12.11 |