inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

Spring boot에서 일반 예외처리와 api예외처리 한번에 하는 좋은 방법 없을까요?

466

백엔드 주니어 개발자

작성한 질문수 23

0

@Slf4j
@ControllerAdvice
@RequiredArgsConstructor
public class ExceptionControllerAdvisor {

    private final HttpServletRequest httpServletRequest;
    private final HttpServletResponse httpServletResponse;

    @ExceptionHandler(RollbackTriggeredException.class)
    public ResponseEntity<ErrorResponse> rollBackException(RollbackTriggeredException e) throws IOException {
        if (httpServletRequest.getRequestURI().startsWith("/api")) {
            int statusCode = e.getStatusCode();

            ErrorResponse body = ErrorResponse.builder()
                    .code(String.valueOf(statusCode))
                    .message(e.getMessage())
                    .validation(e.getValidation())
                    .build();

            return ResponseEntity.status(statusCode)
                    .body(body);
        } else {
            httpServletResponse.sendError(e.getStatusCode());
            return null;
        }
    }
}

spring boot와 thymeleaf를 사용해서 이런식으로 api 요청일 경우 해당 요청 uri의 앞에 api를 넣어서 api가 앞에있으면 ResponseEntity객체를 이용해서 RuntimeException을 상속받은 커스텀 예외(RollbackTriggeredException)을 처리하고, api 가 없다면 HttpServletResponse객체의 sendError 메서드를 사용해서 에러를 발생시킨다음 Spring boot의 예외처리 매커니즘을 통해 에러페이지로 이동하도록 코드를 짜보았습니다.

 

하지만 else부분에 else를 작성해줘야한다는 점이 좀 좋지 않은 코드는 아닐까 하는 생각이들게 되더라고요??

일반예외(페이지 이동하다 예외가 발생했을경우)와 api예외(ajax요청하다 예외가 발생했을 때)를 동시에 처리하는 좋은 방법있으면 알려주신다면 감사하겠습니다.

springboot exception

답변 1

0

인프런 AI 인턴

안녕하세요, 백엔드 개발자 취준생님! 일반 예외처리와 API 예외처리를 한 번에 처리하는 좋은 방법에 대해 알려드릴게요.

Spring Boot에서는 @RestControllerAdvice 어노테이션을 사용하여 일반 컨트롤러와 API 컨트롤러에서 발생한 예외를 모두 처리할 수 있습니다. 이렇게 하면 별도의 분기처리 없이 한 곳에서 모든 예외를 처리할 수 있는 장점이 있어요.

아래는 예시 코드입니다:

@Slf4j
@RestControllerAdvice
@RequiredArgsConstructor
public class ExceptionControllerAdvisor {

    @ExceptionHandler(RollbackTriggeredException.class)
    public ResponseEntity<ErrorResponse> handleRollBackException(HttpServletRequest request, RollbackTriggeredException e) {
        if (isAjax(request)) {
            int statusCode = e.getStatusCode();

            ErrorResponse body = ErrorResponse.builder()
                    .code(String.valueOf(statusCode))
                    .message(e.getMessage())
                    .validation(e.getValidation())
                    .build();

            return ResponseEntity.status(statusCode)
                    .body(body);
        } else {
            throw e;
        }
    }

    private boolean isAjax(HttpServletRequest request) {
        String accept = request.getHeader("accept");
        return accept != null && accept.contains("application/json");
    }
}

@RestControllerAdvice 어노테이션을 사용하여 예외 처리를 위한 공통 Controller Advice를 정의합니다. 그리고 @ExceptionHandler 어노테이션을 사용하여 특정 예외를 처리하는 메소드를 작성합니다.

isAjax() 메소드를 사용하여 현재 요청이 Ajax 요청인지를 확인합니다. 요청이 Ajax 요청일 경우는 API 예외처리를, 일반적인 브라우저 요청일 경우는 예외를 다시 던져서 Spring Boot의 예외 처리 매커니즘에게 처리를 맡기도록 합니다.

이렇게 하면 if-else 구문을 사용하지 않고도 일반 예외와 API 예외를 한 번에 처리할 수 있습니다. 이 방법을 활용하시면 코드의 가독성과 유지보수성을 향상시킬 수 있을 거예요. 감사합니다!

0

백엔드 주니어 개발자

정말 감사합니다!ㅎㅎ

Kotlin과 Java의 현업에서의 활용

0

124

2

SocketException: Connection reset 에러가 뜨지 않습니다

0

786

3

스프링부트,Mysql작업시 빌드

0

275

1

start.spring.io 에서 dependencies 에 아무것도 추가를 안하면

0

419

1

@ConditionalOnMissingBean 관련 질문이 있습니다!

0

293

1

서로를 참조하고 있는 클래스의 예외던지기에 관해

0

290

1

querydsl Projection 성능 문제

0

920

2

h2 Driver 서버 연결 오류가 발생합니다

0

659

1

여러 패키지들 does not exist 오류

0

3581

3

두 테이블에 동일한 PK를 복합키로 사용했을때 JPA 연관관계 매핑

0

1817

2

api 작성중에 enum type 문의 드립니다.

1

1367

1

변경 감지가 일어나는 시점에 대하여 궁금한 점이 있습니다.

5

1621

1

선생님 Restful API 제작 관련 커리큘럼이 궁금합니다.

0

328

1

table 생성오류

0

582

2

application.properties 질문 드립니다!

0

367

1

3강 Swagger 컴파일 에러

0

574

0

에러 java.lang.IllegalStateException at DefaultCacheAwareContextLoaderDelegate.java:132

1

6029

2

setter없이 생성메서드 생성하는 방법

0

408

1

QueryDsl 메소드에 대한 질문있습니다.

0

476

1

[스프링 jdbcTemplate] 6분30초대에 말씀하신 document가 어떤것일까요?

0

305

1

Valid 사용이유

0

412

1

3분 59초에 말씀하신 부분에 대해 궁금한 사항이 있습니다

0

238

1

Junit 테스트관련 질문을 드려요

1

326

1

테스트 에러때문에 질문드립니다.

1

1627

4