
오늘은 Docker를 이용하여 Redis를 로컬에 설치하고, Springboot와 연동하겠다.
Step 1. Docker를 이용하여 Redis를 받아보자!
docker는 다운받아져 있는걸로 알고..
'docker pull redis:latest' 명령어를 사용하여 최신버전의 redis를 받아온다.

그 다음, 'docker network create redis-network --driver bridge' 명령어를 사용하여 네트워크를 생성해 준다.
※ docker network : 컨테이너간의 통신 및 데이터 공유를 위한 가상 네트워크

이제, 'sudo vim redis.conf' 명령어를 사용하여 redis.conf 파일을 수정하여 설정을 잡아준다.

docker run \
-d \
--name redis \
-p 6379:6379 \
--network redis-network \
-v ~/${데이터를 저장할 파일 경로} /redis.conf:/etc/redis/redis.conf \
-v redis_data:/data \
redis:latest redis-server /etc/redis/redis.conf

포트번호와, 방금 설정한 네트워크, 데이터 저장 경로를 잡아준다.
이렇게 설정을 마쳤으면 redis 이미지가 생성되었음을 확인할 수 있다.

최종적으로 생성된 이미지로 컨테이너를 만들어 준다.

docker run --name myredis \
-p 6379:6379 \
--network redis-network \
-v /Users/lts/Desktop/docker/redis:/data \
-d redis:latest redis-server \
--appendonly yes

컨테이너까지 생성완료!
'docker exec -it myredis redis-cli --raw' 명령어를 사용하여 컨테이너 실행

프롬프트를 보면 정상적으로 접속됨을 확인할 수 있다.
Step 2. Redis와 Spring Boot 연동하기
※ 해당 프로젝트는 Maven 을 사용한 프로젝트이다.
먼저 application.properties 에 redis 포트를 추가하여준다
spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379

그 다음 config 파일을 작성하여준다.

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(redisConnectionFactory());
return redisTemplate;
}
@Bean
public StringRedisTemplate stringRedisTemplate() {
final StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
stringRedisTemplate.setKeySerializer(new StringRedisSerializer());
stringRedisTemplate.setValueSerializer(new StringRedisSerializer());
stringRedisTemplate.setConnectionFactory(redisConnectionFactory());
return stringRedisTemplate;
}
}
Model과 Repository 도 작성해준다.

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.index.Indexed;
import java.time.LocalDateTime;
@Getter
@RedisHash(value = "resultHistory", timeToLive = 3600) // Redis Repository 사용을 위한
@AllArgsConstructor
@NoArgsConstructor
public class ResultHistory {
@Id
private String id;
@Indexed // 필드 값으로 데이터를 찾을 수 있도록 설정 (findByAccessToken)
private String ip;
private String originalText;
private String translatedText;
@Indexed
private LocalDateTime createDateTime;
@Builder
public ResultHistory(String ip, String originalText, String translatedText, LocalDateTime createDateTime) {
this.ip = ip;
this.originalText = originalText;
this.translatedText = translatedText;
this.createDateTime = createDateTime;
}
}

import com.teamTS.funfun.model.ResultHistory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
import java.util.Optional;
@Repository
public interface ResultRedisRepository extends JpaRepository<ResultHistory, String> {
Optional<List<ResultHistory>> findByIpOrderByCreateDateTimeAsc(String ip);
}
controller 에 간단한 테스트 코드를 작성하여 값을 확인해보자!

@GetMapping("/hello")
public String HelloWorld(Model model) {
redisConnectionTest();
List<TestModel> tm = testRepository.getTestData();
model.addAttribute("data", tm.get(0).getTitle());
return "home/homeView";
}
void redisConnectionTest() {
final String key = "a";
final String data = "1";
final ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
valueOperations.set(key, data);
final String s = valueOperations.get(key);
}
}
그런데...

'Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.'
대충 빈 생성이 중복으로 발생하여 생긴 오류인듯 하다..
원인은 기존 MapperRepository와 Redis용 JpaRepository에서
@Repository
해당 어노테이션을 사용하여 충돌한듯 하다.
이럴때는
application.properties 에
spring.main.allow-bean-definition-overriding=true
한 줄을 추가하여 준다.

성공적인 실행.

이후 ' keys * ' 명령어를 사용하여 데이터가 정상적으로 추가된 것을 확인할 수 있다.