엄지월드

Kafka 기본 환경설정 - 코드 본문

카테고리 없음

Kafka 기본 환경설정 - 코드

킨글 2025. 5. 10. 12:13

의존성 추가:
Spring Boot 프로젝트의 build.gradle (또는 pom.xml) 파일에 Spring Kafka 의존성을 추가합니다.

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

 

Spring Boot 설정:
application.properties 파일에 Kafka 브로커 연결 정보를 설정합니다.

# Kafka 브로커가 실행 중인 IP와 Port
spring.kafka.bootstrap-servers=localhost:9092

# Producer 설정 (예시)
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer

# Consumer 설정 (예시)
spring.kafka.consumer.group-id=my-consumer-group
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.auto-offset-reset=earliest # 또는 latest


Q. spring.kafka.consumer.auto-offset-reset=earliest # 또는 latest 이거 차이가 뭐야?

spring.kafka.consumer.auto-offset.reset 설정은 Kafka 컨슈머가 특정 토픽 파티션에서 마지막으로 커밋된 오프셋 정보가 없을 때 (예: 새로운 컨슈머 그룹이 처음으로 토픽을 읽거나, 컨슈머 그룹의 오프셋 정보가 만료되었을 때) 어디서부터 메시지를 읽기 시작할지를 결정하는 설정입니다.

이 설정은 주로 두 가지 값 중 하나를 사용합니다. earliest와 latest.

earliest:
이 설정은 컨슈머가 해당 파티션에 저장된 가장 오래된(가장 낮은 오프셋) 메시지부터 읽기 시작하도록 합니다 [3] [9].
이는 데이터 유실 없이 모든 메시지를 처음부터 처리하고 싶을 때 유용합니다 [4]. 새로 시작하는 컨슈머가 과거의 모든 데이터를 재처리해야 하는 경우에 사용됩니다.
주의할 점은, 만약 토픽에 이미 많은 양의 데이터가 쌓여 있다면 earliest로 설정했을 때 컨슈머가 처리해야 할 데이터가 매우 많아 초기 부하가 커질 수 있다는 점입니다.


latest:
이 설정은 컨슈머가 시작되는 시점부터 새로 들어오는(가장 최신 오프셋) 메시지만 읽기 시작하도록 합니다 [3] [9]. 과거의 메시지는 건너뜁니다.
이는 주로 실시간으로 발생하는 메시지만 처리하고 싶을 때 사용됩니다. 컨슈머 시작 시점에 이미 저장되어 있던 과거 데이터는 중요하지 않거나 처리할 필요가 없을 때 적합합니다.
이것이 Kafka의 기본 설정값입니다.


요약:
earliest: 커밋된 오프셋이 없을 때, 파티션의 가장 처음부터 메시지를 읽습니다. 모든 데이터를 놓치지 않고 처리하려 할 때 사용합니다.
latest: 커밋된 오프셋이 없을 때, 컨슈머가 시작하는 시점의 가장 최신 메시지부터 읽습니다. 실시간 데이터 처리 시 주로 사용합니다.
어떤 값을 사용할지는 애플리케이션의 요구사항에 따라 달라집니다. 데이터 무결성이 매우 중요하고 과거 데이터부터 모두 처리해야 한다면 earliest를, 실시간 데이터만 처리하면 된다면 latest를 선택하시면 됩니다.

Q. 데이터 통신은 대부분 String으로 이루어져? 자바 객체를 전달하거나 하지는 않아?

아닙니다, Kafka를 통한 데이터 통신이 반드시 String으로만 이루어지는 것은 아닙니다. String은 가장 기본적인 형태로 사용될 뿐이며, Java 객체를 포함한 다양한 형태의 데이터를 전달할 수 있습니다.

Kafka에서 메시지 본문(Value)과 키(Key)는 바이트 배열(byte[]) 형태로 전송됩니다. 따라서 어떤 형태의 데이터든 바이트 배열로 직렬화(Serialize)하여 Kafka로 보내고, Kafka에서 받은 바이트 배열을 다시 원래의 데이터 형태(Deserialize)로 역직렬화하는 과정이 필요합니다.

이때 사용되는 것이 **직렬화/역직렬화 도구(Serializer/Deserializer)**입니다.

Spring Kafka 설정에서 spring.kafka.producer.value-serializer와 spring.kafka.consumer.value-deserializer 등을 설정하는 이유가 바로 여기에 있습니다.

org.apache.kafka.common.serialization.StringSerializer/StringDeserializer: String 데이터를 바이트 배열로 변환하고 다시 String으로 변환할 때 사용합니다.

Comments