카테고리 없음

[ Redis / Docker / Spring ] docker를 이용하여 springboot에서 Redis 연동하기

윰태 2024. 3. 15. 03:11

 

오늘은 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 * ' 명령어를 사용하여 데이터가 정상적으로 추가된 것을 확인할 수 있다.