0. 이 글을 작성하는 이유
토이 프로젝트를 진행하면서 gRPC를 사용하려는데 rpc파일들은 submodule로 관리를 하려고 한다. 일단 붙이긴 해서 여기서 더 효율적인 gradle내용과 이쁘게 하기 위해 수정은 해야겠지만 기록 및 공유하기 위함
1. 일단 왜 gRPC를 붙이려고 했는가?
토이 프로젝트가 MSA환경으로 구축하고 있는데 각 서비스 간 통신을 하기 위해 gRPC를 택했다.
2. 그래서 gradle은 어떻게 했는가?
인터넷 짜집기를 좀 많이 했다. 분명 수정해야 할 것들이 존재할 거다.
내가 작성한 gradle은 아래와 같다.
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
import com.google.protobuf.gradle.*
plugins {
id("org.springframework.boot") version "3.2.0"
id("io.spring.dependency-management") version "1.1.4"
id("com.google.protobuf") version "0.9.4"
kotlin("plugin.noarg") version "1.5.30"
kotlin("jvm") version "1.9.20"
kotlin("plugin.spring") version "1.9.20"
}
apply(plugin = "com.google.protobuf")
group = "com.cooffee"
version = "0.0.1-SNAPSHOT"
java {
sourceCompatibility = JavaVersion.VERSION_17
}
noArg {
annotation("jakarta.persistence.Entity") // Java EE면 javax.persistence.Entity
}
val grpcVersion = "1.59.1"
val protobufVersion = "3.25.1"
val protocVersion = protobufVersion
repositories {
mavenCentral()
}
sourceSets {
main {
java {
srcDir("src/main/generatedProto")
}
}
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("io.grpc:grpc-protobuf:${grpcVersion}")
implementation("io.grpc:grpc-stub:${grpcVersion}")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
protobuf {
protoc { artifact = "com.google.protobuf:protoc:${protocVersion}" }
plugins {
id("grpc") {
artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}"
}
}
generateProtoTasks {
ofSourceSet("main").forEach { task ->
task.builtins {
all().forEach {
it.plugins {
id("grpc")
}
}
}
}
setGeneratedFilesBaseDir("$projectDir/src/generatedProto")
}
tasks.withType<KotlinCompile> {
kotlinOptions {
freeCompilerArgs += "-Xjsr305=strict"
jvmTarget = "17"
}
}
tasks.withType<Test> {
useJUnitPlatform()
}
}
주로 참고한 건 아래 github을 참고했다.
https://github.com/grpc/grpc-java/blob/master/examples/build.gradle
3. 일단 gRPC 설정은 되었다면 proto파일은 어떻게 땡겼는가?
git submodule을 이용했다. 각 서비스들에서 공통된 proto를 사용하려면 이렇게 관리하는 게 더 좋을 것으로 판단했다.
명령어는 아래와 같다.
git submodule add [SUBMODULE_REPOSITORY_URL] [LOCATION]
LOCATION에는 내가 가져온 submodule이 어디에 위치할지 정하는 부분이다. 나는 src/main/proto로 지정했다. 왜냐하면 gRPC에서 최초로 proto파일을 찾는 지점이 src/main/proto 디렉토리이기 때문이다.
4. proto파일 예시는?
일단 테스트를 위해 간단하게 하나만 작성했다.
syntax = "proto3";
option java_multiple_files = true;
package com.cooffee.orderservice.v1;
service Order {
rpc GetOrder(OrderRequest) returns (OrderResponse);
}
message OrderRequest {
string user_id = 1;
}
message OrderResponse {
string test_response = 1;
}
패키지에 대해 명시해 주고 하나의 파일이 아닌 쪼개진 파일로 생성하기 위해 java_multiple_files 옵션을 true로 주었다.(default : false)
5. 그래서 생성은 되었는가?
되었다.
6. 생성은 근데 어떻게 했는가?
위 gradle이 정상동작 되었다면 generateProto 기능이 생긴다.
7. 그 github 멀티 계정 이야기나 좀 해보자.
하나의 노트북에서 회사 계정과 내 계정이 섞이다 보니 레포를 작업할 때마다 내 원래 계정으로 초기화를 시켜줘야 하는데 이게 귀찮아서 그냥 스크립트를 하나 만들었다. 나는 zsh을 사용하다 보니 이렇게 주었다.
#!/bin/zsh
REPOSITORY_NAME=$1
git remote remove origin
git remote add origin git@github.com-[내 github이름]:[조직 이름]/$REPOSITORY_NAME.git
# initialize git
git init
git config user.name [내 github이름]
git config user.email [내 github이메일]
git branch -M master
git add --all
git commit -m "first commit"
git push -u origin master
일단 최초에 돌리면 잘 돌아가게 되어있다.
8. 뭘 배웠는가
.gitmodules 파일을 실제로 볼 일이 없었는데 봐봤다.
스크립트도 간만에 짜봤다.
gRPC설정을 처음부터 해보는데 이것저것 좀 볼게 많았다.
'JAVA > spring' 카테고리의 다른 글
Spring API Gateway 간단한 예제 (0) | 2023.12.10 |
---|---|
[Test] h2대신 postgresql을 DB로 대체해본.ssul (1) | 2023.11.04 |
Spring Cloud Netflix Zuul을 바라보며 (1) | 2023.10.28 |
Spring Security - CSRF를 disable?(간단, 요약) (0) | 2023.08.11 |
테스트 진행하기(Entity 기본과 약간의 Repository를 곁들인) (0) | 2023.08.05 |