MSA에서 굉장히 많이 사용하는 Kafka를 사용하려고 한다.
kafka에서는 이벤트를 주고 받을 때, 넘기는 데이터를 class로 정의해야 하는데 이것을 avro를 사용해서 정의해보려고 한다.
avro를 사용해서 resource 폴더에 json으로 포멧을 작성하고, avro를 실행하면 java의 클래스로 파일들이 생성되게 된다.
우선 gradle에 avro를 추가하자
build.gradle.kts를 사용했다.
import com.github.davidmc24.gradle.plugin.avro.GenerateAvroJavaTask
plugins {
kotlin("jvm") version "1.9.25"
id("com.github.davidmc24.gradle.plugin.avro") version "1.9.1"
}
repositories {
mavenCentral()
}
dependencies {
implementation("org.apache.avro:avro:1.12.0")
}
tasks.test {
useJUnitPlatform()
}
kotlin {
jvmToolchain(17)
}
avro {
setCreateSetters(false)
}
val generateAvro:TaskProvider<GenerateAvroJavaTask> = tasks.register("generateAvro", GenerateAvroJavaTask::class.java) {
source("src/main/resources/avro")
setOutputDir(file("src/main/java"))
stringType.set("String")
enableDecimalLogicalType = true
}
tasks.named("compileJava").configure {
dependsOn(generateAvro)
}
source로 src/main/resources/avro를 지정해주었다.
해당 폴더에 avsc 파일을 생성한 후에 generateAvro를 gradlew로 실행해주면 된다.
avsc 파일의 예시이다.
{
"namespace": "seungkyu.food.ordering.kafka.order.avro.model",
"type": "record",
"name": "PaymentRequestAvroModel",
"fields": [
{
"name": "id",
"type": {
"type": "string",
"logicalType": "uuid"
}
},
{
"name": "sagaId",
"type": {
"type": "string",
"logicalType": "uuid"
}
},
{
"name": "customerId",
"type": {
"type": "string",
"logicalType": "uuid"
}
},
{
"name": "orderId",
"type": {
"type": "string",
"logicalType": "uuid"
}
},
{
"name": "price",
"type": {
"type": "long",
"logicalType": "long"
}
},
{
"name": "createdAt",
"type": {
"type": "long",
"logicalType": "timestamp-millis"
}
},
{
"name": "paymentOrderStatus",
"type": {
"type": "enum",
"name": "PaymentOrderStatus",
"symbols": ["PENDING", "CANCELLED"]
}
}
]
}
우선 namespace는 생성할 파일의 위치이다.
name으로 해당 클래스의 이름을 지정해준다.
fields이다.
name으로 해당 클래스에서 파라미터의 이름을 지정해준다.
type으로 class에서 사용할 타입과, kafka에서 사용할 타입을 명시해준다.
이제 gradle로 실행해보자.
지정한 패키지에 해당 클래스들이 생성되었다.
들어가서 확인해보니, 이렇게 직접 수정하지 말라고 하는 안내도 있었다.
이렇게 생성한 class로 kafka 이벤트를 주고 받을 수 있게 되었다.
'MSA' 카테고리의 다른 글
MSA에 CQRS 패턴 적용하기 (0) | 2025.03.01 |
---|---|
MSA에 Outbox 패턴 적용하기 (0) | 2025.02.28 |
MSA에 SAGA 패턴 적용하기 (0) | 2025.02.24 |
DDD에서 Hexagonal Architecture로 변경하기 (0) | 2025.02.20 |
DDD의 핵심 요소 (0) | 2025.02.14 |