Spring Boot Redis 연동 - docker 사용

1

back-end

목록 보기
7/18
post-thumbnail

회사에서 elastic cache 기능을 추가하게 돼서 개발을 진행해 봤다.
local 환경에서 redis 연동, 개발 환경에서 elastic cache를 연동했다.

따라서, 다음 게시물은 ec2와 elastic cache를 연동하는 방법을 알아볼 것이고, 현재는 local에서 연동과 간단한 사용법을 기록할 것이다.

https://github.com/khc41/redis-test
관련 코드는 깃허브에서 확인할 수 있다.

docker를 이용한 redis 설치 / 실행

docker에서 redis의 latest 버전 이미지 가져오기

docker pull redis 

6379번 포트로 redis를 실행

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

docker에서 redis 접속

docker exec -it myredis /bin/sh
redis-cli
redis-cli로 테스트 결과 redis가 잘 되는것을 확인할 수 있다.


Spring Boot에서 연동

예제를 통한 redis 사용법을 알아보자
컨트롤러에서 key, value를 body로 받아서 redis에 값이 있으면 가져오고 없으면 저장하는 로직을 구현할 것이다.

gradle 세팅

build.gradle 파일에 dependency 추가

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-data-redis'
}

yml이나 properties 파일에 host, port 세팅

application.yml파일

spring:
  data:
    redis:
      host: localhost
      port: 6379

application.properties 파일

spring.data.redis.host=localhost
spring.data.redis.port=6379

redis config 설정

RedisConfigure 파일

@Configuration
public class RedisConfigure {
	// yml, properties 파일에서 host, port 정보 가져옴
    @Value("${spring.data.redis.host}")
    private String host;
    @Value("${spring.data.redis.port}")
    private int port;

	// redis와 백엔드 연결
    // Lettuce와 Jedis가 있는데 성능상 Lettuce를 많이 쓴다고 함
    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        return new LettuceConnectionFactory(new RedisStandaloneConfiguration(host, port));
    }

	// 추상화와 직렬화 세팅
    // CacheManager를 사용하면 spring에서 캐싱할 때 로컬 캐시가 아닌 redis에 캐시한다고 함
    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

Redis의 캐시 기능만 이용할거면 CacheManager를 이용하는게 더 좋다고 한다.
다음번에 CacheManger를 이용한 캐시를 간단하게 정리해보겠다.

컨트롤러 파일 세팅

RedisController.java

@RestController
@RequiredArgsConstructor
public class RedisController {

    private final RedisService redisService;

    @GetMapping("/redis")
    public String getRedis(@RequestBody RedisParam param) {
        return redisService.getRedis(param);
    }
}

RedisParam.java

@Getter
@Setter
@Builder
public class RedisParam {
    private String key;
    private String value;
}

서비스 파일 세팅

RedisService.java

public interface RedisService {
    String getRedis(RedisParam param);
}

RedisServiceImpl.java

@Service
@Slf4j
@RequiredArgsConstructor
public class RedisServiceImpl implements RedisService {

    private final RedisTemplate<String, Object> redisTemplate;

    @Override
    public String getRedis(RedisParam param) {
        ValueOperations<String, Object> operations = redisTemplate.opsForValue();
        String result = (String) operations.get(param.getKey());
        if (!StringUtils.hasText(result)) {
            operations.set(param.getKey(), param.getValue(), 10, TimeUnit.MINUTES);
            log.info("redis save");
            result = param.getValue();
        }
        return result;
    }
}


결과 확인

프로젝트를 실행하고 포스트맨을 이용해서 테스트를 진행할 것이다.
*주의: redis가 local에 실행되고 있어야한다.

body에 적절한 값을 넣어주고 postman으로 api call을 했을 때 응답시간을 비교한 결과이다.

처음 실행 결과 소요시간 201ms

두번째 텍스트실행 결과 소요시간 6ms

redis-cli로 hello를 조회 결과 정상적으로 world가 들어간 것을 알 수 있다.

local에서 redis를 사용하는 방법을 알아봤다.
다음에는 aws ec2와 elastic cache를 사용해서 연동하는 방법을 알아보겠다. (일정은 미정)

0개의 댓글