본문 바로가기

Program/Java

springboot3 - redis 사용법

Redis는 키-값 저장소로 매우 빠르고 효율적이기 때문에, 캐시, 세션 관리, 메시지 큐 등 다양한 용도로 사용할 수 있습니다.

 

1. Redis 의존성 추가

 

먼저, pom.xml에 Redis 관련 의존성을 추가해야 합니다. Spring Boot 3에서도 Redis와의 통합을 위해 spring-boot-starter-data-redis와 Jackson을 추가할 수 있습니다.

 

Maven을 사용하는 경우 (pom.xml):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>

 

Gradle을 사용하는 경우 (build.gradle):

implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'com.fasterxml.jackson.core:jackson-databind'

 

2. Redis 설정

 

application.properties 또는 application.yml 파일에 Redis 서버 연결 정보를 설정합니다.

 

application.properties

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password= # 비밀번호가 있으면 입력
spring.redis.timeout=60000 # 타임아웃 설정

 

application.yml:

spring:
  redis:
    host: localhost
    port: 6379
    password: 
    timeout: 60000 # 밀리초 단위

 

3. RedisTemplate 설정

 

RedisTemplate을 사용하여 Redis와 상호작용할 수 있습니다. Redis에서 데이터를 키-값 형태로 저장하고 조회하려면 RedisTemplate을 사용해야 합니다. 이를 위해 RedisConfig 클래스를 설정합니다.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);

        // 키를 문자열로 직렬화
        template.setKeySerializer(new StringRedisSerializer());

        // 값을 JSON 형식으로 직렬화
        Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
        template.setValueSerializer(serializer);

        return template;
    }
}

 

이 설정은 Redis 키를 문자열로, 값을 JSON 형식으로 직렬화하여 저장하도록 설정합니다.

 

4. Redis 서비스 구현

 

Redis에 데이터를 저장하고, 조회하는 서비스를 작성합니다. 여기서는 RedisTemplate을 사용하여 데이터를 저장하고 조회하는 예시입니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class RedisService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    // 객체 저장
    public void save(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    // 객체 저장 + 유효기간 설정
    public void saveWithExpiration(String key, Object value, long timeout, TimeUnit unit) {
        redisTemplate.opsForValue().set(key, value, timeout, unit);
    }

    // 객체 조회
    public Object find(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    // 키 삭제
    public void delete(String key) {
        redisTemplate.delete(key);
    }
}

 

5. 컨트롤러에서 사용

 

이제 이 서비스를 컨트롤러에서 사용하여 데이터를 저장하고 조회할 수 있습니다.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/redis")
public class RedisController {

    @Autowired
    private RedisService redisService;

    @PostMapping("/save")
    public String saveToRedis(@RequestParam String key, @RequestBody MyObject object) {
        redisService.save(key, object);
        return "Saved to Redis";
    }

    @PostMapping("/saveWithExpiration")
    public String saveToRedisWithExpiration(@RequestParam String key, @RequestBody MyObject object, @RequestParam long timeout) {
        redisService.saveWithExpiration(key, object, timeout, TimeUnit.SECONDS);
        return "Saved with expiration";
    }

    @GetMapping("/get")
    public Object getFromRedis(@RequestParam String key) {
        return redisService.find(key);
    }

    @DeleteMapping("/delete")
    public String deleteFromRedis(@RequestParam String key) {
        redisService.delete(key);
        return "Deleted from Redis";
    }
}

class MyObject {
    private String name;
    private int age;

    // Getters and Setters
}

 

6. 유효기간 설정

 

Redis에 저장할 때 유효기간을 설정할 수 있습니다. 예를 들어, 캐시 데이터를 일정 시간 후에 만료시키고 싶다면 saveWithExpiration 메서드를 사용하여 데이터를 저장할 때 TTL(Time-To-Live)을 설정할 수 있습니다.

redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);

 

7. Redis 활용 예시

 

캐시: Spring Boot 애플리케이션에서 Redis를 캐시로 사용할 수 있습니다. 이를 통해 데이터베이스 조회나 외부 API 호출의 성능을 개선할 수 있습니다.

세션 관리: Redis를 사용하여 분산 환경에서 세션을 관리할 수 있습니다.

메시지 큐: Redis는 간단한 메시지 큐로도 사용될 수 있으며, RedisPubSub 패턴을 사용하여 메시지를 발행하고 구독할 수 있습니다.