예외처리
먼저 exceptionhandler 라는 패키지와
우리가 원하는 예외들을 담을수 있게
common/exception 패키지 두개를 만들자.
exceptionhandler 에는 두개의 클래스가 있다.
@Slf4j
@RestControllerAdvice
@Order(value = Integer.MIN_VALUE)
public class ApiExceptionHandler {
@ExceptionHandler(value = ApiException.class)
public ResponseEntity<Object> apiException(
ApiException apiException
){
log.error("",apiException);
var errorCode = apiException.getErrorCodeIfs();
return ResponseEntity
.status(errorCode.getHttpStatusCode())
.body(
Api.ERROR(errorCode,apiException.getErrorDescription())
);
}
}
@Slf4j
@RestControllerAdvice
@Order(value = Integer.MAX_VALUE) //가장 마지막에 실행 적용
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ResponseEntity<Api<Object>> exception(
Exception exception
){
log.error("",exception);
return ResponseEntity
.status(500)
.body(
Api.ERROR(ErrorCode.SERVER_ERROR)
);
}
}
@Getter
public class ApiException extends RuntimeException implements ApiExceptionIfs{
private final ErrorCodeIfs errorCodeIfs;
private final String errorDescription;
public ApiException(ErrorCodeIfs errorCodeIfs){
super(errorCodeIfs.getDescription());
this.errorCodeIfs=errorCodeIfs;
this.errorDescription = errorCodeIfs.getDescription();
}
public ApiException(ErrorCodeIfs errorCodeIfs, String errorDescription){
super(errorDescription);
this.errorCodeIfs=errorCodeIfs;
this.errorDescription =errorDescription;
}
public ApiException(ErrorCodeIfs errorCodeIfs, Throwable tx){
super(tx);
this.errorCodeIfs=errorCodeIfs;
this.errorDescription = errorCodeIfs.getDescription();
}
public ApiException(ErrorCodeIfs errorCodeIfs, Throwable tx, String errorDescription){
super(tx);
this.errorCodeIfs=errorCodeIfs;
this.errorDescription = errorDescription;
}
}
public interface ApiExceptionIfs {
ErrorCodeIfs getErrorCodeIfs();
String getErrorDescription();
}
다음으로 인터셉터 등록을 해줘야 된다.
먼저 config 패키지에 web 패키지를 만들고
WebConfig 만든다음 아래와 같이 코드를 작성해준다.
WebMvcConfigurer 이놈이 있으면 검증한다는 뜻이다.
@RequiredArgsConstructor
@Configuration
public class WebConfig implements WebMvcConfigurer {
private final AuthorizationInterceptor authorizationInterceptor;
private List<String> OPEN_API = List.of(
"/open-api/**"
);
private List<String> DEFAULT_EXCLUDE = List.of(
"/",
"favicon.ico",
"/error"
);
private List<String> SWAGGER = List.of(
"/swagger-ui.html",
"/swagger-ui/**",
"/v3/api-docs/**"
);
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authorizationInterceptor)
.excludePathPatterns(OPEN_API)
.excludePathPatterns(DEFAULT_EXCLUDE)
.excludePathPatterns(SWAGGER);
}
}
authorizationInterceptor 이놈의 코드는 아래와 같다.
@Slf4j
@RequiredArgsConstructor
@Component
public class AuthorizationInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("Authorization Interceptor url : {}", request.getRequestURI());
//WEB , chrome 의 경우 GET, POST OPTIONS = pass
if(HttpMethod.OPTIONS.matches(request.getMethod())){
return true;
}
//js, html, png, resource 를 요청하는 경우 =pass
if(handler instanceof ResourceHttpRequestHandler){
return true;
}
//ToDo header 검증
return true;
}
}
'JAVA > 배달웹 프로젝트' 카테고리의 다른 글
5. Jpa 를 이용한 UserEntity 생성 및 공통 annotation 생성 (0) | 2024.06.29 |
---|---|
2. db BaseEntity 생성 및 Config Json Swagger 등 (0) | 2024.06.28 |
1. 멀티모듈 및 grade 환경설정 (0) | 2024.06.28 |