카테고리 없음

☁ EC2에 스프링 부트 배포하면서 피땀 흘린 썰 (2)

책다니엘 2025. 5. 12. 08:26
― Redis 오류, 그리고 Security 지옥 ―

🔴 4. Redis 연결 오류 (UnknownHostException: redis)

Spring Boot는 잘 떴는데, 갑자기 이런 에러가 터졌다:

java.net.UnknownHostException: redis

 

처음엔 “레디스 안 켜졌나?” 싶었는데, Redis는 잘 실행 중이었다.
문제는 Docker 네트워크였다.


✅ 이유: Redis를 docker-compose로 안 띄웠기 때문

내가 백엔드 컨테이너만 먼저 띄워놓고 Redis는 따로 설치해서 돌렸었는데,
그 상태에서 .env에 이렇게 설정해놨었다:

# env
spring.data.redis.host=redis

 

→ 당연히 "redis"라는 이름은 Docker 내부 네트워크에서만 인식 가능하고,
그 이름을 호스트 이름으로 쓰면 못 찾는다.


💡 해결 방법은 2가지

  1. Redis도 docker-compose로 같이 띄우기
  2. EC2에 Redis가 설치돼 있다면 spring.data.redis.host=172.17.0.1로 수정

난 결국 Docker Compose로 Redis를 같이 돌리면서 해결했다.

redis: image: redis:6.2 
container_name: redis 
ports: - "6379:6379"

 

이렇게 하고 나니까 "redis"라는 호스트명이 정상적으로 인식되더라.
역시 컨테이너는 같이 묶어야 편하다.


🧨 5. ClientRegistrationRepository 에러

이번엔 애플리케이션 실행하자마자 이런 에러가 터졌다:

Error creating bean with name 'filterChain': No bean of type 'ClientRegistrationRepository' found

 

이건 구글 로그인 설정이 빠졌거나 제대로 안 돼 있을 때 나오는 에러였다.


✅ 해결: .env에 제대로 된 소셜 로그인 값 추가

처음에는 이렇게만 넣어놨었다:

GOOGLE_CLIENT_ID=xxxx 
GOOGLE_CLIENT_SECRET=xxxx

 

근데 실제로 Spring이 찾는 변수는 이런 식이었다:

spring.security.oauth2.client.registration.google.client-id=xxxx 
spring.security.oauth2.client.registration.google.client-secret=xxxx 
spring.security.oauth2.client.registration.google.redirect-uri=http://localhost:8080/login/oauth2/code/google 
spring.security.oauth2.client.registration.google.scope=profile,email

 

이 이름 그대로 .env에 넣어야 정상적으로 인식된다.
이것도 모르고 한참 동안 "왜 Bean을 못 찾지?" 하고 헤맸다.

 

― 서버는 떴지만, 그게 끝은 아니었다 ―

 

🥳 6. 드디어 서버가 떴다

진짜 모든 에러를 잡고, 모든 환경변수를 맞추고, 모든 컨테이너를 띄우고 나서
docker logs -f moneytalk-app을 보는데, 딱 이 로그가 떴다:

Tomcat started on port 8080 (http)

 

🔥 진짜 소리 지르고 싶었다.

그리고 Swagger에 들어갔다:

http://<EC2-IP>:8080/swagger-ui/index.html

 

로딩 없이 딱 열렸다. 뭔가 되게 프로가 된 기분이었다.


🧊 7. 그런데 서버가 멈췄다

근데 문제는…
몇 시간 지나고 나니까 EC2 SSH 접속이 끊기고,
다시 접속하려니 렉이 너무 심하거나 아예 붙질 않았다.

이유는 간단했다.


✅ EC2 프리티어(t2.micro)는 상시 서비스용이 아니다

처음에는 무료로 배포하니까 좋다고 생각했는데,
현실은 프리티어 인스턴스는 CPU 크레딧이 부족하면 느려지거나 멈춘다.

  • 메모리는 1GB
  • CPU는 공유형
  • 과부하 걸리면 throttling (자동 제한)

즉, 지속적으로 서비스 돌리기에는 무리였다.


🤔 8. 그럼 포트폴리오는 어떻게 배포해야 할까?

프로젝트를 포트폴리오로 보여주고 싶은데,
면접 때마다 EC2에 SSH 접속해서 docker compose up 하긴 귀찮고 위험하다.

그래서 구글링, AI 등의 도움을 통해 배포 전략 몇개를 정리했다.


✅ 정리: 포트폴리오용 데모 배포 전략


 

구성 추천
백엔드 Render (Spring Boot용 무료 배포 가능)
프론트엔드 Vercel / Netlify (정적 파일 배포 최적화)
DB PlanetScale (MySQL 클라우드 버전)
Redis Upstash (무료 Redis, HTTP API 지원)
기타 Swagger, 영상 녹화본, Notion 페이지 정리

 

면접관이 "링크 있나요?" 하면 바로 Notion 보여주면 된다.


🎁 보너스: Swagger 무한 로딩, S3Uploader 주입 실패, UnknownHost(redis) 에러 등

진짜 배포하다가 하나씩 다 걸려봤다.
지금 생각하면, "에러 메시지 잘 읽고, 환경변수 이름 정확히 맞추면 해결된다"는 교훈 하나만 남았다.


🔚 마무리

직접 운영 환경처럼 배포해보니까
진짜로 현업에서 겪는 문제를 축소판으로 경험한 느낌이었다.

그리고 무엇보다...
지금은 이 삽질기록을 블로그에 정리하면서, 나중의 나에게 뿌듯함을 남기는 중이다.