diff --git a/.gitignore b/.gitignore index 7766915..e184dcb 100644 --- a/.gitignore +++ b/.gitignore @@ -173,3 +173,6 @@ gradle-app.setting ### Gradle Patch ### # Java heap dump *.hprof + + +redis/ diff --git a/build.gradle.kts b/build.gradle.kts index 669611f..28d4aa6 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -50,6 +50,7 @@ dependencies { // spring implementation("org.springframework.boot:spring-boot-starter-data-jpa") + implementation("org.springframework.boot:spring-boot-starter-data-redis") implementation("org.springframework.boot:spring-boot-starter-validation") implementation("org.springframework.boot:spring-boot-starter-web") diff --git a/compose.yaml b/compose.yaml index b9b3f34..7614792 100644 --- a/compose.yaml +++ b/compose.yaml @@ -24,8 +24,24 @@ services: DB_PASSWORD: local ports: - "18080:8080" + restart: always depends_on: - db + - cache + + cache: + image: redis:7.0-alpine + container_name: redis_cache + ports: + - "16379:6379" + volumes: + - ./redis/data:/data + - ./redis/conf/redis.conf:/usr/local/conf/redis.conf + labels: + - "name=redis" + - "mode=standalone" + command: redis-server /usr/local/conf/redis.conf + restart: always volumes: postgres: diff --git a/src/main/kotlin/com/mjucow/eatda/common/config/RedisConfiguration.kt b/src/main/kotlin/com/mjucow/eatda/common/config/RedisConfiguration.kt new file mode 100644 index 0000000..dc9a99c --- /dev/null +++ b/src/main/kotlin/com/mjucow/eatda/common/config/RedisConfiguration.kt @@ -0,0 +1,30 @@ +package com.mjucow.eatda.common.config + +import com.mjucow.eatda.common.properties.RedisProperties +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.data.redis.connection.RedisConnectionFactory +import org.springframework.data.redis.connection.RedisStandaloneConfiguration +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory +import org.springframework.data.redis.core.RedisTemplate +import org.springframework.data.redis.serializer.StringRedisSerializer + +@Configuration +class RedisConfiguration( + private val redisProperties: RedisProperties +) { + @Bean + fun redisConnectionFactory(): RedisConnectionFactory { + return LettuceConnectionFactory( + RedisStandaloneConfiguration(redisProperties.host, redisProperties.port) + ) + } + + @Bean + fun redisTemplate(redisConnectionFactory: RedisConnectionFactory): RedisTemplate { + return RedisTemplate().apply { + connectionFactory = redisConnectionFactory + setDefaultSerializer(StringRedisSerializer()) + } + } +} diff --git a/src/main/kotlin/com/mjucow/eatda/common/properties/PropertiesConfiguration.kt b/src/main/kotlin/com/mjucow/eatda/common/properties/PropertiesConfiguration.kt new file mode 100644 index 0000000..4607729 --- /dev/null +++ b/src/main/kotlin/com/mjucow/eatda/common/properties/PropertiesConfiguration.kt @@ -0,0 +1,8 @@ +package com.mjucow.eatda.common.properties + +import org.springframework.boot.context.properties.ConfigurationPropertiesScan +import org.springframework.context.annotation.Configuration + +@Configuration +@ConfigurationPropertiesScan(basePackages = ["com.mjucow.eatda.common.properties"]) +class PropertiesConfiguration diff --git a/src/main/kotlin/com/mjucow/eatda/common/properties/RedisProperties.kt b/src/main/kotlin/com/mjucow/eatda/common/properties/RedisProperties.kt new file mode 100644 index 0000000..81909a0 --- /dev/null +++ b/src/main/kotlin/com/mjucow/eatda/common/properties/RedisProperties.kt @@ -0,0 +1,9 @@ +package com.mjucow.eatda.common.properties + +import org.springframework.boot.context.properties.ConfigurationProperties + +@ConfigurationProperties(prefix = "spring.data.redis") +data class RedisProperties( + var host: String = "", + var port: Int = -1, +) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 277b32f..09f4b12 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -39,6 +39,12 @@ spring: jooq: sql-dialect: postgres + + data: + redis: + host: localhost + port: 16379 + --- spring: @@ -63,5 +69,9 @@ spring: validation-timeout: 1000 max-lifetime: 600000 + data: + redis: + host: ${REDIS_URL} + jooq: sql-dialect: postgres diff --git a/src/test/kotlin/com/mjucow/eatda/domain/AbstractCacheTest.kt b/src/test/kotlin/com/mjucow/eatda/domain/AbstractCacheTest.kt new file mode 100644 index 0000000..0c7626c --- /dev/null +++ b/src/test/kotlin/com/mjucow/eatda/domain/AbstractCacheTest.kt @@ -0,0 +1,32 @@ +package com.mjucow.eatda.domain + +import com.mjucow.eatda.common.config.RedisConfiguration +import com.mjucow.eatda.common.properties.PropertiesConfiguration +import com.mjucow.eatda.common.properties.RedisProperties +import org.springframework.boot.test.autoconfigure.data.redis.DataRedisTest +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase +import org.springframework.boot.testcontainers.service.connection.ServiceConnection +import org.springframework.context.annotation.Import +import org.springframework.test.context.ActiveProfiles +import org.testcontainers.containers.GenericContainer +import org.testcontainers.junit.jupiter.Container +import org.testcontainers.junit.jupiter.Testcontainers + +@Import(value = [ + RedisProperties::class, + RedisConfiguration::class, + PropertiesConfiguration::class, +]) +@DataRedisTest +@Testcontainers +@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) +@ActiveProfiles("test") +abstract class AbstractCacheTest { + companion object { + @Container + @ServiceConnection + val REDIS_CONTAINER = GenericContainer("redis:7.0-alpine") + .withExposedPorts(6379) + .withReuse(true) + } +} diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 40b06ed..d70da7e 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -15,4 +15,9 @@ spring: datasource: url: jdbc:tc:postgresql:///test-database -logging.config: classpath:logback-test.xml \ No newline at end of file + data: + redis: + host: localhost + port: 6379 + +logging.config: classpath:logback-test.xml