개발공부/SPRING

[SPRING] 공통 Response와 Exception Handler 관리하기

키크니개발자 2023. 7. 2. 18:49

 

안녕하세요!

키크니 개발자 입니다. 🦒

 

처음 프로젝트를 셋팅하고 개발하기 전에 공통 Response를 구성하고, Exception Handler 설정을 하는데 이 부분에 대해 기록하면 좋을 것 같아 글로 남깁니다! 😁

 

 

Spring Boot 프로젝트를 처음 생성하게 되면,

아래와 같이 공통 Response 데이터를 설정해줍니다.

 

Response.class

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class Response<T> {
    private String resultCode;
    private T result;

    public static <T> Response<T> success() {
        return new Response<T>("SUCCESS", null);
    }

    public static <T> Response<T> success(T result) {
        return new Response<T>("SUCCESS", result);
    }

    public static Response<Void> error(String resultCode) {
        return new Response<Void>(resultCode, null);
    }
}

 

Exception을 공통으로 처리해주기 위해서는 보통 @RestControllerAdvice를 사용합니다.

해당 어노테이션을 붙이고, Exception마다 핸들러 해주게 되면 Exception이 발생했을 때 처리해준대로 결과값을 반환하게 됩니다.

 

GlobalControllerAdvice.class

import com.dev.patientpractice.dto.response.Response;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@Slf4j
@RestControllerAdvice
public class GlobalControllerAdvice {
    @ExceptionHandler(ApplicationCustomException.class)  // (1)
    public ResponseEntity<?> applicationCustomExceptionHandler(ApplicationCustomException e) {
        log.error("Error occurs {}", e.toString());
        return ResponseEntity.status(e.getErrorCode().getHttpStatus())
                .body(Response.error(e.getErrorCode().name(), e.getMessage()));

    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<?> exceptionHandler(Exception e) {
        log.error("Error occurs {}", e.toString());
        return ResponseEntity.status(ErrorCode.INTERNAL_SERVER_ERROR.getHttpStatus())
                .body(Response.error(ErrorCode.INTERNAL_SERVER_ERROR.name(), ErrorCode.INTERNAL_SERVER_ERROR.getMessage()));

    }

}

(1) : Exception을 커스텀했습니다. 에러코드와 메세지는 Enum에서 관리하게 됩니다.

 

ErrorCode.class

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.http.HttpStatus;

@Getter
@AllArgsConstructor
public enum ErrorCode {

    INVALID_PARAMETER(HttpStatus.BAD_REQUEST, "파라미터 유효성 에러"),
    INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "내부 시스템 에러");

    private HttpStatus httpStatus;
    private String message;
}

 

CustomApplicationException.class

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class ApplicationCustomException extends RuntimeException {

    private ErrorCode errorCode;
    private String message;

    public ApplicationCustomException(ErrorCode errorCode) {
        this.errorCode = errorCode;
    }

    @Override
    public String getMessage() {
        if (message == null) {
            return errorCode.getMessage();
        } else {
            return String.format("%s. %s", errorCode.getMessage(), message);
        }
    }
}

 

위와 같이 공통 Response와 Exception을 관리하게 되면 공통적인 포맷으로 결과값을 확인하기 편합니다!

더 좋은 의견있으면 댓글로 주시면 감사하겠습니다. 😁

 

 

 

References

- 패스트캠퍼스 : 10개 프로젝트로 완성하는 백엔드 웹개발(Java/Spring)

반응형