DABOM ํ๋ก์ ํธ ๊ณต์ฉ Kafka ๋ฉ์์ง ๋ผ์ด๋ธ๋ฌ๋ฆฌ
| ํญ๋ชฉ | ๊ฐ |
|---|---|
| Artifact | com.github.da-bom:lib-kafka |
| ํ์ฌ ๋ฒ์ | 1.0.1 |
| Java | 21 |
| Spring Boot | 3.4.0 |
| ๋ฐฐํฌ | JitPack |
DABOM ๋ง์ดํฌ๋ก์๋น์ค์์ ๋ฐ๋ณต๋๋ Kafka ๊ด๋ จ ์ฝ๋๋ฅผ ํ๋์ ๊ณตํต ๋ชจ๋๋ก ํตํฉํ๋ค.
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ๊ฒ:
- Kafka Producer / Consumer ์๋ ์ค์ - ํฉํ ๋ฆฌ, ํ ํ๋ฆฟ, ๋ฆฌ์ค๋ ์ปจํ ์ด๋๋ฅผ ํ์ค ์ค์ ์ผ๋ก ๊ตฌ์ฑ
- ์ด๋ฒคํธ ์๋ฒจ๋กํ - ๋ชจ๋ ๋ฉ์์ง๋ฅผ
EventEnvelope<T>ํฌ๋งท์ผ๋ก ํต์ผ - ๊ณ์ฝ ์์ - ํ ํฝ๋ช , ์ด๋ฒคํธ ํ์ , ์ปจ์๋จธ ๊ทธ๋ฃน์ ์ฝ๋ ๋ ๋ฒจ ์์๋ก ๊ด๋ฆฌ
- ์์ธ ๋ถ๋ฅ & ์๋ฌ ํธ๋ค๋ง - ์์ธ ํ์ ๋ณ retry / ignore / DLQ ์๋ ๋ผ์ฐํ
- ์ด์ ๋ฉํธ๋ฆญ - Micrometer ๊ธฐ๋ฐ producer/consumer ์ฑ๊ณต๋ฅ , ์ง์ฐ์๊ฐ, DLT ์นด์ดํธ
์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ์ง ์๋ ๊ฒ:
- Outbox polling / ์ํ ์ ์ด / ์ค์ผ์ค๋ง
- ์๋น์ค ๊ณ ์ ๋น์ฆ๋์ค ๋ก์ง
- Kafka ํด๋ฌ์คํฐ ํ๋ก๋น์ ๋
com.dabom.messaging.kafka
โโโ autoconfigure/ Kafka ๋น ์๋ ์ค์
โ โโโ KafkaConfig Producer/Consumer Factory, KafkaTemplate, ListenerContainerFactory
โ โโโ KafkaErrorHandlerConfig CommonErrorHandler, DLT Publisher, ExceptionClassifier
โโโ contract/ ๋ฉ์์ง ๊ณ์ฝ ์์
โ โโโ KafkaTopics ํ ํฝ๋ช
โ โโโ KafkaEventTypes ์ด๋ฒคํธ ํ์
๋ฌธ์์ด
โ โโโ KafkaConsumerGroups ์ปจ์๋จธ ๊ทธ๋ฃน ID
โโโ error/ ์์ธ ๋ถ๋ฅ & ๋๋ฉ์ธ ์์ธ
โ โโโ KafkaExceptionClassifier ์์ธ โ ์ก์
๋งคํ
โ โโโ KafkaMessageProcessingException
โ โโโ NonRetryableKafkaMessageProcessingException
โ โโโ KafkaMessageDeserializationException
โ โโโ KafkaErrorAction RETRY / IGNORE / DLQ
โ โโโ KafkaErrorCode ๋ถ๋ฅ ์ฝ๋ enum
โ โโโ KafkaErrorDecision (action, code) ์
โโโ event/
โ โโโ dto/ ํ์ด๋ก๋ ๋ ์ฝ๋
โ โ โโโ EventEnvelope<T> ๊ณตํต ๋ฉ์์ง ๋ํผ
โ โ โโโ notification/ NotificationPayload, NotificationType, NotificationEventSupport
โ โ โโโ policy/ PolicyUpdatedPayload
โ โ โโโ usage/ UsagePayload, UsageRealtimePayload
โ โโโ consumer/ ์๋น ์ธํฐํ์ด์ค
โ โ โโโ KafkaEventConsumer<T>
โ โโโ publisher/ ๋ฐํ ์ธํฐํ์ด์ค
โ โ โโโ KafkaEventPublisher
โ โ โโโ DefaultKafkaEventPublisher
โ โโโ KafkaEventMessageSupport JSON ํ์ฑ, eventType ํํฐ๋ง, ์ง๋ ฌํ
โโโ metrics/ Micrometer ๋ฉํธ๋ฆญ
โ โโโ KafkaMetrics ์นด์ดํฐ/ํ์ด๋จธ ์ ์
โ โโโ KafkaMetricTagSanitizer ํ๊ทธ ์ ๊ทํ
โ โโโ KafkaEventMetadataExtractor
โ โโโ consumer/
โ โ โโโ KafkaMetricsRecordInterceptor
โ โโโ producer/
โ โโโ KafkaMetricsProducerListener
โโโ support/
โโโ KafkaLogSanitizer ๋ก๊ทธ ์ธ์ ์
๋ฐฉ์ง
๋ชจ๋ Kafka ๋ฉ์์ง์ ๋ํผ ๋ ์ฝ๋. Jackson ๋คํ์ฑ ์ญ์ง๋ ฌํ๋ฅผ ์ง์ํ๋ค.
public record EventEnvelope<T>(
String eventId, // UUID
String eventType, // KafkaEventTypes ์์๊ฐ
LocalDateTime timestamp,
T payload
)ํฉํ ๋ฆฌ:
EventEnvelope<UsagePayload> envelope = EventEnvelope.of("DATA_USAGE", payload);
// eventId = UUID.randomUUID(), timestamp = LocalDateTime.now()Jackson @JsonTypeInfo ๋งคํ:
| eventType ๊ฐ | payload ํ์ |
|---|---|
DATA_USAGE |
UsagePayload |
POLICY_UPDATED |
PolicyUpdatedPayload |
USAGE_REALTIME |
UsageRealtimePayload |
NOTIFICATION |
NotificationPayload |
Wire format ์์:
{
"eventId": "a1b2c3d4-...",
"eventType": "NOTIFICATION",
"timestamp": "2026-03-20T14:30:00",
"payload": {
"familyId": 1,
"customerId": 42,
"type": "THRESHOLD_ALERT",
"title": "๋ฐ์ดํฐ ๊ฒฝ๊ณ ",
"message": "์์ฌ๋์ด 10% ๋จ์์ต๋๋ค.",
"data": { "thresholdPercent": 10 }
}
}| ๋ ์ฝ๋ | ํ๋ | ์ฉ๋ |
|---|---|---|
UsagePayload |
familyId, customerId, appId, bytesUsed, metadata | ์๋ณธ ์ฌ์ฉ๋ ์ด๋ฒคํธ |
UsageRealtimePayload |
familyId, customerId, usedBytes, limitBytes, usagePercent, metadata | ์ค์๊ฐ ์ฌ์ฉ๋ ์ค๋ ์ท |
PolicyUpdatedPayload |
familyId, policyKey, policyValue, activatedAt, active | ์ ์ฑ ๋ณ๊ฒฝ ์ด๋ฒคํธ |
NotificationPayload |
familyId, customerId, type, title, message, data | ์๋ฆผ ์ด๋ฒคํธ (customerId=null์ด๋ฉด ๊ฐ์กฑ ์ ์ฒด ๋ธ๋ก๋์บ์คํธ) |
13์ข
์ ์๋ฆผ ํ์
enum. NotificationEventSupport.resolveTitle(type)๋ก ํ๊ธ ์ ๋ชฉ์ ์ป์ ์ ์๋ค.
| enum | resolveTitle ๋ฐํ๊ฐ |
|---|---|
QUOTA_UPDATED |
๋ฐ์ดํฐ ์์ฌ๋ ๊ฐฑ์ |
THRESHOLD_ALERT |
๋ฐ์ดํฐ ๊ฒฝ๊ณ |
CUSTOMER_BLOCKED |
๋ฐ์ดํฐ ์ฐจ๋จ |
CUSTOMER_UNBLOCKED |
๋ฐ์ดํฐ ์ฐจ๋จ ํด์ |
POLICY_CHANGED |
์ ์ฑ ๋ณ๊ฒฝ |
MISSION_CREATED |
๋ฏธ์ ์์ฑ |
REWARD_REQUESTED |
๋ณด์ ์์ฒญ |
REWARD_APPROVED |
๋ณด์ ์น์ธ |
REWARD_REJECTED |
๋ณด์ ๊ฑฐ์ |
APPEAL_CREATED |
์ด์์ ๊ธฐ ์ ์ |
APPEAL_APPROVED |
์ด์์ ๊ธฐ ์น์ธ |
APPEAL_REJECTED |
์ด์์ ๊ธฐ ๊ฑฐ์ |
EMERGENCY_APPROVED |
๊ธด๊ธ ์ฟผํฐ ์น์ธ |
| ์์ | ํ ํฝ๋ช | Producer | Consumer |
|---|---|---|---|
KafkaTopics.USAGE_EVENTS |
usage-events |
simulator-traffic | dabom-processor-usage |
KafkaTopics.POLICY_UPDATED |
policy-updated |
dabom-api-core | dabom-processor-usage |
KafkaTopics.USAGE_REALTIME |
usage-realtime |
dabom-processor-usage | dabom-api-core |
KafkaTopics.NOTIFICATION |
notification-events |
dabom-processor-usage / ๋ฐฐ์น | dabom-api-notification |
| ์์ | ๊ฐ | ์ฐ๊ฒฐ ํ์ด๋ก๋ |
|---|---|---|
KafkaEventTypes.DATA_USAGE |
DATA_USAGE |
UsagePayload |
KafkaEventTypes.POLICY_UPDATED |
POLICY_UPDATED |
PolicyUpdatedPayload |
KafkaEventTypes.USAGE_REALTIME |
USAGE_REALTIME |
UsageRealtimePayload |
KafkaEventTypes.NOTIFICATION |
NOTIFICATION |
NotificationPayload |
| ์์ | ๊ฐ | ์๋น์ค |
|---|---|---|
KafkaConsumerGroups.DABOM_PROCESSOR_USAGE_MAIN |
dabom-processor-usage-main-group |
dabom-processor-usage |
KafkaConsumerGroups.DABOM_PROCESSOR_USAGE_POLICY |
dabom-processor-usage-policy-group |
dabom-processor-usage |
KafkaConsumerGroups.DABOM_API_CORE_REALTIME |
dabom-api-core-realtime-group |
dabom-api-core |
KafkaConsumerGroups.DABOM_NOTIFICATION_SENDER |
dabom-notification-sender-group |
dabom-api-notification |
flowchart LR
A[simulator-traffic] -->|DATA_USAGE| T1[usage-events]
B[dabom-api-core] -->|POLICY_UPDATED| T2[policy-updated]
T1 --> C[dabom-processor-usage]
T2 --> C
C -->|USAGE_REALTIME| T3[usage-realtime]
C -->|NOTIFICATION| T4[notification-events]
T3 --> D[dabom-api-core]
T4 --> E[dabom-api-notification]
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ปดํฌ๋ํธ ์ค์บ๋๋ฉด ์๋ ๋น์ด ์๋ ๋ฑ๋ก๋๋ค.
| ๋น | ์ค์ |
|---|---|
ProducerFactory<String, String> |
StringSerializer, acks=all, enable.idempotence=true |
KafkaTemplate<String, String> |
observation ํ์ฑํ, ๋ฉํธ๋ฆญ ๋ฆฌ์ค๋ ๋ถ์ฐฉ |
| ๋น | ์ค์ |
|---|---|
ConsumerFactory<String, String> |
ErrorHandlingDeserializer ๋ํ (poison pill ๋ฐฉ์ด) |
ConcurrentKafkaListenerContainerFactory |
observation ํ์ฑํ, ๋ฉํธ๋ฆญ ์ธํฐ์ ํฐ, ๊ณตํต ์๋ฌ ํธ๋ค๋ฌ |
| ๋น | ์ญํ |
|---|---|
CommonErrorHandler |
DefaultErrorHandler + exponential backoff + DLT ๋ผ์ฐํ
|
KafkaExceptionClassifier |
์์ธ ์ฒด์ธ์ ๋ถ์ํ์ฌ (action, code) ๊ฒฐ์ |
| DLT Producer | {์๋ณธํ ํฝ}.DLT๋ก ์คํจ ๋ฉ์์ง ์ ์ก, x-error-code/x-error-action ํค๋ ํฌํจ |
| ๋น | ์ญํ |
|---|---|
KafkaEventMessageSupport |
JSON ํ์ฑ, eventType ํํฐ๋ง, ์ง๋ ฌํ/์ญ์ง๋ ฌํ |
DefaultKafkaEventPublisher |
KafkaEventPublisher ๊ตฌํ์ฒด |
KafkaMetrics |
Micrometer ์นด์ดํฐ/ํ์ด๋จธ ์ ์ |
KafkaMetricsProducerListener |
producer ์ฑ๊ณต/์คํจ ๋ฉํธ๋ฆญ |
KafkaMetricsRecordInterceptor |
consumer ์ฒ๋ฆฌ์๊ฐ, producer-to-consumer ์ง์ฐ ๋ฉํธ๋ฆญ |
KafkaLogSanitizer |
๋ก๊ทธ ์ธ์ ์
๋ฐฉ์ง (\r\n\t ์นํ, 128์ ์ ๋จ) |
Application
โโ KafkaEventPublisher.publish(topic, eventType, payload)
โโ EventEnvelope.of(eventType, payload) โ UUID, timestamp ์๋ ์์ฑ
โโ KafkaEventMessageSupport.serialize() โ ObjectMapper โ JSON String
โโ KafkaTemplate.send(topic, json)
โโ KafkaMetricsProducerListener โ ์ฑ๊ณต/์คํจ ์นด์ดํฐ, ์ง์ฐ ํ์ด๋จธ
๋ฌด๊ดํ ์ด๋ฒคํธ์ ๋ํ ์ ์ฒด ์ญ์ง๋ ฌํ ๋น์ฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด 2-pass ์ ๋ต์ ์ฌ์ฉํ๋ค.
ConsumerRecord<String, String>
โ
โโ Pass 1: readTree(json) โ JsonNode
โ โโ extractEventType(node)
โ โโ eventType์ด ๊ธฐ๋๊ฐ๊ณผ ๋ถ์ผ์น? โ warn ๋ก๊ทธ, return (skip)
โ
โโ Pass 2: eventType ์ผ์น ์
โโ convertToEnvelope(node, TypeReference<EventEnvelope<T>>)
โโ KafkaEventConsumer.handle(envelope, recordKey)
์์ธ ๋ฐ์ ์ ๋ถ๋ฅ๊ธฐ๊ฐ ์ก์ ์ ๊ฒฐ์ ํ๋ค:
Exception ๋ฐ์
โโ KafkaExceptionClassifier.classify(exception)
โโ cause chain ์ํํ๋ฉฐ ์ฒซ ๋งค์นญ ๊ท์น ์ ์ฉ
โโ RETRY โ exponential backoff ํ ์ฌ์๋
โโ IGNORE โ skip (warn ๋ก๊ทธ + ๋ฉํธ๋ฆญ)
โโ DLQ โ {topic}.DLT๋ก ์ ์ก
| ์์ธ | ์ก์ | ์ฝ๋ |
|---|---|---|
KafkaMessageDeserializationException |
DLQ | DESERIALIZATION_FAILED |
DeserializationException |
DLQ | DESERIALIZATION_FAILED |
SerializationException |
DLQ | DESERIALIZATION_FAILED |
IllegalArgumentException |
IGNORE | INVALID_EVENT |
TimeoutException |
RETRY | TRANSIENT_NETWORK |
SocketTimeoutException |
RETRY | TRANSIENT_NETWORK |
RetriableException |
RETRY | TRANSIENT_NETWORK |
TransientDataAccessException |
RETRY | TRANSIENT_DB |
KafkaMessageProcessingException |
RETRY | PROCESSING_FAILED |
NonRetryableKafkaMessageProcessingException |
DLQ | NON_RETRYABLE_PROCESSING_FAILED |
| ๊ธฐํ ๋ชจ๋ ์์ธ | DLQ | UNKNOWN |
๋ถ๋ฅ๊ธฐ๋ cause chain ์ ์ฒด๋ฅผ ์ํํ๋ค. ๋ํ๋ ์์ธ๋ ์ฌ๋ฐ๋ฅด๊ฒ ๋ถ๋ฅ๋๋ค.
| ํ๋กํผํฐ | ๊ธฐ๋ณธ๊ฐ | ์ค๋ช |
|---|---|---|
spring.kafka.bootstrap-servers |
localhost:9092 |
Kafka ๋ธ๋ก์ปค ์ฃผ์ |
app.kafka.error-handler.retry.max-attempts |
2 |
์ต๋ ์ฌ์๋ ํ์ |
app.kafka.error-handler.retry.initial-interval-ms |
1000 |
์ฒซ ์ฌ์๋ ๋๊ธฐ (ms) |
app.kafka.error-handler.retry.multiplier |
2.0 |
backoff ๋ฐฐ์ |
app.kafka.error-handler.retry.max-interval-ms |
10000 |
์ต๋ ๋๊ธฐ ๊ฐ๊ฒฉ (ms) |
| ๋ฉํธ๋ฆญ | ํ์ | ํ๊ทธ |
|---|---|---|
kafka.producer.send.success.count |
Counter | topic, eventType, result |
kafka.producer.send.error.count |
Counter | topic, eventType, result |
kafka.producer.send.latency |
Timer (percentile) | topic, eventType |
| ๋ฉํธ๋ฆญ | ํ์ | ํ๊ทธ |
|---|---|---|
kafka.consumer.success.count |
Counter | topic, group, eventType |
kafka.consumer.invalid_event.count |
Counter | topic, group, eventType |
kafka.consumer.retryable_error.count |
Counter | topic, group, eventType |
kafka.consumer.dlt.count |
Counter | topic, group, eventType |
kafka.consumer.dedup_hit.count |
Counter | topic, group, eventType |
kafka.consumer.processing.time |
Timer (percentile) | topic, group, eventType |
kafka.consumer.producer_to_consumer.latency |
Timer (percentile) | topic, group, eventType |
eventType ํ๊ทธ๋ KafkaMetricTagSanitizer๊ฐ ์ ๊ทํํ๋ค. ํ์ฉ๋์ง ์์ ๊ฐ์ UNKNOWN ๋๋ OTHER๋ก ์นํ๋์ด ๋ฉํธ๋ฆญ ํญ๋ฐ์ ๋ฐฉ์งํ๋ค.
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
dependencies {
implementation 'com.github.da-bom:lib-kafka:v1.0.1'
}์ ํ๋ฆฌ์ผ์ด์
๋ฃจํธ ํจํค์ง๊ฐ com.dabom ํ์๊ฐ ์๋๋ฉด ๋ช
์์ ์ผ๋ก ์ค์บ ๋ฒ์๋ฅผ ์ถ๊ฐํ๋ค.
@SpringBootApplication(scanBasePackages = {
"com.myservice",
"com.dabom.messaging.kafka"
})
public class MyApplication {}@Service
@RequiredArgsConstructor
public class UsageEventPublishService {
private final KafkaEventPublisher kafkaEventPublisher;
public void publish(UsageRealtimePayload payload) {
kafkaEventPublisher.publish(
KafkaTopics.USAGE_REALTIME,
KafkaEventTypes.USAGE_REALTIME,
payload);
}
}์๋ฆผ ๋ฐํ:
@Service
@RequiredArgsConstructor
public class NotificationPublishService {
private final KafkaEventPublisher kafkaEventPublisher;
public void publish(NotificationPayload payload) {
kafkaEventPublisher.publish(
KafkaTopics.NOTIFICATION,
NotificationEventSupport.toEnvelope(payload));
}
}@Component
@RequiredArgsConstructor
public class UsageRealtimeListener {
private final KafkaEventMessageSupport kafkaEventMessageSupport;
private final UsageRealtimeService usageRealtimeService;
@KafkaListener(
topics = KafkaTopics.USAGE_REALTIME,
groupId = KafkaConsumerGroups.DABOM_API_CORE_REALTIME)
public void consume(ConsumerRecord<String, String> record) {
kafkaEventMessageSupport.consumeByEventType(
record,
KafkaEventTypes.USAGE_REALTIME,
new TypeReference<EventEnvelope<UsageRealtimePayload>>() {},
(envelope, key) -> usageRealtimeService.handle(envelope.payload(), key));
}
}๋ฆฌ์ค๋๋ฅผ ์๊ฒ ์ ์งํ๊ณ ์ฒ๋ฆฌ ์ฑ ์์ ๋ถ๋ฆฌํ๋ ํจํด:
@Component
@RequiredArgsConstructor
public class UsageRealtimeConsumer implements KafkaEventConsumer<UsageRealtimePayload> {
private final UsageRealtimeService usageRealtimeService;
@Override
public String eventType() {
return KafkaEventTypes.USAGE_REALTIME;
}
@Override
public TypeReference<EventEnvelope<UsageRealtimePayload>> typeReference() {
return new TypeReference<>() {};
}
@Override
public void handle(EventEnvelope<UsageRealtimePayload> envelope, String recordKey) {
usageRealtimeService.handle(envelope.payload(), recordKey);
}
}๋ฆฌ์ค๋์์ ์์:
@KafkaListener(topics = KafkaTopics.USAGE_REALTIME,
groupId = KafkaConsumerGroups.DABOM_API_CORE_REALTIME)
public void consume(ConsumerRecord<String, String> record) {
usageRealtimeConsumer.consume(record, kafkaEventMessageSupport);
}| ์ํฉ | ์ฌ์ฉํ ์์ธ | ๋ถ๋ฅ ๊ฒฐ๊ณผ |
|---|---|---|
| JSON ํ์ฑ / ์ญ์ง๋ ฌํ ์คํจ | KafkaMessageDeserializationException |
DLQ |
| ์ผ์ ์ฅ์ (๋คํธ์ํฌ, DB) | KafkaMessageProcessingException |
RETRY |
| ์ฌ์๋ ๋ฌด์๋ฏธํ ๋น์ฆ๋์ค ์คํจ | NonRetryableKafkaMessageProcessingException |
DLQ |
| ๊ณ์ฝ ์๋ฐ, ์ ๋ ฅ ๊ฒ์ฆ ์คํจ | IllegalArgumentException |
IGNORE |
- ํ๊ทธ ๋ฒ์ ๊ณ ์ ์ฌ์ฉ:
v1.0.1ํํ - ๊ธฐ์กด ํ๊ทธ ์ฌ์ฌ์ฉ ๊ธ์ง - ๋ณ๊ฒฝ ์ ๋ฐ๋์ ์ ํ๊ทธ ๋ฐํ
- ๋ธ๋ ์ดํน ๋ณ๊ฒฝ์ ๋ฉ์ด์ ๋ฒ์ ์
- ํจ์น/๊ธฐ๋ฅ ์ถ๊ฐ๋ ๋ง์ด๋/ํจ์น ๋ฒ์ ์ผ๋ก ์ ํ๊ทธ ๋ฐํ
- ๋ฒ์ ๋ฒํ
- notification ๊ณ์ฝ์
NotificationType+ ๋จ์ผNotificationPayload๊ตฌ์กฐ๋ก ๋จ์ํ EventEnvelope.subType์ ๊ฑฐusage-persistํ ํฝ ๊ณ์ฝ ์ ๊ฑฐ (USAGE_PERSIST,UsagePersistPayload, persistence consumer group)NotificationEventSupport.resolveTitle()ํฌํผ ์ถ๊ฐ
KafkaTopics,KafkaEventTypes,KafkaConsumerGroups์ถ๊ฐNotificationSubTypes,NotificationEventSupport์ถ๊ฐ
- ํจํค์ง ๊ตฌ์กฐ๋ฅผ
com.dabom.messaging.kafka๊ธฐ์ค์ผ๋ก ์ฌ์ ๋ฆฌ KafkaEventPublisher,DefaultKafkaEventPublisher,KafkaEventConsumer<T>์ถ๊ฐ- tracing ์ง์ ์ ๊ฑฐ
- ์ด๊ธฐ Kafka ์ค์ , ์ด๋ฒคํธ envelope, ์๋ฌ ์ฒ๋ฆฌ, ๋ฉํธ๋ฆญ ๊ธฐ๋ฅ ์ ๊ณต
# ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ๋ก์ ํธ์์
./gradlew clean publishToMavenLocal -x test// ์๋น ํ๋ก์ ํธ์์
repositories {
mavenLocal()
mavenCentral()
maven { url 'https://jitpack.io' }
}| ๋ฌธ์ | ๋ด์ฉ |
|---|---|
| usage-guide | ์ค์น๋ถํฐ ๋ฐํ/์๋น๊น์ง ๋จ๊ณ๋ณ ๊ฐ์ด๋ |
| kafka-architecture-overview | ํ ํฝ ๊ตฌ์กฐ, ์ปจ์๋จธ ๊ทธ๋ฃน, ์ฒ๋ฆฌ ํ๋ฆ |
| error-handling-policy | ์์ธ ๋ถ๋ฅ ๊ท์น, retry/DLT ์ ์ฑ |
| operations-guide | ๋ฉํธ๋ฆญ ํด์, DLT ๊ธฐ์ค, ์ด์ ์ฒดํฌํฌ์ธํธ |
| migration-guide | ๊ธฐ์กด ์๋น์ค์์ lib-kafka๋ก ์ ํํ๋ ์ ์ฐจ |