로컬 개발 환경에서 H2 인메모리 DB를 사용하다가 MySQL로 전환하면서 발생했던 문제들과 그 해결 과정을 정리합니다. Docker와 TablePlus를 활용했으며,
data.sql자동 실행 및application-test.yml오작동 등 다양한 이슈들을 직접 해결했습니다.
H2에서 MySQL로 데이터베이스를 전환한 후 회원가입을 하게 되면 정상적으로 데이터가 저장되지만, 서버를 재시작하면 저장된 데이터가 사라지는 문제가 발생했습니다.
IntelliJ에서 서버 실행
브라우저에서 회원가입 진행

TablePlus에서 users 테이블 확인
▲ 회원가입 직후 TablePlus에 저장된 사용자 정보 확인 화면
IntelliJ에서 서버 종료 (DemoApplication 수동 종료)
Docker 컨테이너 종료
docker stop wingits-mysql
docker start wingits-mysql
IntelliJ에서 서버 재실행
다시 TablePlus에서 users 테이블 확인
▲ 서버 재실행 후 회원 정보가 사라진 상태
spring.jpa.hibernate.ddl-auto: update로 설정되어 있음docker volume도 정상적으로 연결되어 있었음CommandLineRunner 안에서 userRepository.deleteAll() 사용data.sql 파일이 존재함application-test.yml에서 mysql을 사용하도록 되어 있었다는 사실을 발견함data.sql 자동 실행
▲ MySQL로 전환한 뒤에도 data.sql 파일이 남아 있는 상태
CommandLineRunner에서 deleteAll() 호출
→ 개발 중 테스트용 코드가 실서버에서도 동작하며 회원 데이터를 모두 삭제해 문제를 악화시킴.
application-test.yml 설정이 제대로 분리되지 않음
→ 테스트 환경에서도 실제 MySQL을 참조하게 되어 의도치 않게 실DB에 영향을 줄 수 있는 구조였음.
운영 환경에서 유저 데이터가 삭제되지 않도록
• CommandLineRunner 내 userRepository.deleteAll() 코드 제거
Spring Boot의 자동 SQL 실행 방지
• data.sql, schema.sql 파일 완전 삭제
테스트 환경과 운영 환경의 설정 명확히 분리
• 운영은 MySQL, 테스트는 H2를 사용
• application.yml과 application-test.yml을 분리하고, 테스트에서는 아래와 같은 H2 설정만 유지
spring:
datasource:
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
driver-class-name: org.h2.Driver
username: sa
password:
jpa:
hibernate:
ddl-auto: create-drop
show-sql: true
h2:
console:
enabled: true
| 원인 | 설명 | 조치 |
|---|---|---|
data.sql 자동 실행 | 서버 시작 시 실행되어 DB 초기화 | data.sql 삭제 |
CommandLineRunner.deleteAll() | 운영 환경에서도 모든 유저 삭제 실행됨 | 해당 코드 제거 또는 조건 분기 |
application-test.yml 설정 오류 | 테스트 DB가 MySQL로 설정됨 | H2로 수정하여 테스트 분리 |
| Docker 볼륨 마운트 불확실 | 데이터 유지가 안 되는 의심 | docker inspect로 확인, 문제 없음 |
data.sql파일은 운영 환경에서 사용하지 않으면 삭제해두는 것이 좋습니다. (실수로 DB가 초기화될 수 있습니다.)CommandLineRunner에서 초기화 코드(deleteAll() 등)는 테스트 전용 조건 분기 또는 @Profile("test") 설정으로 운영 환경과 분리하는 것이 좋습니다.application.yml, application-test.yml의 설정을 명확히 구분하고, 테스트 환경에서는 반드시 H2 같은 인메모리 DB를 사용합시다.docker inspect 명령어로 볼륨 마운트 상태를 꼭 확인해두면, 데이터 손실 여부를 빠르게 파악할 수 있습니다.ddl-auto, datasource url 등)은 코드 리뷰 전 꼭 double-check!