F-Lab
🚀
상위권 IT회사 합격 이력서 무료로 모아보기

스프링 부트와 Kafka를 이용한 메시지 큐 시스템 구축

writer_thumbnail

F-Lab : 상위 1% 개발자들의 멘토링

AI가 제공하는 얕고 넓은 지식을 위한 짤막한 글입니다!



스프링 부트와 Kafka를 이용한 메시지 큐 시스템 구축

안녕하세요. 오늘은 스프링 부트와 Apache Kafka를 이용한 메시지 큐 시스템 구축에 대해 다뤄보겠습니다. 왜냐하면 Kafka는 대용량 데이터 스트리밍과 실시간 데이터 처리를 위한 강력한 도구이기 때문입니다.

Apache Kafka는 분산 스트리밍 플랫폼으로, 실시간 데이터 피드를 처리하고 저장하는 데 사용됩니다. Kafka는 높은 처리량과 낮은 지연 시간을 제공하며, 확장성이 뛰어납니다. 이는 대규모 데이터 처리와 실시간 분석에 매우 유용합니다.

스프링 부트는 자바 기반의 애플리케이션을 빠르게 개발할 수 있는 프레임워크입니다. 스프링 부트와 Kafka를 결합하면, 강력하고 확장 가능한 메시지 큐 시스템을 구축할 수 있습니다.

이번 글에서는 스프링 부트와 Kafka를 이용한 메시지 큐 시스템을 단계별로 구현해보겠습니다. 왜냐하면 이론만으로는 이해하기 어렵기 때문입니다.

그럼 시작해보겠습니다.



Kafka의 기본 개념

Kafka는 분산 스트리밍 플랫폼으로, 주로 메시지 큐와 로그 수집 시스템으로 사용됩니다. 왜냐하면 Kafka는 높은 처리량과 낮은 지연 시간을 제공하며, 확장성이 뛰어나기 때문입니다.

Kafka의 주요 구성 요소는 Producer, Consumer, Broker, Topic입니다. Producer는 메시지를 생성하여 Kafka에 전송하고, Consumer는 Kafka에서 메시지를 소비합니다. Broker는 메시지를 저장하고 관리하며, Topic은 메시지를 분류하는 단위입니다.

Kafka는 메시지를 로그 파일에 저장하고, Consumer는 이 로그 파일을 읽어 메시지를 처리합니다. 이는 메시지의 무결성과 순서를 보장합니다.

Kafka는 분산 시스템으로, 여러 개의 Broker로 구성될 수 있습니다. 이는 높은 가용성과 확장성을 제공합니다.

이제 Kafka를 이용한 메시지 큐 시스템 구축 방법을 단계별로 설명하겠습니다.



Kafka 설치 및 설정

먼저, Kafka를 설치하고 설정하겠습니다. 왜냐하면 Kafka 설치와 설정이 첫 번째 단계이기 때문입니다.

Kafka를 설치하려면, Apache Kafka 공식 웹사이트에서 Kafka를 다운로드합니다. 다운로드한 파일을 압축 해제하고, Kafka를 실행합니다.

아래는 Kafka를 실행하는 명령어 예제입니다.

# Zookeeper 실행
bin/zookeeper-server-start.sh config/zookeeper.properties

# Kafka Broker 실행
bin/kafka-server-start.sh config/server.properties

위 명령어에서 Zookeeper와 Kafka Broker를 실행합니다. Zookeeper는 Kafka의 메타데이터를 관리하는 역할을 합니다.

Kafka가 정상적으로 실행되면, Kafka 토픽을 생성합니다.

# Kafka 토픽 생성
bin/kafka-topics.sh --create --topic test-topic --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1

위 명령어에서 test-topic이라는 이름의 Kafka 토픽을 생성합니다.



스프링 부트 프로젝트 설정

이제 스프링 부트 프로젝트를 생성하고 필요한 의존성을 추가하겠습니다. 왜냐하면 프로젝트 설정이 두 번째 단계이기 때문입니다.

스프링 부트 프로젝트를 생성하려면, Spring Initializr를 사용할 수 있습니다. Spring Initializr 웹사이트에서 프로젝트를 생성하고, 필요한 의존성을 선택합니다.

