기술나눔

SpringBoot: SpringBoot 통합 응답 및 통합 예외 처리

2024-07-06

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

I. 소개

Spring Boot 애플리케이션을 개발할 때 응답 결과 및 예외가 처리되는 방식은 프로젝트의 유지 관리성, 확장성 및 팀 협업에 중요한 영향을 미칩니다. 분산된 응답 결과와 예외 처리 논리로 인해 이해하고 유지 관리하기 어려운 중복 코드가 발생하는 경우가 많습니다. 따라서 통일된 결과 반환과 통일된 예외 처리는 프로젝트 품질을 향상시키는 핵심 전략 중 하나입니다.

2. 통일된 결과 반환

결과 반환을 통합한다는 것은 일반적으로 모든 컨트롤러 메서드에 대한 표준 응답 형식을 정의하는 것을 의미합니다. 이는 상태 코드, 메시지 및 데이터와 같은 공통 필드를 포함하는 하나 이상의 응답 엔터티 클래스를 생성하여 수행할 수 있습니다. 컨트롤러 메서드는 비즈니스 로직을 처리한 후 이러한 필드를 채워 클라이언트에 반환합니다.

다음으로 SpringBoot에서 통합 결과 반환을 달성하는 방법을 살펴보겠습니다.

1. 공통 응답 객체 정의

일반 응답 개체를 만들고, 성공 및 실패 반환 시나리오를 정의하고, 일반 반환 개체가 인터페이스에서 사용되는지 확인하세요.

public class ResponseResult {

    private int code;

    private String message;

    private Object data;

    public static ResponseResult success(Object data) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setData(data);
        responseResult.setCode(ResultEnum.SUCCESS.code);
        return responseResult;
    }

    public static ResponseResult error(ResultEnum resultEnum) {
        return error(resultEnum, resultEnum.message);
    }

    public static ResponseResult error(ResultEnum resultEnum, String message) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setCode(resultEnum.code);
        responseResult.setMessage(message);
        return responseResult;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

2. 인터페이스 응답 상태 코드 정의

공통 상태 코드 세트를 정의하는 것은 통합 결과 반환의 핵심 키 중 하나입니다. 이 접근 방식은 API의 유용성과 유지 관리성을 향상시킬 뿐만 아니라 클라이언트가 응답 데이터를 보다 효율적으로 구문 분석하고 처리할 수 있도록 하며 API 개발자에게 따라야 할 명확하고 일관된 표준을 제공합니다.

public enum ResultEnum {

    SUCCESS(200 ,"请求处理成功"),
    SERVICE_ERROR(500, "服务器异常,请稍后重试");

    public final Integer code;

    public final String message;

    ResultEnum(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

3. 통합된 성공 및 실패 처리 방법 정의

public class ResponseResult {

    private int code;

    private String message;

    private Object data;

    public static ResponseResult success(Object data) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setData(data);
        responseResult.setCode(ResultEnum.SUCCESS.code);
        return responseResult;
    }

    public static ResponseResult error(ResultEnum resultEnum) {
        return error(resultEnum, resultEnum.message);
    }

    public static ResponseResult error(ResultEnum resultEnum, String message) {
        ResponseResult responseResult = new ResponseResult();
        responseResult.setCode(resultEnum.code);
        responseResult.setMessage(message);
        return responseResult;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }
}

4. 컨트롤러는 결과에 균일하게 반응합니다.

@GetMapping("/testResult")
 public ResponseResult test() {
     // 模拟业务逻辑
     try {
         // 假设这里有一些业务逻辑
         return ResponseResult.success("success");
     } catch (Exception e) {
         // 捕获异常并返回错误信息
         return ResponseResult.error(ResultEnum.SERVICE_ERROR);
     }
 }

3. 통합 예외 처리

통합 예외 처리는 전역 예외 처리기를 사용하여 컨트롤러에서 발생한 예외를 캡처하고 처리합니다. 이 접근 방식은 각 컨트롤러 메서드에서 중복된 예외 처리 코드를 작성하는 것을 방지하고 예외 처리 논리를 더욱 중앙 집중화하고 관리하기 쉽게 만듭니다.

@레스트컨트롤러어드바이스
@RestControllerAdvice는 @ControllerAdvice와 @ResponseBody를 결합한 결합 주석입니다. 주로 예외 처리, 데이터 바인딩, 데이터 전처리 등과 같은 컨트롤러 계층에 대한 전역 구성을 제공하는 데 사용됩니다. @ResponseBody가 포함되어 있으므로 @RestControllerAdvice가 처리하는 모든 메서드는 기본적으로 HTTP 응답 본문에 반환 값을 쓰고 적절한 Content-Type을 설정합니다.

@예외 핸들아르 자형
@ExceptionHandler 주석은 컨트롤러에서 발생한 예외를 처리하는 메서드를 표시하는 데 사용됩니다. 컨트롤러의 메서드가 예외를 던지면 Spring은 예외를 처리할 수 있는 @ExceptionHandler 주석이 달린 메서드를 찾습니다. 그렇다면 메서드가 호출되고 해당 응답이 반환됩니다.

알아채다

当使用@ControllerAdvice时,我们需要将@ResponseBody添加到异常处理方法上。
如果我们使用@RestControllerAdvice,就不需要添加。

1. 비즈니스 예외 클래스 정의

통합 예외 클래스를 사용하면 오류와 예외를 보다 효율적으로 관리할 수 있으므로 시스템 전체에서 오류 처리를 더욱 일관되고 예측 가능하게 만들 수 있습니다.

public class BusinessException extends RuntimeException{

    private final ResultEnum resultEnum;

    public BusinessException(ResultEnum resultEnum, String message) {
        super(message);
        this.resultEnum = resultEnum;
    }

    public BusinessException(ResultEnum resultEnum) {
        this(resultEnum, resultEnum.message);
    }


}

2. 전역 예외 처리기

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler({BusinessException.class})
    public ResponseResult handleBusinessException(BusinessException businessException, HttpServletRequest request) {
        // 想处理的业务
        return ResponseResult.error(ResultEnum.SERVICE_ERROR, businessException.getMessage());
    }

    /**
     * 其他异常
     * @param e
     * @return
     */
    @ExceptionHandler(value = Exception.class)
    public ResponseResult handleOtherExceptions(Exception e) {
        // 这里可以根据不同的异常类型返回不同的状态码和消息
        // 但为了简单起见,这里只返回一个通用的错误信息
        return ResponseResult.error(ResultEnum.SERVICE_ERROR);
    }

}

3. 통일된 처리 및 이용

@GetMapping("/testException1")
    public ResponseResult test1() {
        if (true) {
            // 业务场景
            throw new BusinessException(ResultEnum.SERVICE_ERROR);
        }

        return ResponseResult.success("success");
    }

통합 예외 처리 사용의 이점

코드 재사용: 유사한 응답 결과와 예외 처리 코드를 여러 곳에 작성하지 마세요.

유지 관리가 용이함: 응답 형식이나 예외 처리 논리를 수정해야 하는 경우 한 곳에서만 수정하면 됩니다.

팀워크: 팀원들이 통일된 코딩 표준을 보다 쉽게 ​​이해하고 따를 수 있습니다.

확장성: 새로운 응답 유형이나 예외 처리 논리를 추가해야 하는 경우 기존 항목을 확장하면 됩니다.