본문 바로가기
내가 배운 것들/문제 해결

[SpringBoot/Redis/Ubuntu] 우분투 환경에 Redis 설치, SpringBoot에 세팅

by Zabee52 2021. 12. 27.

Redis

Redis. 얼마나 좋길래 이렇게 추천을 받는 것인지. 써보고 싶어졌다. 그래서 세팅해본다.

 

1. ubuntu 환경에 Redis 설치

$sudo apt-get update
$sudo apt-get install -y redis-server

2. Redis configuration

$sudo vim /etc/redis/redis.conf

maxmemory-policy allkeys-lru 추가

- redis 메모리가 가득 찰 경우 오래된 데이터부터 지우겠다는 뜻이다.

maxmemory-policy 설정

3. Redis 테스트

$redis-cli
127.0.0.1:6379> set key1 hello
127.0.0.1:6379> get key1

Redis 설치 테스트

 

여기까지가 ubuntu 환경에 redis 설치 및 가장 기초적인 세팅을 완료한 것이다.

이제부턴 스프링부트에 세팅한다.

 

Spring-Boot

1. application.properties 설정

spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379

2. @EnableCaching 선언

- 캐싱을 사용하겠다는 의미다.

@EnableCaching
@SpringBootApplication
public class BackendApplication {

    public static void main(String[] args) {
        SpringApplication.run(BackendApplication.class, args);
    }

}

3. configuration 클래스 생성

@Configuration
@EnableRedisRepositories
public class RedisConfiguration {
    @Value("${spring.redis.host}")
    private String redisHost;

    @Value("${spring.redis.port}")
    private int redisPort;

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(redisHost, redisPort);
    }

    @Bean
    public RedisTemplate<?, ?> redisTemplate() {
        RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        return redisTemplate;
    }
}

이 구간에서 겪었던 문제 : 클래스가 Redis에 Set되지 않는 문제

해결 : setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class)); 선언을 통해 해결되었다.

이 문제를 해결하는데 도와준 양이님과 버민님께 감사의 뜻을 전합니다.

 

변경 후 내용

// 위와 같음

    @Bean
    public RedisTemplate<?, ?> redisTemplate() {
        RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
        // 적용 내용
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class));
        // 적용 내용 끝
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        return redisTemplate;
    }
}

4. Service에서 테스트

@Service
@RequiredArgsConstructor
public class MainService {
    private final RedisTemplate<String, Object> redisTemplate;

    public String getMainPageElements(String token) {
        ValueOperations<String, Object> operations = redisTemplate.opsForValue();
        operations.set("test", "test");
        String redis = (String)operations.get("test");
        System.out.println(redis);

        return redis;
    }

 

참고로 위 테스트는 그냥 예시 코드다. 알아서 잘 커스텀 해서 사용하면 된다.

출력 결과는 콘솔에 "test"가 출력되면 잘 된 것이다.

성능에 큰 영향을 주는 기능이니 정적 데이터는 기본이고 동적 데이터에도 잘 쓰면 사용자 경험에 큰 도움이 될 것이라고 생각한다.

댓글