7.0 KiB
7.0 KiB
AskingDateTime() gRPC 워크플로우 분석 보고서
Note
심화/선택 학습 안내 이 문서는 3단계 기본 실습을 모두 성공적으로 마친 후, gRPC의 내부 동작 원리와 상세 네트워크 흐름을 깊이 탐구하고 싶은 분들을 위한 선택 학습 자료입니다.
본 문서는 클라이언트의 AskingDateTime() 함수 호출을 기점으로, gRPC 네트워크 채널을 거쳐 서버에서 실행 및 응답이 완료되는 엔드투엔드(End-to-End) 워크플로우를 기술적으로 분석하여 기록합니다.
1. 동작 흐름 시퀀스 다이어그램 (Sequence Diagram)
다음 다이어그램은 호출이 시작되어 응답이 반환되기까지 각 구성요소 간의 패킷 전송 및 메서드 호출 흐름을 보여줍니다.
sequenceDiagram
autonumber
participant ClientApp as [클라이언트 앱] (client.go)
participant ClientStub as [Go Client Stub] (protoapi_grpc.pb.go)
participant ClientEngine as [gRPC Client Engine] (google.golang.org/grpc)
participant Network as [네트워크 레이어] (TCP / HTTP/2)
participant ServerEngine as [gRPC Server Engine] (google.golang.org/grpc)
participant ServerStub as [Go Server Stub] (protoapi_grpc.pb.go)
participant ServerApp as [서버 구현체] (server.go)
ClientApp->>ClientApp: AskingDateTime() 호출 실행
Note over ClientApp: RequestDateTime 구조체 정의<br/>("Please send me the date and time")
ClientApp->>ClientStub: IoTServiceClient.GetDate(ctx, request) 호출
ClientStub->>ClientEngine: grpc.ClientConn.Invoke() 위임 (호출 식별자 전달)
Note over ClientEngine: Protobuf 직렬화 실행 (바이너리화)<br/>HTTP/2 스트림 개설 및 헤더 구성
ClientEngine->>Network: HTTP/2 POST 전송<br/>Path: /protoapi.IoTService/GetDate
Network->>ServerEngine: TCP 패킷 수신 및 스트림 복원
Note over ServerEngine: HTTP/2 프레임 파싱<br/>호출 타깃 확인 및 서비스 라우팅<br/>바이너리 패킷 역직렬화
ServerEngine->>ServerStub: _IoTService_GetDate_Handler() 트리거
ServerStub->>ServerApp: IoTServiceServer.GetDate(ctx, request) 디스패치
Note over ServerApp: GetDate() 함수 연산 수행<br/>time.Now() 호출 및 DateTime 구조체 바인딩
ServerApp-->>ServerStub: DateTime 응답 구조체 포인터 반환
ServerStub-->>ServerEngine: 응답 데이터 전달
Note over ServerEngine: 응답 구조체 바이너리 직렬화<br/>HTTP/2 Response Headers 및 DATA 구성
ServerEngine->>Network: HTTP/2 Response 전송
Network->>ClientEngine: TCP 패킷 수신 및 페이로드 분석
Note over ClientEngine: 바이너리 패킷 역직렬화 (Go 구조체 복원)
ClientEngine-->>ClientStub: Invoke() 완료 처리 및 결과 전달
ClientStub-->>ClientApp: DateTime 반환 및 수신 출력
2. 각 단계별 상세 라이프사이클 분석
🔍 2.1 ~ 2.6 단계별 상세 라이프사이클 분석 내용 펼쳐보기
2.1 클라이언트의 호출 개시 (Client-side Initiation)
- 함수 기동:
client.go에서AskingDateTime(ctx, client)함수가 동작을 시작합니다. - 요청 메시지 바인딩: 클라이언트는 호출에 전송할 매개변수인
protoapi.RequestDateTime인스턴스를 메모리에 할당하고 요청 문자열(Value: "Please send me the date and time")을 채워 넣습니다. - 인터페이스 대리자 호출: 클라이언트 인스턴스(
m)의GetDate(ctx, request)인터페이스 메서드를 트리거합니다.
2.2 클라이언트 스터브 및 gRPC 엔진 처리 (Client-side Serialization & Transport)
- 스터브 메서드 실행:
protoapi_grpc.pb.go내부에 컴파일된GetDate바인딩 구현체로 진입합니다. - 호출 식별자 바인딩: 스터브는 통신 채널에 대해
grpc.ClientConn.Invoke(...)함수를 대리 기동하며, 대상 호출 식별자 경로인"/protoapi.IoTService/GetDate"와 요청 객체 주소를 주입합니다. - 직렬화 및 HTTP/2 포장:
- gRPC 엔진은 주입된
RequestDateTimeGo 구조체를 프로토콜 버퍼 직렬화 메커니즘을 경유하여 용량이 최소화된 바이너리 바이트 배열로 변환합니다. - 확보된 TCP 세션 커넥션에서 독립적인 **HTTP/2 스트림(Stream)**을 새로 개설하고,
POST /protoapi.IoTService/GetDate HTTP/2형식의 헤더 프레임과 직렬화된 데이터 바디 프레임을 순차 전송합니다.
- gRPC 엔진은 주입된
2.3 네트워크 전송 (Network Layer)
- 이진 데이터 라우팅: 데이터는 TCP 소켓 및 인터넷 통신망을 경유하여
server.go가 리스닝 포트(예::8080)를 점유하고 기다리고 있는 대상 서버 주소로 이동합니다.
2.4 서버의 수신 및 역직렬화 (Server-side Dispatching & Deserialization)
- 리스너 캐치: 서버의 TCP 리스너가 수신 포트로 유입된 소켓 접속 및 HTTP/2 스트림 유입을 인식합니다.
- 패킷 분석 및 분기: gRPC 서버 라이브러리는 수신된 HTTP/2 경로(
/protoapi.IoTService/GetDate)를 판별하여, 현재 기동 중인 서비스 중IoTService의GetDate메서드로 패킷을 라우팅합니다. - 역직렬화: 이진 데이터 바이너리 페이로드를 꺼내어, 수신 측 메모리 구조체인
protoapi.RequestDateTime객체로 역직렬화(Unmarshalling)를 진행합니다. - 핸들러 전달: 디바이스 정보가 담긴 구조체 포인터를 파라미터로 적재하여
_IoTService_GetDate_Handler내부 라우터를 깨웁니다.
2.5 서버 비즈니스 로직 수행 (Server-side Execution)
- 핸들러 대리 실행:
server.go내부의IoTServer구조체가 바인딩된GetDate(ctx, r)메서드가 호출됩니다. - 연산 가동:
time.Now()를 호출하여 서버의 현재 시간 값을 획득합니다.- 획득된 시간 값을 문자열로 변환하여 반환용
protoapi.DateTime구조체에 대입합니다.
- 반환 값 전달: 완성된 응답 구조체 메모리 주소를
return response, nil로 통신망 레이어에 토스합니다.
2.6 응답 회신 및 완료 (Response Delivery & Return)
- 서버 응답 전송: gRPC 서버 엔진은 전달받은
DateTimeGo 구조체를 바이너리로 압축(직렬화)한 후, 기존에 개설된 HTTP/2 응답 스트림의 DATA 프레임에 적재하여 송신 포트로 내보냅니다. - 클라이언트 수신 및 전달:
- 클라이언트 gRPC 엔진이 소켓으로 수신된 바이너리 데이터를 해독하여 Go 언어의
protoapi.DateTime구조체로 역직렬화합니다. - 대기 상태에 있던
client.go내의AskingDateTime함수가 최종 반환값을 가로채어 복귀합니다. - 복귀된 값을 받아 화면(
Server Date and Time: [시간 문자열])에 출력하며 시퀀스가 종료됩니다.
- 클라이언트 gRPC 엔진이 소켓으로 수신된 바이너리 데이터를 해독하여 Go 언어의
