Spring Boot와 MySQL을 연동하는 방법에 대해서 정리하고
JPA를 활용하여 데이터베이스를 설계하고 조작하는 방법에 대해서 작성하려고 합니다
Spring Boot + MySQL 연동 방법
1. Spring dependency 설정
Spring 프로젝트를 생성할 때 dependency를 다음과 같이 추가해줍니다

[1] Spring Web
- Spring MVC를 기반으로 HTTP 요청과 응답을 처리하며, REST API와 MVC 템플릿 기반 웹 애플리케이션을 구현할 수 있는
웹 환경을 제공하는 의존성
[2} Spring Data JPA
- Spring 프레임워크에서 JPA(Java Persistence API)를 쉽고 편리하게 사용할 수 있도록 Repository 추상화를 제공하는
데이터 접근 의존성
[3] MySQL Driver
- Spring 애플리케이션과 MySQL 데이터베이스를 실제로 연결해 주는 JDBC 드라이버
[4] Lombok
- getter,setter 등 반복적인 코드를 컴파일 타임 어노테이션을 통해 코드를 자동 생성해 주는 라이브러리
build.gradle.kts
dependencies {
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-webmvc")
compileOnly("org.projectlombok:lombok")
runtimeOnly("com.mysql:mysql-connector-j")
annotationProcessor("org.projectlombok:lombok")
testImplementation("org.springframework.boot:spring-boot-starter-data-jpa-test")
testImplementation("org.springframework.boot:spring-boot-starter-webmvc-test")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}
2. MySQL 설정
Spring 애플리케이션과 연결할 MySQL 서버를 설정해줘야 합니다

연결할 MySQL 서버를 생성하거나 기존에 사용하는 게 있다면 서버 정보와 계정 정보를 사용하기 때문에 확인해 주면 됩니다

다음으로 스키마를 생성해 줍니다 저는 project라는 이름으로 스키마를 생성하겠습니다
3. Spring 프로젝트 MySQL 연결 설정 파일 정의
MySQL 설정이 끝나면 Spring Boot 프로젝트에서 MySQL에 연결 설정을 파일에 정의해야 합니다
Spring Boot는 application.properties 또는 application.yml 파일을 통해 DB 연결 정보 및 JPA 동작 방식을 설정합니다
저는 application.yml 기준으로 설정하겠습니다

Project1 에서 src - main - resources를 확인해 보면 application.properties 파일이 기본적으로 생성이 되어 있습니다
해당 파일에서 마우스 우클릭을 통해 이름 변경을 해줍니다

