300x250
250x250
Notice
Recent Posts
Recent Comments
Link
just_do_IT
[gRPC] gRPC 기초적인 추가 정보 2. 스트리밍 방식, 개발 순서 본문
728x90
728x90
https://www.youtube.com/watch?v=sKWy7BJxIas&t=2524s
본 게시물은 위 영상을 토대로 작성되었습니다.
목차
- [1] gRPC의 스트리밍 방식
- [2] 개발 순서와 상세 정보
- [3] 추가적인 확인 사항
[1] gRPC의 스트리밍 방식
1.1 gRPC의 스트리밍 방식
종류 | 설명 |
![]() |
- 스트리밍은 아니지만 타 스트리밍 방식과 다르기 때문에 첨부 - 가장 단순한 형태 |
![]() |
- 클리이언트가 요청을 1번 보내면 서버가 여러 번 보내는 구조 ex) 클라이언트가 어떤 목록 조회 요청 상황 - 목록은 여러 개 존재할 수 있어 서버는 여러 개의 목록을 순차적으로 스트리밍하여 회신할 때 사용 |
![]() |
- 클라이언트에서 여러 번 요청을 보내면 서버가 클라이언트에서 받은 정보들을 집계하여 하나의 정보로 회신 |
![]() |
- 클라이언트도 여러번 요청을 보낼 수 있고, 서버도 클라이언트에 여러 번 회신 가능 |
1.2 gRPC 내 Stub의 종류
- RPC에서 가장 중추적인 역할 중 하나
- BlockingStub
- Unary, Server Streaming만 지원
- FutureStub
- Unary만 지원
- (Async)Stub
- 괄호가 있는 이유 : gRPC는 Async 방식이 기본
- 클래스명 또한 Async를 명시하지 않고, 그냥 stub으로 지칭
- 4가지 스트리밍 방식을 모두 지원
[2] 개발 순서와 상세 정보
2.1 서버 개발 순서
- 1. build.gradle
- 2. proto 작성
- 3. gRPC 기반 코드 생성
- 4. gRPC Dependency 해결
- 5. gRPC 서버 작성
2.2 상세 정보
1. build.gradle
build.gradle Code더보기
group 'homo.efficio'
version '1.0-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'com.google.protobuf'
apply plugin: 'idea'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.6'
}
}
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:3.6.1"
// Set the location of generated source code by protoc compiler
generatedFilesBaseDir = "$projectDir/gen-src"
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.16.1'
}
}
generateProtoTasks {
all()*.plugins {
grpc {}
}
}
}
// Add source dir for generated source code of gRPC
sourceSets {
main {
java {
srcDirs 'gen-src/main/java'
srcDirs 'gen-src/main/grpc'
}
}
}
dependencies {
compile 'io.grpc:grpc-netty:1.16.1'
compile 'io.grpc:grpc-protobuf:1.16.1'
compile 'io.grpc:grpc-stub:1.16.1'
testCompile group: 'junit', name: 'junit', version: '4.12'
}


- .proto 파일 : 10가지 언어로 된 자동 코드 생성 기능
- protocol buf gradle plugin 설정하기 위한 내용

- 기본적으로 netty, protobuf, stub 라이브러리 사용
- netty : 프로토콜 서버 및 클라이언트와 같은 네트워크 응용 프로그램을 빠르고 쉽게 개발할 수 있는 서버 프레임 워크
2. proto 작성
- (Intellij)Protobuf Support Plugin 설치 추천 : 키워드 하이라이팅 기능이 있어 편리함

- RPC Model은 로컬에서 스텁을 통해서 하부 네트워크를 추상화해서 동작

- gRPC모델에서는 proto파일이 추가
- proto파일에서 자동 생성된 gRPC base file들을 기반으로 로컬과 원격적인 코드를 상속 및 호출 등에 이용함
proto file 세부 내용
proto file Code더보기
syntax = "proto3";
option java_multiple_files = true;
option java_outer_classname = "HelloGrpcProto";
package homo.efficio.springcamp2017.grpc.hello;
message HelloRequest {
string clientName = 1;
}
message HelloResponse {
string welcomeMessage = 1;
}
service HelloSpringCamp {
rpc unaryHello(HelloRequest) returns (HelloResponse) {}
rpc serverStreamingHello(HelloRequest) returns (stream HelloResponse) {}
rpc clientStreamingHello(stream HelloRequest) returns (HelloResponse) {}
rpc biStreamingHello(stream HelloRequest) returns (stream HelloResponse) {}
}
-
- 메타정보
- 자료 구조
- 메서드 선언
1. 메타정보

- 프로토콜 버퍼 버전 3을 사용 : syntax = "proto3";
- 파일 생성 시 합쳐서 하나로 만들지 않고 여러개로 쪼개서 만듬 : option java_multiple_files = true;
- 생성할 기본 place 이름 : option java_outer_classname = "HelloGrpcProto";
- 패키지 이름 : package homo.efficio.springcamp2017.grpc.hello;
2. 자료 구조

- 1의 의미 : 단순한 index 개념
- Binary Protocal 이어서 주어진 자료 그대로 데이터 공간을 낭비하지 않고 최적화해서 배치
- 단순한 Stirng int 뿐만 아니라 메시지라는 키워드로 선언된 자료구조를 안에 중첩해서 사용 가능
3. 메서드 선언

- Async Unary 방식으로 동작하는 하나의 메서드를 선언한 예제
- 여러가지 방식으로 구성된 메서드 선언 가능
- rpc 키워드로 메서드 이름과 파라미터, returns 키워드로 반환할 타입을 명시
3. gRPC 기반 코드 생성

- main 하위 디렉터리에는 아무 파일이 없음

- gradle 내 Tasks/other/generateProto 더블클릭

- 처리 중

- main 하위 디렉터리에 필요 파일 자동 생성
- grpc 폴더 : 스텁에 대한 구현 내용
- java 폴더 : 자료구조에 대한 구현 내용
4. gRPC Dependency 해결


- 새로 생성된 파일은 컴파일을 해줘야 한다
- 직접 했을 땐 컴파일이 자동으로 되어있었다.
5. gRPC 서버 작성
gRPC 서버 구성

- ServerService : .proto file에서 이름만 선언해뒀던 메서드들을 실제 구현해놓은 부분
- Server : 클라이언트로부터 요청을 받아들일 수 있는 기능하는 서버 : Server에 ServerService를 add하는 방식으로 동작
- ServerRunner
[3] 추가적인 확인 사항

- gRPC 내 Thread Safe하는 요소
- 4가지 Streaming 방식과 3가지 Stub의 조합
- 자동 생성 소스 확인
728x90
728x90
'초보 개발자의 스터디룸' 카테고리의 다른 글
[Java] Stream 이란? (장점, 단점, 사용 시기, 성능 Graph) (2) | 2025.02.14 |
---|---|
[gRPC] Protobuf란? (0) | 2023.01.31 |
[gRPC] gRPC란? 1. 개요, 특징, 사례 (0) | 2023.01.31 |
[Logstash] 로그스태시란? 개요, 기능, 특징 (0) | 2023.01.09 |
[Elastic Search] 엘라스틱서치란? 3. 장/단점, ES vs RDBMS (0) | 2023.01.06 |