Redis EC2에 Docker Container화, Spring Boot에서 Redis 쓰기

skyju·2023년 4월 12일
1

Redis 서버를 사용하기 위해서 우선
1. ec2에 직접 서버를 설치하는 방법
2. docker를 이용하여 공식 이미지를 받아 컨테이너를 띄우는 방법
이 있습니다.
우리는 ec2 서버 내에 직접 설치가 아닌 docker를 이용하는 방식을 사용하고 있으니, 2번으로 진행합니다.

Docker를 활용한 Redis container 띄우기

우선, redis 공식사이트에서 docker 컨테이너를 위한 공식 이미지를 제공하고 있습니다.
대략적인 docker를 활용한 redis 이용방법은 공식 사이트에서도 안내되고 있습니다.
공식 사이트에서 사용할 이미지를 골랐다면 docker pull을 통해 이미지를 다운로드받습니다.
docker pull --platform linux/amd64 redis
이미지를 받았다면 docker images -a를 통해 잘 받았는지 확인합니다.
다음으로 redis용 docker network를 생성합니다
docker network create redis-network 뒤의 이름은 임의로 결정하시면 됩니다.
network가 성공적으로 잘 만들어졌다면 docker network ls 명령어를 통해 확인할 수 있습니다.

이제 이미지를 실행할 차례입니다.
docker run --name redis -p 6379:6379 --network redis-network -it -d redis

- docker run 옵션에 대한 자세한 설명보기 
    — name : 컨테이너의 이름을 설정합니다.
    -p, —publish : 포트포워딩, 호스트와 컨테이너의 포트를 연결합니다. <호스트포트>:<컨테이너포트>순입니다.
    —network : 사용할 docker network를 지정합니다.
    —rm : 프로세스 종료시 컨테이너를 자동으로 제거합니다.
    -i, —interactive : 표준입력을 활성화합니다.
    -t, —tty : tty모드(pseudo-tty)를 활성화합니다. 보통 bash로 보기위해 기본으로 설정합니다.
    -d,—detach : 보통 데몬모드라고 부르며 컨테이너가 백그라운드로 실행됩니다.

지정한 옵션대로 컨테이너가 실행중인지 확인합니다.

만약 삭제하고 싶다면 kill 후(rm옵션이 없는 경우 rm까지 진행) 다시 진행합니다.

여기까지 진행되었다면 redis의 경우 redis-cli환경을 통해 접속할 수 있습니다.

(1) docker exec -it redis redis-cli
또는 다른 컨테이너와 마찬가지로 docker exec it redis /bin/bash 를 통해 docker 컨테이너에 접속한 후 redis-cli 명령어를 입력해도 (1)과 같이 접속할 수 있습니다.

redis 서버가 정상적으로 작동하는지 확인하기 위해 keys * 명령어를 통해 모든 keys를 확인해봅니다. 정상적으로 작동한다면 redis 서버가 정상 작동하고 있음을 확인할 수 있습니다.
redis-cli 환경에서 나오려면 다른 컨테이너와같이 중지없이 빠져나오면 됩니다.

<!!> 삽질

https://velog.io/@rnqhstlr2297/Redis를-Docker-Compose로-실행하기

위의 블로그에서 보면 알 수 있듯이… docker 컨테이너로 spring과 redis를 각각 올리고 spring boot application.properties에서 redis container를 참조하려고 하니 매우 많은 오류가 발생했습니다. (못찾겠다는..) 구글링해보니 localhost로 그냥 두면된다. 127.0.0.1로 지정하면 된다 말이 많지만,, 컨테이너로 올려서 자체 ip가 생긴이상 그렇게 하면 된다는 것은 안될 일이라는 것이 쉬이 예상 갈 것입니다…

docker-compose는 여러개의 컨테이너를 같이 관리할 수 있도록 도와줍니다. 또한 한 컨테이너가 만들어져야, 다음 컨테이너가 만들어지라는 의존성 설정까지 가능합니다, (depends on으로 작성하면 됩니다.) 이를 통해서 같이 묶인 컨테이너는 서로의 존재를 컨테이너 명으로 확인이 가능합니다.. 이러한 docker-compse의 특성을 이용하여 ip주소가 아닌 container명으로 host를 지정하여 redis를 인식하도록 합시다.

