FLUSHALL 사용하기

import org.springframework.data.redis.core.StringRedisTemplate

@SpringBootTest
class RedisRepositoryImplTest {

    @Autowired
    private lateinit var redisTemplate: StringRedisTemplate

    @BeforeEach
    fun setUp() {
        redisFlushAll()
    }

    @AfterEach
    fun tearDown() {
        redisFlushAll()
    }

    private fun redisFlushAll() {
        redisTemplate.connectionFactory?.connection?.serverCommands()?.flushAll()
    }

}

  1. connectionFactory
  2. connection
  3. serverCommands()
  4. flushAll()

<aside> ❗

FLUSHALL은 Redis의 모든 DB를 초기화하기 때문에, 다른 테스트나 서비스에 영향을 줄 수 있습니다.

그렇기 때문에 테스트 전용 Redis 인스턴스를 사용하는 것이 좋습니다.

</aside>

<aside> ❗

테스트내에서 @Transactional 을 사용해도 redis 에 저장되는 데이터들은 기본적으로 롤백되지 않습니다.

즉, 테스트에서 저장한 데이터가 다른 테스트에 영향을 줄 수 있는 환경입니다. (멱등성 지켜지지 않음.)

그렇기 때문에 전/후에 초기화를 꼭해야 다른 테스트에 영향이 없습니다.

</aside>

DefaultedRedisConnection 의 deprecated

private fun flushRedis() {
    redisTemplate.connectionFactory?.connection?.flushAll()
}

블로그를 찾아보면 DefaultedRedisConnection의 flushAll()을 사용하는 케이스가 많습니다.

하지만 DefaultedRedisConnection에서 제공하는 메서드는 전부 deprecated 됐습니다.

사실 내부적으로 동작은 에서 작성한 코드와 동일합니다.

/** @deprecated in favor of {@link RedisConnection#serverCommands()}. */
@Override
@Deprecated
default void flushAll(FlushOption option) {
    serverCommands().flushAll(option);
}