From 5488f90ad5ccab320f1fd427f6bd169036928563 Mon Sep 17 00:00:00 2001 From: coffeesigma Date: Tue, 27 May 2025 14:52:41 +0900 Subject: [PATCH 1/3] KW-481/feat: grpc error http status to runtime status --- .../grpc/server/MemberGrpcServiceImpl.java | 5 ++-- .../global/exception/GrpcExceptionUtil.java | 24 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/doubleo/memberservice/global/exception/GrpcExceptionUtil.java diff --git a/src/main/java/com/doubleo/memberservice/domain/member/grpc/server/MemberGrpcServiceImpl.java b/src/main/java/com/doubleo/memberservice/domain/member/grpc/server/MemberGrpcServiceImpl.java index 3258bb3..7b25f02 100644 --- a/src/main/java/com/doubleo/memberservice/domain/member/grpc/server/MemberGrpcServiceImpl.java +++ b/src/main/java/com/doubleo/memberservice/domain/member/grpc/server/MemberGrpcServiceImpl.java @@ -1,7 +1,7 @@ package com.doubleo.memberservice.domain.member.grpc.server; import com.doubleo.memberservice.domain.member.repository.MemberRepository; -import com.doubleo.memberservice.global.exception.CommonException; +import com.doubleo.memberservice.global.exception.GrpcExceptionUtil; import com.doubleo.memberservice.global.exception.errorcode.MemberErrorCode; import io.grpc.stub.StreamObserver; import net.devh.boot.grpc.server.service.GrpcService; @@ -34,6 +34,7 @@ public void getMember(MemberRequest request, StreamObserver resp }, () -> responseObserver.onError( - new CommonException(MemberErrorCode.MEMBER_NOT_FOUND))); + GrpcExceptionUtil.toStatusRuntimeException( + MemberErrorCode.MEMBER_NOT_FOUND))); } } diff --git a/src/main/java/com/doubleo/memberservice/global/exception/GrpcExceptionUtil.java b/src/main/java/com/doubleo/memberservice/global/exception/GrpcExceptionUtil.java new file mode 100644 index 0000000..2e58c16 --- /dev/null +++ b/src/main/java/com/doubleo/memberservice/global/exception/GrpcExceptionUtil.java @@ -0,0 +1,24 @@ +package com.doubleo.memberservice.global.exception; + +import com.doubleo.memberservice.global.exception.errorcode.BaseErrorCode; +import io.grpc.Metadata; +import io.grpc.Status; +import io.grpc.StatusRuntimeException; + +public class GrpcExceptionUtil { + + public static StatusRuntimeException toStatusRuntimeException(BaseErrorCode errorCode) { + Metadata metadata = new Metadata(); + + Metadata.Key codeKey = Metadata.Key.of("code", Metadata.ASCII_STRING_MARSHALLER); + Metadata.Key messageKey = + Metadata.Key.of("message", Metadata.ASCII_STRING_MARSHALLER); + + metadata.put(codeKey, errorCode.errorClassName()); + metadata.put(messageKey, errorCode.getMessage()); + + return Status.fromCodeValue(errorCode.getHttpStatus().value()) + .withDescription(errorCode.getMessage()) + .asRuntimeException(metadata); + } +} From fba0bbd3ba257d041a88bb64f3882335f9446e54 Mon Sep 17 00:00:00 2001 From: coffeesigma Date: Tue, 27 May 2025 16:18:11 +0900 Subject: [PATCH 2/3] =?UTF-8?q?KW-481/feat:=20commonexcepton=20=EC=B6=94?= =?UTF-8?q?=EC=B6=9C=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EC=B6=94=EA=B0=80,?= =?UTF-8?q?=20registry=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/exception/GrpcExceptionUtil.java | 34 +++++++++++++++---- .../errorcode/ErrorCodeRegistry.java | 29 ++++++++++++++++ .../exception/errorcode/GrpcErrorCode.java | 20 +++++++++++ 3 files changed, 76 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/doubleo/memberservice/global/exception/errorcode/ErrorCodeRegistry.java create mode 100644 src/main/java/com/doubleo/memberservice/global/exception/errorcode/GrpcErrorCode.java diff --git a/src/main/java/com/doubleo/memberservice/global/exception/GrpcExceptionUtil.java b/src/main/java/com/doubleo/memberservice/global/exception/GrpcExceptionUtil.java index 2e58c16..76c6a3d 100644 --- a/src/main/java/com/doubleo/memberservice/global/exception/GrpcExceptionUtil.java +++ b/src/main/java/com/doubleo/memberservice/global/exception/GrpcExceptionUtil.java @@ -1,24 +1,44 @@ package com.doubleo.memberservice.global.exception; import com.doubleo.memberservice.global.exception.errorcode.BaseErrorCode; +import com.doubleo.memberservice.global.exception.errorcode.ErrorCodeRegistry; +import com.doubleo.memberservice.global.exception.errorcode.GrpcErrorCode; import io.grpc.Metadata; import io.grpc.Status; import io.grpc.StatusRuntimeException; +import lombok.extern.slf4j.Slf4j; +@Slf4j public class GrpcExceptionUtil { + private static final Metadata.Key CODE_KEY = + Metadata.Key.of("code", Metadata.ASCII_STRING_MARSHALLER); + private static final Metadata.Key CLASS_KEY = + Metadata.Key.of("class", Metadata.ASCII_STRING_MARSHALLER); + private static final Metadata.Key MESSAGE_KEY = + Metadata.Key.of("message", Metadata.ASCII_STRING_MARSHALLER); + public static StatusRuntimeException toStatusRuntimeException(BaseErrorCode errorCode) { Metadata metadata = new Metadata(); - - Metadata.Key codeKey = Metadata.Key.of("code", Metadata.ASCII_STRING_MARSHALLER); - Metadata.Key messageKey = - Metadata.Key.of("message", Metadata.ASCII_STRING_MARSHALLER); - - metadata.put(codeKey, errorCode.errorClassName()); - metadata.put(messageKey, errorCode.getMessage()); + metadata.put(CODE_KEY, errorCode.errorClassName()); + metadata.put(CLASS_KEY, errorCode.getClass().getSimpleName()); + metadata.put(MESSAGE_KEY, errorCode.getMessage()); return Status.fromCodeValue(errorCode.getHttpStatus().value()) .withDescription(errorCode.getMessage()) .asRuntimeException(metadata); } + + public static CommonException fromStatusRuntimeException(StatusRuntimeException e) { + Metadata metadata = Status.trailersFromThrowable(e); + if (metadata != null) { + String code = metadata.get(CODE_KEY); + String className = metadata.get(CLASS_KEY); + String message = metadata.get(MESSAGE_KEY); + + log.warn("gRPC Error - code: {}, message: {}", code, message); + return new CommonException(ErrorCodeRegistry.resolve(className, message)); + } + return new CommonException(GrpcErrorCode.GRPC_SERVER_RESPONSE_FAILED); + } } diff --git a/src/main/java/com/doubleo/memberservice/global/exception/errorcode/ErrorCodeRegistry.java b/src/main/java/com/doubleo/memberservice/global/exception/errorcode/ErrorCodeRegistry.java new file mode 100644 index 0000000..f397a6f --- /dev/null +++ b/src/main/java/com/doubleo/memberservice/global/exception/errorcode/ErrorCodeRegistry.java @@ -0,0 +1,29 @@ +package com.doubleo.memberservice.global.exception.errorcode; + +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +public class ErrorCodeRegistry { + private static final Map> registry = + new HashMap<>(); + + static { + registry.put("GlobalErrorCode", GlobalErrorCode::valueOf); + registry.put("GrpcErrorCode", GrpcErrorCode::valueOf); + registry.put("MemberErrorCode", MemberErrorCode::valueOf); + } + + public static BaseErrorCode resolve(String className, String code) { + Function parser = registry.get(className); + if (parser == null) { + throw new IllegalArgumentException("Unknown class " + className); + } + try { + return parser.apply(code); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException( + "Invalid error code " + code + " for class " + className, e); + } + } +} diff --git a/src/main/java/com/doubleo/memberservice/global/exception/errorcode/GrpcErrorCode.java b/src/main/java/com/doubleo/memberservice/global/exception/errorcode/GrpcErrorCode.java new file mode 100644 index 0000000..416f876 --- /dev/null +++ b/src/main/java/com/doubleo/memberservice/global/exception/errorcode/GrpcErrorCode.java @@ -0,0 +1,20 @@ +package com.doubleo.memberservice.global.exception.errorcode; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +public enum GrpcErrorCode implements BaseErrorCode { + GRPC_SERVER_RESPONSE_FAILED(HttpStatus.NOT_FOUND, "gRPC 호출에 실패했습니다."), + ; + + private final HttpStatus httpStatus; + private final String message; + + @Override + public String errorClassName() { + return this.name(); + } +} From 94b996756acb941943df7d6f7c86a4c39b09ab64 Mon Sep 17 00:00:00 2001 From: coffeesigma Date: Tue, 27 May 2025 17:56:32 +0900 Subject: [PATCH 3/3] KW-481/fix: fix error --- .../memberservice/global/exception/GrpcExceptionUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/doubleo/memberservice/global/exception/GrpcExceptionUtil.java b/src/main/java/com/doubleo/memberservice/global/exception/GrpcExceptionUtil.java index 76c6a3d..f6e1a96 100644 --- a/src/main/java/com/doubleo/memberservice/global/exception/GrpcExceptionUtil.java +++ b/src/main/java/com/doubleo/memberservice/global/exception/GrpcExceptionUtil.java @@ -37,7 +37,7 @@ public static CommonException fromStatusRuntimeException(StatusRuntimeException String message = metadata.get(MESSAGE_KEY); log.warn("gRPC Error - code: {}, message: {}", code, message); - return new CommonException(ErrorCodeRegistry.resolve(className, message)); + return new CommonException(ErrorCodeRegistry.resolve(className, code)); } return new CommonException(GrpcErrorCode.GRPC_SERVER_RESPONSE_FAILED); }