반응형

gRPC 서비스를 만드는 중 gradle build 후에 상속받아야 할 ProductInfoGrpc가 생성이 안되는 경우가 있었습니다.

처음 만든 경우에는 생성이 되었고 2번째 만들 때는 Controller를 하나 만들어서 연결시키려고 했는데 거기서는 생성이 안되었습니다. 그래서 상속을 받을 수 있는 케이스가 발생했습니다.

 

상속이 가능한 상황

 

상속이 가능했던 코드를 복사해서 변경할 부분만 변경한 후 2개의 프로젝트를 만들어서 테스트 해보려고 합니다.


// main/proto/ProductInfo.proto

syntax = "proto3";
package grpc_test_01;

service ProductInfo {
  rpc addProduct(Product) returns (ProductID);
  rpc getProduct(ProductID) returns (Product);
}

message  Product {
  string id = 1;
  string name = 2;
  string description = 3;
  float price = 4;
}

message ProductID {
  string value = 1;
}

 


// build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.google.protobuf:protobuf-gradle-plugin:0.9.4'
    }
}

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.0'
    id 'io.spring.dependency-management' version '1.1.4'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '21'
}

apply plugin: 'java'
apply plugin: 'com.google.protobuf'

repositories {
    mavenCentral()
}

// 의존성 추가 3번째 grpc부터

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'javax.annotation:javax.annotation-api:1.3.2'
    implementation 'io.grpc:grpc-netty:1.56.1'
    implementation 'io.grpc:grpc-protobuf:1.56.1'
    implementation 'io.grpc:grpc-stub:1.56.1'
    implementation 'com.google.protobuf:protobuf-javalite:3.22.2'
}

// insert


protobuf {
    protoc {
        artifact = 'com.google.protobuf:protoc:3.9.2'
    }
    plugins {
        grpc {
            artifact = 'io.grpc:protoc-gen-grpc-java:1.56.1'
        }
    }
    generateProtoTasks {
        all()*.plugins {
            grpc {}
        }
    }
}

sourceSets {
    main {
        java {
            srcDirs 'build/generated/source/proto/main/grpc'
            srcDirs 'build/generated/source/proto/main/java'
        }
    }
}

jar {
    manifest {
        attributes "Main-Class": "grpc_test_01.ProductInfoServer"
    }
    from {
        configurations.compileClasspath.collect{ it.isDirectory() ? it : zipTree(it)}

    }
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

apply plugin: 'application'
startScripts.enabled = false
// insert end

test {
    useJUnitPlatform()
}

기본 세팅

기본 디펜던시 세팅은 Lombok, Spring Web, Mustache, Spring Security, OAuth2 Client, Spring Data JPA를 해주고 테스트 했습니다.

 

1차 시도 성공!

1차 시도 시에 테스트 코드에서 Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. 에러가 떴었는데 이건 DB 설정을 안해서 발생한 오류였습니다. 이건 지금 중요한게 아니므로 패스!

상속 받을 때 Grpc 파일은 proto 파일 명과 같았습니다.

 

2차 시도 성공!

proto 파일 명은 테스트로 BoardInfo로 만들었는데 생성된건 ProductInfoGrpc였습니다. 그래서 어떤 이름을 그걸로 했나 하고 찾아보니

proto service

proto 파일 생성 시 service 이름으로 생성이 되는거였습니다.

 

오늘도 하나 배우고 가네요.

 

 

 

반응형
복사했습니다!