Kafka에서 JSON 메시지 주고받기 – Spring Kafka로 객체 직렬화 처리하기
Kafka에서는 문자열뿐 아니라 JSON 형식의 객체 메시지도 주고받을 수 있습니다. Spring Kafka를 활용하면 직렬화(Serialization)와 역직렬화(Deserialization)를 자동으로 처리할 수 있어 매우 편리합니다. 이 글에서는 Java 객체를 Kafka 메시지로 전송하고, 다시 객체로 받는 과정을 예제 중심으로 설명합니다.
1. 메시지 객체 클래스 정의
JSON으로 주고받을 데이터를 Java 객체로 정의합니다.
public class UserEvent {
private String userId;
private String action;
// 생성자, getter/setter 생략
}
2. application.yml 설정 (JSON 직렬화)
spring:
kafka:
bootstrap-servers: localhost:9092
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
consumer:
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
properties:
spring.json.trusted.packages: "*"
3. Kafka Producer – JSON 전송
KafkaTemplate에 객체를 그대로 넘기면 자동으로 JSON으로 변환됩니다.
@Service
public class UserEventProducer {
private final KafkaTemplate<String, UserEvent> kafkaTemplate;
public UserEventProducer(KafkaTemplate<String, UserEvent> kafkaTemplate) {
this.kafkaTemplate = kafkaTemplate;
}
public void sendUserEvent(UserEvent event) {
kafkaTemplate.send("user-event-topic", event);
}
}
4. Kafka Consumer – JSON 수신
@Component
public class UserEventConsumer {
@KafkaListener(topics = "user-event-topic", groupId = "event-group")
public void consume(UserEvent event) {
System.out.println("Received user event: " + event.getUserId() + ", " + event.getAction());
}
}
5. REST API 연동 (JSON 요청 수신 → Kafka 발행)
@RestController
@RequestMapping("/event")
public class UserEventController {
private final UserEventProducer userEventProducer;
public UserEventController(UserEventProducer userEventProducer) {
this.userEventProducer = userEventProducer;
}
@PostMapping
public ResponseEntity<String> sendEvent(@RequestBody UserEvent event) {
userEventProducer.sendUserEvent(event);
return ResponseEntity.ok("Event sent.");
}
}
6. 메시지 구조 예시 (JSON)
{
"userId": "user123",
"action": "LOGIN"
}
7. 실무 팁
- 패키지 지정:
spring.json.trusted.packages를 정확히 지정하거나*허용 - KafkaTemplate 제네릭:
KafkaTemplate<String, UserEvent>형태로 지정 - Consumer가 JSON을 못 읽는 경우: 직렬화 설정, 패키지 접근 확인
8. 결론
Spring Kafka를 이용한 JSON 메시지 처리는 객체 지향적인 설계를 그대로 유지한 채 안정적인 메시지 송수신을 가능하게 합니다. Kafka 메시지를 구조화된 데이터로 주고받고 싶다면 JSON 직렬화를 활용하는 방식이 가장 직관적이며, 실무에서 널리 사용됩니다.