
개요
본 게시글에서는 개발용으로 사용하던 H2 InMemory DB를 MySQL로 교체하는 과정을 다룹니다.
H2는 서버를 재시작하면 Data가 사라지는 반면, MySQL은 영구적으로 Data를 저장합니다.
H2 vs MySQL 비교
| 항목 | H2 | MySQL |
|---|---|---|
| 설치 | 불필요 (Liberary만 추가) | 별도 설치 필요 |
| DATA 유지 | 서버 재시작 시 사라짐 | 영구 저장 |
| 용도 | 개발 초기, 테스트 | 실제 서비스 |
1. MySQL 설치
Homebrew를 이용해 MySQL을 설치.
brew install mysql
설치 후 MySQL 서비스를 시작.
brew services start mysql
2. 데이터베이스 생성
MySQL에 접속해 프로젝트에서 사용할 DB를 생성합니다.
mysql -u root
접속 후 아래 명령어를 실행.
DB 이름은 마음대로 정해도 됩니다. 저는 todo_db로 하겠습니다.
CREATE DATABASE todo_db;
SHOW DATABASES;
exit;
SHOW DATABASE를 입력했을 때 todo_db 가 목록에 표시되면 정상적으로 생성된 것입니다.
3. build.gradle 수정
dependencies 블록에 MySQL 드라이버를 추가하고, 기존 H2 의존성을 제거합니다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.mysql:mysql-connector-j'
}
참고:
runtimeOnly는 컴파일 시점에는 필요 없고 실행 시점에만 필요한 의존성에 사용.
MySQL 드라이버는 코드에서 직접 참조하지 않고 JPA가 내부적으로 사용하므로runtimeOnly로 지정.
4. application.properties 수정
기존 H2 설정을 MySQL 설정으로 교체하겠습니다.
spring.application.name=demo
# MySQL 설정
spring.datasource.url=jdbc:mysql://localhost:3306/todo_db
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=
# JPA 설정
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
설정 항목 설명
| 항목 | 설명 |
|---|---|
spring.datasource.url |
MySQL DB 접속 주소 |
spring.datasource.driver-class-name |
MySQL JDBC Driver 클래스명 |
spring.datasource.username |
DB 접속 계정 |
spring.datasource.password |
DB 접속 비밀번호 |
spring.jpa.hibernate.ddl-auto=update |
서버 시작 시 Table이 없으면 생성, 있으면 유지 |
spring.jpa.show-sql=true |
JPA가 실행하는 SQL을 터미널에 출력 |
spring.jpa.properties.hibernate.dialect |
MySQL 문법에 맞는 SQL을 생성하도록 지정 |
H2와 ddl-auto 차이: H2에서는
create-drop(서버 시작 시 생성, 종료 시 삭제)을 사용했지만,
MySQL에서는update(테이블이 없으면 생성, 있으면 유지)를 사용해 데이터를 영구 보존.
5. 빌드 및 실행
./gradlew build -x test
빌드 성공 후 서버를 실행하면 터미널에 아래와 같이 출력됩니다.
Started DemoApplication in x.xxx seconds
6. 연결 확인
Postman에서 POST로 Todo를 생성한 후 서버를 재시작하고 GET으로 조회했을 때
데이터가 그대로 남아있으면 MySQL 연결이 성공적으로 완료된 것입니다.
트러블슈팅
저는 게시글 작성 전 직접 구현해보고 오류를 경험하면 해결 후 원인과 결과를 정리해서 같이 알려드립니다.
이번 오류들은 모두 오타와 세미콜론을 오기입하여 발생하였고 항상 조심할 필요가 있습니다.
1. Access denied for user 'root;'@'localhost'
원인: application.properties 에서 username 값에 세미콜론(;)이 포함된 경우 발생.
해결: spring.datasource.username=root 에 불필요한 특수문자가 없는지 확인할 필요가 있습니다.
2. Unable to resolve name [org.hibernate.dialectMySQLDialect]
원인: dialect 설정에서 .dialect. 부분이 누락된 경우 발생.
해결: org.hibernate.dialect.MySQLDialect 로 정확히 입력해아 합니다. (.dialect. 포함)
마무리
이로써 H2에서 MySQL로 DB 교체를 마쳤습니다.
서버를 재시작해도 데이터가 유지되는 것을 확인할 수 있고 다음 글에서는 Service 레이어를 추가해 더 깔끔한 구조로 코드를 개선하는 과정을 다루겠습니다.
감사합니다.
'Dev > Spring' 카테고리의 다른 글
| Spring Boot 전역 예외 처리하기 (0) | 2026.04.07 |
|---|---|
| Spring Boot Service 레이어 (0) | 2026.04.07 |
| Spring Boot로 CRUD REST API 구현하기 (0) | 2026.03.26 |
| Mac OS에서 Spring Boot 개발환경 구축하기 (0) | 2026.03.25 |
| Spring의 진짜 핵심과 좋은 객체 지향 프로그래밍에 대한 생각 (0) | 2025.07.15 |