Spring 데이터베이스 연결, 집에 가는 것처럼 쉽게 이해하기
💡 이 글은 누구를 위한 것인가요?
데이터베이스 연결이 낯선 Spring 입문자, 백엔드 개발을 시작하는 분들을 위해 쉬운 비유와 함께 설명합니다.
🎯 한눈에 보기
| 주제 | 핵심 내용 |
|---|---|
| 연결 4요소 | 주소, DB 이름, 사용자명, 비밀번호 |
| 설정 파일 | root-context.xml |
| 연결 풀 | HikariCP로 효율적인 연결 관리 |
| URL 자동 선택 | JDBC URL에 DB 이름 포함 = USE 불필요 |
📖 데이터베이스 연결, 왜 어렵게 느껴질까?
처음 Spring 프로젝트를 열었을 때, root-context.xml에 적힌 복잡한 설정들을 보고 당황하셨나요? 저도 그랬습니다.
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/springdb?serverTimezone=Asia/Seoul" />
이게 대체 무슨 뜻인지, 왜 이렇게 길어야 하는지… 막막하죠.
하지만 걱정 마세요! 집에 가는 것에 비유하면 정말 쉽게 이해할 수 있습니다.
🏠 비유로 이해하기: 데이터베이스는 집이다
데이터베이스에 연결하는 것은 친구 집에 놀러 가는 것과 똑같습니다.
flowchart LR
subgraph "🏠 친구 집에 가려면?"
A["📍 집 주소"] --> E["🏠 친구 집"]
B["🏢 동-호수"] --> E
C["👤 누구인지"] --> E
D["🔑 비밀번호"] --> E
end
style E fill:#4CAF50,color:#fff
style A fill:#E3F2FD
style B fill:#FFF3E0
style C fill:#FCE4EC
style D fill:#F3E5F5
친구 집 vs 데이터베이스
| 친구 집 방문 | 데이터베이스 연결 | 실제 값 예시 |
|---|---|---|
| 📍 집 주소 (서울시 강남구…) | 호스트 주소 | localhost:3306 |
| 🏢 동-호수 (101동 505호) | 데이터베이스 이름 | springdb |
| 👤 내 이름 (김철수입니다) | 사용자명 | springdbuser |
| 🔑 현관 비밀번호 | 비밀번호 | 1234 |
이 4가지 정보만 있으면 어디든 갈 수 있습니다!
🔑 인증: 열쇠가 맞아야 문이 열린다

왜 root 계정을 안 쓸까요?
MySQL에는 root라는 마스터 키가 있습니다. 이 키로는 모든 문을 열 수 있죠.
하지만 위험합니다! 마스터 키를 도둑맞으면? 모든 집이 탈탈 털리겠죠.
-- ❌ 위험한 방법: root 계정 사용
-- 모든 데이터베이스에 접근 가능 = 리스크 높음
-- ✅ 안전한 방법: 전용 계정 생성
CREATE USER 'springdbuser'@'localhost' IDENTIFIED BY '1234';
GRANT ALL PRIVILEGES ON springdb.* TO 'springdbuser'@'localhost';
springdbuser는 오직 springdb만 사용할 수 있는 전용 열쇠입니다.
- 해킹당해도 피해가 제한됨
- 실수로 다른 DB를 건드릴 위험 없음
- 각 프로젝트별로 독립적 관리 가능
⚙️ 설정 파일 완전 분석: root-context.xml
이제 실제 설정 파일을 한 줄씩 뜯어봅시다.
<bean name="hikariConfig" class="com.zaxxer.hikari.HikariConfig">
<!-- 🚗 MySQL 드라이버: 데이터베이스와 대화할 수 있는 통역사 -->
<property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
<!-- 📍 집 주소 + 동호수 조합 -->
<property name="jdbcUrl"
value="jdbc:mysql://localhost:3306/springdb?serverTimezone=Asia/Seoul" />
<!-- 👤 방문자 이름 -->
<property name="username" value="springdbuser" />
<!-- 🔑 비밀번호 -->
<property name="password" value="1234" />
</bean>
JDBC URL 해부하기
jdbc:mysql://localhost:3306/springdb?serverTimezone=Asia/Seoul
│ │ │ │ │ │
│ │ │ │ │ └─ 🕐 시간대 (한국)
│ │ │ │ └─────────── 🏢 데이터베이스 이름
│ │ │ └──────────────── 🚪 포트 번호 (MySQL 기본)
│ │ └────────────────────────── 📍 서버 주소
│ └──────────────────────────────── 🗄️ 데이터베이스 종류
└───────────────────────────────────── 📡 프로토콜
핵심 포인트:
localhost= 내 컴퓨터 = 127.0.0.13306= MySQL 기본 포트/springdb= URL에 DB 이름이 있으면 USE 명령 불필요!
🏊 커넥션 풀(HikariCP): 왜 필요한가?

