Test 환경에서 H2와 Embedded Redis로 production 환경과 격리하기

October 15, 2023


앞선 요약

Embedded Redis는 실제 프로덕트 환경과 분리해서 테스트때만 레디스 서버를 실행하는 편리한 라이브러리입니다.

다음 라이브러리를 추가하면 됩니다.

testImplementation('org.signal:embedded-redis:0.8.3')

문제점

그런데 현재 사용하고 있는 라이브러리가 너무 오래되어서 맥 ARM에서 Invocation of init method failed 오류가 발생했습니다.

정확히는 동작했었지만 갑자기 Embedded Redis를 실행할 수 없어서 포트가 문제인가 바꾸어 보았지만 결론으로는 개발환경인 맥북의 OS 버전을 Sonoma로 업그레이드해서 생긴 문제라고 판단햇습니다.

이를 해결하기 위해서는 따로 Redis를 ARM용으로 컴파일해서 추가해서 사용해야 합니다.

그런데 누군가 만들어 두지 않았을까하고 포크한 내역을 살펴보니 역시 이미 누군가 불편함을 느끼고 잘 만들어 두었습니다.

라이브러리

// 기존: 2020년에 마지막으로 업데이트
testImplementation('it.ozimov:embedded-redis:0.7.2')

// 비교적 최신: 2023년에 마지막으로 업데이트
testImplementation('org.signal:embedded-redis:0.8.3')

Test용 Redis Configuration

아래 파일을 src/test 경로 아래에 작성합니다.

@TestConfiguration
public class TestRedisConfiguration {

    private final RedisServer redisServer;

    public TestRedisConfiguration(RedisProperties redisProperties) {
        this.redisServer = RedisServer.builder()
                .port(redisProperties.getPort())
                .setting("bind 127.0.0.1")
                .setting("maxmemory 128M")
                .build();
    }

    @PostConstruct
    public void postConstruct() {
        redisServer.start();
    }

    @PreDestroy
    public void preDestroy() {
        redisServer.stop();
    }
}

application-test.yml

spring:
  data:
    redis:
      host: localhost
      port: 6369

운영이나 개발 환경과 분리하기 위해서 test용 프로필용으로 port를 설정합니다. 기본이 로컬에서 실행하는 것이지만 host를 명시해주어야 합니다.

test에서 사용

@ActiveProfiles("test") // 또는 "!prod"
@SpringBootTest(classes = TestRedisConfiguration.class)
class SomethingIntegrationTest {
    ...
}

Gradle 병렬 테스트시 포트 충돌

이후 테스트를 위해 띄운 redis 포트 충돌로 레디스와 관련한 테스트가 실패하는 경우를 확인할 수 있었습니다.

그래서 간편하지만 에러가 간혈적으로 발생하는 Embedded Redis 대신 Testcontainers를 사용해서 테스트시 로컬 레디스를 사용하는 방법에 대해 알아보겠습니다.

Testcontainers를 사용한 테스트 환경 분리하기 정리글

참고

https://github.com/signalapp/embedded-redis

https://www.baeldung.com/spring-embedded-redis


Profile picture

이재원

이해하기 쉬운 코드를 작성하려 고민합니다.


© 2024 Won's blog Built with Gatsby