Implementing Messaging with Spring Boot and Apache Kafka

스프링 부트와 아파치 카프카를 활용한 메시징 구현

메시징은 분산 시스템에서 데이터를 주고받는 방식 중 하나로, 실시간성이 중요한 시스템에서 많이 사용됩니다. 이번에는 스프링 부트와 아파치 카프카를 이용하여 메시징을 구현하는 방법에 대해 알아보겠습니다.

아파치 카프카란?

아파치 카프카는 대용량 실시간 로그처리에 특화된 오픈소스 메시징 시스템입니다. 대규모 데이터 처리에 최적화되어 있으며, 수백만 개의 이벤트 스트림을 처리할 수 있습니다. 또한, 데이터를 복제하여 내구성과 가용성을 보장하며, 분산 시스템에서는 필수적인 기술이라고 할 수 있습니다.

카프카 프로듀서와 컨슈머의 구현 방법

카프카에서는 데이터를 보내는 역할을 하는 프로듀서와 데이터를 받아 처리하는 역할을 하는 컨슈머가 있습니다. 스프링 부트에서는 이를 구현하기 위해 spring-kafka 라이브러리를 사용할 수 있습니다.

@Service
public class KafkaProducer {
    private final KafkaTemplate kafkaTemplate;
    private final String topic = "test-topic";

    public KafkaProducer(KafkaTemplate kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }

    public void sendMessage(String message) {
        kafkaTemplate.send(topic, message);
    }
}

@Service
public class KafkaConsumer {
    @KafkaListener(topics = "test-topic", groupId = "group-id")
    public void consume(String message) {
        // 데이터 처리 로직
    }
}

위의 코드는 KafkaProducerKafkaConsumer 클래스를 정의한 것입니다. KafkaProducer에서는 KafkaTemplate을 이용하여 메시지를 보내고, KafkaConsumer에서는 @KafkaListener 어노테이션을 이용하여 메시지를 받아 처리합니다.

스프링 부트를 이용한 브로커 설정 및 메시지 전송 구현

카프카에서는 브로커란 데이터를 중개하는 서버를 의미합니다. 스프링 부트에서는 application.properties 파일을 이용하여 브로커 설정을 할 수 있습니다.

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

위의 코드에서는 spring.kafka.bootstrap-servers를 이용하여 브로커의 주소를 설정하고, spring.kafka.producer.value-serializerspring.kafka.consumer.value-deserializer를 이용하여 직렬화 및 역직렬화를 설정하였습니다.

메시지를 전송하는 코드는 다음과 같습니다.

@RestController
public class KafkaController {
    private final KafkaProducer kafkaProducer;

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

    @GetMapping("/kafka/send/{message}")
    public void sendMessage(@PathVariable String message) {
        kafkaProducer.sendMessage(message);
    }
}

위의 코드에서는 KafkaProducer를 이용하여 메시지를 보내는 sendMessage 메소드를 정의하였습니다. 이 메소드는 @GetMapping 어노테이션을 이용하여 GET 요청을 받아 실행됩니다.

결론

이번에는 스프링 부트와 아파치 카프카를 이용하여 메시징을 구현하는 방법에 대해 알아보았습니다. 카프카는 대규모 실시간 데이터 처리에 최적화된 메시징 시스템이며, 스프링 부트에서는 spring-kafka 라이브러리를 이용하여 간편하게 구현할 수 있습니다. 메시징을 구현하면 분산 시스템에서 데이터를 효율적으로 처리할 수 있으므로, 많은 시스템에서 사용될 것으로 예상됩니다.