Spring Boot 3.0과 net.devh:grpc-server-spring-boot-starter, net.devh:grpc-client-spring-boot-starter 호환성 오류

문법식·2023년 2월 3일
1

gRPC를 공부하기 위해 Spring Boot로 클라이언트와 서버를 만들어서 간단하게 통신해보려고 했다.

위의 참고 링크들로 gRPC의 개념에 대해 학습을 했고 마지막 참고 링크의 블로그 글을 클론 코딩하면서 실습을 진행했다. 코드를 다 작성하고 gRPC 서버의 SpringBoot 실행했는데,,, 두둥,,

서버가 실행되지 않았다. "gRPCServiceBean이 제대로 등록되지 않아서 오류가 발생하는 것인가?"하는 생각에 로그 레벨을 DEBUG로 변경해서 찍어봤다.

gRPCServiceBean도 잘 등록되고 있었다. 1시간 동안 정말 많은 삽질을 했고 원인을 알 수 있었다.

원인

원인은 생각보다 어이없는 것이었다.

Grpc Server never starts when using Spring Boot 3.0.0

요약하자면, Spring Boot 버전 3에서 더 이상 spring.factories를 지원하지 않게 됐고, net.devh:grpc-server-spring-boot-starternet.devh:grpc-client-spring-boot-starter 설정이 자동으로 되지 않는 것이다. 간단히 말하면, Spring Boot 버전 3와 호환성 문제가 있다는 뜻이다. 해결 방법은 다음과 같다.

Spring Boot 버전 3 호환성 문제 해결 방법 1

Spring Boot의 버전을 2.7.8로 변경하고 다시 실행해 보았다.

gRPCServer 실행

gRPCClient 실행

서버가 제대로 실행됐다.

클라이언트에서 서버로 보낸 요청이 제대로 처리된다. 첫 번째 해결 방법은 spring.factories를 지원하는 Spring Boot 버전 2번대를 사용하면 된다.

Spring Boot 버전 3 호환성 문제 해결 방법 2

그렇다면, Spring Boot 버전 3에서 net.devh:grpc-server-spring-boot-starternet.devh:grpc-client-spring-boot-starter를 사용하려면 어떻게 해야 할까? Spring Boot 버전 2번대에서 spring.factories로 자동 설정되던 부분을 직접 설정해주면 된다.

gRPCServer 설정

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 {
}

gRPCClient 설정

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 {
}

gRPCServer 실행

gRPCClient 실행

결과

클라이언트에서 서버로 보낸 요청이 제대로 처리된다. 두 번째 해결 방법은 자동 설정으로 되던 부분을 직접 설정해주면 된다.

참고 링크

profile
백엔드

0개의 댓글