👥🚨 로컬로 실행 후 배포한 서버에도 DB가 적용되는 이유

2026. 2. 7. 01:08·프로젝트/스프링 부트 3 백엔드 개발자 되기 Blog + 선착순 강의 프로젝트

1️⃣ 문제 상황

Spring Boot 프로젝트에서

  • 로컬 개발 환경에서는 H2 DB
  • AWS 배포 환경에서는 RDS(MySQL)

를 사용하도록 설계했는데, 예상과 다른 문제가 발생했다.

❗ 발생한 현상

  1. 로컬에서 애플리케이션을 실행했는데
    - AWS RDS에 데이터가 저장됨
  2. 설정 파일을 .gitignore에 추가한 뒤
    - 배포 서버에서 500 Internal Server Error 발생
  3. 보안을 위해 설정 파일을 숨기자
    - 서버가 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만 만들면 끝

'프로젝트 > 스프링 부트 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
'프로젝트/스프링 부트 3 백엔드 개발자 되기 Blog + 선착순 강의 프로젝트' 카테고리의 다른 글
  • 👥🚨 수정시간 및 수정하기 작성자 권한 변경
  • 👥🚨 수정은 됐는데 화면에는 “실패”라고 뜬다?
  • 👥💡 N+1 리팩토링 과정
  • 👥🚨 배포 후 로컬 실행 시 OAuth2 승인 오류
hak0622
hak0622
개발하면서 “이게 뭐지?”라는 순간마다 궁금한 점을 바탕으로 정리한 개발 블로그입니다.
  • hak0622
    궁금한 개발 이야기 Why?
    hak0622
  • 전체
    오늘
    어제
    • 분류 전체보기 (68)
      • 공부 (36)
        • 1. 자바 ORM 표준 JPA 프로그래밍 - 기본.. (35)
        • 시험 (1)
      • 프로젝트 (32)
        • 스프링 부트 3 백엔드 개발자 되기 Blog + .. (32)
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
hak0622
👥🚨 로컬로 실행 후 배포한 서버에도 DB가 적용되는 이유
상단으로

티스토리툴바