๐Ÿ”™๋’ค๋กœ๊ฐ€๊ธฐ

Kafka ์„ค์น˜ ๋ฐ ๊ตฌ์„ฑ์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ Spring Kafka ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

1. Gradle ๋นŒ๋“œ ํŒŒ์ผ ์ˆ˜์ •

Spring Boot ํ”„๋กœ์ ํŠธ์—์„œ Kafka๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ํ”„๋กœ์ ํŠธ์˜ build.gradle ํŒŒ์ผ์— Spring Kafka ์˜์กด์„ฑ์„ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค.

build.gradle

implementation 'org.springframework.kafka:spring-kafka'

2. Spring Boot Kafka ๊ตฌ์„ฑ

application.properties ๋˜๋Š” application.yml ํŒŒ์ผ์— Kakfa ์„œ๋ฒ„์˜ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

spring:
  kafka:
    bootstrap-servers: localhost:9092
# ์‹ค์ œ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์—ฌ๋Ÿฌ Kafka ๋ธŒ๋กœ์ปค๋ฅผ ','๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋‚˜์—ดํ•  ์ˆ˜ ์žˆ๋‹ค.
#		**bootstrap-servers: kafka1:9092,kafka2:9092,kafka3:9092**

์ด ์„ค์ •์€ Spring Boot ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๊ฒŒ Kafka ๋ธŒ๋กœ์ปค๊ฐ€ **localhost**์˜ 9092 ํฌํŠธ์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ ค์ค€๋‹ค. ์ฐธ๊ณ ๋กœ, **localhost:9092**๋Š” Kafka์˜ ๊ธฐ๋ณธ ์„ค์ •์ด๋ฉฐ, ์‹ค์ œ Kafka ์„œ๋ฒ„์˜ ์„ค์ •์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค.

3. ์ด๋ฒคํŠธ ์ƒ์„ฑ ๋ฐ ์ „์†ก

์‚ฌ์šฉ์ž ํ™œ๋™์— ๋”ฐ๋ฅธ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฅผ Kafka๋กœ ์ „์†กํ•˜๋Š” Java ๋กœ์ง์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด KafkaTemplate๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”์‹œ์ง€๋ฅผ Kafka ํ† ํ”ฝ์— ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ์ž ํ™œ๋™ ์ด๋ฒคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ „์†กํ•˜๋Š” ์„œ๋น„์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;

@Service
public class UserActivityService {

    private final KafkaTemplate<String, UserActivity> kafkaTemplate;

    public UserActivityService(KafkaTemplate<String, UserActivity> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void sendActivity(UserActivity activity) {
        kafkaTemplate.send("user-activities", activity);
    }
}

์—ฌ๊ธฐ์„œ **UserActivity**๋Š” ์‚ฌ์šฉ์ž ํ™œ๋™์„ ๋‚˜ํƒ€๋‚ด๋Š” ์˜ˆ์‹œ ํด๋ž˜์Šค์ด๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ์‚ฌ์šฉ์ž ID, ํ™œ๋™ ์œ ํ˜•, ์‹œ๊ฐ„, ๋‹ต๋ณ€ ๋‚ด์šฉ ๋“ฑ์˜ ํ•„๋“œ๋ฅผ ํฌํ•จํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ, **user-activities**๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ „์†กํ•  Kafka ํ† ํ”ฝ์˜ ์ด๋ฆ„์ด๋‹ค. Kafka ํ† ํ”ฝ์€ ๋ฉ”์‹œ์ง€๋ฅผ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ฐ ํ† ํ”ฝ์—๋Š” ๊ด€๋ จ๋œ ๋ฉ”์‹œ์ง€๋“ค์ด ์ €์žฅ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ† ํ”ฝ์˜ ์ด๋ฆ„์€ ์ €์žฅ๋˜๋Š” ๋ฉ”์‹œ์ง€์˜ ๋‚ด์šฉ์„ ์ž˜ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค.

ํ…Œ์ŠคํŠธ

์ด์ œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์‚ฌ์šฉ์ž ํ™œ๋™์„ Kafka๋กœ ์ „์†กํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋‹จ์œ„ ํ…Œ์ŠคํŠธ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ฝ”๋“œ ๋‚ด์—์„œ ์ง์ ‘ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” Spring Kafka์—์„œ ์ œ๊ณตํ•˜๋Š” **KafkaTestUtils**์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, Mock ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•ด Kafka ์—ฐ๊ฒฐ์„ ๋ชจ๋ฐฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ Kafka ์‚ฌ์ด์˜ ์‹ค์ œ ํ†ต์‹ ์„ ํ…Œ์ŠคํŠธํ•œ๋‹ค. ๋กœ์ปฌ์— ์„ค์น˜๋œ Kafka๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, Docker๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Kafka ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ Kafka ๊ฐ„์˜ ์‹ค์ œ ํ†ต์‹ ์ด ์ž˜ ์ด๋ฃจ์–ด์ง€๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.