- 이전 시간에 우리가 구현한 회원가입 로직은 사용자가 알맞지 않은 데이터를 입력했을 때 오류 페이지를 발생시켰습니다.
- 이를 유효성 검사를 통해 오류를 미리 탐지하여 사용자에게 알맞은 오류 메시지를 출력해줄 수 있도록 수정하려고 합니다.
📝 SignupDto
- 이를 위해 우리는 DTO에 다음과 같은 어노테이션을 붙여줄 수 있습니다.
package com.cos.photogram.web.dto.auth;
...
@Data
public class SignupDto {
@Size(min = 2, max = 20) //최소 길이 2, 최대 길이 20
@NotBlank //반드시 입력해야 함
private String username;
@NotBlank
private String password;
@NotBlank
private String email;
@NotBlank
private String name;
...
}
📝 User
- 다음으로
User
객체에서도 아래와 같이 제약조건을 달아줍니다.
package com.cos.photogram.domain.user;
import java.time.LocalDateTime;
...
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class User {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 20, unique = true)
private String username;
@Column(nullable = false)
private String password;
@Column(nullable = false)
private String email;
@Column(nullable = false)
private String name;
...
}
위와 같이 객체에 변화를 준 경우 데이터베이스에 적용시키기 위해서는 모든 테이블을 DROP하고 다시 CREATE해야 합니다. application.yml 파일의 ddl-auto 속성을 create로 설정하고 저장한 뒤 다시 update로 바꾸어줍시다.
📝 Controller
- 컨트롤러에서는 위에서 설정한 조건을 검사하도록 아래와 같이
@Valid
어노테이션과BindingResult
인터페이스를 사용합니다.
package com.cos.photogram.web;
...
@RequiredArgsConstructor
@Controller //IoC, 파일을 리턴하는 Controller
public class AuthController {
...
@PostMapping("/auth/signup")
public String signup(@Valid SignupDto signupDto, BindingResult bindingResult) {
if (bindingResult.hasErrors()) { //검사 결과 유효하지 않은 데이터가 발견된 경우 실행
//오류 메시지를 저장하기 위함
Map<String, String> errorMap = new HashMap<>();
//발견한 오류의 개수에 따라 반복문을 돌며 오류 메시지 저장
for (FieldError error : bindingResult.getFieldErrors()) {
errorMap.put(error.getField(), error.getDefaultMessage());
}
//간단한 메시지와 함께, 위에서 저장한 오류 메시지를 예외 처리 클래스에게 넘겨줌
throw new CustomValidationException("유효성 검사에 실패하였습니다.", errorMap);
}
//SignupDto -> User
User user = signupDto.toEntity();
authService.join(user);
return "auth/signin";
}
}
- 여기서는 유효성 검사에 실패할 경우 Custom Exception을 발생시키도록 하고 있는데, 해당 Exception은 아래와 같이 구현되어 있습니다.
📝 CustomException
- 해당 Exception은 에러 메시지와 에러의 종류를 컨트롤러로부터 전달받아 필드에 저장합니다.
- 해당 필드는 이후 ExceptionHandler에서 전달받아 처리할 것입니다.
package com.cos.photogram.handler.ex;
...
public class CustomValidationException extends RuntimeException {
//객체 구분에 사용
private static final long serialVersionUID = 1L;
private Map<String, String> erorrMap;
public CustomValidationException(String message, Map<String, String> erorrMap) {
super(message);
this.erorrMap = erorrMap;
}
public Map<String, String> getErorrMap() {
return erorrMap;
}
}
📝 ExceptionHandler
- Custom Exception을 전달받아 처리하기 위해서 ExceptionHandler를 생성하여 아래와 같이 구현해주었습니다.
package com.cos.photogram.handler;
...
@RestController
@ControllerAdvice
public class ControllerExceptionHandler {
@ExceptionHandler(CustomValidationException.class) //지정한 예외 발생시 해당 메소드에서 이를 처리
public Map<String, String> validationException(CustomValidationException e) {
return e.getErorrMap();
}
}
- 해당 핸들러는 우리가 만든 Custom Exception이 발생하면, 이를 캐치하여 에러 메시지가 담겨있는
Map
을 반환하도록 되어 있습니다.
@ExceptionHandler 어노테이션을 사용하면 특정 예외가 발생했을 때 이를 감지하여 처리하도록 설정할 수 있습니다.
📝 Result
- 이후 회원가입을 수행하여 유효성 검사에 실패한 경우를 결과로 확인해보면 아래와 같습니다.
'🚗 Backend Toy Project > Photogram' 카테고리의 다른 글
[Photogram] 회원정보 수정 (0) | 2022.07.09 |
---|---|
[Photogram] 로그인 (0) | 2022.07.08 |
[Photogram] 회원가입 - 공통 응답 DTO, Script 만들기 (0) | 2022.07.08 |
[Photogram] 회원가입 - 데이터베이스 저장 (0) | 2022.07.07 |
[Photogram] 회원가입 - Security 설정 (0) | 2022.07.05 |