diff --git a/src/main/java/org/sopt/sopkerton/common/exception/GlobalError.java b/src/main/java/org/sopt/sopkerton/common/exception/GlobalError.java new file mode 100644 index 0000000..daf893f --- /dev/null +++ b/src/main/java/org/sopt/sopkerton/common/exception/GlobalError.java @@ -0,0 +1,32 @@ +package org.sopt.sopkerton.common.exception; + +import lombok.AllArgsConstructor; +import org.sopt.sopkerton.common.exception.base.ErrorBase; +import org.springframework.http.HttpStatus; + +@AllArgsConstructor +public enum GlobalError implements ErrorBase { + + ; + + private final HttpStatus status; + private final String errorMessage; + + + @Override + public int getHttpStatusCode() { + return status.value(); + } + + @Override + public HttpStatus getHttpStatus() { + return this.status; + } + + + @Override + public String getErrorMessage() { + return this.errorMessage; + } + +} diff --git a/src/main/java/org/sopt/sopkerton/common/exception/GlobalException.java b/src/main/java/org/sopt/sopkerton/common/exception/GlobalException.java new file mode 100644 index 0000000..11f96be --- /dev/null +++ b/src/main/java/org/sopt/sopkerton/common/exception/GlobalException.java @@ -0,0 +1,13 @@ +package org.sopt.sopkerton.common.exception; + +import org.sopt.sopkerton.common.exception.base.ExceptionBase; + +/** + * 전역적 혹은 시스템 전체 범위에서 발생하는 예외 + */ +public class GlobalException extends ExceptionBase { + + public GlobalException(GlobalError error) { + super(error); + } +} diff --git a/src/main/java/org/sopt/sopkerton/common/exception/GlobalSuccess.java b/src/main/java/org/sopt/sopkerton/common/exception/GlobalSuccess.java new file mode 100644 index 0000000..6852d5b --- /dev/null +++ b/src/main/java/org/sopt/sopkerton/common/exception/GlobalSuccess.java @@ -0,0 +1,30 @@ +package org.sopt.sopkerton.common.exception; + +import lombok.AllArgsConstructor; +import org.sopt.sopkerton.common.exception.base.SuccessBase; +import org.springframework.http.HttpStatus; + +@AllArgsConstructor +public enum GlobalSuccess implements SuccessBase { + ; + + private final HttpStatus status; + private final String successMessage; + + + @Override + public int getHttpStatusCode() { + return this.status.value(); + } + + @Override + public HttpStatus getHttpStatus() { + return this.status; + } + + @Override + public String getSuccessMessage() { + return this.successMessage; + } + +} diff --git a/src/main/java/org/sopt/sopkerton/common/exception/base/ErrorBase.java b/src/main/java/org/sopt/sopkerton/common/exception/base/ErrorBase.java new file mode 100644 index 0000000..3b340d9 --- /dev/null +++ b/src/main/java/org/sopt/sopkerton/common/exception/base/ErrorBase.java @@ -0,0 +1,10 @@ +package org.sopt.sopkerton.common.exception.base; + +import org.springframework.http.HttpStatus; + +public interface ErrorBase extends RootEnum{ + int getHttpStatusCode(); + + HttpStatus getHttpStatus(); + String getErrorMessage(); +} diff --git a/src/main/java/org/sopt/sopkerton/common/exception/base/ExceptionBase.java b/src/main/java/org/sopt/sopkerton/common/exception/base/ExceptionBase.java new file mode 100644 index 0000000..014e7a2 --- /dev/null +++ b/src/main/java/org/sopt/sopkerton/common/exception/base/ExceptionBase.java @@ -0,0 +1,20 @@ +package org.sopt.sopkerton.common.exception.base; + + +/** + * 하위 도메인 예외는 본 Exception 클래스를 상속 받습니다. + * - 객체 생 + */ +public abstract class ExceptionBase extends RuntimeException{ + private static final String ERROR_MESSAGE_HEADER = "ERROR : "; + + private final ErrorBase errorBase; + protected ExceptionBase(ErrorBase errorBase) { + super(ERROR_MESSAGE_HEADER + errorBase.getErrorMessage()); + this.errorBase = errorBase; + } + + public ErrorBase getError() { + return errorBase; + } +} diff --git a/src/main/java/org/sopt/sopkerton/common/exception/base/RootEnum.java b/src/main/java/org/sopt/sopkerton/common/exception/base/RootEnum.java new file mode 100644 index 0000000..4f6fca7 --- /dev/null +++ b/src/main/java/org/sopt/sopkerton/common/exception/base/RootEnum.java @@ -0,0 +1,4 @@ +package org.sopt.sopkerton.common.exception.base; + +public interface RootEnum { +} diff --git a/src/main/java/org/sopt/sopkerton/common/exception/base/SuccessBase.java b/src/main/java/org/sopt/sopkerton/common/exception/base/SuccessBase.java new file mode 100644 index 0000000..bea0d30 --- /dev/null +++ b/src/main/java/org/sopt/sopkerton/common/exception/base/SuccessBase.java @@ -0,0 +1,11 @@ +package org.sopt.sopkerton.common.exception.base; + +import org.springframework.http.HttpStatus; + +public interface SuccessBase extends RootEnum{ + int getHttpStatusCode(); + + HttpStatus getHttpStatus(); + String getSuccessMessage(); + +} diff --git a/src/main/java/org/sopt/sopkerton/common/response/ApiResponse.java b/src/main/java/org/sopt/sopkerton/common/response/ApiResponse.java new file mode 100644 index 0000000..a64d7d3 --- /dev/null +++ b/src/main/java/org/sopt/sopkerton/common/response/ApiResponse.java @@ -0,0 +1,38 @@ +package org.sopt.sopkerton.common.response; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; +import org.sopt.sopkerton.common.exception.base.ErrorBase; +import org.sopt.sopkerton.common.exception.base.SuccessBase; + +@RequiredArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class ApiResponse { + private final int code; + private final String message; + + @JsonInclude(JsonInclude.Include.NON_NULL) + private T data; + + public static ApiResponse success(SuccessBase success) { + return new ApiResponse<>(success.getHttpStatusCode(), success.getSuccessMessage()); + } + + public static ApiResponse success(SuccessBase success, T data) { + return new ApiResponse(success.getHttpStatusCode(), success.getSuccessMessage(), data); + } + + public static ApiResponse error(ErrorBase error) { + return new ApiResponse<>(error.getHttpStatusCode(), error.getErrorMessage()); + } + + public static ApiResponse error(ErrorBase error, T data) { + return new ApiResponse<>(error.getHttpStatusCode(), error.getErrorMessage(), data); + } + + public static ApiResponse error(ErrorBase error, Exception exception) { + return new ApiResponse<>(error.getHttpStatusCode(), error.getErrorMessage(), exception); + } +} diff --git a/src/main/java/org/sopt/sopkerton/common/response/CommonControllerAdvice.java b/src/main/java/org/sopt/sopkerton/common/response/CommonControllerAdvice.java new file mode 100644 index 0000000..09324c4 --- /dev/null +++ b/src/main/java/org/sopt/sopkerton/common/response/CommonControllerAdvice.java @@ -0,0 +1,26 @@ +package org.sopt.sopkerton.common.response; + +import lombok.RequiredArgsConstructor; + +import org.sopt.sopkerton.common.exception.base.ErrorBase; +import org.sopt.sopkerton.common.exception.base.ExceptionBase; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +@RequiredArgsConstructor +public class CommonControllerAdvice { + + @ExceptionHandler(value = ExceptionBase.class) + public ResponseEntity sopkathonExceptionHandler(ExceptionBase exception) { + ErrorBase error = exception.getError(); + return ResponseEntity + .status(error.getHttpStatus()) + .body( + ApiResponse.error(error) + ); + } + +}