λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

μŠ€ν”„λ§ λΆ€νŠΈμ™€ Kafka μ†Œκ°œ: μ‹€μ‹œκ°„ 데이터 처리의 힘

okrestart 2024. 10. 22.

 

μŠ€ν”„λ§ λΆ€νŠΈ 와 Apache Kafka λŠ” ν˜„λŒ€ IT μ‹œμŠ€ν…œμ—μ„œ μ€‘μš”ν•œ 역할을 ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 특히 μ‹€μ‹œκ°„ 데이터 처리 의 μ€‘μš”μ„±μ΄ μ»€μ§€λ©΄μ„œ, 두 기술의 결합은 더 큰 κ°€μΉ˜λ₯Ό λ°œνœ˜ν•˜κ²Œ λ©λ‹ˆλ‹€. 이번 ν¬μŠ€νŒ…μ—μ„œλŠ” μŠ€ν”„λ§ λΆ€νŠΈ 와 Kafka λ₯Ό μ†Œκ°œν•˜κ³ , 이λ₯Ό 톡해 μ‹€μ‹œκ°„ 데이터 처리 의 이점을 μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€. λ˜ν•œ, μ‹€λ¬΄μ—μ„œ μ–΄λ–»κ²Œ μ μš©ν•  수 μžˆλŠ”μ§€ μ½”λ“œ 예제 와 ν•¨κ»˜ μ„€λͺ…ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

 

μŠ€ν”„λ§ λΆ€νŠΈ κ°œμš”

μŠ€ν”„λ§ λΆ€νŠΈ λŠ” Spring Framework 의 ν™•μž₯판으둜, λ³΅μž‘ν•œ μ„€μ • 없이 λΉ λ₯΄κ²Œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 μžˆλŠ” λ„κ΅¬μž…λ‹ˆλ‹€. μžλ°” 개발자 듀이 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ§Œλ“€ λ•Œ νŽΈλ¦¬ν•˜κ²Œ μ‚¬μš©ν•  수 있으며, λ‹€μ–‘ν•œ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜μ—μ„œ 주둜 μ‚¬μš©λ©λ‹ˆλ‹€.

μŠ€ν”„λ§ λΆ€νŠΈμ˜ μ£Όμš” μž₯점 :
- λΉ λ₯Έ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 개발 : κ°„λ‹¨ν•œ μ„€μ •μœΌλ‘œ λ°”λ‘œ μ‹€ν–‰ κ°€λŠ₯ν•œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.
- μžλ™ μ„€μ • : λŒ€λΆ€λΆ„μ˜ 섀정이 μžλ™μœΌλ‘œ μ²˜λ¦¬λ˜μ–΄, κ°œλ°œμžλŠ” μ½”λ“œ μž‘μ„±μ— 집쀑할 수 μžˆμŠ΅λ‹ˆλ‹€.
- λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 지원 : 큰 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ—¬λŸ¬ μ„œλΉ„μŠ€λ‘œ λ‚˜λˆ  λ…λ¦½μ μœΌλ‘œ 배포할 수 μžˆμŠ΅λ‹ˆλ‹€.

 


 

Apache Kafkaλž€ 무엇인가?

Apache Kafka λŠ” λŒ€μš©λŸ‰μ˜ μ‹€μ‹œκ°„ 데이터 슀트리밍 을 μ²˜λ¦¬ν•˜λŠ” λΆ„μ‚°ν˜• λ©”μ‹œμ§• μ‹œμŠ€ν…œμž…λ‹ˆλ‹€. KafkaλŠ” 데이터λ₯Ό ν”„λ‘œλ“€μ„œ (producer)μ—μ„œ 컨슈머 (consumer)둜 λ³΄λ‚΄λŠ” λ©”μ‹œμ§€ 브둜컀 역할을 ν•©λ‹ˆλ‹€. λΆ„μ‚° ν™˜κ²½ μ—μ„œ 데이터 처리 μ„±λŠ₯을 κ·ΉλŒ€ν™”ν•  수 μžˆμ–΄, 이벀트 쀑심 μ‹œμŠ€ν…œ μ—μ„œ 자주 μ‚¬μš©λ©λ‹ˆλ‹€.

Kafka의 μ£Όμš” νŠΉμ§• :
- 높은 μ²˜λ¦¬λŸ‰ : μ΄ˆλ‹Ή 수백만 건의 λ©”μ‹œμ§€λ₯Ό μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
- ν™•μž₯μ„± : μ„œλ²„ λ…Έλ“œλ₯Ό μΆ”κ°€ν•΄ μ„±λŠ₯을 ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
- 내ꡬ성 : λ©”μ‹œμ§€κ°€ 손싀 없이 μ•ˆμ „ν•˜κ²Œ μ €μž₯λ©λ‹ˆλ‹€.

 


 

μŠ€ν”„λ§ λΆ€νŠΈμ—μ„œ Kafkaλ₯Ό μ‚¬μš©ν•˜λŠ” 이점

