1. 문제 상황

Spring Boot 애플리케이션에서 Redis 연결 설정을 완료한 후, 애플리케이션을 실행했지만 다음과 같은 에러가 발생했습니다:

org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis
Caused by: java.net.ConnectException: Connection refused

이 에러는 Redis 서버와 애플리케이션이 제대로 통신하지 못하는 경우에 발생합니다.


2. 문제 원인

  • Redis 서버가 실행되지 않음
  • Redis 설정 파일에서 외부 접근을 허용하지 않음
  • Spring Boot의 Redis 설정에서 호스트가 잘못 지정됨
  • Docker 네트워크 문제: 애플리케이션과 Redis 컨테이너가 서로 다른 네트워크에 속해 있음
  • 포트 문제: Redis가 사용하는 포트(기본: 6379)가 열려 있지 않음

3. 해결 방법

Redis를 EC2에 직접 설치하거나 Docker를 통해 Redis 컨테이너를 설정하여 문제를 해결할 수 있습니다. 저는 Docker 환경에서 해결한 과정을 아래에 공유합니다.


4. Docker 환경에서 Redis 설정 및 문제 해결

4.1 Redis와 Spring Boot 애플리케이션이 통신할 네트워크 생성

먼저, Docker 컨테이너 간의 통신을 위해 네트워크를 생성합니다.

docker network create social-network

4.2 Redis 컨테이너 실행

Redis 컨테이너를 실행하면서, 이전에 생성한 네트워크(social-network)에 연결합니다.

docker run -d \\
  --name redis \\
  --network social-network \\
  -p 6379:6379 \\
  redis

  • -name redis: 컨테이너 이름을 redis로 설정
  • -network social-networksocial-network 네트워크에 연결
  • p 6379:6379: Redis의 기본 포트를 EC2에서 열어줌

4.3 Spring Boot 컨테이너 실행

Spring Boot 애플리케이션 컨테이너도 같은 네트워크에 연결하여 실행합니다.

docker run -d \\
  --name social-media \\
  --network social-network \\
  -p 8080:8080 \\
  -e AWS_S3_ACCESS_KEY=$AWS_S3_ACCESS_KEY \\
  -e AWS_S3_BUCKET_NAME=$AWS_S3_BUCKET_NAME \\
  -e AWS_S3_REGION=$AWS_S3_REGION \\
  -e AWS_S3_SECRET_KEY=$AWS_S3_SECRET_KEY \\
  <도커이미지이름>:latest
  • -network social-network: Redis와 같은 네트워크에 연결
  • Redis와 동일한 네트워크에 연결하지 않으면 Connection refused 에러가 발생합니다.

4.4 Spring Boot 설정 변경

Spring Boot 애플리케이션의 application.yml에서 Redis 호스트 이름을 redis로 변경합니다.

spring:
  data:
    redis:
      host: redis
      port: 6379
  • host: redis: Docker 네트워크 내에서 Redis 컨테이너의 이름을 호스트로 지정

4.5 컨테이너 상태 확인

컨테이너들이 제대로 실행되고 있는지 확인합니다.

docker ps

출력

CONTAINER ID   IMAGE                              COMMAND                  CREATED         STATUS         PORTS                                       NAMES
0d2f25acb373   redis                              "docker-entrypoint.s…"   2 minutes ago   Up 2 minutes   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   redis
de6bb85de644   <image이름>  			  "java -Dspring.profi…"   2 minutes ago   Up 2 minutes   0.0.0.0:8080->8080/tcp, :::8080->8080/tcp   <설정한 이름>

5. Redis 연결 테스트

Spring Boot 애플리케이션 내에서 Redis 연결이 제대로 이루어졌는지 확인합니다.

5.1 컨테이너 내부에서 Redis CLI 테스트

social-media 컨테이너 내부에서 Redis CLI를 설치한 후 Redis에 연결해보세요.

docker exec -it social-media bash

내부에서 Redis CLI를 설치하고 연결 테스트를 수행합니다.

apt-get update && apt-get install redis-tools -y
redis-cli -h redis -p 6379 ping

출력 

PONG
  • PONG 응답이 나오면 Redis와의 연결이 성공적으로 이루어진 것입니다.

6. 해결

위 과정을 통해 Spring Boot 애플리케이션이 Redis와 성공적으로 연결되었습니다. 이제 애플리케이션에서 Redis를 사용하는 기능을 정상적으로 실행할 수 있습니다.


7. 참고 명령어

  • Docker 네트워크 생성:
  • docker network create social-network
  • Redis 컨테이너 실행:
  • docker run -d --name redis --network social-network -p 6379:6379 redis
  • Spring Boot 애플리케이션 컨테이너 실행:
  • docker run -d --name social --network social-network -p 8080:8080

이렇게 문제를 해결하면 Spring Boot 애플리케이션과 Redis 간의 Connection refused 에러를 효과적으로 해결할 수 있습니다. 

+ Recent posts