4.4 KiB
grpccanary
grpccanary는 Go 언어를 활용하여 데이터 직렬화(JSON)부터 HTTP 웹 서버, 그리고 최종적으로 gRPC 서버/클라이언트 호출까지 단계별로 학습할 수 있는 실습 프로젝트입니다.
개념적인 상세 학습 자료 및 이론적 배경은 docs/MANUSCRIPT.md 문서를 참고해 주시기 바랍니다.
gRPC 실행하기
이 리포지토리에 포함된 예제 코드를 사용해 gRPC 서버와 클라이언트를 실행하고 통신해 볼 수 있습니다.
1. 사전 준비사항
gRPC를 구동하기 전에 아래 요구사항이 충족되었는지 확인하십시오:
- Go 설치 확인: Go 버전이 1.25.4 이상이어야 합니다.
go version - 의존성 모듈 설치: 리포지토리 루트 디렉토리에서 다음 명령을 실행하여 필요한 Go 모듈들을 다운로드합니다:
go mod download
2. (선택) IDL 파일 컴파일 및 Stub 생성
이미 컴파일된 stub 파일들(protoapi/protoapi.pb.go, protoapi/protoapi_grpc.pb.go)이 리포지토리에 기본 포함되어 있어 이 단계를 건너뛰고 바로 실행할 수 있습니다.
만약 .proto 정의 파일을 직접 수정하고 코드를 다시 빌드하고 싶다면, 구체적인 protoc 설치 및 컴파일 절차는 grpcentity README 가이드를 참고하여 진행해 주시기 바랍니다.
3. 실습용 코드 준비 (main.go 편집)
이 프로젝트의 진입점 파일인 examples/main.go는 기본적으로 JSON 파싱 예제만 실행하도록 설정되어 있습니다. gRPC 예제를 실행하기 위해서는 아래와 같이 진입점을 변경해야 합니다:
- examples/main.go 파일을 엽니다.
import블록에서 미사용 임포트 오류(imported and not used)를 방지하기 위해"grpccanary/examples/jsonexample"줄을 주석 처리(또는 삭제)하고,main()함수에서grpcSample()을 호출하도록 수정합니다.
수정 후 코드 스니펫 예시:
package main
import (
"fmt"
entity "grpccanary/examples/grpcentity"
// "grpccanary/examples/jsonexample" // 미사용 임포트 주석 처리
"time"
)
var port = ":8080"
func main() {
// jsonexample.JsonParsingExample() // 기존 JSON 예제 주석 처리
grpcSample() // gRPC 예제 실행 호출로 변경
}
- 수정 내용을 저장합니다.
4. gRPC 예제 실행하기
리포지토리 루트 디렉토리에서 다음 Go 실행 명령을 입력합니다:
go run ./examples
5. 기대 출력 결과
명령어가 정상적으로 실행되면, examples/main.go에 정의된 grpcSample() 함수가 구동되어 백그라운드 고루틴으로 :8080 포트에서 gRPC 서버를 실행한 뒤, gRPC 클라이언트가 서버로 RPC 호출을 보냅니다. 터미널에는 아래와 유사한 출력 로그가 나타납니다:
Serving requests...
Client:
Server Date and Time: 2026-07-12 20:00:00.123456789 +0900 KST m=+1.000000001
Random Password: &c(D7f/G#s%d
Random Integer 1: 42
Random Integer 2: 87
- 동작 흐름:
- 클라이언트가 서버의
GetDate메서드를 호출하여 현재 날짜와 시간 문자열을 받아옵니다. - 클라이언트가
GetRandomPass메서드를 호출하여 무작위 비밀번호(&c(D7f/G#s%d)를 생성하여 받아옵니다. - 클라이언트가
GetRandom메서드를 두 차례 호출하여 각각 무작위 정수 값을 받아옵니다.
- 클라이언트가 서버의
6. 트러블슈팅 가이드
listen tcp :8080: bind: address already in use: 이미 다른 프로세스가8080포트를 점유하고 있는 상태입니다. 점유 중인 프로세스를 종료하거나,examples/main.go및examples/grpcentity/server.go에서port변수 값을 다른 값(예::9090)으로 변경한 후 다시 실행하십시오.module grpccanary: package ... is not in GOROOT: 모듈 로드 에러가 발생한 경우, 리포지토리 루트 경로(작업 디렉토리)에서 명령어를 올바르게 실행했는지 재확인하고,go clean -modcache후go mod tidy를 수행해 보십시오.
7. 다음 단계
gRPC 동작 방식을 깊이 이해하고 통신 명세(IDL)를 확장해 보려면, protoapi.proto의 메시지 타입을 편집해 보거나 grpcentity README로 이동해 다음 실습 단계를 탐색하십시오.