Spring & Spring Boot

[ Spring Boot Kotiln ] Redis 사용하기

사과씨앗 2024. 2. 25. 22:32
728x90
반응형

 

 

[ Redis ] 

 

Redis 오픈 소스 기반의 인메모리 데이터베이스입니다. "REmote DIctionary Server" 약자로, 메모리에 데이터를 저장하고 조회하는 특화되어 있습니다.

 

 Redis 메모리 기반 데이터베이스로 데이터를 디스크에 저장하지 않고 메모리에 직접 저장하여 빠른 속도를 제공합니다. 이로 인해 높은 처리량과 낮은 지연 시간을 가지며, 대규모 데이터 작업에 효과적입니다.

 

글쓴이는 docker를 사용하여 redis를 사용하겠습니다.

 

터미널에서 해당 명령어를 입력하여 줍니다. 

docker run -d -p 6379:6379 --name my-redis redis

 

아래 명령어로 설치를 확인하여 줍니다.

docker ps

 

 

build.gradle 에서 dependencies를 설정하여 줍니다.

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-data-redis")
}

 


yml 파일을 설정하여 줍니다.

    cache:
      type: redis
      redis:
          host: localhost
          port: 6379

 

 

config 설정을 위해 클래스를 만들어 준 다음 아래처럼 코딩하여 줍니다.

 

@Configuration
class RedisConfig {
    @Value("\${spring.cache.redis.host}")
    lateinit var host: String

    @Value("\${spring.cache.redis.port}")
    lateinit var port: String

    @Bean
    fun redisConnectionFactory(): RedisConnectionFactory{
        return LettuceConnectionFactory(host,port.toInt())
        //RedisConnectionFactory는 Spring Boot에서 Redis와의 연결을 관리하는 인터페이스입니다. 
        //이 인터페이스를 사용하여 Redis 서버와의 연결을 설정하고 관리할 수 있습니다
    }

    @Bean
    fun redisTemplate(): RedisTemplate<String,Any>{
    //RedisTemplate은 Redis와의 상호 작용을 단순화하는 Spring Data Redis의 핵심 클래스입니다.
        val redisTemplate = RedisTemplate<String,Any>()
        redisTemplate.connectionFactory = redisConnectionFactory()
        redisTemplate.keySerializer = StringRedisSerializer()
        redisTemplate.valueSerializer = StringRedisSerializer()
        return redisTemplate
    }



}

 

 

Key Serializer,Value Serializer를 사용하는 이유는 다음과 같습니다:

  1. 데이터 형식 변환: Redis는 문자열 형식으로 Key를 저장합니다. 하지만 Java에서 사용되는 객체는 다양한 형식을 가질 수 있습니다. Key Serializer를 사용하면 Java 객체를 Redis Key로 변환하여 저장할 수 있습니다. Serializer는 Java 객체를 문자열로 변환하는 역할을 수행합니다.
  2. 편의성: Key Serializer를 사용하면 Redis Key를 직접 다루지 않고도 Java 객체를 통해 Key를 사용할 수 있습니다. Java의 자료구조인 Map이나 Set 등을 사용하여 Key를 관리할 수 있으며, Serializer가 자동으로 Key를 Redis에서 사용 가능한 형식으로 변환해 줍니다.
  3. 일관성 유지: Key Serializer를 사용하면 서로 다른 Java 객체를 동일한 Redis Key로 변환할 수 있습니다. 이는 일관성을 유지하면서 Redis에 데이터를 저장하고 검색할 수 있는 장점을 제공합니다.
  4. 유연성: Key Serializer는 사용자 정의 Serializer를 설정할 수 있는 유연성을 제공합니다. 기본적으로는 RedisTemplate에서 제공하는 기본 Serializer를 사용할 수 있지만, 사용자가 직접 Serializer를 구현하여 특정 데이터 형식에 맞게 Key를 변환할 수도 있습니다.

설정이 끝났으면 test를 위해 controller를 생성 후 아래처럼 코딩하여 줍니다.

 

@RestController
class RedisController(
    private val redisUtil: RedisUtil
) {

    @GetMapping("/redis")
    fun getRedisCount(): Long{
        redisUtil.increment("count")
        return redisUtil.getCount("count")?: 0L

    }
}

 

 

redisUtil이라는 이름으로 Service 클래스를 만들고 아래처럼 코딩하여 줍니다.

 

@Service
class RedisUtil(
    private val redisTemplate: RedisTemplate<String,Any>
) {

    fun increment(key:String){
        redisTemplate.opsForValue().increment(key,1L)
    }
    
       fun getCount(key: String):Long?{
        return redisTemplate.opsForValue().get(key)?.toString()?.toLong()
    }

}

 

 

opsForValue()는 RedisTemplate을 사용하여 Redis 데이터베이스에서 값을 조작하기 위한 메서드입니다. RedisTemplate은 스프링 프레임워크에서 Redis와 상호 작용하기 위한 강력한 도구입니다.

opsForValue() Redis 문자열 값에 대한 작업을 수행하는 메서드를 반환합니다. 반환된 객체를 사용하여 문자열 값을 설정하거나 가져오는 등의 다양한 작업을 수행할 있습니다.

 

 

Swegger를 사용하여 테스트를 해보면 아래처럼 확인할 수 있습니다.

( Response Body 값이 계속하여 증가 )

 

 

 

 

 

 

728x90
반응형