9.1 PostgreSQL / MySQL 데이터베이스 설치 및 환경 세팅
스프링 부트 애플리케이션이 생존하기 위한 혈관이자 심장부인 데이터베이스를 연결하는 과정입니다. 실무에서 가장 많이 쓰이는 무겁지 않은 컨테이너 방식의 구축을 진행해 봅시다.
🐋 1. Docker Compose 기반 가장 우아한 DB 설치기
로컬 PC 포맷할 때마다 데이터베이스 재설치로 고생하지 않으려면 무조건 Docker 를 써야 합니다.
프로젝트 루트 디렉토리에 docker-compose.yml 파일을 단 하나 만들어 두면, 팀원 누구든 docker compose up -d 한 줄로 5초 만에 동일한 DB를 구동시킬 수 있습니다.
docker-compose.yml (PostgreSQL 기준)
version: '3.8'
services:
postgres:
image: postgres:15-alpine # 가장 가벼운 최신 15버전 알파인 리눅스
container_name: boot-postgres
ports:
- "5432:5432" # 내 PC 5432 포트 접근 -> 도커 5432 포트로 포워딩
environment:
POSTGRES_USER: root
POSTGRES_PASSWORD: password123!
POSTGRES_DB: local_db
TZ: Asia/Seoul # KST 시간대 맞춤
volumes:
- ./postgres-data:/var/lib/postgresql/data # DB 꺼져도 데이터 안 날아가도록 로컬 파일과 마운트!
# 초기 스키마 자동 세팅 (옵션)
- ./init/schema.sql:/docker-entrypoint-initdb.d/init.sql
init/schema.sql (스프링 부트 기동 전 DB 그릇부터 미리 만들 때 유용)
CREATE TABLE IF NOT EXISTS members (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
nickname VARCHAR(50) NOT NULL
);
💽 2. DBeaver로 내 DB 혈관 꽂아보기
DB가 떴다면 내 PC(클라이언트)에서 DBeaver나 DataGrip 등 SQL 클라이언트 툴로 잘 살아있는지 접속 테스트를 해봅니다.
- Host:
localhost - Port:
5432 - Database:
local_db - Username:
root - Password:
password123!
접속이 성공했다면 이제 스프링 부트에게 이 좌표를 똑같이 알려주면 됩니다!
⚙️ 3. Spring Boot 하부 구조 DataSource 연결 세팅
application.yml (혹은 application.properties)은 스프링 부트 애플리케이션이 켜지면서 가장 먼저 읽어 들이는 설정 지휘 통제소입니다.
spring:
datasource:
# 1. 어느 DB 주소로 갈까요?
url: jdbc:postgresql://localhost:5432/local_db
driver-class-name: org.postgresql.Driver
# 2. 아이디 비밀번호는 이겁니다.
username: root
password: password123!
# HikariCP 커넥션 풀 성능 튜닝 세팅 (대규모 트래픽 대비)
datasource.hikari:
maximum-pool-size: 15 # 동시에 쥐고 있을 최대 물리 커넥션 갯수
connection-timeout: 3000 # 3초 안에 남는 커넥션 배달 안 되면 즉시 팅겨냄 (무한 대기 뻗음 방지)
jpa:
# 3. 콘솔에 하이버네이트가 짜주는 SQL 좀 예쁘게(format) 보여주세요
show-sql: true
properties:
hibernate:
format_sql: true
# [매우 심각] 4. 엔티티 구조 보고 DB 테이블을 니가 알아서 덮어쓸래 말래?
hibernate:
ddl-auto: update
🚨 4. 실전 고수 팁 (Pro Tips)
💡 파멸적 사고의 주범:
ddl-auto명령어의 무서움
spring.jpa.hibernate.ddl-auto는 자바@Entity클래스 구조를 보고 DB 테이블을 자동으로 찍어내거나 부숴버리는 옵션입니다.
create: 서버 켜질 때마다 기존 100만 명 회원이 든 접속 테이블을 싹 DROP (삭제) 하고 빈 껍데기로 새로 만듦.create-drop: 서버 꺼질 때도 지워버림. (순수 로컬 테스트용)update: 기존 데이트는 두고 컬럼이 자바쪽에서 새로 생기면 DB에도 추가(Alter)해 줌. (위험)validate: "자바 설계도랑 지금 DB 테이블이랑 철자 하나 안 틀리고 똑같아? 다르면 서버 켜지마!" (검증만 함)none: 기능 완전 끄기[실무 불문율 1계명] 웬만하면 개발기(로컬)에서는 편의상
update를 쓰더라도, 수십만 명이 접속 중인 운영(Production / Staging) 환경 서버에서는 무조건validate나none으로 잠가둬야 합니다. 운영 DB의 컬럼 하나가 실수로 추가/삭제 Alter 되는 순간, 수 분간 테이블 풀 스캔(Table Lock) 락이 걸려 전사 시스템이 셧다운 마비되는 끔찍한 대참사가 일어납니다!!