이번 프로젝트에서는 Spring Web, Spring for Apache Kafka 라이브러리를 사용할 것입니다. 아래는 build.gradle 파일의 예제입니다.

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.springframework.kafka:spring-kafka'
}

위 코드에서 필요한 의존성을 추가하였습니다. 이제 프로젝트를 빌드하고, 필요한 설정을 진행하겠습니다.

스프링 부트 애플리케이션의 진입점인 Application 클래스를 생성합니다.

@SpringBootApplication
public class KafkaApplication {
    public static void main(String[] args) {
        SpringApplication.run(KafkaApplication.class, args);
    }
}

위 코드에서 @SpringBootApplication 어노테이션을 사용하여 스프링 부트 애플리케이션을 설정하였습니다.



Kafka Producer와 Consumer 구현

이제 Kafka Producer와 Consumer를 구현해보겠습니다. 왜냐하면 Kafka의 핵심 기능이 메시지 생성과 소비이기 때문입니다.

먼저, Kafka Producer를 구현합니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class KafkaProducerController {
    @Autowired
    private KafkaTemplate kafkaTemplate;

    @PostMapping("/send")
    public void sendMessage(@RequestBody String message) {
        kafkaTemplate.send("test-topic", message);
    }
}

위 코드에서 KafkaProducerController 클래스는 HTTP POST 요청을 받아 Kafka 토픽에 메시지를 전송합니다.

이제 Kafka Consumer를 구현합니다.

import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

@Service
public class KafkaConsumerService {
    @KafkaListener(topics = "test-topic", groupId = "group_id")
    public void consumeMessage(String message) {
        System.out.println("Consumed message: " + message);
    }
}

위 코드에서 KafkaConsumerService 클래스는 Kafka 토픽에서 메시지를 소비하고, 콘솔에 출력합니다.



Kafka 예외 처리

이제 Kafka를 이용한 예외 처리 방법을 설명하겠습니다. 왜냐하면 예외 처리는 프로그램의 안정성을 높이는 중요한 요소이기 때문입니다.

Kafka에서 예외 처리를 위해 ErrorHandler를 사용할 수 있습니다. ErrorHandler는 메시지 처리 중 발생한 예외를 처리하는 역할을 합니다.

먼저, KafkaErrorHandler 클래스를 작성합니다.

import org.apache.kafka.clients.consumer.Consumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.listener.ErrorHandler;
import org.springframework.stereotype.Component;

@Component
public class KafkaErrorHandler implements ErrorHandler {
    @Override
    public void handle(Exception thrownException, ConsumerRecord record, Consumer consumer) {
        System.err.println("Error processing message: " + record.value());
        thrownException.printStackTrace();
    }
}

위 코드에서 KafkaErrorHandler 클래스는 메시지 처리 중 발생한 예외를 처리하고, 예외 정보를 콘솔에 출력합니다.

이제 KafkaErrorHandler를 KafkaListenerContainerFactory에 설정합니다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;

@Configuration
public class KafkaConfig {
    @Bean
    public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory(ConsumerFactory consumerFactory, KafkaErrorHandler errorHandler) {
        ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(consumerFactory);
        factory.setErrorHandler(errorHandler);
        return factory;
    }
}

위 코드에서 KafkaConfig 클래스는 KafkaListenerContainerFactory에 KafkaErrorHandler를 설정합니다.



결론

오늘은 스프링 부트와 Kafka를 이용한 메시지 큐 시스템 구축에 대해 다뤄보았습니다. 왜냐하면 Kafka는 대용량 데이터 스트리밍과 실시간 데이터 처리를 위한 강력한 도구이기 때문입니다.

스프링 부트와 Kafka를 결합하면, 강력하고 확장 가능한 메시지 큐 시스템을 구축할 수 있습니다. 이번 글에서 다룬 내용들을 실제 프로젝트에 적용해보시기 바랍니다.

다음 글에서는 더 심화된 내용을 다뤄보겠습니다. 많은 기대 부탁드립니다.

감사합니다.

ⓒ F-Lab & Company

이 컨텐츠는 F-Lab의 고유 자산으로 상업적인 목적의 복사 및 배포를 금합니다.

조회수
logo
copyright © F-Lab & Company 2025