87 lines
6.6 KiB
Markdown
87 lines
6.6 KiB
Markdown
# AskingDateTime() gRPC 워크플로우 분석 보고서
|
|
|
|
본 문서는 클라이언트의 `AskingDateTime()` 함수 호출을 기점으로, gRPC 네트워크 채널을 거쳐 서버에서 실행 및 응답이 완료되는 엔드투엔드(End-to-End) 워크플로우를 기술적으로 분석하여 기록합니다.
|
|
|
|
---
|
|
|
|
## 1. 동작 흐름 시퀀스 다이어그램 (Sequence Diagram)
|
|
|
|
다음 다이어그램은 호출이 시작되어 응답이 반환되기까지 각 구성요소 간의 패킷 전송 및 메서드 호출 흐름을 보여줍니다.
|
|
|
|
```mermaid
|
|
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 클라이언트의 호출 개시 (Client-side Initiation)
|
|
1. **함수 기동**: `client.go`에서 `AskingDateTime(ctx, client)` 함수가 동작을 시작합니다.
|
|
2. **요청 메시지 바인딩**: 클라이언트는 호출에 전송할 매개변수인 `protoapi.RequestDateTime` 인스턴스를 메모리에 할당하고 요청 문자열(`Value: "Please send me the date and time"`)을 채워 넣습니다.
|
|
3. **인터페이스 대리자 호출**: 클라이언트 인스턴스(`m`)의 `GetDate(ctx, request)` 인터페이스 메서드를 트리거합니다.
|
|
|
|
### 2.2 클라이언트 스터브 및 gRPC 엔진 처리 (Client-side Serialization & Transport)
|
|
4. **스터브 메서드 실행**: `protoapi_grpc.pb.go` 내부에 컴파일된 `GetDate` 바인딩 구현체로 진입합니다.
|
|
5. **호출 식별자 바인딩**: 스터브는 통신 채널에 대해 `grpc.ClientConn.Invoke(...)` 함수를 대리 기동하며, 대상 호출 식별자 경로인 `"/protoapi.IoTService/GetDate"` 와 요청 객체 주소를 주입합니다.
|
|
6. **직렬화 및 HTTP/2 포장**:
|
|
* gRPC 엔진은 주입된 `RequestDateTime` Go 구조체를 프로토콜 버퍼 직렬화 메커니즘을 경유하여 용량이 최소화된 바이너리 바이트 배열로 변환합니다.
|
|
* 확보된 TCP 세션 커넥션에서 독립적인 **HTTP/2 스트림(Stream)**을 새로 개설하고, `POST /protoapi.IoTService/GetDate HTTP/2` 형식의 헤더 프레임과 직렬화된 데이터 바디 프레임을 순차 전송합니다.
|
|
|
|
### 2.3 네트워크 전송 (Network Layer)
|
|
7. **이진 데이터 라우팅**: 데이터는 TCP 소켓 및 인터넷 통신망을 경유하여 `server.go`가 리스닝 포트(예: `:8080`)를 점유하고 기다리고 있는 대상 서버 주소로 이동합니다.
|
|
|
|
### 2.4 서버의 수신 및 역직렬화 (Server-side Dispatching & Deserialization)
|
|
8. **리스너 캐치**: 서버의 TCP 리스너가 수신 포트로 유입된 소켓 접속 및 HTTP/2 스트림 유입을 인식합니다.
|
|
9. **패킷 분석 및 분기**: gRPC 서버 라이브러리는 수신된 HTTP/2 경로(`/protoapi.IoTService/GetDate`)를 판별하여, 현재 기동 중인 서비스 중 `IoTService`의 `GetDate` 메서드로 패킷을 라우팅합니다.
|
|
10. **역직렬화**: 이진 데이터 바이너리 페이로드를 꺼내어, 수신 측 메모리 구조체인 `protoapi.RequestDateTime` 객체로 역직렬화(Unmarshalling)를 진행합니다.
|
|
11. **핸들러 전달**: 디바이스 정보가 담긴 구조체 포인터를 파라미터로 적재하여 `_IoTService_GetDate_Handler` 내부 라우터를 깨웁니다.
|
|
|
|
### 2.5 서버 비즈니스 로직 수행 (Server-side Execution)
|
|
12. **핸들러 대리 실행**: `server.go` 내부의 `IoTServer` 구조체가 바인딩된 `GetDate(ctx, r)` 메서드가 호출됩니다.
|
|
13. **연산 가동**:
|
|
* `time.Now()`를 호출하여 서버의 현재 시간 값을 획득합니다.
|
|
* 획득된 시간 값을 문자열로 변환하여 반환용 `protoapi.DateTime` 구조체에 대입합니다.
|
|
14. **반환 값 전달**: 완성된 응답 구조체 메모리 주소를 `return response, nil`로 통신망 레이어에 토스합니다.
|
|
|
|
### 2.6 응답 회신 및 완료 (Response Delivery & Return)
|
|
15. **서버 응답 전송**: gRPC 서버 엔진은 전달받은 `DateTime` Go 구조체를 바이너리로 압축(직렬화)한 후, 기존에 개설된 HTTP/2 응답 스트림의 DATA 프레임에 적재하여 송신 포트로 내보냅니다.
|
|
16. **클라이언트 수신 및 전달**:
|
|
* 클라이언트 gRPC 엔진이 소켓으로 수신된 바이너리 데이터를 해독하여 Go 언어의 `protoapi.DateTime` 구조체로 역직렬화합니다.
|
|
* 대기 상태에 있던 `client.go` 내의 `AskingDateTime` 함수가 최종 반환값을 가로채어 복귀합니다.
|
|
* 복귀된 값을 받아 화면(`Server Date and Time: [시간 문자열]`)에 출력하며 시퀀스가 종료됩니다.
|