๋ฐฐ์น ์ฒ๋ฆฌ vs ์คํธ๋ฆผ ์ฒ๋ฆฌ. ์์์ ํ ๋ฒ์ ์ฒ๋ฆฌํ ๊น, ๋ค์ด์ค๋ ์ฆ์ ์ฒ๋ฆฌํ ๊น. ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃจ๋ ๋ ๊ฐ์ง ๋ฐฉ์์ Spring Batch์ Kafka๋ผ๋ ๋ํ ๋๊ตฌ๋ก ์ดํด๋ณด๊ณ , ์ธ์ ๋ฌด์์ ์จ์ผ ํ๋์ง ์ค์ ์ฝ๋์ ํจ๊ป ์ ๋ฆฌํ๋ค.
๋ค์ด๊ฐ๋ฉฐ
๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ ๊ฐ๋๋ค. ํ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ชจ์๋๋ค๊ฐ ์ ํด์ง ์์ ์ ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐฐ์น(Batch), ๋ค๋ฅธ ํ๋๋ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์ค๋ ์ฆ์ ํ๋ ค๋ณด๋ด๋ฉฐ ์ฒ๋ฆฌํ๋ ์คํธ๋ฆผ(Stream)์ด๋ค.
"๋งค์ผ ์๋ฒฝ 2์์ ์ด์ ๋งค์ถ์ ์ง๊ณํ๋ค"๋ฉด ๋ฐฐ์น, "๊ฒฐ์ ๊ฐ ์ผ์ด๋๋ ์๊ฐ ์ค์๊ฐ์ผ๋ก ์ด์ ๊ฑฐ๋๋ฅผ ํ์งํ๋ค"๋ฉด ์คํธ๋ฆผ์ด๋ค. ๊ฐ์ ๋ฐ์ดํฐ๋ผ๋ ์ธ์ ์ฒ๋ฆฌํ๋๋์ ๋ฐ๋ผ ์ ๊ทผ์ด ์์ ํ ๋ฌ๋ผ์ง๋ค.
๋ฐฐ์น๋ "์์์ ํ ๋ฒ์", ์คํธ๋ฆผ์ "๋ค์ด์ค๋ ์ฆ์". ์ด ํ์ด๋ฐ์ ์ฐจ์ด๊ฐ ๋๊ตฌ ์ ํ์ ๊ฐ๋ฅธ๋ค.
์ด ๊ธ์์๋ ๋ ๋ฐฉ์์ ๊ฐ๋ ์ ์ก๊ณ , ๊ฐ๊ฐ์ ๋ํ ๋๊ตฌ์ธ Spring Batch(๋ฐฐ์น)์ Kafka(์คํธ๋ฆผ)๋ฅผ ์ค์ ์ฝ๋๋ก ์ดํด๋ณธ๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ์ ๋ฌด์์ ์จ์ผ ํ๋์ง ์ ๋ฆฌํ๋ค.
๋ฐฐ์น ์ฒ๋ฆฌ๋
๋ฐฐ์น ์ฒ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ผ์ ๊ธฐ๊ฐ ๋ชจ์๋ค๊ฐ, ์ ํด์ง ์์ ์ ๋ฌถ์(batch)์ผ๋ก ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด๋ค. ์ ํต์ ์ด๊ณ ๊ฐ์ฅ ์ค๋๋ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐฉ์์ด๋ค.
ํน์ง์ ์ด๋ ๋ค.
- ์ ํด์ง ์์ ์ ์คํ๋๋ค (๋งค์ผ ์๋ฒฝ, ๋งค์ ์ ๊ฐ ๋ฑ)
- ํ ๋ฒ์ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ค
- ์ค์๊ฐ์ผ ํ์๊ฐ ์๋ค (๋ช ์๊ฐ ๋ฆ์ด๋ ๋๋ ์์ )
- ์ฒ๋ฆฌ๋(throughput)์ด ์ค์ํ๊ณ , ์ง์ฐ์๊ฐ(latency)์ ๋ ์ค์ํ๋ค
๋ํ์ ์ธ ์๊ฐ ์ ์ฐ, ํต๊ณ ์ง๊ณ, ๋๋ ๋ฉ์ผ ๋ฐ์ก, ๋ฐ์ดํฐ ๋ง์ด๊ทธ๋ ์ด์ ์ด๋ค. "์ด์ ํ๋ฃจ์น๋ฅผ ์ค๋ ์๋ฒฝ์ ์ ๋ฆฌ"ํ๋ ์์ ์์ ์ด ์ ํ์ ์ด๋ค.
Spring Batch — ๋ฐฐ์น์ ๋ํ ๋๊ตฌ
์๋ฐ ์ง์์์ ๋ฐฐ์น ์ฒ๋ฆฌ์ ์ฌ์ค์ ํ์ค์ Spring Batch๋ค. "์์ฆ๋ ์ฐ๋?" ์ถ์ง๋ง, ๊ธ์ต·๋ณดํ·์ ์ฐ์ฒ๋ผ ๋๋์ ์ ํ ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ ์์ญ์์๋ ์ฌ์ ํ ํ์ญ์ด๋ค. ์ฒญํฌ ๋จ์ ์ฒ๋ฆฌ, ์คํจ ์ ์ฌ์์, skip/retry ๊ฐ์ ๊ธฐ๋ฅ์ ์ง์ ๋ง๋ค๋ฉด ๋์ฐํ๋ฐ, Spring Batch๊ฐ ๋ค ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํต์ฌ ๊ตฌ์กฐ๋ Job → Step → (Reader-Processor-Writer) ๋ค.
Job (๋ฐฐ์น ์์
์ ์ฒด)
โ Step (ํ๋์ ์ฒ๋ฆฌ ๋จ๊ณ)
โ ItemReader : ๋ฐ์ดํฐ๋ฅผ ์ฝ์ด์จ๋ค (DB, ํ์ผ)
โ ItemProcessor : ํ ๊ฑด์ฉ ๊ฐ๊ณตํ๋ค
โ ItemWriter : ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๋ค
ํ์๋ค์ ์ด์ ์ฃผ๋ฌธ์ ์ง๊ณํ๋ ๋ฐฐ์น๋ฅผ ์๋ก ๋ณด์.
@Configuration
public class OrderSummaryBatch {
// 1. Reader — DB์์ ์ฃผ๋ฌธ์ ํ ๊ฑด์ฉ ์ฝ๋๋ค (์ปค์ ๊ธฐ๋ฐ: ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ )
@Bean
public JdbcCursorItemReader<Order> reader(DataSource dataSource) {
return new JdbcCursorItemReaderBuilder<Order>()
.name("orderReader")
.dataSource(dataSource)
.sql("SELECT id, user_id, amount FROM orders " +
"WHERE created_at >= CURRENT_DATE - 1")
.rowMapper((rs, n) -> new Order(
rs.getLong("id"),
rs.getLong("user_id"),
rs.getInt("amount")))
.build();
}
// 2. Processor — ํ ๊ฑด์ฉ ๊ฐ๊ณต (์: ์ง๊ณ์ฉ ๊ฐ์ฒด๋ก ๋ณํ)
@Bean
public ItemProcessor<Order, OrderSummary> processor() {
return order -> new OrderSummary(order.userId(), order.amount());
}
// 3. Writer — ๊ฒฐ๊ณผ๋ฅผ ์ง๊ณ ํ
์ด๋ธ์ ์ ์ฅ
@Bean
public JdbcBatchItemWriter<OrderSummary> writer(DataSource dataSource) {
return new JdbcBatchItemWriterBuilder<OrderSummary>()
.dataSource(dataSource)
.sql("INSERT INTO order_summary (user_id, total) " +
"VALUES (:userId, :total)")
.beanMapped()
.build();
}
// 4. Step — Reader-Processor-Writer๋ฅผ ๋ฌถ๊ณ , chunk(10)๋ก ์ฒ๋ฆฌ
@Bean
public Step step(JobRepository repo, PlatformTransactionManager tm,
JdbcCursorItemReader<Order> reader,
ItemProcessor<Order, OrderSummary> processor,
JdbcBatchItemWriter<OrderSummary> writer) {
return new StepBuilder("summaryStep", repo)
.<Order, OrderSummary>chunk(10, tm) // 10๊ฑด์ฉ ๋ฌถ์ด ํธ๋์ญ์
์ฒ๋ฆฌ
.reader(reader)
.processor(processor)
.writer(writer)
.build();
}
// 5. Job — ์ ์ฒด ๋ฐฐ์น ์์
@Bean
public Job orderSummaryJob(JobRepository repo, Step step) {
return new JobBuilder("orderSummaryJob", repo)
.start(step)
.build();
}
}
์ฌ๊ธฐ์ chunk(10) ๊ฐ ํต์ฌ์ด๋ค. 10๊ฑด์ฉ ๋ฌถ์ด์ ์ฝ๊ณ -๊ฐ๊ณตํ๊ณ -์ฐ๊ณ ๋ฅผ ํ ํธ๋์ญ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ค. 100๋ง ๊ฑด์ ํ ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฌ์ง ์๊ณ 10๊ฑด์ฉ ๋๋ ์ฒ๋ฆฌํ๋, ๋์ฉ๋์๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํฐ์ง์ง ์๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๊ฐ์ ์คํจํ๋ฉด ๊ทธ ์ง์ ๋ถํฐ ์ฌ์์ํ ์ ์๋ค. ์ด๊ฒ ์ง์ ์ง๋ฉด ๊ณ ํต์ค๋ฌ์ด, Spring Batch์ ๊ฐ์น๋ค.
๋ณดํต ์ด Job์ ์ค์ผ์ค๋ฌ(@Scheduled๋ Quartz)๋ก ๋งค์ผ ์๋ฒฝ์ ๋๋ฆฐ๋ค.
์คํธ๋ฆผ ์ฒ๋ฆฌ๋
์คํธ๋ฆผ ์ฒ๋ฆฌ๋ ์ ๋ฐ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ชจ์ผ์ง ์๊ณ , ๋ค์ด์ค๋ ์ฆ์ ํ๋์ฉ(๋๋ ์์ ๋ฌถ์์ผ๋ก) ์ค์๊ฐ ์ฒ๋ฆฌํ๋ค.
ํน์ง์ ์ด๋ ๋ค.
- ๋ฐ์ดํฐ๊ฐ ๋ฐ์ํ๋ ์ฆ์ ์ฒ๋ฆฌํ๋ค
- ์ง์ฐ์๊ฐ(latency) ์ด ์ค์ํ๋ค (๋ฐ๋ฆฌ์ด~์ด ๋จ์ ๋ฐ์)
- ๋ฐ์ดํฐ๊ฐ ๋์์์ด ํ๋ฅธ๋ค (๋์ด ์ ํด์ง์ง ์์)
- ์ค์๊ฐ ๋ฐ์์ด ํ์ํ ์์ ์ ์ ํฉํ๋ค
๋ํ์ ์ธ ์๊ฐ ์ค์๊ฐ ์ด์ ๊ฑฐ๋ ํ์ง, ์ค์๊ฐ ์๋ฆผ, ๋ก๊ทธ ๋ชจ๋ํฐ๋ง, ์ค์๊ฐ ์ถ์ฒ์ด๋ค. "์ง๊ธ ์ด ์๊ฐ ์ผ์ด๋๋ ์ผ์ ์ฆ์ ๋ฐ์"ํด์ผ ํ๋ ์์ ์ด๋ค.
Kafka — ์คํธ๋ฆผ์ ๋ํ ๋๊ตฌ
์คํธ๋ฆผ ์ฒ๋ฆฌ์ ์ค์ฌ์๋ Apache Kafka๊ฐ ์๋ค. ์ ํํ๋ Kafka๋ ๋ฐ์ดํฐ๊ฐ ํ๋ฅด๋ ํต๋ก(๋ฉ์์ง ํ/์ด๋ฒคํธ ์คํธ๋ฆฌ๋ฐ ํ๋ซํผ) ์ด๊ณ , ๊ทธ ์์์ ์ค์๊ฐ ์ฒ๋ฆฌ๊ฐ ์ผ์ด๋๋ค.
ํต์ฌ ๊ฐ๋ ์ ์ ์ด๋ค.
| ๊ฐ๋ | ์ญํ |
| Producer | ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ์ชฝ (์ด๋ฒคํธ ๋ฐํ) |
| Topic | ๋ฐ์ดํฐ๊ฐ ์์ด๋ ์นดํ ๊ณ ๋ฆฌ๋ณ ํต๋ก |
| Consumer | ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ ์ชฝ (์ด๋ฒคํธ ๊ตฌ๋ ) |
์์ฐ์๊ฐ ํ ํฝ์ ์ด๋ฒคํธ๋ฅผ ๋์ง๋ฉด, ์๋น์๊ฐ ๊ทธ๊ฑธ ์ค์๊ฐ์ผ๋ก ๋ฐ์ ์ฒ๋ฆฌํ๋ค. ์ฃผ๋ฌธ์ด ๋ฐ์ํ ๋๋ง๋ค ์ด๋ฒคํธ๋ฅผ ํ๋ ค๋ณด๋ด๋ ์๋ฅผ ๋ณด์.
Producer — ์ด๋ฒคํธ ๋ฐํ
@Service
public class OrderEventProducer {
private final KafkaTemplate<String, OrderEvent> kafkaTemplate;
public OrderEventProducer(KafkaTemplate<String, OrderEvent> kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
// ์ฃผ๋ฌธ์ด ์๊ธธ ๋๋ง๋ค 'orders' ํ ํฝ์ผ๋ก ์ด๋ฒคํธ๋ฅผ ํ๋ ค๋ณด๋ธ๋ค
public void publish(Order order) {
OrderEvent event = new OrderEvent(
order.getId(), order.getUserId(), order.getAmount());
kafkaTemplate.send("orders", event);
// ๋ฐฐ์น์ฒ๋ผ ๋ชจ์ผ์ง ์๋๋ค. ๋ฐ์ ์ฆ์ ์ ์ก.
}
}
Consumer — ์ค์๊ฐ ์ฒ๋ฆฌ
@Service
public class FraudDetectionConsumer {
// 'orders' ํ ํฝ์ ์ด๋ฒคํธ๊ฐ ๋ค์ด์ค๋ ์ฆ์ ํธ์ถ๋๋ค
@KafkaListener(topics = "orders", groupId = "fraud-detection")
public void handle(OrderEvent event) {
// ์ค์๊ฐ ์ด์ ๊ฑฐ๋ ํ์ง — ๋ค์ด์ค์๋ง์ ๊ฒ์ฌ
if (event.amount() > 10_000_000) {
alertService.notify("๊ณ ์ก ๊ฒฐ์ ๊ฐ์ง: " + event.orderId());
}
// ์๋ฒฝ๊น์ง ๊ธฐ๋ค๋ฆฌ์ง ์๋๋ค. ์ง๊ธ ์ฆ์ ๋ฐ์.
}
}
๋ฐฐ์น ์ฝ๋์ ๋น๊ตํ๋ฉด ์ฐจ์ด๊ฐ ๋ถ๋ช ํ๋ค. Spring Batch๋ "์ด์ ์น๋ฅผ ๋ชจ์์ ์๋ฒฝ์ ํ ๋ฒ์" ์ฒ๋ฆฌํ์ง๋ง, Kafka๋ "์ฃผ๋ฌธ์ด ์๊ธฐ๋ ๋งค ์๊ฐ ์ฆ์" ์ฒ๋ฆฌํ๋ค. ๊ฐ์ ์ฃผ๋ฌธ ๋ฐ์ดํฐ์ธ๋ฐ ์ฒ๋ฆฌ ํ์ด๋ฐ์ด ์ ๋ฐ๋๋ค.
Kafka์ ๋ ๋ค๋ฅธ ๊ฐ์ ์ ํ๋์ ํ ํฝ์ ์ฌ๋ฌ ์๋น์๊ฐ ๊ฐ์ ๊ตฌ๋
ํ ์ ์๋ค๋ ์ ์ด๋ค. orders ํ ํฝ ํ๋๋ฅผ ์ด์ํ์ง ์๋น์, ์๋ฆผ ์๋น์, ํต๊ณ ์๋น์๊ฐ ๋์์ ๋ฐ์ ๊ฐ์ ์ฒ๋ฆฌํ๋ค. ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ํคํ
์ฒ์ ํ ๋๊ฐ ๋๋ค.
ํ๋์ ๋น๊ต

| ๋ฐฐ์น ์ฒ๋ฆฌ (Spring Batch) | ์คํธ๋ฆผ ์ฒ๋ฆฌ (Kafka) | |
| ์ฒ๋ฆฌ ์์ | ์ ํด์ง ์์ ์ ํ ๋ฒ์ | ๋ฐ์ดํฐ ๋ฐ์ ์ฆ์ |
| ๋ฐ์ดํฐ | ๋ชจ์๋ ์ ํํ ๋ฌถ์ | ๋์์์ด ํ๋ฅด๋ ๋ฐ์ดํฐ |
| ์ค์ ์งํ | ์ฒ๋ฆฌ๋(throughput) | ์ง์ฐ์๊ฐ(latency) |
| ์ง์ฐ | ํ์ฉ๋จ (๋ช ์๊ฐ OK) | ์ต์ํ (๋ฐ๋ฆฌ์ด~์ด) |
| ๋ํ ์ | ์ ์ฐ, ํต๊ณ, ๋ง์ด๊ทธ๋ ์ด์ | ์ค์๊ฐ ํ์ง, ์๋ฆผ, ๋ชจ๋ํฐ๋ง |
| ๋ณต์ก๋ | ์๋์ ์ผ๋ก ๋จ์ | ์ธํ๋ผ ์ด์ ๋ณต์ก |
๊ทธ๋์, ๋ฌด์์ ์จ์ผ ํ๋
์ ํ ๊ธฐ์ค์ ๊ฒฐ๊ตญ "์ผ๋ง๋ ๋นจ๋ฆฌ ๋ฐ์ํด์ผ ํ๋๊ฐ" ๋ค.
๋ฐฐ์น๊ฐ ๋ง๋ ๊ฒฝ์ฐ
- ์ค์๊ฐ์ผ ํ์๊ฐ ์๋ค (์ผ/์๊ฐ ๋จ์๋ก ์ถฉ๋ถ)
- ๋๋์ ๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ผ๋ก, ์ ํํ๊ฒ ์ฒ๋ฆฌํด์ผ ํ๋ค
- ์ ์ฐ·ํต๊ณ·๋ฆฌํฌํธ์ฒ๋ผ ์ ํด์ง ์ฃผ๊ธฐ์ ์์
- ์คํจ ์ ์ฌ์์·์ ํฉ์ฑ์ด ์ค์ํ๋ค → Spring Batch
์คํธ๋ฆผ์ด ๋ง๋ ๊ฒฝ์ฐ
- ์ฆ๊ฐ์ ์ธ ๋ฐ์์ด ํ์ํ๋ค (์ด์ ํ์ง, ์ค์๊ฐ ์๋ฆผ)
- ๋ฐ์ดํฐ๊ฐ ๋์์์ด ๋ฐ์ํ๋ค
- ์ฌ๋ฌ ์์คํ ์ด ๊ฐ์ ์ด๋ฒคํธ์ ๋ฐ์ํด์ผ ํ๋ค → Kafka
๊ทธ๋ฆฌ๊ณ ์ค์ํ ์ — ๋์ ์์ํ์ผ์ด ์๋๋ค. ์ค๋ฌด์์๋ ์์ฃผ ํจ๊ป ์ด๋ค. ์๋ฅผ ๋ค์ด Kafka๋ก ์ค์๊ฐ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ ์ฒ๋ฆฌํ๋ฉด์, ๋์์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์์๋๋ค๊ฐ ์๋ฒฝ ๋ฐฐ์น๋ก ์ผ๋ณ ์ง๊ณ๋ฅผ ๋๋ฆฐ๋ค. "์ค์๊ฐ ๋ฐ์์ ์คํธ๋ฆผ, ๋๋ ์ง๊ณ๋ ๋ฐฐ์น"๋ก ์ญํ ์ ๋๋๋ ๊ฒ์ด๋ค.
์คํธ๋ฆผ์ด ๋ฐฐ์น๋ฅผ ์์ ํ ๋์ฒดํ๋ ๊ฒ ์๋๋ค. ๋น ๋ฅธ ๋ฐ์์ด ํ์ํ ๊ณณ์ ์คํธ๋ฆผ, ์ ํํ ๋๋ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ณณ์ ๋ฐฐ์น. ๋์ ๊ณต์กดํ๋ค.
๋ง์น๋ฉฐ
๋ฐฐ์น์ ์คํธ๋ฆผ์ "๋ฐ์ดํฐ๋ฅผ ์ธ์ ์ฒ๋ฆฌํ๋๋"์ ๋ํ ๋ ๊ฐ์ง ๋ต์ด๋ค. ์์์ ํ ๋ฒ์ ์ฒ๋ฆฌํ๋ ๋ฐฐ์น(Spring Batch)๋ ์ ์ฐ·์ง๊ณ์ฒ๋ผ ์ ํ์ฑ๊ณผ ์ฒ๋ฆฌ๋์ด ์ค์ํ ๊ณณ์์ ์ฌ์ ํ ๊ฐ๋ ฅํ๊ณ , ๋ค์ด์ค๋ ์ฆ์ ์ฒ๋ฆฌํ๋ ์คํธ๋ฆผ(Kafka)์ ์ค์๊ฐ ๋ฐ์์ด ํ์ํ ๊ณณ์์ ๋น๋๋ค.
"์์ฆ์ ๋ค ์ค์๊ฐ ์๋์ผ?"๋ผ๊ณ ์๊ฐํ๊ธฐ ์ฝ์ง๋ง, ํ์ค์ ๊ทธ๋ ์ง ์๋ค. ์๋ฒฝ์ ํ ๋ฒ ๋๋ฆฌ๋ฉด ๋๋ ์ผ์ ๊ตณ์ด ์ค์๊ฐ์ผ๋ก ๋ง๋ค๋ฉด ์ธํ๋ผ๋ง ๋ณต์กํด์ง๋ค. ๋ฐ๋๋ก ์ฆ๊ฐ ๋ฐ์ํด์ผ ํ ์ผ์ ๋ฐฐ์น๋ก ์ฒ๋ฆฌํ๋ฉด ๋๋ฌด ๋ฆ๋๋ค. ํต์ฌ์ ํ๋ ค๋ ๋ฌธ์ ๊ฐ ์ค์๊ฐ์ ์๊ตฌํ๋์ง ๋จผ์ ๋ฌป๋ ๊ฒ์ด๋ค.
์ข์ ๋ฐฑ์๋ ๊ฐ๋ฐ์๋ ๋ ๋ค ์ดํดํ๊ณ , ๋ฌธ์ ์ ๋ง๊ฒ ๊ณ ๋ฅด๊ฑฐ๋ ์กฐํฉํ๋ค. ๋ฐฐ์น๋ ์คํธ๋ฆผ์ด๋๊ฐ ์๋๋ผ, ์ด๋์ ๋ฌด์์ ์ธ์ง๊ฐ ์ง์ง ์ค๋ ฅ์ด๋ค.
์ฐธ๊ณ ์ถ์ฒ
- Spring Batch ๊ณต์ ๋ฌธ์ — https://docs.spring.io/spring-batch/reference/
- Apache Kafka ๊ณต์ ๋ฌธ์ — https://kafka.apache.org/documentation/
- Spring for Apache Kafka — https://docs.spring.io/spring-kafka/reference/
- Confluent: Batch vs Stream Processing — https://www.confluent.io/learn/batch-vs-stream-processing/
'๐ Tech Stack > Backend' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ํ์ ์์ ์์ฃผ ์ฐ๋ ๋ฐฑ์๋ ์คํฌ๋ค (with JAVA) (3) | 2026.07.10 |
|---|---|
| @Transactional ์ ๋ฆฌ (0) | 2026.06.22 |
| HTTP ์ํ ์ฝ๋(Status Code) ์ ๋ฆฌ (1) | 2026.06.15 |
| ์น ์ธ์ฆ ๋ฐฉ์ ๋น๊ต (์ฟ ํค, ์ธ์ , ํ ํฐ) (1) | 2026.06.09 |
| JPA N+1 ์ฌํ๋ถํฐ Fetch Join, Batch Size๊น์ง (0) | 2026.06.03 |