# grpccanary `grpccanary`는 Go 언어를 활용하여 데이터 직렬화(JSON)부터 HTTP 웹 서버, 그리고 최종적으로 gRPC 서버/클라이언트 호출까지 단계별로 학습할 수 있는 실습 프로젝트입니다. 개념적인 상세 학습 자료 및 이론적 배경은 [docs/MANUSCRIPT.md](docs/MANUSCRIPT.md) 문서를 참고해 주시기 바랍니다. # gRPC 실행하기 이 리포지토리에 포함된 예제 코드를 사용해 gRPC 서버와 클라이언트를 실행하고 통신해 볼 수 있습니다. ## 1. 사전 준비사항 gRPC를 구동하기 전에 아래 요구사항이 충족되었는지 확인하십시오: * **Go 설치 확인**: Go 버전이 1.25.4 이상이어야 합니다. ```bash go version ``` * **의존성 모듈 설치**: 리포지토리 루트 디렉토리에서 다음 명령을 실행하여 필요한 Go 모듈들을 다운로드합니다: ```bash go mod download ``` ## 2. (선택) IDL 파일 컴파일 및 Stub 생성 이미 컴파일된 stub 파일들(`protoapi/protoapi.pb.go`, `protoapi/protoapi_grpc.pb.go`)이 리포지토리에 기본 포함되어 있어 **이 단계를 건너뛰고 바로 실행할 수 있습니다.** 만약 `.proto` 정의 파일을 직접 수정하고 코드를 다시 빌드하고 싶다면, 구체적인 `protoc` 설치 및 컴파일 절차는 [grpcentity README](examples/grpcentity/README.md) 가이드를 참고하여 진행해 주시기 바랍니다. ## 3. 실습용 코드 준비 (main.go 편집) 이 프로젝트의 진입점 파일인 `examples/main.go`는 기본적으로 JSON 파싱 예제만 실행하도록 설정되어 있습니다. gRPC 예제를 실행하기 위해서는 아래와 같이 진입점을 변경해야 합니다: 1. [examples/main.go](examples/main.go) 파일을 엽니다. 2. `import` 블록에서 미사용 임포트 오류(`imported and not used`)를 방지하기 위해 `"grpccanary/examples/jsonexample"` 줄을 주석 처리(또는 삭제)하고, `main()` 함수에서 `grpcSample()`을 호출하도록 수정합니다. **수정 후 코드 스니펫 예시:** ```go package main import ( "fmt" entity "grpccanary/examples/grpcentity" // "grpccanary/examples/jsonexample" // 미사용 임포트 주석 처리 "time" ) var port = ":8080" func main() { // jsonexample.JsonParsingExample() // 기존 JSON 예제 주석 처리 grpcSample() // gRPC 예제 실행 호출로 변경 } ``` 3. 수정 내용을 저장합니다. ## 4. gRPC 예제 실행하기 리포지토리 루트 디렉토리에서 다음 Go 실행 명령을 입력합니다: ```bash go run ./examples ``` ## 5. 기대 출력 결과 명령어가 정상적으로 실행되면, `examples/main.go`에 정의된 `grpcSample()` 함수가 구동되어 백그라운드 고루틴으로 `:8080` 포트에서 gRPC 서버를 실행한 뒤, gRPC 클라이언트가 서버로 RPC 호출을 보냅니다. 터미널에는 아래와 유사한 출력 로그가 나타납니다: ```text 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 ``` * **동작 흐름**: 1. 클라이언트가 서버의 `GetDate` 메서드를 호출하여 현재 날짜와 시간 문자열을 받아옵니다. 2. 클라이언트가 `GetRandomPass` 메서드를 호출하여 무작위 비밀번호(`&c(D7f/G#s%d`)를 생성하여 받아옵니다. 3. 클라이언트가 `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](protoapi.proto)의 메시지 타입을 편집해 보거나 [grpcentity README](examples/grpcentity/README.md)로 이동해 다음 실습 단계를 탐색하십시오.