파일 확장자를 properties에서 yml로 변경합니다
application.yml
spring:
application:
name: Project1
config:
import: optional:file:.env[.properties]
datasource:
url: ${DB_URL}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
jpa:
hibernate:
ddl-auto: update
show-sql: true
properties:
hibernate:
format_sql: true
database-platform: org.hibernate.dialect.MySQL8Dialect
3-1. spring.application.name
spring:
application:
name: Project1
Spring 애플리케이션의 고유 이름
- 단일 프로젝트에서도 기본적으로 명시하는 것이 좋다
3-2. config.import - 환경 변수 파일 로딩
config:
import: optional:file:.env[.properties]
.env 파일을 외부 설정으로 불러오기 위한 설정
- .env 파일에 DB정보,비밀키 등 민감 정보를 저장
- 프로젝트 GitHub 관리 시 노출되면 안 되는 정보를 application.yml과 분리하기 위함
.env 파일 (예시)
DB_URL=jdbc:mysql://localhost:3306/project1
DB_USERNAME=root
DB_PASSWORD=password
3-3. datasource - MySQL 연결 정보
datasource:
url: ${DB_URL}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
driver-class-name: com.mysql.cj.jdbc.Driver
MySQL과 연결하기 위한 정보 설정
- url: JDBC 프로토콜을 통해 MySQL 서버 주소 지정
- username / password: DB 인증 정보
- driver-class-name: MySQL JDBC 드라이버 지정
3-4 jpa.hibernate.ddl-auto - 스키마 자동 관리 전략
jpa:
hibernate:
ddl-auto: create
스키마 자동 관리 전략을 설정
- 애플리케이션 실행 시 Entity 변경 사항을 테이블에 반영하는지 여부 지정
- 간단한 컬럼 추가 및 변경은 가능하지만 삭제 및 그 외 설정은 제한적
create: 애플리케이션 실행 시 기존 테이블을 삭제하고 새로 생성
주로 개발 초기에 사용되며 테이블의 데이터 또한 삭제되기 때문에 실제 운영 서버에서는 절대 사용하면 안 된다
create-drop: 실행 시 테이블 생성, 종료 시 테이블 삭제
(일회성 테스트 환경)
update: Entity 변경 사항을 기존 테이블에 반영
간단한 컬럼 추가나 일부 변경 사항만 자동으로 반영되기 때문에 설정을 했는데 스키마 변경이 적용되지 않은 것처럼 보인다면
먼저 이 옵션을 의심해 볼 필요가 있습니다
특히 컬럼 삭제,타입 변경,제약 조건 수정과 같은 큰 구조 변경은 Hibernate가 자동으로 처리하지 않기 때문에 이런 변경 사항은 꼭 DBMS에서 직접 DDL을 통해서 적용하는 것이 안전합니다
제가 이전에 외래 키 설정을 Entity에서 변경하고 서버를 재시작해도 적용이 되지 않아서 확인해본 결과 구조 변경은 자동으로 적용 되지 않는 것을 깨닫고 큰 구조 변경은 무조건 MySQL에서 직접 처리하고 있습니다
validate: Entity와 테이블 구조가 일치하는지 검증만 수행
none: 스키마 자동 생성 / 수정 기능 비활성화
3-5. show-sql & format_sql - SQL 가시성 확보
show-sql: true
properties:
hibernate:
format_sql: true
- show-sql: Hibernate가 실행하는 SQL을 콘솔에 출력
- format-sql: SQL을 보기 좋은 형태로 포맷팅
show-sql 과 format-sql 은 개발 단계에서 JPA 동작을 확인하는 데 유용하지만
운영 환경에서는 로그 제어 및 보안 문제로 사용하기에는 어려움이 있다고 생각하고 있습니다
그래서 로깅과 모니터링을 적용해서 체크 하는 게 좋다고 생각합니다
왜냐하면 운영 단계에서는 수많은 쿼리가 발생되는데 그 쿼리를 다 출력한다면 서버 로그 확인이 어렵기 때문이죠
따로 로깅 처리를 통해 로그 관리를 하도록 하는게 좋을 거 같네요
3-6. database-platform - MySQL 방언(Dialect) 설정
database-platform: org.hibernate.dialect.MySQL8Dialect
- Hibernate에게 MySQL 8.x 문법을 사용하도록 명시
- DB별 SQL 차이를 해결하기 위한 설정
4. 프로젝트 실행
프로젝트를 실행하면 Hibernate가 애플리케이션 기동 과정에서 데이터베이스 연결 정보와 JPA 동작 설정을 로그로 출력한다

