본문 바로가기

전지적라온시점

Kafka에서 JSON 메시지 주고받기 – Spring Kafka로 객체 직렬화 처리하기 본문

Development/Kafka

Kafka에서 JSON 메시지 주고받기 – Spring Kafka로 객체 직렬화 처리하기

최라온 2025. 6. 4. 17:01
728x90
반응형
SMALL

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 직렬화를 활용하는 방식이 가장 직관적이며, 실무에서 널리 사용됩니다.

728x90
반응형
LIST