카테고리 없음

💥 Docker에서 Redis 연결 안 될 때? 내 삽질 기록 정리 🐳🔥

책다니엘 2025. 5. 12. 00:36

📌 문제 상황

Spring Boot + Redis + Docker Compose 환경에서 프로젝트를 올리는데,
애플리케이션이 갑자기 종료되고 아래와 같은 에러를 뿜었다.

Connection refused: localhost/127.0.0.1:6379 Unable to connect to Redis

분명 REDIS_HOST=redis로 설정했는데 왜 자꾸 localhost:6379로 연결하려는 거야...?

 


🔍 문제 원인 파헤치기

1. localhost로 연결되는 이유?

  • Redis를 Docker 컨테이너로 띄우면 localhost가 아닌 컨테이너 이름(redis)으로 접근해야 한다.
  • 그런데도 Spring이 계속 localhost를 사용한다면?
    환경 변수 적용이 제대로 안 됐거나, 소스 코드나 설정 어딘가에 하드코딩된 게 있다!

2. application.yml과 .env 파일 체크

# application-docker.yml 
spring: 
  data: 
    redis: 
      host: ${REDIS_HOST} 
      port: ${REDIS_PORT}
 
# .env 
REDIS_HOST=redis 
REDIS_PORT=6379

이렇게 되어 있어야 정상인데, 나는 .env에 공백을 둬서(REDIS_HOST = redis) 아예 인식이 안 됐었다... 😅


3. 로그 찍히게 설정하기

Spring이 실제 어떤 값을 읽고 있는지 몰라서 로그 찍는 RedisDebugger 컴포넌트도 추가했다.

@Component @RequiredArgsConstructor 
public class RedisDebugger { 
	@Value("${spring.data.redis.host}") 
    private final String redisHost; 
    
    @PostConstruct 
	public void printInfo() { 
    System.out.println("🔍 Redis Host: " + redisHost); 
    } 
}
 

그런데 문제는...


🚨 로그가 안 나와!?

알고 보니 빌드가 제대로 반영 안 되고 있었다!
Dockerfile은 이렇게 되어 있었는데:

FROM openjdk:17-jdk-slim \

ARG JAR_FILE=build/libs/moneytalk-0.0.1-SNAPSHOT.jar 

COPY ${JAR_FILE} app.jar 

ENTRYPOINT ["java", "-Dspring.profiles.active=docker", "-jar", "/app.jar"]

문제는 이거였다:

❗ build/libs/xxx.jar이 최신 파일이 아닐 수도 있음

→ 내가 코드를 바꿨다고 해도 JAR을 다시 안 만들면 소용이 없다.


✅ 해결 방법 정리

1. JAR 먼저 빌드하자

# bash
./gradlew clean bootJar

2. .dockerignore에 build 디렉토리 넣지 마!

처음엔 아래처럼 잘못 적었었다:

# dockerignore

build ❌

→ 이러면 JAR 파일을 Docker 빌드에 복사 못 해서 오류 난다

3. Docker 빌드 캐시는 반드시 날려야 함

# bash
docker compose down -v 
docker compose build --no-cache 
docker compose up -d

이걸 안 하면 Docker가 옛날 캐시된 이미지로 실행해서 새 코드가 반영 안 됨. 진짜 망할 차가운 캐시...


🧩 그리고 드디어 성공!

# bash
✅✅✅ MAIN METHOD TRIGGERED ✅✅✅ 🔍 Redis Host: redis

이거 보고 진짜 눈물 날 뻔했다...


💡 마무리 팁

  • application.yml 말고 application-docker.yml에서 설정하고 SPRING_PROFILES_ACTIVE=docker 꼭 잊지 말기
  • .env는 공백 없이, 대소문자 정확하게!
  • System.out.println()이 안 보인다면? → 빌드 안 됐다고 보면 된다

✍️ 마무리

이번 삽질을 통해 얻은 교훈:
👉 Docker는 믿되, 캐시는 믿지 말자.

이런 트러블을 겪는 분들께 도움이 되기를 바라며,
나는 이제 다음 테스트하러 갑니다... 🫠