[팀프로젝트] Springboot 프로젝트에 Redis 연동하기(AWS ec2에 띄워보자!)

정상희·2023년 3월 1일
0
post-thumbnail

❗ Redis를 ec2에서 도커 컨테이너로 띄우는 방법

*AWS ec2에 도커를 띄우는 방법은 정리해두었으니 참고해보자
AWS Ec2 스팟 인스턴스설정 + MySql 도커 띄우기

📑 xshell에 아래의 명령어들을 입력한다

✔️ redis 이미지 파일 다운

docker pull redis 

✔️ 이미지 파일 확인

docker images


✔️ redis 컨테이너 실행

docker run -p 6379:6379 --name (redis 컨테이너 이름) -d redis

ex) docker run -p 6379:6379 --name spring-redis -d redis

✔️ AWS 보안그룹 인바운드/아웃바인드 설정

*AWS 보안그룹 인바운드/아웃바인드 설정방법은 아래 포스트를 참고해보자
AWS Ec2 스팟 인스턴스설정 + MySql 도커 띄우기


✔️ 실행중인 컨테이너 spring-redis와 상호작용하고(-i) 명령어는 redis-cli로 redis와 접근

docker exec -i -t (redis 컨테이너 이름) redis-cli


ping pong이 잘 오가면 클라이언트와 서버가 제대로 작동하고 있는 것이다.
❓ Aws 컨테이너 관점에서 localhost (또는 127.0.0.1)



🎫 비밀번호 인증이 필요한 이유
난데없는 backup은 뭐지?
redis에 값을 넣고 key를 조회하다보면 내 key값들은 사라지고 아래 화면처럼 알 수 없는 키들을 보곤 한다.
악의적이고 단조로운 해킹에 당한 것을 축하한다 🥂

  • redis의 잘 알려진 6379 포트가 열려있고
  • redis에 비밀번호를 설정하지 않는다면 해킹의 표적이 되기 쉽다.

그렇다면 우리는 다음과같이 위의 두가지 조건을 만족하지 않게하면 될텐데
시스템에서 대체적으로 많이 알려져있는 포트는 가급적이면 변경하지 않고 사용하는 것이 좋으므로 6379번 그대로 유지하자.
단, redis 서버에 접근하려면 필수로 인증을 하게끔 설정하는 것을 권유한다.



❗ 비밀번호 설정

docker image로 실행하고 있기에 간단하게 도커이미지에 환경변수를 넘기는 것만으로 requirepass가 설정할 수 있다. (간단한 환경설정이 도커 방식의 장점)

✔️ 기존의 docker (비밀번호 설정되지 않은) 컨테이너 삭제 후 명령어를 재실행

  • 도커 컨테이너 중지
    Ctrl + Insert로 복사 / Shift + Insert로 붙여넣기
 docker ps
 docker stop (redis containerID)

  • 도커 컨테이너 삭제
 docker rm (redis containerID)

✔️ docker를 사용하여 redis 이미지를 만들고 redis 비밀번호를 설정

 docker run -p 6379:6379 --name (redis 컨테이너 이름) -d redis:latest --requirepass "(비밀번호)"

ex) docker run -p 6379:6379 --name spring-redis -d redis:latest --requirepass "123456"

✔️ redis-cli에서 인증 후 접속 확인

docker exec -i -t (redis 컨테이너 이름) redis-cli
AUTH (비밀번호)


redis 설치 완료!

❗ Springboot과 연동하기

라이브러리
Spring Boot에서는 Spring Date Redis를 통해 Lettuce, Jedis라는 오픈소스 Java 라이브러리를 사용할 수 있다.
접근방식
Spring Data Redis는 Redis에 두 가지 접근 방식을 제공한다.

하나는 RedisTemplate을 이용한 방식이며, 다른 하나는 RedisRepository를 이용한 방식이다.


*해당 포스트는 Lettuce를 통해 Redis를 사용한다.
*또한 RedisTemplate 방식으로 Redis에 접근한다.


Redis에 접근하기 위해서는 Redis 저장소와 연결하는 과정이 필요하다.

✔️ build.gradle 의존성 추가

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

✔️ Redis 저장소와 연결


@Configuration
@EnableRedisRepositories // redis 활성화
public class RedisConfig {
    @Value("${spring.redis.host}")
    private String redisHost;

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

    /*
    RedisTemplate을 이용한 방식

    RedisConnectionFactory 인터페이스를 통해
    LettuceConnectionFactory를 생성하여 반환
     */

    @Bean
    public RedisConnectionFactory redisConnectionFactory(int dbIndex) {
        final RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
        redisStandaloneConfiguration.setHostName(redisHost);
        redisStandaloneConfiguration.setPort(redisPort);
        redisStandaloneConfiguration.setPassword(redisPassword);
        return new LettuceConnectionFactory(redisStandaloneConfiguration);

    @Bean
    public RedisTemplate<String, String> redisTemplate() {
        // redisTemplate를 받아와서 set, get, delete를 사용
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
        /**
         * setKeySerializer, setValueSerializer 설정
         * redis-cli을 통해 직접 데이터를 조회 시 알아볼 수 없는 형태로 출력되는 것을 방지
         */
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(redisConnectionFactory());

        return redisTemplate;
    }
}

✔️ 환경 설정

  • application.yml 에 해당 내용 추가
    application.yml 파일은 깃허브에 그대로 노출되므로 임시의 값을 넣어주고 Environment Variables 설정을 통해 실제 값을 주입한다.
spring:
  redis:
    host: localhost
    port: 6379
	password: hello
  • Environment Variables
  • ⭐ SPRING_REDIS_HOST 의 주소는 ec2 인스턴스의 퍼블릭 IPv4 주소로 값을 넣어주어야 한다.


여기까지 docker에 Redis 띄우기 및 Springboot 연동 실습이 끝났다.

‼ 마무리

Redis는 build.gradle dependencies에서만 적용을 하면 redis가 되는 줄 알았지만, 따로 다운로드 및 설치 후 port 실행을 해야지 연결이 가능했다.
그리고 redis를 ec2에 띄웠기 때문에 spring.reids.host주소를 IPv4주소로 주입해주는 것을 알기까지 오래 헤맸던 것 같다.
막상 정리하고 보니 설치 과정이 너무 복잡하지는 않다는 생각이 들고, redis를 설정함으로써 이번 팀프로젝트에 다양한 기능을 확장해나갈 수 있었기에 보람찬 마음도 든다!


참고 문헌

https://ratseno.tistory.com/93
내redis가해킹당했다고심지어local인데/
https://wildeveloperetrain.tistory.com/32
https://jojoldu.tistory.com/297

*ec2 docker 컨테이너가 아닌 localhost 환경에 Redis를 설치하고 싶다면 이 링크를 참조해서 설정할 수 있다
[REDIS] 📚 Window10 환경에 Redis 설치 & 설정

0개의 댓글