
gRPC 상태 코드는 클라이언트와 서버 간의 통신 결과를 나타내는 코드로, 요청의 성공 여부 및 다양한 오류 상황을 명확하게 전달하기 위해 사용됩니다.
이는 HTTP 상태 코드와 유사하지만, gRPC는 보다 구체적인 오류를 표현할 수 있도록 설계되었습니다.
| 항목 | gRPC 상태 코드 | HTTP 상태 코드 |
|---|---|---|
| 기반 프로토콜 | HTTP/2 | HTTP 1.1 및 2 |
| 코드 개수 | 17개 (카테고리화됨) | 5개 범주 (1xx~5xx) |
| 오류 설명 | 보다 상세한 오류 메시지 포함 가능 | 범용적인 상태 코드 사용 |
| 확장성 | Protobuf 기반 확장 가능 | 새로운 상태 코드 추가 어려움 |
gRPC Metadata는 클라이언트와 서버 간의 통신에서 메시지와는 별도로 전달되는 부가 정보입니다. 이는 HTTP/2 헤더 프레임을 기반으로 하며, 요청 및 응답 시 다양한 추가 정보를 제공할 수 있습니다.
요청을 보낼 때 포함되는 메타데이터
인증 토큰, 요청 언어, 클라이언트 정보 등을 포함
:method: POST
:scheme: http
:path: /greet.Greeter/SayHello
:authority: localhost:50051
content-type: application/grpc
user-agent: grpc-go/1.43.0
te: trailers
grpc-timeout: 9933133n
응답 메시지의 끝에 추가되는 메타데이터
주로 상태 코드와 에러 메시지 포함
:status: 200
content-type: application/grpc
grpc-status: 0
grpc-message: ""
서버는 StatusRuntimeException을 활용하여 클라이언트에 적절한 상태 코드와 메시지를 전달할 수 있습니다.
import io.grpc.Status;
import io.grpc.stub.StreamObserver;
public void someRpcMethod(Request request, StreamObserver<Response> responseObserver) {
if (!hasPermission(request)) {
StatusRuntimeException exception = Status.PERMISSION_DENIED
.withDescription("Access to this resource is denied.")
.asRuntimeException();
responseObserver.onError(exception);
return;
}
// 정상적인 처리 로직
}
클라이언트는 Status 클래스를 이용하여 응답 상태를 확인하고 적절한 처리를 수행해야 합니다.
import io.grpc.StatusRuntimeException;
try {
Response response = blockingStub.someRpcMethod(request);
} catch (StatusRuntimeException e) {
if (e.getStatus().getCode() == Status.Code.PERMISSION_DENIED) {
System.out.println("접근 권한이 없습니다.");
}
}
스트리밍 RPC의 경우, 서버에서 onError()를 호출하여 클라이언트에 에러를 전송할 수 있습니다.
import io.grpc.StatusRuntimeException;
try {
Response response = blockingStub.someRpcMethod(request);
} catch (StatusRuntimeException e) {
if (e.getStatus().getCode() == Status.Code.PERMISSION_DENIED) {
System.out.println("접근 권한이 없습니다.");
}
}
gRPC는 강력한 상태 코드 시스템과 메타데이터 기능을 통해 보다 정교한 에러 처리 및 확장성을 제공합니다.
이를 활용하여 클라이언트와 서버 간의 안정적인 통신을 구축할 수 있으며, 적절한 예외 처리를 통해 서비스의 신뢰성을 높일 수 있습니다.