TL;DR
- 테스트에 외부 Kafka를 사용하면 안정적인 테스트가 어렵다.
spring-kafka-test
패키지에서@EmbeddedKafka
가 제공된다.- Embedded Kafka를 통해 독립적이고 안정적인 테스트를 수행할 수 있다.
테스트를 어떻게 하지?
sakd.uk은 효율적으로 접속 이력 등의 데이터 처리를 위해 Kafka를 사용하고 있습니다.
실제 운영 환경에는 처음 활용하는 만큼, 다양한 테스트를 만들어두고 개발을 진행하고자 했습니다.
문제는 Kafka 관련 기능을 테스트하기 위해서는 반드시 Kafka 서버가 필요하다는 점이었습니다.
이내 고민에 빠졌습니다.
"테스트를 어떻게 하지?"
테스트 방법에 대한 고민
첫번째 떠올린 방법은 Topic의 분리입니다.
운영 환경과 개발 환경, 테스트 환경의 Topic을 분리하여 운영하는 것이죠.
지금은 혼자 개발하기 때문에 가능하지만, 만약 여럿이서 개발한다면 분명 동시에 테스트가 실행되는 일이 발생할 것입니다.
때문에 이 방법은 제가 찾는 답이 아닙니다.
두번째 방법은 Kafka를 Docker로 구동하는 것입니다.
각 개발자마다 따로 Kafka를 실행한다는 점에서 동시에 테스트가 실행되는 문제는 피할 수 있습니다.
하지만 Github Action 등 CI/CD 과정에서 빌드 테스트를 수행할 수 없습니다.
역시 제가 찾는 답이 아니다.
마지막 방법은 검색을 통해 찾은 Embedded Kafka를 활용하는 것입니다.
Embedded Kafka를 활용하면 테스트 시 별도로 Kafka를 실행할 필요가 없습니다.
또한 테스트 할 때마다 독립적으로 실행되기 때문에, 실제 운영 중인 Kafka와 서로 간섭이 발생하지 않습니다.
이 방법을 사용하기로 했다.
Embedded Kafka
Embedded Kafka를 사용하려면 먼저 spring-kafka-test
패키지 의존성을 추가해야 합니다.
기존에 의존성으로 추가되어 있지 않다면 아래와 같이 추가합니다.
// gradle
testImplementation 'org.springframework.kafka:spring-kafka-test'
// maven
<!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring-kafka-test -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka-test</artifactId>
<scope>test</scope>
</dependency>
테스트 클래스의 클래스 선언 상단에 아래와 같이 @EmbeddedKafka
어노테이션을 추가한다.
package net.jetalog.test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.kafka.test.context.EmbeddedKafka;
@SpringBootTest
@EmbeddedKafka(
// 브로커 설정
brokerProperties = {
"listeners=PLAINTEXT://localhost:39092",
"port=39092",
"security.protocol=PLAINTEXT"
},
// 파티션 갯수 설정
partitions = 3
)
class KafkaTest {
...
이렇게 선언하면 해당 클래스에서의 테스트는 EmbeddedKafka 환경에서 수행됩니다.
정말 간단합니다.
테스트 결과
기존에 Docker로 Kafka를 실행하고 테스트를 수행한 경우
Docker를 종료하고 테스트를 수행한 경우
Embedded Kafka를 사용한 경우
결론
Embedded Kafka를 이용하면 간단하게 Kafka 관련 Unit Test를 수행할 수 있습니다.
게다가 기존 운영 환경과 분리되어 수행되므로 아래와 같은 이점도 얻을 수 있습니다.
- 테스트로 인한 운영 환경 부하 방지
- 테스트 데이터로 인한 운영 환경 오작동 혹은 운영 데이터로 인한 테스트 영향 방지
- 별도의 환경 구축 없이 CI/CD 과정에서 테스트 수행 가능
참고 문서
- Testing Applications :: Spring Kafka - Spring (https://docs.spring.io/spring-kafka/reference/testing.html)
- Embedded Kafka를 통한 Kafka 테스트 - 로티.log (https://velog.io/@wodyd202/Embedded-Kafka를-통한-Kafka-테스트)
- [Spring boot & Kafka] Kafka Unit test 예제 - 밴쿠버 코로노의 개발일지 (https://corono.tistory.com/31)