1️⃣ 문제 상황
Spring Boot 프로젝트에서
- 로컬 개발 환경에서는 H2 DB
- AWS 배포 환경에서는 RDS(MySQL)
를 사용하도록 설계했는데, 예상과 다른 문제가 발생했다.
❗ 발생한 현상
- 로컬에서 애플리케이션을 실행했는데
- AWS RDS에 데이터가 저장됨 - 설정 파일을 .gitignore에 추가한 뒤
- 배포 서버에서 500 Internal Server Error 발생 - 보안을 위해 설정 파일을 숨기자
- 서버가 DB 접속 정보를 찾지 못하고 실행 실패
👉 “분명 로컬은 H2 쓰게 해놨는데 왜 배포 DB에 영향이 가지?”
2️⃣ 원인 분석
문제의 핵심은 환경 분리 미흡 + 설정 관리 방식 오류였다.
1. 하나의 application.yml에서 모든 환경을 관리
- 로컬 / 운영 환경 설정이 한 파일에 섞여 있음
- Spring Boot는 실행 시 명확한 기준이 없으면 같은 설정을 공유
- 결과적으로:
- 로컬 실행 → 운영 DB(RDS) 접속
- 테스트 데이터가 실제 서비스 DB에 저장됨
2. 보안 처리와 배포 방식의 충돌
- DB 비밀번호, 시크릿 키 보호를 위해
- application-prod.yml을 .gitignore에 추가
- 하지만 AWS 서버는:
- 해당 파일 자체를 받지 못함
- 결과:
- 서버 실행 시 DB 설정을 찾지 못해 500 에러 발생
👉 “보안을 지키려다 서버가 죽는 상황”
3. 운영 환경에 없는 H2 설정을 참조
- SecurityConfig에서 아래 설정 사용 중
PathRequest.toH2Console()
- 문제점 :
- H2 의존성은 local 환경에만 존재
- prod 환경에서는 해당 Bean 자체가 없음
- 결과 :
- 운영 서버 부팅 중 Bean 생성 실패
- 애플리케이션 기동 불가
3️⃣ 해결 방법
문제를 해결하기 위해 환경을 명확히 분리하고 보안과 배포를 동시에 만족하는 구조로 개선했다.
1. Spring Profile을 이용한 환경 분리
환경별 설정 파일을 명확히 나눴다.
📁 설정 파일 구조
application.yml
application-local.yml
application-prod.yml
application.yml (공통 설정)
spring:
profiles:
active: local
👉 기본 실행은 local
application-local.yml (로컬 환경)
- H2 DB 사용
- 콘솔 허용
- 테스트에 최적화된 설정
application-prod.yml (운영 환경)
- AWS RDS(MySQL) 사용
- H2 관련 설정 제거
- 실제 서비스 전용 설정
👉 이제 로컬과 운영이 완전히 분리됨
2. 환경 변수(Environment Variables)로 보안 해결
❌ 잘못된 방식
spring.datasource.password: my-secret-password
- GitHub 유출 위험 ❌
✅ 개선된 방식
spring:
datasource:
password: ${SPRING_DATASOURCE_PASSWORD}
- 실제 값은 코드에 없음
- 플레이스홀더만 GitHub에 Push
🔐 실제 값은 어디에?
- AWS Elastic Beanstalk → 환경 속성(Environment Properties) 에 직접 등록
👉 코드가 유출돼도 DB 비밀번호는 노출되지 않음
3. Security 설정 수정 (운영 환경 안정화)
❌ 기존 코드
.requestMatchers(PathRequest.toH2Console()).permitAll()
- prod 환경에서 Bean 없음 -> 서버 기동 실패
✅ 수정 코드
.requestMatchers("/h2-console/**").permitAll()
- 단순 문자열 경로
- Bean 의존성 제거
- local / prod 모두 안전하게 동작
4️⃣ 결과
🎉 개선 효과
- 환경 독립성 확보
- 로컬에서 어떤 테스트를 해도 RDS에 영향 없음
- 보안 강화
- DB 비밀번호, JWT Secret Key GitHub 미노출
- 확장성 확보
- dev, stage 환경 추가 시
→ application-dev.yml만 만들면 끝
- dev, stage 환경 추가 시
'프로젝트 > 스프링 부트 3 백엔드 개발자 되기 Blog + 선착순 강의 프로젝트' 카테고리의 다른 글
| 👥💡 Querydsl 페이징: fetchResults()가 비권장(Deprecated)된 이유와 실무 정석 패턴 (0) | 2026.02.14 |
|---|---|
| 👥🚨 수정시간 및 수정하기 작성자 권한 변경 (0) | 2026.02.14 |
| 👥🚨 수정은 됐는데 화면에는 “실패”라고 뜬다? (1) | 2026.02.07 |
| 👥💡 N+1 리팩토링 과정 (1) | 2026.02.07 |
| 👥🚨 배포 후 로컬 실행 시 OAuth2 승인 오류 (0) | 2026.02.07 |