Spring

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.1
  • 3306 = 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

커넥션 풀의 장점:

  1. 미리 연결해두고 재사용 → 속도 향상
  2. 연결 개수 제한 → 서버 과부하 방지
  3. 사용 후 반납 → 리소스 효율적 관리

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: 다 썼어요, 반납!

단계별 설명

  1. 시작 - Spring이 root-context.xml을 읽음
  2. 준비 - HikariCP가 MySQL에 연결 여러 개를 미리 만듦
  3. 요청 - 사용자가 게시판을 보려고 하면
  4. 빌림 - 풀에서 연결 하나를 꺼내옴
  5. 사용 - 데이터 조회/저장 수행
  6. 반납 - 연결을 풀에 돌려놓음 (끊지 않음!)

❓ 자주 묻는 질문 (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.1localhost의 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 = 내 컴퓨터

🔗 관련 글


💬 질문이나 피드백이 있으시면 댓글로 남겨주세요!
이 글이 도움이 되었다면 공유해주시면 감사하겠습니다 🙏