수영장에서 배우는 커넥션 풀
매번 수영하러 바다에 가면 어떨까요?
- 가는 데 2시간
- 오는 데 2시간
- 실제 수영 30분…
비효율적이죠!
그래서 집 앞에 수영장을 만들어둡니다.
flowchart TB
subgraph "🏊 커넥션 풀 (HikariCP)"
C1["⚡ 연결 1"]
C2["⚡ 연결 2"]
C3["💤 연결 3"]
C4["💤 연결 4"]
C5["💤 연결 5"]
end
A["🌐 요청 1"] --> C1
B["🌐 요청 2"] --> C2
style C1 fill:#4CAF50,color:#fff
style C2 fill:#4CAF50,color:#fff
style C3 fill:#9E9E9E,color:#fff
style C4 fill:#9E9E9E,color:#fff
style C5 fill:#9E9E9E,color:#fff
커넥션 풀의 장점:
- 미리 연결해두고 재사용 → 속도 향상
- 연결 개수 제한 → 서버 과부하 방지
- 사용 후 반납 → 리소스 효율적 관리
HikariCP가 인기 있는 이유
| 커넥션 풀 | 특징 |
|---|---|
| HikariCP | 🚀 가장 빠름, Spring Boot 기본 |
| DBCP2 | 전통적, 안정적 |
| C3P0 | 오래됨, 느림 |
🔄 연결 과정 시뮬레이션
실제로 우리 코드가 데이터베이스에 어떻게 연결되는지 보여드릴게요.
sequenceDiagram
participant App as 🖥️ Spring 앱
participant Pool as 🏊 HikariCP
participant MySQL as 🗄️ MySQL
Note over App: 애플리케이션 시작
App->>Pool: root-context.xml 읽기
Pool->>MySQL: 연결 5개 미리 생성
MySQL-->>Pool: ✅ 연결 준비 완료
Note over App: 사용자 요청 발생
App->>Pool: 연결 1개 빌려주세요
Pool-->>App: 여기요 ⚡
App->>MySQL: SELECT * FROM tbl_board
MySQL-->>App: 게시판 데이터
App->>Pool: 다 썼어요, 반납!
단계별 설명
- 시작 - Spring이
root-context.xml을 읽음 - 준비 - HikariCP가 MySQL에 연결 여러 개를 미리 만듦
- 요청 - 사용자가 게시판을 보려고 하면
- 빌림 - 풀에서 연결 하나를 꺼내옴
- 사용 - 데이터 조회/저장 수행
- 반납 - 연결을 풀에 돌려놓음 (끊지 않음!)
❓ 자주 묻는 질문 (FAQ)
Q1: “USE springdb” 명령어가 필요한가요?
아니요! JDBC URL에 데이터베이스 이름이 포함되어 있으면 자동으로 선택됩니다.
jdbc:mysql://localhost:3306/springdb
↑
여기에 이미 있음!
Q2: 연결이 안 될 때 체크리스트
# 1️⃣ MySQL 서버 실행 중인지 확인
brew services list | grep mysql
# 2️⃣ 포트 확인 (3306 사용 중?)
lsof -i :3306
# 3️⃣ 직접 접속 테스트
mysql -u springdbuser -p1234 -h localhost
# 4️⃣ 데이터베이스 존재 확인
SHOW DATABASES;
Q3: VS Code 확장 프로그램이랑 뭐가 달라요?
flowchart LR
subgraph "같은 MySQL 서버"
DB["🗄️ MySQL<br/>localhost:3306"]
end
A["🔌 VS Code 확장"] --> DB
B["🌱 Spring 앱"] --> DB
style DB fill:#9C27B0,color:#fff
둘 다 같은 MySQL 서버에 연결하는 것입니다!
- VS Code 확장 = 시각적으로 DB를 보는 도구
- Spring 앱 = 코드로 DB를 사용하는 애플리케이션
Q4: localhost는 뭔가요?
localhost = 127.0.0.1 = 내 컴퓨터
| 표현 | 의미 |
|---|---|
localhost | 이 컴퓨터 자체 |
127.0.0.1 | localhost의 IP 표현 |
192.168.1.100 | 같은 네트워크의 다른 컴퓨터 |
db.example.com | 인터넷상의 서버 |
📁 파일 위치 정리
sp1/
└── src/
└── main/
└── webapp/
└── WEB-INF/
└── spring/
├── root-context.xml ← 🗄️ DB 연결 설정
└── servlet-context.xml ← 🌐 웹 관련 설정
- root-context.xml: 데이터베이스, 서비스 등 비즈니스 로직
- servlet-context.xml: 컨트롤러, 뷰 등 웹 계층
✅ 정리: 핵심만 기억하세요!
연결에 필요한 4가지
| 요소 | 예시 | 비유 |
|---|---|---|
| 호스트 | localhost:3306 | 📍 집 주소 |
| DB 이름 | springdb | 🏢 동-호수 |
| 사용자명 | springdbuser | 👤 방문자 이름 |
| 비밀번호 | 1234 | 🔑 현관 비밀번호 |
꼭 기억할 것
✅ URL에 DB 이름 포함 → USE 명령 불필요
✅ 전용 계정 사용 → 보안 향상
✅ 커넥션 풀 → 성능 최적화
✅ localhost = 내 컴퓨터
🔗 관련 글
💬 질문이나 피드백이 있으시면 댓글로 남겨주세요!
이 글이 도움이 되었다면 공유해주시면 감사하겠습니다 🙏