μŠ€ν”„λ§ λΆ€νŠΈμ—μ„œ Kafkaλ₯Ό μ‚¬μš©ν•˜λ©΄ κ°„νŽΈν•œ 톡합 이 κ°€λŠ₯ν•©λ‹ˆλ‹€. μŠ€ν”„λ§ λΆ€νŠΈλŠ” Kafkaμ™€μ˜ 톡합을 μœ„ν•΄ λ‹€μ–‘ν•œ μžλ™ μ„€μ • 을 μ œκ³΅ν•˜κ³  있으며, μ„€μ • 파일만으둜 Kafka ν΄λΌμ΄μ–ΈνŠΈλ₯Ό μ‰½κ²Œ ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

μŠ€ν”„λ§ λΆ€νŠΈ + Kafka의 μ£Όμš” 이점:

  • κ°„νŽΈν•œ μ„€μ • : μ˜μ‘΄μ„± 좔가와 κ°„λ‹¨ν•œ μ„€μ •λ§ŒμœΌλ‘œ Kafkaλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • 높은 ν™•μž₯μ„± : Kafkaλ₯Ό ν™œμš©ν•˜μ—¬ λŒ€κ·œλͺ¨ νŠΈλž˜ν”½μ„ μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μ‹€μ‹œκ°„ 데이터 처리 : μ‹€μ‹œκ°„ 둜그, νŠΈλžœμž­μ…˜ 데이터 λ“±μ˜ λΉ λ₯Έ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•©λ‹ˆλ‹€.

 


 

μ‹€μ‹œκ°„ 데이터 처리의 μ€‘μš”μ„±

μ˜€λŠ˜λ‚  λ°μ΄ν„°μ˜ μ–‘κ³Ό μ†λ„λŠ” κΈ°ν•˜κΈ‰μˆ˜μ μœΌλ‘œ 증가 ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 기업듀은 μ΄λŸ¬ν•œ 데이터λ₯Ό μ‹€μ‹œκ°„μœΌλ‘œ μ²˜λ¦¬ν•˜μ—¬ μ˜μ‚¬κ²°μ •μ— ν™œμš© ν•΄μ•Ό 경쟁λ ₯을 μœ μ§€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ‹œκ°„ 데이터 처리 λŠ” 주둜 이벀트 기반 μ•„ν‚€ν…μ²˜ μ—μ„œ μ‚¬μš©λ˜λ©°, KafkaλŠ” μ΄λŸ¬ν•œ μ‹€μ‹œκ°„ 처리λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” 핡심 λ„κ΅¬μž…λ‹ˆλ‹€.

 


 

μŠ€ν”„λ§ λΆ€νŠΈμ—μ„œ Kafka μ„€μ •ν•˜κΈ°: μ½”λ“œ 예제

이제 μŠ€ν”„λ§ λΆ€νŠΈ 와 Kafka λ₯Ό ν™œμš©ν•œ κ°„λ‹¨ν•œ λ©”μ‹œμ§€ μ†‘μˆ˜μ‹  예제 λ₯Ό μ‚΄νŽ΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

μ˜μ‘΄μ„± μΆ”κ°€

λ¨Όμ €, pom.xml νŒŒμΌμ— Kafka μ˜μ‘΄μ„±μ„ μΆ”κ°€ν•©λ‹ˆλ‹€:

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
    <version>2.8.0</version>
</dependency>

Kafka μ„€μ • 파일

application.yml νŒŒμΌμ—μ„œ Kafka 브둜컀 섀정을 ν•©λ‹ˆλ‹€:

spring:
  kafka:
    bootstrap-servers: localhost:9092
    consumer:
      group-id: my-group
      auto-offset-reset: earliest
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer

Kafka ν”„λ‘œλ“€μ„œ κ΅¬ν˜„

@Service
public class KafkaProducer {
    private static final Logger logger = LoggerFactory.getLogger(KafkaProducer.class);
    private final KafkaTemplate<String, String> kafkaTemplate;

    @Autowired
    public KafkaProducer(KafkaTemplate<String, String> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void sendMessage(String message) {
        logger.info(String.format("#### -> Producing message -> %s", message));
        this.kafkaTemplate.send("my_topic", message);
    }
}

Kafka 컨슈머 κ΅¬ν˜„

@Service
public class KafkaConsumer {
    private static final Logger logger = LoggerFactory.getLogger(KafkaConsumer.class);

    @KafkaListener(topics = "my_topic", groupId = "my-group")
    public void consume(String message) {
        logger.info(String.format("#### -> Consumed message -> %s", message));
    }
}

ν”„λ‘œλ“€μ„œ μ‚¬μš© 예제

@RestController
@RequestMapping("/api/kafka")
public class KafkaController {
    private final KafkaProducer kafkaProducer;

    @Autowired
    public KafkaController(KafkaProducer kafkaProducer) {
        this.kafkaProducer = kafkaProducer;
    }

