프로그램은 어떠한 원인으로 인해 오작동 혹은 비정상적으로 종료되는 경우가 있다. 이를 Error
라고 하는데, Error
는 발생 시점에 따라 크게 3가지로 나눌 수 있다.
Error
Error
Error
Java는 발생할 수 있는 Error
를 2가지로 구분한다.
Error
: 프로그램 코드에 의해서 수습될 수 없는 심각한 오류Exception
: 프로그램 코드에 의해서 수습될 수 있는 사소한 오류Java에서는 발생할 수 있는 Error
와 Exception
을 클래스로 정의한다. 구조는 다음과 같다.
Compiler None-Check Exception. 프로그램의 실행 도중 예측 불가능한 방향으로 발생하는 Exception
. 예측이 불가능하기 때문에, Compile 과정에서 예외 처리 코드가 명시되어 있는지 확인하지 않음.
Compiler Check Exception. 프로그램 실행 도중 예외가 발생할 가능성이 높기 때문에, Compile 과정에서 예외 처리 코드가 명시되어 있는지 확인함.
try-catch-finally block
은 Constructor
내부와 Method
내부에서 작성되며, Exception
이 발생했을 때 예외처리를 할 수 있도록 한다.
try {
[예외가 발생할 수 있는 코드]
} catch(ExceptionClass e) {
[예외 처리 로직]
} finally {
[항상 실행되는 로직]
}
try block
내부에는 다양한 예외가 발생할 수 있다. 발생되는 예외에 따라 다른 Exception Handling
을 적용하려면, 다중 catch block
을 통해 구현할 수 있다.
try {
[예외가 발생할 수 있는 코드]
} catch(ExceptionClass1 e1) {
[예외 처리 로직1]
} catch(ExceptionClass2 e2) {
[예외 처리 로직2]
} finally {
[항상 실행되는 로직]
}
💡 참고사항
catch block
은 선언되어 있는 순서대로 실행되며, 앞선catch block
에서Exception
이 발생할 경우 나머지catch block
은 호출되지 않는다.
프로그래머가 강제로 예외를 발생시키는 것.
Method
에서 처리하지 않은 예외를 호출한 곳으로 떠넘기는 것.
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException, CustomSecurityException {
System.out.println("JWTAuthFilter Called");
// Login, SignUp 기능의 경우 해당 Filter 건너뜀.
String uri = request.getRequestURI();
if (uri.equals("/login") || uri.equals("/signup")){
System.out.println("JWT Filter Skipped");
filterChain.doFilter(request, response);
return;
}
// 1. Request에서 토큰 추출
String token = jwtUtil.resolveToken(request, "AccessToken");
// 2. Token 유효성 검사 및 인증
// 2-1. Token 존재 여부 확인
if(token == null) {
System.out.println("There is no Token");
throw new CustomSecurityException(CustomSecurityErrorCode.JWT_NOT_FOUND);
}
// 2-2. Token 유효성 확인
if(!jwtUtil.validateAccessToken(token, request, response)){
System.out.println("Token is invalid");
throw new CustomSecurityException(CustomSecurityErrorCode.INVALID_JWT);
}
// 3. 사용자 인증
Claims info = jwtUtil.getUserInfoFromHttpServletRequest(request);
setAuthentication(info.getSubject());
// 4. 다음 필터로 보냄
filterChain.doFilter(request,response);
}
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
filterChain.doFilter(request, response);
} catch (CustomSecurityException ex){
log.error("JWT 인증/인가 관련 이슈");
setErrorResponse(response, ex);
}
}
기존에 정의된 예외 클래스 외에 필요에 따라 사용자 정의 클래스를 정의하여 사용할 수 있다.
public class CustomException extends RuntimeException {
private final CommonErrorCode errorCode;
}