Database JDBC URL
Database JDBC URL [jdbc:mysql://localhost:3306/project]
애플리케이션이 실제로 연결된 데이터베이스 주소를 의미한다
설정한 DB URL이 정상적으로 적용이 되었는지 확인하는 기본적인 로그라고 볼 수 있다
Database Driver
Database driver: MySQL Connector/J
MySQL과 통신하기 위해 사용 중인 JDBC 드라이버를 의미한다
Spring Boot가 MySQL Driver를 정상적으로 인식하고 있다고 볼 수 있겠네요
Database dialect
Database dialect: MySQLDialect
Hibernate가 MySQL에 맞는 SQL 문법을 생성하기 위해 사용되는 방언(Dialect) 정보
Default catalog / schema
Default catalog/schema: project/undefined
기본으로 사용되는 데이터베이스(스키마) 정보
현재 데이터베이스에 테이블을 생성하지 않은 상태이기 때문에 스키마 정보가 undefined로 출력되고 있습니다
Autocommit mode
Autocommit mode: undefined/unknown
커넥션의 자동 커밋 여부와 관련된 정보이며 Spring의 트랜잭션 관리(@Transactional)에 의해 제어된다
현재는 설정이 되어 있지 않은 상태입니다
자동 커밋
SQL 한 줄마다 즉시 커밋하는 방식을 의미하며 데이터 정합성을 보장하기 어렵기 때문에
Spring에서는 @Transactional을 통해 자동 커밋을 비활성화하고 트랜잭션 단위로 커밋과 롤백을 관리하는 편입니다
lsolation level
Isolation level: REPEATABLE_READ [default REPEATABLE_READ]
트랜잭션의 격리 수준을 나타내며 MySQL의 기본 격리 수준이 적용된 상태입니다
JDBC fetch size
JDBC fetch size: none
한 번의 DB 조회 시 가져오는 데이터의 단위 크기 설정이다
💡 JDBC fetch size란?
DB에서 조회한 결과를 한 번에 전부 가져올지, 나눠서 가져올지를 결정하는 값을 의미하고 있다
- fetch size가 작으면 -> 조금씩 나눠서 가져오기
- tetch size가 크면 -> 한 번에 많이 가져오기
대용량 데이터를 처리할 때 fetch size를 크게 설정하면 DB와 애플리케이션 간 통신 횟수가 줄어들어
네트워크 비용과 통신 오버헤드 감소로 성능 개선에 도움이 된다
Connection Pool
Pool: DataSourceConnectionProvider
애플리케이션이 DataSource 기반의 커넥션 풀을 사용 중임을 의미한다
Pool size (min / max)
Minimum pool size: undefined/unknown
Maximum pool size: undefined/unknown
Hibernate 로그 기준으로는 풀 크기가 명시되지 않은 상태
커넥션 풀 크기도 성능 개선에 있어서 고려할 사항이라고 볼 수 있습니다
커넥션 풀(Connection Pool)
애플리케이션이 데이터베이스와 통신하기 위해 사용되는 DB 연결(Connection)을 미리 만들어두고 재사용하는 구조
DB 커넥션은 생성 비용이 크기 때문에 요청이 들어올 때마다 새로 만들면 성능이 떨어진다
커넥션 풀 = 동시에 DB 작업을 처리할 수 있는 슬롯
그냥 사이드 프로젝트를 만들 때는 고려하지 않을 수 있다 왜 서버에 요청 보내는 사람이 어느 정도 한정 되어 있는 상황이다 보니 어쩔 수 없다 사이드 프로젝트는 거의 혼자 테스트해보는 경우가 많기 때문이다
TPS(Transactions Per Second)
1초 동안 시스템이 처리할 수 있는 요청(트랜잭션)의 수
TPS = 100
-> 초당 100개의 요청을 안정적으로 처리 가능
전체 응답 시간(Response Time)
클라이언트가 요청을 보내고 응답을 받을 때까지 걸리는 총 시간
커넥션 풀 크기 설정
커넥션 풀 크기는 동시에 DB 작업을 수행할 수 있는 요청 수를 결정하며 이 값이 시스템의 TPS 상한선을 만들고
풀이 부족하게 되면 요청이 커넥션을 기다리게 되어 전체 응답 시간이 증가하기 때문에
TPS와 전체 응답 시간을 고려하여 커넥션 풀 크기를 적절하게 유지해야 한다
- 커넥션 풀 크기가 동시에 DB를 사용하는 요청 수보다 작은 경우
일부 요청은 커넥션이 반환될 때까지 대기하게 되어 대기 시간으로 인해 전체 응답 시간이 증가한다
- 커넥션 풀 크기가 현재 트래픽에 충분한 경우
요청이 즉시 커넥션을 할당받아 처리하기 때문에 전체 응답 시간이 안정적으로 유지가 된다
- 커넥션 풀 크기가 필요 이상으로 큰 경우
일반적인 트래픽 상황에서는 큰 문제가 되지 않지만 이미 DB 사용량이 높은 상태에서 트래픽이 급증하게 되면
과도한 동시 DB 접근으로 인해 오히려 응답 시간이 증가할 수 있어 주의해야 한다
Tomcat Web Server
TomcatWebServer
Spring Boot 내장 Tomcat 서버가 정상적으로 기동 되었음을 의미한다
Application Startup
Project1Application
메인 애플리케이션 클래스가 실행되었으며 Spring Boot 애플리케이션 기동 과정이 정상적으로 완료되었음을 나타낸다
Spring Boot 프로젝트를 MySQL와 어떻게 연결하는지 그리고 실행 후 나오는 로그에 대해서 정리했습니다
이번에 정리해 보면서 평소에 그냥 지나쳤던 내용도 작성해 보면서 저도 많이 성장하는 것 같습니다
다음으로 테이블 생성 후 JPA를 어떻게 활용하는지 작성해보려고 합니다
'Back-end > Spring' 카테고리의 다른 글
| [Spring] Spring Security 기본 구조와 인증 처리 흐름 (Filter Chain) (0) | 2026.01.09 |
|---|---|
| [Spring] Spring Boot + MySQL 연동 & JPA 활용 심화 (2) (0) | 2026.01.03 |
| [Spring] Spring Data JPA 어노테이션 정리 (초기화 전략,연관관계,Repository) (0) | 2025.11.06 |
| [Spring] Java 제네릭과 람다 개념 정리 및 Service 계층 활용 예제 (0) | 2025.09.23 |
| [Spring] DTO와 ResponseEntity로 깔끔한 응답 처리하기 (1) | 2025.08.28 |