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