📌 문제 상황
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는 믿되, 캐시는 믿지 말자.
이런 트러블을 겪는 분들께 도움이 되기를 바라며,
나는 이제 다음 테스트하러 갑니다... 🫠