docs: restore missing contents and align canonical stage names across docs
This commit is contained in:
+38
-4
@@ -1,4 +1,6 @@
|
||||
# gRPC & Protocol Buffers 심화 학습
|
||||
# 3단계: gRPC 통신 구현 상세 가이드
|
||||
|
||||
⬅ [학습 로드맵으로 돌아가기](MANUSCRIPT.md)
|
||||
|
||||
이 문서는 `grpccanary` 프로젝트의 **3단계: gRPC 통신 구현**에 대한 이론적 배경, 스키마 명세, 컴파일 기법 및 구체적인 소스코드 분석을 설명합니다.
|
||||
|
||||
@@ -28,7 +30,7 @@ gRPC는 HTTP/2를 기반으로 구축된 구글의 고성능 오픈소스 원격
|
||||
|
||||
## 2. 인터페이스 명세서 (`protoapi.proto`)
|
||||
|
||||
저장소 루트의 [protoapi.proto](file:///home/godopu16/PuKi/lab/canary_projects/grpccanary/protoapi.proto) 파일은 의사 난수, 비밀번호, 날짜 데이터를 교환하는 `Random` 서비스를 제공하기 위해 아래와 같이 사양을 선언해 둡니다.
|
||||
저장소 루트의 [protoapi.proto](../protoapi.proto) 파일은 의사 난수, 비밀번호, 날짜 데이터를 교환하는 `Random` 서비스를 제공하기 위해 아래와 같이 사양을 선언해 둡니다.
|
||||
|
||||
```proto
|
||||
syntax = "proto3";
|
||||
@@ -99,7 +101,7 @@ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. \
|
||||
|
||||
## 4. 실습 코드 구현 상세 분석
|
||||
|
||||
### 4.1 gRPC 서버 구현 ([server.go](file:///home/godopu16/PuKi/lab/canary_projects/grpccanary/examples/grpcentity/server.go))
|
||||
### 4.1 gRPC 서버 구현 ([server.go](../examples/grpcentity/server.go))
|
||||
|
||||
* **구조체 정의**:
|
||||
```go
|
||||
@@ -118,7 +120,7 @@ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. \
|
||||
server.Serve(listen)
|
||||
```
|
||||
|
||||
### 4.2 gRPC 클라이언트 구현 ([client.go](file:///home/godopu16/PuKi/lab/canary_projects/grpccanary/examples/grpcentity/client.go))
|
||||
### 4.2 gRPC 클라이언트 구현 ([client.go](../examples/grpcentity/client.go))
|
||||
|
||||
* **연결 수립**:
|
||||
```go
|
||||
@@ -129,3 +131,35 @@ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. \
|
||||
`insecure.NewCredentials()`를 전달하여 TLS를 건너뛴 채 평문으로 빠르고 간단한 로컬 테스트 환경을 구축합니다.
|
||||
* **원격 호출**:
|
||||
`client.GetDate()`, `client.GetRandom()`, `client.GetRandomPass()`를 차례로 호출하여 매개변수와 결과를 콘솔로 확인합니다.
|
||||
|
||||
### 4.3 gRPC 실습 예제 동작 흐름
|
||||
예제가 구동되면 서버와 클라이언트 간에 다음과 같은 호출 시퀀스가 순차적으로 실행됩니다:
|
||||
1. **날짜 조회 (`GetDate`)**: 클라이언트가 서버에 날짜 조회를 요청하고, 서버는 자체의 현재 날짜와 시간 문자열을 포맷하여 반환합니다.
|
||||
2. **비밀번호 생성 (`GetRandomPass`)**: 클라이언트가 생성할 무작위 비밀번호의 길이(기본 8자)와 난수 생성 시드값을 전달하면, 서버는 지정된 사양의 임의 문자열을 작성해 반환합니다.
|
||||
3. **난수 생성 (`GetRandom`)**: 서로 다른 위치(Place) 및 시드(Seed) 값을 전달하여 각각 1회씩, 총 2회의 독립적인 난수 생성(의사 난수 정수값) 결과를 반환받아 출력합니다.
|
||||
|
||||
---
|
||||
|
||||
## 5. 트러블슈팅 (Troubleshooting)
|
||||
|
||||
gRPC 서버 및 클라이언트 실습 과정에서 직면할 수 있는 대표적인 문제와 해결 방안입니다.
|
||||
|
||||
### 5.1 `listen tcp :8080: bind: address already in use`
|
||||
* **원인**: 포트 `8080`이 이미 다른 백그라운드 프로세스나 기존 기동된 서버에 의해 점유되어 충돌이 난 상태입니다.
|
||||
* **해결 방법**:
|
||||
- `examples/main.go` 의 `port` 변수값과 [server.go](file:///home/godopu16/PuKi/lab/canary_projects/grpccanary/examples/grpcentity/server.go)의 `port` 전역 변수값을 동시에 다른 포트(예: `:9090`)로 변경하고 재시도해야 합니다.
|
||||
- **주의**: `server.go` 내부의 `ServerRun(addr string)` 함수는 외부 진입점으로부터 인자 `addr`을 인가받지만, 실제 포트 리슨 코드에서는 이를 무시하고 패키지 전역 변수 `port = ":8080"`를 직접 읽어 처리하도록 하드코딩되어 있습니다. 따라서 정상적으로 포트를 바꾸기 위해서는 반드시 `server.go` 내부 전역 변수인 `port` 값을 수정해 주어야 포트 바인딩이 성공합니다.
|
||||
|
||||
---
|
||||
|
||||
## 6. 다음 단계 (Next Steps)
|
||||
|
||||
gRPC 통신 방식을 한층 더 깊이 탐구해 보려면 다음과 같은 후속 실습을 추천합니다:
|
||||
1. **메시지 스펙 확장**: 루트 디렉토리의 [protoapi.proto](file:///home/godopu16/PuKi/lab/canary_projects/grpccanary/protoapi.proto)에 새로운 필드를 추가하거나 메서드를 정의한 뒤, Stub을 재컴파일([examples/grpcentity/README.md](file:///home/godopu16/PuKi/lab/canary_projects/grpccanary/examples/grpcentity/README.md) 컴파일 가이드 참고)해 보십시오.
|
||||
2. **인터페이스 모듈 연계**: 생성된 gRPC 클라이언트 및 서버 stub 인터페이스를 활용하여, 향후 분산 AIoT 환경에서의 센서 데이터 수집이나 에이전트 간 제어 메시지 전송 로직을 설계해 보십시오.
|
||||
|
||||
---
|
||||
|
||||
## 7. 참고 자료
|
||||
|
||||
* [gRPC와 REST의 차이점 (AWS)](https://aws.amazon.com/ko/compare/the-difference-between-grpc-and-rest/)
|
||||
|
||||
Reference in New Issue
Block a user