간만에 시간 좀 나서 얼마 전 모님이 얘기했던 armeria 이용해서 간단한 샘플 코딩 해봤습니다. 샘플 코드 등은 좀 더 공부한 후 공유해보도록 하겠고 오늘은 gRPC, thrift 코드 자동 생성 하기 위한 방법 우선 공유합니다.
(gRPC, thrift 프로그래밍 방식에 대한 세세한 설명은 빼고 소스 자동 생성에 관련된 부분만 설명합니다)
1. gRPC
- 확장자가 proto 인 IDL 파일을 src/main/proto 밑에 작성해둡니다.
- build.gradle 보면 grpc, protobuf 가 들어간 설정들이 보일텐데 reposioty 에서 grpc 라이브러리 다운 받아 protobuf 로 코드 생성해주는 것들입니다.
- 위 두 단계만으로도 소스는 자동 생성되었습니다. 하지만 정작 서비스 구현하려고 하니 생성된 코드를 찾을 수 없다는 에러에 부딪혔습니다. 소스는 build/generated/source/proto 밑에 생성되는데 위 build.gradle 에서 idea { module { ... }} 이란 부분을 넣어준 후에야 에러 없이 소스 참조할 수 있었습니다.
2. thrift
- src/main/thrift 에 확장자 thrift 인 IDL 파일을 작성해둡니다.
- thrift 는 gRPC 에 비해 설정은 간단했습니다. compileThrift 부분에서 거의 모두 해결됩니다.
- gRPC 와 달리 이 녀석은 소스 생성해주는 thrift 실행 파일이 추가로 필요했습니다. thriftExecutable 설정값으로 컴파일러 위치를 지정해주면 됩니다.
- 소스는 build/generated-sources/thrift 밑에 생성됩니다. gRPC 와 달리 따로 소스 디렉토리 설정 안해줘도 서비스 구현 시 에러 없이 잘 찾습니다. 왜 그런지는 저도 잘 모르겠어요 ㅎ.이상입니다. intellij 환경에서 테스트한거라 이클립스에서는 어떨런지 모르겠습니다. 그리고 gradle 잘 모르고 쓰는거라 설명 중 오류 있을 수 있다는 점 염두에 두셔요.
buildscript {
dependencies {
classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.8'
}
}
plugins {
id "io.spring.dependency-management" version "1.0.7.RELEASE"
id "org.jruyi.thrift" version "0.4.1"
}
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: 'com.google.protobuf'
apply plugin: "org.jruyi.thrift"
repositories {
mavenCentral()
}
dependencyManagement {
imports {
mavenBom 'com.linecorp.armeria:armeria-bom:0.84.0'
}
}
protobuf {
protoc {
artifact = 'com.google.protobuf:protoc:3.7.1'
}
plugins {
grpc {
artifact = 'io.grpc:protoc-gen-grpc-java:1.20.0'
}
}
generateProtoTasks {
ofSourceSet('main')*.plugins {
grpc {}
}
}
}
dependencies {
compile 'com.linecorp.armeria:armeria'
compile 'com.linecorp.armeria:armeria-grpc'
compile 'com.linecorp.armeria:armeria-thrift'
compile 'io.projectreactor:reactor-core:3.2.8.RELEASE'
compileOnly 'jakarta.annotation:jakarta.annotation-api:1.3.4'
compileOnly 'org.projectlombok:lombok:1.18.6'
annotationProcessor 'org.projectlombok:lombok:1.18.6'
runtime 'org.slf4j:slf4j-simple:1.7.26'
}
tasks.withType(JavaCompile) {
sourceCompatibility = '1.8'
targetCompatibility = '1.8'
options.encoding = 'UTF-8'
options.debug = true
options.compilerArgs += '-parameters'
}
idea {
module {
sourceDirs += file("${protobuf.generatedFilesBaseDir}/main/java");
sourceDirs += file("${protobuf.generatedFilesBaseDir}/main/grpc");
}
}
compileThrift {
thriftExecutable "D:/libs/thrift.exe"
recurse true
generator 'html'
generator 'java', 'private-members'
}
'Slack 채널 정리' 카테고리의 다른 글
리눅스 fuser 명령어 (0) | 2019.11.29 |
---|---|
git HTTP Basic: Access denied 에러 (0) | 2019.11.29 |
graphql 기초 용어 (0) | 2019.11.29 |
Flogo 삽질 (0) | 2019.11.29 |
conda-forge (0) | 2019.11.29 |