🍈

스프링부트(Spring-boot)에서 레디스(Redis) 사용할 때, 간단한 설정만으로도 사용할 수 있다.
테스트 환경도 로컬 환경이나 개발 환경에 설치한 레디스를 이용할 수 있지만 이번에는 Textcontainers를 이용하여 테스트 환경을 구성해보자. 단, junit이 아닌 spock를 사용해보자.

build.gradle에 spock을 위한 라이브러리와 spock에서 testcontainers를 이용하기 위한 라이브러리를 추가하자.

123
testImplementation 'org.spockframework:spock-core:2.3-groovy-4.0'
testImplementation 'org.spockframework:spock-spring:2.3-groovy-4.0'
testImplementation "org.testcontainers:spock:1.17.4"

그리고 테스트 코드에서는 도커(docker)로 실행한 레디스를 정보를 가져와 설정한다.

12345678910111213141516171819202122232425262728
@Testcontainers
@SpringBootTest
class UserServiceTest extends Specification {
@Autowired
RedisTemplate<?, ?> redisTemplate
@Shared
static GenericContainer redis = new GenericContainer<>(DockerImageName.parse("redis:latest")).withExposedPorts(6379)
@DynamicPropertySource
static void props(DynamicPropertyRegistry registry) {
redis.start()
registry.add("spring.redis.host", () -> redis.getHost())
registry.add("spring.redis.port", () -> redis.getMappedPort(6379).toString())
}
def "RedisTemplate should set and get value."() {
given:
redisTemplate.opsForValue().set("hello", "world")
when:
def found = redisTemplate.opsForValue().get("hello")
then:
true
"world" == found
}
}

핵심 부분은 레디스 컨테이너(container)를 생성하고 생성한 레디스 컨테이너 정보를 @DynamicPropertySource 를 통해 호스트(host)와 포트(port)를 설정하는 부분이다.
이렇게 설정하면 로컬에서 띄운 레디스 컨테이너와 연결할 수 있고 RedisTemplate를 이용해 값을 설정하고 가져올 수 있다.

Reference