강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

woo님의 프로필 이미지
woo

작성한 질문수

은행 서버 프로젝트 실습을 통해 배우는 코틀린 마스터 클래스

redisConfig 질문입니다

해결된 질문

작성

·

65

0

package org.example.config

import org.redisson.Redisson
import org.redisson.api.RedissonClient
import org.redisson.config.Config
import org.springframework.beans.factory.annotation.Value
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.context.annotation.Primary
import org.springframework.data.redis.connection.RedisConnectionFactory
import org.springframework.data.redis.connection.RedisStandaloneConfiguration
import org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory
import org.springframework.data.redis.core.RedisTemplate
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer
import org.springframework.data.redis.serializer.StringRedisSerializer
import java.time.Duration

@Configuration
class RedisConfig {

    @Bean
    fun redisConnectionFactory(
        @Value("\${database.redis.host}") host: String,
        @Value("\${database.redis.port}") port: Int,
        @Value("\${database.redis.password:${null}}") password: String?,
        @Value("\${database.redis.database:${0}}") database: Int,
        @Value("\${database.redis.timeout:${10000}}") timeout: Long,
    ) : LettuceConnectionFactory {
        val config = RedisStandaloneConfiguration(host, port).apply {
            password?.let { setPassword(it) }
            setDatabase(database)
        }

        val clientConfig = LettuceClientConfiguration.builder()
            .commandTimeout(Duration.ofSeconds(timeout))
            .build()

        return LettuceConnectionFactory(config,clientConfig)
    }

    @Bean
    @Primary
    fun redisTemplate(connectionFactory : RedisConnectionFactory): RedisTemplate<String, String> {
        val template = RedisTemplate<String, String>()

        template.connectionFactory = connectionFactory
        template.keySerializer = StringRedisSerializer()
        template.valueSerializer = Jackson2JsonRedisSerializer(String::class.java)
        template.hashKeySerializer = StringRedisSerializer()
        template.hashValueSerializer = Jackson2JsonRedisSerializer(String::class.java)
        template.afterPropertiesSet()

        return template
    }


    @Bean
    fun redissonClient(
        @Value("\${database.redisson.host}") host: String,
        @Value("\${database.redisson.timeout}") timeout: Int,
        @Value("\${database.redisson.password:${null}}") password: String?,
    ) : RedissonClient {
        val config = Config()

        val singleServerConfig = config.useSingleServer()
            .setAddress(host)
            .setTimeout(timeout)

        if (!password.isNullOrBlank()) {
            singleServerConfig.setPassword(password)
        }

        return Redisson.create(config).also {
            println("redisson create success")
        }
    }


}
  • An annotation argument must be a compile-time constant

와 같은 에러가 나는데 강의 파일 코드로도 같은 에러가 납니다

답변 1

0

Hong님의 프로필 이미지
Hong
지식공유자

woo님 안녕하세요 질문 남겨주셔서 감사합니다!

혹시 컴파일 하실 떄 사용하시는 java 버전 정보를 알 수 있을까요??

woo님의 프로필 이미지
woo
질문자

현재 build.gradle.kts의 정보는 다음과 같습니다

 

plugins {
    id("org.springframework.boot") version "3.2.2"
    id("io.spring.dependency-management") version "1.1.4"
    kotlin("jvm") version "1.9.22"
    kotlin("plugin.spring") version "1.9.22"
    kotlin("plugin.jpa") version "1.9.22"
    kotlin("plugin.serialization") version "1.8.0"
}

tasks.test {
    useJUnitPlatform()
}
kotlin {
    jvmToolchain(17)
}
Hong님의 프로필 이미지
Hong
지식공유자

공유해주셔서 감사합니다.

코드상의 오타가 있었네요 현재

redisConnectuonFactory 함수에서의 password에 문제가 있습니다.

Kotlin에서 ${null}에 대해서 런타임에서는 표현식으로 인식하기 때문에 컴파일 에러가 발생을 하는것입니다.

 

그냥 간단하게 {database.redis.password:} 로 수정하신다면 문제가 해결되는것으로 보입니다!!

 

woo님의 프로필 이미지
woo
질문자

확인했습니다! 말씀대로 {database.redis.password:}로 바꾸니 잘 대입되는군요

woo님의 프로필 이미지
woo

작성한 질문수

질문하기