일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- SQL
- HTML
- 프로그래머스
- 자바
- 캡슐화
- 알고리즘
- CRUD
- github
- DTO
- @builder
- git
- 에러
- stringbuffer
- 상속
- 깃허브
- @AllArgsConstructor
- Python
- 코드업
- 브랜치
- entity
- 기본생성자
- Codeup
- java
- 부트캠프
- 파이썬
- @NoArgsConstructor
- HashSet
- 부스트코스
- lv1
- html tag
- Today
- Total
잉?
[SpringBoot] 회원가입 예외처리 하기(statusCode:400) + 인텔리제이 디버깅 본문
[SpringBoot] 회원가입 예외처리 하기(statusCode:400) + 인텔리제이 디버깅
Jye_647 2023. 8. 1. 20:55회원가입 시 username과 password의 구성이 알맞지 않으면 에러메시지와 statusCode: 400을 Client에 반환하기
요구사항에 맞게 코드를 작성하려 한다.
UserController.java
@PostMapping("/user/signup")
public ResponseEntity<ApiResponseDto> signup(@RequestBody @Valid SignupRequestDto requestDto) {
try{
userService.signup(requestDto);
}catch (IllegalArgumentException e){
return ResponseEntity.badRequest().body(new ApiResponseDto("중복된 username입니다.", HttpStatus.BAD_REQUEST.value()));
}
return ResponseEntity.status(201).body(new ApiResponseDto("회원가입 성공", HttpStatus.CREATED.value()));
}
SignupRequestDto.java
@Pattern(regexp = "^[0-9a-z]{4,10}$",
message = "최소4자 이상, 10자 이하의 알파벳 소문자(a~z), 숫자(0~9)로 구성된 username을 입력해주세요.")
@NotBlank(message = "username을 입력해주세요.")
private String username;
@Pattern(regexp = "^[a-zA-Z0-9!@#$%^&*()_+{}:\"<>?,.\\\\/]{8,15}$",
message = "최소 8자 이상, 15자 이하의 알파벳 대소문자(a~z)(A~Z), 숫자(0~9), 특수문자로 구성된 password를 입력해주세요.")
@NotBlank(message = "password를 입력해주세요.")
private String password;
private UserRoleEnum role;
위의 @Valid 정규표현식을 사용하면 에러 상황일 때 반환 코드가 403 Forbidden이다.
이 상태코드를 400으로 반환해야 한다.
포스트맨을 사용하여 확인해 보았다.
password를 정규표현식에 맞지 않게 보냈을때 403 Forbidden 상태코드가 보인다.
아래는 콘솔에서 보이는 경고 로그이다.
WARN 7524 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MethodArgumentNotValidException: Validation failed for argument [0] in public org.springframework.http.ResponseEntity<com.sparta.blog.ApiResponseDto> co m.sparta.blog.user.controller.UserController.signup(com.sparta.blog.user.dto.SignupRequestDto) with 2 errors: [Field error in object 'signupRequestDto' on field 'password': rejected value []; codes [NotBlank.signupRequestDto.password,NotBlank.password,NotBlank.java.lang.String,NotBlank]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [signupRequestDto.password,password]; arguments []; default message [password]]; default message [password를 입력해주세요.]] [Field error in object 'signupRequestDto' on field 'password': rejected value []; codes [Pattern.signupRequestDto.password,Pattern.password,Pattern.java.lang.String,Pattern]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [signupRequestDto.password,password]; arguments []; default message [password],[Ljakarta.validation.constraints.Pattern$Flag;@4fa2507c,^[a-zA-Z0-9!@#$%^&*()_+{}:"<>?,.\\/]{8,15}$]; default message [최소 8자 이상, 15자 이하의 알파벳 대소문자(a~z)(A~Z), 숫자(0~9), 특수문자로 구성된 password를 입력해주세요.]] ]
DefaultHandlerExceptionResolver가 MethodArgumentNotValidException이 발생했다고 알려준다.
ExceptionHandler를 구현할 것이다.
ExceptionHandler는 해당 클래스에서 에러가 발생했을 때
{MethodArgumentNotValidException.class}가 handleMethodArgumentNotValidException 메서드를 실행 함으로써 에러처리를 공통화하겠다는 뜻이다.
@ExceptionHandler({MethodArgumentNotValidException.class})
public ResponseEntity<ApiResponseDto> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex){
}
이제 안에 해당 메시지가 출력될 때 상태코드는 400으로 반환할 것이야.라는실행 로직을 작성해줘야 한다.
해당 메시지를 가져오기 위해선 안에 값이 어떻게 들어가는지 디버깅을 해본다.
똑같이 포스트맨 보내고 콘솔을 보면 ex → bindingResult → errors → 0번째 → 해당 메시지 우클릭 add to watches
이동된 곳에서 우클릭 edit을 하면 이렇게 경로가 나온다.
@ExceptionHandler({MethodArgumentNotValidException.class})
public ResponseEntity<ApiResponseDto> handleMethodArgumentNotValidException(MethodArgumentNotValidException ex){
ApiResponseDto restApiException = new ApiResponseDto(ex.getBindingResult().getAllErrors().get(0).getDefaultMessage(), HttpStatus.BAD_REQUEST.value());
return new ResponseEntity<>(restApiException, HttpStatus.BAD_REQUEST);
}
이 경로를 msg란에 적어주면 끝.
ApiResponseDto에는 msg와 statusCode 변수가 들어있다.
포스트맨에서 확인해 보면 400을 잘 반환해주고 있다.
'자바(Java) > 스프링부트(SpringBoot)' 카테고리의 다른 글
[SpringBoot] 단위 테스트를 위한 Mockito? 그게 뭔데? (0) | 2023.07.26 |
---|---|
[SpringBoot] 단위 테스트(Unit Tests)는 뭔데? + 사용 이유 (0) | 2023.07.25 |
[SpringBoot] Service단에서의 DTO <--> Entity의 변환. (0) | 2023.07.11 |
[SpringBoot] Entity란? + @Table, @NoArgsConstructor, @AllArgsConstructor (0) | 2023.07.10 |
[SpringBoot] 빌더 패턴의 “toEntity”와 “of” 메서드 (0) | 2023.07.04 |