    @PostMapping("/publish")
    public ResponseEntity<String> sendMessageToKafkaTopic(@RequestParam("message") String message) {
        this.kafkaProducer.sendMessage(message);
        return ResponseEntity.ok("Message sent to Kafka topic");
    }
}

이 μ½”λ“œλŠ” ν”„λ‘œλ“€μ„œ κ°€ λ©”μ‹œμ§€λ₯Ό my_topic 으둜 보내고, 컨슈머 κ°€ ν•΄λ‹Ή λ©”μ‹œμ§€λ₯Ό μ†ŒλΉ„ν•˜λŠ” κ΅¬μ‘°μž…λ‹ˆλ‹€. μ‹€μ œ μ‘μš© 사둀 λ‘œλŠ” 둜그 처리 , μ‹€μ‹œκ°„ νŠΈλžœμž­μ…˜ 처리 λ“±μ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 


 

μ‹€μ‹œκ°„ 데이터 처리 νŠΈλ Œλ“œ

졜근 μ‹€μ‹œκ°„ 데이터 처리 의 ν•„μš”μ„±μ΄ λ‹€μ–‘ν•œ μ‚°μ—…μ—μ„œ μ¦κ°€ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. 특히 금육 , μ†Œμ…œ λ―Έλ””μ–΄ , IoT λ“±μ—μ„œ μ‹€μ‹œκ°„ 데이터 뢄석 이 μ€‘μš”ν•œ 역할을 ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. Gartner λ³΄κ³ μ„œμ— λ”°λ₯΄λ©΄, μ‹€μ‹œκ°„ 데이터 μ²˜λ¦¬λŠ” μ•žμœΌλ‘œλ„ 계속 μ„±μž₯ν•  것이며, 2025λ…„κΉŒμ§€ 전체 λ°μ΄ν„°μ˜ 75%κ°€ μ‹€μ‹œκ°„μœΌλ‘œ 처리될 것 으둜 μ˜ˆμΈ‘ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

 


 

자주 λ¬»λŠ” 질문 (FAQ)

Q1. KafkaλŠ” μ–΄λ–€ μƒν™©μ—μ„œ μ‚¬μš©ν•˜λ‚˜μš”?
A1. KafkaλŠ” λŒ€κ·œλͺ¨ μ‹€μ‹œκ°„ 데이터 μŠ€νŠΈλ¦¬λ°μ„ μ²˜λ¦¬ν•  λ•Œ μ‚¬μš©λ©λ‹ˆλ‹€. 주둜 둜그 처리 , νŠΈλžœμž­μ…˜ 데이터 처리, 이벀트 기반 μ‹œμŠ€ν…œ μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.

Q2. μŠ€ν”„λ§ λΆ€νŠΈμ—μ„œ Kafkaλ₯Ό μ„€μ •ν•˜λŠ” 데 λ³΅μž‘ν•œκ°€μš”?
A2. μ•„λ‹ˆμš”. μŠ€ν”„λ§ λΆ€νŠΈλŠ” Kafkaμ™€μ˜ 톡합을 μœ„ν•΄ λ‹€μ–‘ν•œ μžλ™ μ„€μ • 을 μ œκ³΅ν•˜μ—¬ κ°„λ‹¨ν•˜κ²Œ ꡬ성할 수 μžˆμŠ΅λ‹ˆλ‹€.

Q3. Kafka의 ν™•μž₯성은 μ–΄λŠ μ •λ„μΈκ°€μš”?
A3. KafkaλŠ” λΆ„μ‚°ν˜• μ‹œμŠ€ν…œ 으둜, μ„œλ²„ λ…Έλ“œλ₯Ό μΆ”κ°€ν•˜μ—¬ μ‰½κ²Œ ν™•μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Q4. μ‹€μ‹œκ°„ 데이터 μ²˜λ¦¬λŠ” μ™œ μ€‘μš”ν•œκ°€μš”?
A4. μ‹€μ‹œκ°„ 데이터 μ²˜λ¦¬λŠ” λΉ λ₯΄κ²Œ λ³€ν™”ν•˜λŠ” λΉ„μ¦ˆλ‹ˆμŠ€ ν™˜κ²½μ—μ„œ μ‹€μ‹œκ°„ μ˜μ‚¬κ²°μ • 을 κ°€λŠ₯ν•˜κ²Œ ν•˜λ©°, 경쟁λ ₯을 λ†’μ΄λŠ” 핡심 μš”μ†Œμž…λ‹ˆλ‹€.

Q5. μŠ€ν”„λ§ λΆ€νŠΈμ—μ„œ Kafkaλ₯Ό μ‚¬μš©ν•˜λŠ” μ˜ˆμ‹œλ₯Ό λ³Ό 수 μžˆλ‚˜μš”?
A5. μœ„μ—μ„œ 제곡된 μ½”λ“œλ₯Ό μ°Έκ³ ν•˜λ©΄, μŠ€ν”„λ§ λΆ€νŠΈμ—μ„œ Kafkaλ₯Ό μ–΄λ–»κ²Œ μ‚¬μš©ν•˜λŠ”μ§€ μ‰½κ²Œ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ“κΈ€