전 편에서 gRPC에 대한 설명과 특징을 알아보았습니다. 이번 포스트에서는 grpc-java 모듈을 활용한 몇 가지 예제코드를 소개하고, 실제 프로젝트에 적용하는 방안에 대해 소개해보겠습니다.
gRPC Basic
- 프로젝트 생성
- Java : 1.8
- gRPC : 1.25.0
- ProtoBuf : 3.11.0
- pom.xml 설정
- gRPC + Protobuf 의존성 설정
- 스텁 생성을 위해 protoc 플러그인 설정
- proto 컴파일 -> 애플리케이션 컴파일 순으로 진행되도록 설정
1 |
|
- proto 파일 작성 (서비스 정의)
- proto 파일을 별도로 컴파일할 경우
mvn protobuf:{goal}
명령어로 컴파일 할 수 있다. - 컴파일된 결과물은 target(혹은 지정 빌드 디렉토리)/generated-sources/protobuf/java 이하 디렉토리에 생성된다.
message
는 서버-클라이언트 간 송수신될 데이터 포맷service
는 서버, 클라이언트에서 원격 호출되는 서비스 메소드
- proto 파일을 별도로 컴파일할 경우
1 |
|
- 서버 프로그램 작성
- 서비스 기능 구현: proto파일에서 작성한
service
의 RPC 메소드들을 구현해줌 - 아래 예시에서는 정의된
rpc Echo (EchoRequest) returns (EchoResponse) {}
를 구현
- 서비스 기능 구현: proto파일에서 작성한
1 |
|
- 작성한 서비스를 사용하는 서버 프로그램 작성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15public class EchoServer { public static void main(String[] args) throws IOException, InterruptedException { Server server = ServerBuilder.forPort(8000) .addService(new EchoServiceImpl()) .build(); server.start(); Runtime.getRuntime().addShutdownHook(new Thread(() -> { server.shutdown(); })); server.awaitTermination(); } }
- 클라이언트 프로그램 작성
1 |
|
gRPC with SpringBoot
스프링 환경에서도 gRPC를 사용할 수 있다. 공식은 아니지만 몇 가지 개인 또는 그룹에서 제작해서 사용하고 있는 Spring boot starter가 있다. (https://github.com/LogNet/grpc-spring-boot-starter) (https://github.com/saturnism/spring-boot-starter-grpc)
아래는 별도 Spring Boot Starter 없이 진행한 예제
- 프로젝트 생성, pom.xml 에 gRPC 관련 의존성 추가, proto 파일 작성은 기존과 동일
- proto
1 |
|
- 컴포넌트 정의
- 서비스 작성
1 |
|
- gRPC 서버 설정
1 |
|
- Application 구동 시 gRPC 서버가 실행되도록 처리
1 |
|