우선 docker imgae를 통해 빌드해야 하므로, 위에서 받았던 이미지를 이용할 것입니다.

그리고 이미 올려두었던 컨테이너는 죽여줍니다.

version: "3.7"

services:
  redis:
    image: redis
    container_name: redis
    hostname: redis
    ports:
      - "6379:6379"
  springboot:
    container_name: springboot
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - "8080:8080"
    environment:
      SERVER_MODE: prod
      AWS_ACCESS_KEY: "${AWS_ACCESS_KEY}"
      AWS_SECRET_KEY: "${AWS_SECRET_KEY}"
      JWT_SECRET_KEY: "${JWT_SECRET_KEY}"
      STEAM_API_KEY: "${STEAM_API_KEY}"

위 처럼 spring boot를 빌드하는 docker-compose.yml에 redis에 대한 설정을 넣어주어서 host-name을 꼭 지정해주세요.

작성을 완료하면 spring boot를 다시 build하면서 redis까지 docker run이 실행되는지 확인합니다.

성공적으로 두개의 컨테이너가 전부 올라오면 설정이 완료됩니다.

Spring Boot에서 Redis 사용을 위한 기본 설정

우선 redis를 사용하기 위해 해야할 절차는 다음과 같습니다.

  1. redis dependency 설정 (spring용 라이브러리를 사용해야 하니깐요!)
  2. redis server와의 연결을위한 properties(또는 yml이겠죠) 설정
  3. configuration 작성 (기본적인 설정과 spring의 기본 Bean 의존성 주입을 해주어야 합니다.)
  4. 사용할 entity 및 repository 작성 후 기본적인 crud 확인하기

절차대로 진행해보겠습니다.

1. redis dependency 설정

늘 그렇듯이 maven일 경우 pom.xml에, gradle일 경우 gradle.build 파일에 의존 추가를 해줍니다.

gradle 기준으로는 아래 한줄을 추가해주면 됩니다.

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

2. redis server와의 연결을위한 properties 설정

#Redis
spring.redis.lettuce.pool.max-active=5
spring.redis.lettuce.pool.max-idle=5
spring.redis.lettuce.pool.min-idle=2
spring.redis.host=redis
spring.redis.port=6379

위처럼 필요한 내용을 설정합니다.

3. configuration 작성

package com.gamemakase.global.config;

import lombok.RequiredArgsConstructor;
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.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.repository.configuration.EnableRedisRepositories;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
@RequiredArgsConstructor
@EnableRedisRepositories
public class RedisConfig {

    @Value("${spring.redis.host}")
    private String host;

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

    /**
     * 내장 혹은 외부의 Redis를 연결
     */
    @Bean
    public RedisConnectionFactory redisConnectionFactory(){
        return new LettuceConnectionFactory(host, port);
    }

    /**
     * RedisConnection에서 넘겨준 byte 값 객체 직렬화
     */
    @Bean
    public RedisTemplate<?,?> redisTemplate(){
        RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

4. entity 및 repository 작성 후 기본적인 crud 확인하기

spring boot에서 인메모리 데이터 저장소인 redis를 사용하기 위해서는 org.springframework.data.redis.core 패키지에 있는 'RedisTemplate 클래스를 사용하는 방법'과
CrudRepository를 상속받는 'RedisRepository를 사용하는 방법'
이 있습니다. 우리는 JPA를 사용하고 있으므로 2번째 방법을 사용합니다.

@RedisHash를 사용하면 jpa에서의 entity개념을 사용할 수 있습니다.

repository는 위에 언급했듯 crudrepository를 상속받는 interface를 작성하면 사용가능합니다.

@RedisHash // JPA에서의 @Entity역할
@Builder
@Getter
public class SearchHistory {
    @Id
    private String idx;
    private String userId;
    private String content;
}
public interface SearchHistoryRedisRepository extends CrudRepository<SearchHistory, String> {
}

다 작성했으면 controller를 통해 기본적인 read, insert를 확인해보시면 됩니다.

profile
https://github.com/skyju

0개의 댓글