티스토리 뷰
728x90
반응형
스프링부트에서 exception을 처리하는 방법을 알아보자
순서
- 에러코드 정리를 enum 클래스로 작성하여 간결하게 만듭니다.
- Exception 발생시 응답하는 에러 정보 클래스 작성
- 사용자 정의 Exception 클래스 작성
- Exception 발생시 전역으로 처리할 Exception Handler 작성
- 로그인 시 아이디 및 패스워드 불일치 Exception 발생
- 결과 확인
에러코드 정리 Enum 클래스 작성
public enum ErrorType {
UsernameOrPasswordNotFoundException (400, "아이디 또는 비밀번호가 일치하지 않습니다.", HttpStatus.BAD_REQUEST),
UNAUTHORIZEDException (401, "로그인 후 이용가능합니다.", HttpStatus.UNAUTHORIZED),
ExpiredJwtException(444, "기존 토큰이 만료되었습니다. 해당 토큰을 가지고 get-newtoken링크로 이동해주세요.", HttpStatus.UNAUTHORIZED),
ReLogin(445, "모든 토큰이 만료되었습니다. 다시 로그인해주세요.", HttpStatus.UNAUTHORIZED),
;
@Getter
private int code;
@Getter
private String description;
@Getter
private HttpStatus httpStatus;
ErrorType(int code, String description, HttpStatus httpStatus) {
this.code = code;
this.description = description;
this.httpStatus = httpStatus;
}
}
Exception 발생시 응답하는 에러 정보 클래스 작성
@Getter
@AllArgsConstructor
public class ErrorResponse {
private int code = HttpStatus.BAD_REQUEST.value();
private Object error;
}
사용자 정의 Exception 클래스 작성
- RuntimeException을 상속받는 사용자 정의 Exception 클래스를 작성합니다.
- 매개 변수가 있는 생성자를 만들어 Enum 클래스를 매개변수로 전달하여 생성자 주입을 받습니다.
@Getter
public class AuthenticationException extends RuntimeException{
private final ErrorType errorType;
public AuthenticationException(ErrorType errorType) {
this.errorType = errorType;
}
}
Exception 발생시 전역으로 처리할 Exception Handler 작성
- @RestControllerAdvice 또는 @ControllerAdvice, @ExceptionHandler 어노테이션을 이용하여 Exception 발생시 적절한 에러 응답을 생성하여 반환합니다.
@ControllerAdvice
public class ExceptionController {
/**
**** 로그인시 아이디 또는 비밀번호가 일치하지 않는 예외가 발생했을 때
**/
@ExceptionHandler(AuthenticationException.class)
@ResponseBody
public ResponseEntity<ErrorResponse> handleAuthenticationException(AuthenticationException ex){
ErrorResponse errorResponse = new ErrorResponse(ex.getErrorCode().getCode(), ex.getErrorCode().getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
로그인 시 아이디 및 패스워드 불일치 Exception 예외 처리
로그인 컨트롤러 클래스
@RequestMapping("/auth")
@RestController
@RequiredArgsConstructor
public class AuthController {
private final AuthService authService;
@PostMapping("/login")
public ApiResponse login(@RequestBody @Valid AuthDto authDto) {
return authService.login(authDto);
}
}
AuthDto 클래스
@Data
public class AuthDto {
@NotBlank
@ApiModelProperty(value = "아이디", example = "test", required = true)
private String userId;
@NotBlank
@ApiModelProperty(value = "비밀번호", example = "1234", required = true)
private String userPwd;
}
AuthService 클래스
- 유저의 아이디 및 비밀번호가 일치하지 않을 경우 catch 블럭으로 이동하여 예외를 발생시킵니다.
- JWT 토큰 발행이 궁금하시다면 스프링 시큐리티-JWT 연동 >> 이동
- Exception에 대한 전역처리가 궁금하시다면 Exception 전역처리 >> 이동
@Service
@RequiredArgsConstructor
public class AuthService {
private final JwtProvider jwtProvider;
private final AuthenticationManager authenticationManager;
private final AuthRefreshTokenMapper authRefreshTokenMapper;
public ApiResponse login(AuthDto authDto) {
ResponseMap result = new ResponseMap();
try {
authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(authDto.getUserId(), authDto.getUserPwd())
);
String accessToken = jwtProvider.createJwtToken(authDto.getUserId());
String refreshToken = jwtProvider.createRefreshToken(authDto.getUserId());
authRefreshTokenMapper.insertRefreshToken(authDto.getUserId(), accessToken, refreshToken);
result.setResponseData("accessToken", accessToken);
} catch (Exception e) {
throw new AuthenticationException(ErrorType.UsernameOrPasswordNotFoundException);
}
return result;
}
}
결과 확인
정상적으로 로그인이 된 경우
아이디 또는 패스워드가 일치하지 않는 경우
728x90
반응형
'JAVA > SpringBoot' 카테고리의 다른 글
Spring boot - log4j2 를 사용하여 로그남기기 (0) | 2022.03.11 |
---|---|
Spring boot - Spring Security에 대하여 (0) | 2022.02.22 |
Spring boot - security-jwt 연동과 흐름(feat.AccessToken, RefreshToken) (10) | 2021.12.25 |
Spring boot - @Valid, @ControllerAdvice를 사용하여 유효성 검사 (0) | 2021.12.11 |
Spring boot - @ControllerAdvice, @ExceptionHandler를 사용하여 전역 예외처리 (0) | 2021.12.11 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- redis sorted set
- spring boot redis 대기열 구현
- transactional outbox pattern
- 레이어드 아키텍처란
- spring boot 엑셀 다운로드
- spring boot redisson destributed lock
- space based architecture
- pipeline architecture
- 람다 표현식
- polling publisher spring boot
- java userThread와 DaemonThread
- 트랜잭셔널 아웃박스 패턴 스프링부트
- 트랜잭셔널 아웃박스 패턴 스프링 부트 예제
- spring boot excel download oom
- spring boot redisson 분산락 구현
- pipe and filter architecture
- redis sorted set으로 대기열 구현
- transactional outbox pattern spring boot
- 서비스 기반 아키텍처
- redis 대기열 구현
- spring boot excel download paging
- 공간 기반 아키텍처
- @ControllerAdvice
- service based architecture
- microkernel architecture
- spring boot poi excel download
- 자바 백엔드 개발자 추천 도서
- spring boot redisson sorted set
- java ThreadLocal
- JDK Dynamic Proxy와 CGLIB의 차이
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함