개발자
안녕하세요 MSA 공부하고있는 주니어 개발자 입니다. Spring boot 프로젝트 내 Embedded Kafka 를 사용하여 Kafka 테스트 코드를 작성 중 인데 KafkaProducer 클래스를 만들어 Message 를 전송시키고, KafkaConsumer 클래스를 만들어 Message를 받아 전역 변수에 저장시키는 메소드를 만들어 Test Class 에서 Producer 와 Consumer 클래스를 임포트 해주어 사용합니다 Spring boot Test 를 돌리면 에러가 발생하지 않지만 Gradle Test 실행시 Producer Consumer 를 사용하여 메세지를 잘받지만 Consumer의 전역 변수를 Test클래스로 가져오는 메소드를 사용하면 null이 리턴되어 asserThat이 통과되지않습니다. 혹시 해결방법 알고계신 개발자분들있으실까요?
답변 1
먼저, Kafka를 테스트하는데 어려움을 겪고 계시다면, 이 문제는 종종 비동기 코드와 관련이 있습니다. Kafka의 프로듀서와 컨슈머는 비동기로 동작하기 때문에, 테스트 코드에서 메시지를 보내고 받는 동안에는 이미 테스트가 종료될 수 있습니다. 따라서 테스트에서 동기적으로 Kafka 메시지를 처리할 수 있도록 `CountDownLatch`나 `BlockingQueue` 같은 동기화 도구를 사용하실 수 있습니다. 예를 들어, `CountDownLatch`를 사용하면 다음과 같은 코드를 작성하실 수 있습니다. 위의 `getPayload` 메소드는 컨슈머가 메시지를 받을 때까지 최대 10초 동안 대기합니다. 그리고 메시지를 받으면 `latch.countDown()`을 호출하여 대기 중인 `latch.await()`을 해제합니다. 이와 같은 방법으로 비동기 코드를 동기적으로 처리하면 테스트 코드에서도 Kafka 메시지를 제대로 처리할 수 있습니다. 또 다른 방법으로는 Spring Kafka의 `@EmbeddedKafka` 어노테이션과 함께 `KafkaTestUtils`를 사용하는 것도 있습니다. `KafkaTestUtils`는 Kafka 메시지를 송신하고 수신하는데 필요한 도구를 제공하며, 테스트에서 Kafka를 더 쉽게 사용할 수 있게 해줍니다. 다양한 도구와 방법을 시도해보고, 어떤 것이 가장 잘 동작하는지 확인해보세요. 그리고 문제가 지속적으로 발생한다면, 오류 메시지나 더 자세한 코드를 제공해주시면 더 구체적인 도움을 드릴 수 있습니다.
1public class KafkaConsumer {
2 private CountDownLatch latch = new CountDownLatch(1);
3 private String payload = null;
4
5 @KafkaListener(topics = "topic1")
6 public void receive(ConsumerRecord<?, ?> consumerRecord) {
7 payload = consumerRecord.value().toString();
8 latch.countDown();
9 }
10
11 public String getPayload() throws InterruptedException {
12 latch.await(10000, TimeUnit.MILLISECONDS);
13 return payload;
14 }
15}
커리어리 AI 봇의 답변을 평가해 주세요!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!