gRPC
를 공부하기 위해 Spring Boot
로 클라이언트와 서버를 만들어서 간단하게 통신해보려고 했다.
gRPC
참고 링크위의 참고 링크들로 gRPC
의 개념에 대해 학습을 했고 마지막 참고 링크의 블로그 글을 클론 코딩하면서 실습을 진행했다. 코드를 다 작성하고 gRPC
서버의 SpringBoot
실행했는데,,, 두둥,,
서버가 실행되지 않았다. "gRPCService
의 Bean
이 제대로 등록되지 않아서 오류가 발생하는 것인가?"하는 생각에 로그 레벨을 DEBUG
로 변경해서 찍어봤다.
gRPCService
의 Bean
도 잘 등록되고 있었다. 1시간 동안 정말 많은 삽질을 했고 원인을 알 수 있었다.
원인은 생각보다 어이없는 것이었다.
Grpc Server never starts when using Spring Boot 3.0.0
요약하자면, Spring Boot
버전 3에서 더 이상 spring.factories
를 지원하지 않게 됐고, net.devh:grpc-server-spring-boot-starter
와 net.devh:grpc-client-spring-boot-starter
설정이 자동으로 되지 않는 것이다. 간단히 말하면, Spring Boot
버전 3와 호환성 문제가 있다는 뜻이다. 해결 방법은 다음과 같다.
Spring Boot
의 버전을 2.7.8
로 변경하고 다시 실행해 보았다.
서버가 제대로 실행됐다.
클라이언트에서 서버로 보낸 요청이 제대로 처리된다. 첫 번째 해결 방법은 spring.factories
를 지원하는 Spring Boot
버전 2번대를 사용하면 된다.
그렇다면, Spring Boot
버전 3에서 net.devh:grpc-server-spring-boot-starter
와 net.devh:grpc-client-spring-boot-starter
를 사용하려면 어떻게 해야 할까? Spring Boot
버전 2번대에서 spring.factories
로 자동 설정되던 부분을 직접 설정해주면 된다.
package com.example.grpcserver.config;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.context.annotation.Configuration;
@Configuration
@ImportAutoConfiguration({
net.devh.boot.grpc.common.autoconfigure.GrpcCommonCodecAutoConfiguration.class,
net.devh.boot.grpc.common.autoconfigure.GrpcCommonTraceAutoConfiguration.class,
net.devh.boot.grpc.server.autoconfigure.GrpcAdviceAutoConfiguration.class,
net.devh.boot.grpc.server.autoconfigure.GrpcHealthServiceAutoConfiguration.class,
net.devh.boot.grpc.server.autoconfigure.GrpcMetadataConsulConfiguration.class,
net.devh.boot.grpc.server.autoconfigure.GrpcMetadataEurekaConfiguration.class,
net.devh.boot.grpc.server.autoconfigure.GrpcMetadataNacosConfiguration.class,
net.devh.boot.grpc.server.autoconfigure.GrpcMetadataZookeeperConfiguration.class,
net.devh.boot.grpc.server.autoconfigure.GrpcReflectionServiceAutoConfiguration.class,
net.devh.boot.grpc.server.autoconfigure.GrpcServerAutoConfiguration.class,
net.devh.boot.grpc.server.autoconfigure.GrpcServerFactoryAutoConfiguration.class,
net.devh.boot.grpc.server.autoconfigure.GrpcServerMetricAutoConfiguration.class,
net.devh.boot.grpc.server.autoconfigure.GrpcServerSecurityAutoConfiguration.class,
net.devh.boot.grpc.server.autoconfigure.GrpcServerTraceAutoConfiguration.class
})
public class GrpConfig {
}
package com.example.grpcclient.config;
import org.springframework.boot.autoconfigure.ImportAutoConfiguration;
import org.springframework.context.annotation.Configuration;
@Configuration
@ImportAutoConfiguration({
net.devh.boot.grpc.client.autoconfigure.GrpcClientAutoConfiguration.class,
net.devh.boot.grpc.client.autoconfigure.GrpcClientMetricAutoConfiguration.class,
net.devh.boot.grpc.client.autoconfigure.GrpcClientHealthAutoConfiguration.class,
net.devh.boot.grpc.client.autoconfigure.GrpcClientSecurityAutoConfiguration.class,
net.devh.boot.grpc.client.autoconfigure.GrpcClientTraceAutoConfiguration.class,
net.devh.boot.grpc.client.autoconfigure.GrpcDiscoveryClientAutoConfiguration.class,
net.devh.boot.grpc.common.autoconfigure.GrpcCommonCodecAutoConfiguration.class,
net.devh.boot.grpc.common.autoconfigure.GrpcCommonTraceAutoConfiguration.class,
})
public class GrpcConfig {
}
클라이언트에서 서버로 보낸 요청이 제대로 처리된다. 두 번째 해결 방법은 자동 설정으로 되던 부분을 직접 설정해주면 된다.
Github link
: SpringBoot_gRPCSpring Boot
버전 3에서 spring.factories
관한 공식 문서: Spring Boot 3.0.0 M5 Release Notes