F-LAB JAVA · 6주차 · Phase 4 · Connection Pool과 DB 세션
🔗 Phase 4 시작 — DB 접근 성능의 핵심
이 Unit을 끝내면 다음을 답할 수 있어야 한다.
DB 연결 1회에는 TCP 3-way handshake (네트워크 왕복) + DB 인증 (ID/PW 검증) + DB 세션 생성이라는 비싼 비용이 들어 수~수백 ms 가 걸리므로, 매 요청마다 연결하면 100만 요청 = 100만 번의 handshake 가 되어 DB 응답시간보다 연결 설정 시간이 더 길어진다.
DB 연결 1회에는 세 가지 비용이 든다 — (1) TCP 3-way handshake (SYN → SYN-ACK → ACK 네트워크 왕복), (2) DB 인증 (ID/PW 검증), (3) DB 세션 생성 (서버 자원 할당).
이 비용이 합쳐져 연결 1회에 수~수백 ms 가 걸린다 (네트워크 거리/DB 부하에 따라 다름).
매 요청마다 새로 연결하면 100만 요청 = 100만 번의 handshake + 인증 + 세션 생성이 되어, 실제 쿼리 실행 시간보다 연결 설정 시간이 더 길어지는 본말전도가 일어난다.
자원 해제 (close) 도 비용이 들고, 너무 많은 연결은 DB 서버에 부담을 주므로 (세션 한계), 매번 연결 대신 미리 N개를 만들어두고 재사용 하는 Connection Pool 이 필요하다 (다음 Unit).
매 요청 연결 = 매번 신용카드 발급:
매 요청 연결 (낭비):
- 결제마다 새 카드 발급
- 1. 은행 방문 (TCP)
- 2. 본인 인증 (DB 인증)
- 3. 카드 발급 (세션 생성)
- 4. 결제
- 5. 카드 폐기 (close)
- → 다음 결제 또 반복
비용:
- 발급 시간 > 결제 시간 (본말전도)
- 은행 부하
Connection Pool:
- 카드 몇 장 들고 다님 (미리 발급)
- 결제 시 꺼냄 (재사용)
- 결제 후 지갑에 (반환)
- 발급 비용 분산
TCP 3-way handshake:
- SYN: "안녕"
- SYN-ACK: "안녕, 받았어"
- ACK: "알았어"
- 3번 왕복 (지연)
→ 매 요청 연결 = TCP + 인증 + 세션 비용 반복 (본말전도), Connection Pool 필요.
1. DB 연결 비용 3가지
2. TCP 3-way handshake
3. DB 인증
4. DB 세션 생성
5. 매 요청 연결 문제
6. 연결 시간 vs 응답 시간
7. 연결 1회 설정 시간
8. 자원 해제 비용
9. 해결 방향
DB 연결 비용:
1. TCP/IP 3-way handshake (네트워크 왕복)
2. DB 인증 (ID/PW 검증)
3. DB 세션 생성 (서버 자원)
→ 모두 합쳐 수~수백 ms
누적 비용:
3가지 합:
- 네트워크 + CPU + 메모리
- 모두 비쌈
→ 무시 못 함
비용의 의미:
연결 1회 = 비싼 작업:
- 가볍게 X
- 빈번 시 문제
- 재사용 필요
DB 연결 비용 (ILIC)
ILIC 431 API:
- 매 요청 = DB 작업
- 매 요청 새 연결?
- TCP handshake
- 인증
- 세션 생성
- = 수십 ms
- 초당 1000 요청:
- 1000 × 수십 ms = 부담
- DB 도 부하
→ Connection Pool 필수 (다음 Unit)
DB 연결의 비용 3가지는?
답:
1. 3가지:
누적:
의미:
결과:
TCP 3-way handshake:
연결 수립 절차 (3단계):
클라이언트 → 서버: SYN ("연결?")
서버 → 클라이언트: SYN-ACK ("OK, 너도?")
클라이언트 → 서버: ACK ("OK")
→ 3번 왕복
단계별:
1. SYN (Synchronize):
- 클라이언트가 시작 알림
- 시퀀스 번호
2. SYN-ACK:
- 서버 응답 + 인정
- 서버 시퀀스 번호
3. ACK (Acknowledge):
- 클라이언트 인정
- 연결 수립
네트워크 비용:
3번 왕복 = 1.5 RTT:
- 거리 멀수록 비쌈
- 같은 호스트: 빠름 (수 ms)
- 다른 지역: 느림 (수십~수백 ms)
→ 네트워크 지연
시각화:
[클라이언트] [DB 서버]
│ │
│─────── SYN ──────────→ │
│ │
│←──── SYN-ACK ──────── │
│ │
│──────── ACK ─────────→ │
│ │
│ (연결 수립) │
TCP handshake (ILIC)
ILIC 시나리오:
같은 호스트 (Docker 컨테이너):
- backend ↔ mysql 컨테이너
- handshake 빠름 (수 ms)
- 같은 머신 (네트워크 짧음)
분산 환경:
- 다른 머신/리전
- handshake 수십 ms
- 비용 ↑
매 요청 새 connection:
- handshake × 요청 수
- 누적 부담
TCP 3-way handshake란?
답:
1. 3단계:
목적:
비용:
거리:
DB 인증:
연결 후 인증 단계:
- ID/PW 전송
- DB 가 검증
- 권한 확인
인증 절차:
1. 클라이언트: ID/PW 전송 (암호화)
2. DB: 사용자 정보 조회
3. DB: 비밀번호 검증 (해시 비교)
4. DB: 권한 확인
5. DB: 인증 완료/실패
인증 비용:
- 비밀번호 해시 계산 (CPU)
- 사용자 테이블 조회
- 권한 확인
→ DB 서버 CPU 사용
매번 인증 (매 요청):
매 요청 새 연결:
- 매번 인증
- DB CPU 부담
- 같은 사용자 반복
→ 낭비
DB 인증 (ILIC)
ILIC 시나리오:
- ilic_user 가 1000번 연결 요청
- 매번 비밀번호 검증?
- DB CPU 낭비
Connection Pool:
- 1번 인증 (풀 초기화 시)
- 1000번 재사용
- 인증 비용 분산
→ 인증 비용 절약
DB 인증 비용은?
답:
1. 인증:
절차:
비용:
매번 인증:
DB 세션:
연결당 하나의 세션:
- DB 서버 자원
- 메모리 할당
- 트랜잭션 컨텍스트
세션의 구성:
- 메모리 (PGA, 캐시)
- 트랜잭션 상태
- 임시 데이터
- 세션 변수
세션 생성 비용:
- DB 서버 메모리 할당
- 자원 초기화
- 백그라운드 프로세스 (Oracle)
→ DB 서버 부담
세션 한계:
DB 서버:
- 최대 세션 수 한계
- max_connections (MySQL)
- 너무 많으면 거부
→ 무한 X
DB 세션 (ILIC)
ILIC MySQL:
- max_connections = 151 (기본)
- 너무 많은 동시 연결 → 거부
매 요청 새 세션이면:
- 1000 동시 요청 = 1000 세션
- 한계 초과
- 거부 발생
Connection Pool (10개):
- DB 세션 10개만
- 재사용
- DB 부담 ↓
→ DB 보호
DB 세션 생성은?
답:
1. 세션:
구성:
비용:
한계:
매 요청 연결:
100만 요청 = 100만 번:
- TCP handshake
- 인증
- 세션 생성
→ 비용 폭증
누적 효과:
요청 × 연결 비용:
- 1000 요청 × 50ms = 50초 (연결만)
- DB 응답 시간 외에 추가
→ 응답 느림
DB 서버 부하:
연결 폭증:
- 메모리 폭증
- CPU (인증)
- 세션 한계
→ DB 다운 가능
네트워크 부담:
매번 handshake:
- 패킷 폭증
- 대역폭 낭비
- 라우터 부담
매 요청 연결 시나리오 (ILIC)
ILIC 가정 (Connection Pool 없으면):
- 사용자 100명 동시 작업
- 각자 페이지 조회 (API 5개)
- 동시 500 요청
매 요청 새 연결:
- 500 handshake
- 500 인증
- 500 세션 (한계 초과 가능)
- 응답 지연
결과:
- DB 부하 ↑
- 응답 시간 ↑
- 사용자 경험 ↓
→ Connection Pool 필수
매 요청마다 연결의 문제는?
답:
1. 시나리오:
누적:
DB 부하:
네트워크:
본말전도:
연결 설정 시간 > 쿼리 실행 시간:
- 본 작업보다
- 준비가 더 김
→ 잘못된 구조
비교:
쿼리 실행: 1~10 ms (간단 쿼리)
연결 설정: 50~200 ms (handshake+인증+세션)
→ 연결이 5~200배
(같은 호스트라도 연결 더 비쌈)
함의:
단순 쿼리:
- 연결 비용 압도적
- 사용자가 기다리는 건
- 연결 설정 (낭비)
→ 재사용 필수
캐시 무효화:
매 연결 새 세션:
- 세션 캐시 X
- 매번 워밍업
- 성능 ↓
연결 vs 응답 시간 (ILIC)
ILIC GET /api/shipments/{id}:
Connection Pool 없으면:
- 연결 설정: 50ms
- 쿼리 실행: 5ms
- 응답: 55ms (90% 가 연결)
Connection Pool 사용:
- 연결 가져오기: 0.1ms (재사용)
- 쿼리 실행: 5ms
- 응답: 5.1ms (10배 빠름)
→ Connection Pool 의 효과
연결 설정 시간 vs 응답 시간 비교는?
답:
1. 본말전도:
비교:
함의:
캐시:
연결 1회 설정 시간:
로컬 (같은 호스트):
- 1~10 ms
같은 데이터센터:
- 5~50 ms
다른 리전:
- 100~500 ms
+ SSL/TLS 시: 추가 비용
변동 요인:
- 네트워크 거리
- DB 부하
- 인증 복잡도
- SSL 사용
- 방화벽
SSL/TLS 추가:
- TLS handshake (추가 왕복)
- 인증서 검증
- 키 교환
→ 비용 ↑ (보안 트레이드오프)
누적 시간:
100 요청 × 50ms:
- 5초 (연결만)
- 쿼리 시간 별개
→ 무시 못 함
연결 1회 시간 (ILIC)
ILIC Docker 환경:
backend ↔ mysql 컨테이너:
- 같은 머신, 컨테이너 네트워크
- 연결: ~5ms (빠름)
하지만 ILIC 가 클라우드 RDS:
- 다른 인스턴스
- 연결: ~30ms
- SSL 사용 시 더
매 요청 연결이면:
- 30ms × 1000 = 30초 (1000 요청)
- 응답 지연 누적
→ HikariCP (Connection Pool) 필수
연결 1회 설정 시간은?
답:
1. 시간:
변동:
SSL:
누적:
자원 해제 비용:
Connection.close():
- 세션 정리 (DB)
- TCP 종료 (4-way handshake)
- 메모리 해제
→ 닫는 것도 비싸다
TCP 4-way handshake (종료):
FIN → ACK → FIN → ACK
- 양방향 종료
- 4번 왕복
- 시간 소요
TIME_WAIT:
종료 후 대기 상태:
- 60초 (기본)
- 포트 점유
- 빈번한 close → 포트 고갈
close 누락 위험:
finally 누락 시:
- Connection 누수
- 세션 누적
- DB 한계 초과
→ JdbcTemplate 자동 (Phase 7)
자원 해제 (ILIC)
매 요청 connection:
- 열기: TCP handshake + 인증 + 세션 (수십 ms)
- 닫기: TCP 종료 (수 ms) + DB 세션 정리
+ close 누락 위험:
- Connection 누수
- DB 세션 누적
- max_connections 초과
- 서비스 장애
Connection Pool:
- close 가 진짜 close X
- 풀에 "반환"
- 재사용
→ 진짜 close 비용 회피
자원 해제 비용은?
답:
1. 해제:
TIME_WAIT:
누락:
Pool:
해결 — Connection Pool:
미리 N 개 연결:
- 풀에 보관
- 요청 시 빌림
- 사용 후 반환
- 재사용
→ 연결 비용 분산
핵심 아이디어:
연결 비싸다 → 재사용:
- 한 번 만들고
- 여러 번 사용
- 분산
→ 비용 1/N
효과 예고:
Connection Pool:
- 응답 시간 ↓ (재사용)
- DB 부하 ↓ (세션 적음)
- 안정성 ↑
→ 다음 Unit (4.2 ★깊이)
해결 방향 (ILIC)
ILIC Spring Boot:
- HikariCP 기본 (Connection Pool)
- 미리 10개 연결 (기본)
- 모든 요청이 풀 공유
설정 (application.yml):
spring:
datasource:
hikari:
maximum-pool-size: 20
minimum-idle: 5
→ 매 요청 연결 X
→ 재사용으로 빠름
→ Unit 4.2 에서 ★깊이
| Q | 핵심 답변 |
|---|---|
| 연결 비용 3? | TCP/인증/세션 |
| TCP handshake? | SYN→SYN-ACK→ACK |
| DB 인증? | ID/PW 검증 |
| 세션? | 연결당 하나 |
| 매 요청 문제? | 비용 폭증 |
| 연결 시간? | 수~수백 ms |
| 본말전도? | 연결 > 쿼리 |
| 해제 비용? | TCP 종료/TIME_WAIT |
| 해결? | Connection Pool |
| max_connections? | DB 세션 한계 |
답:
답:
답:
답:
답:
1. DB 연결 비용 3가지
2. 매 요청 연결의 문제
3. 해결
이번 Unit에서 연결 비효율을 봤다면, 다음은 Connection Pool (★ 깊이 파기).
🔗 Phase 4 — Connection Pool과 DB 세션
✅ Unit 4.1 매 요청마다 연결의 비효율 ← 여기
⏭ Unit 4.2 Connection Pool 개념 ★깊이
⏭ Unit 4.3 DB 세션과 연결 구조
⏭ Unit 4.4 DB Lock 개념
🧪 Part A (9 Unit) ✅
💾 Part B — DB 접근의 진화
✅ Phase 3 — JDBC (3 Unit)
🔗 Phase 4 — Connection Pool (1/4 진행)
총: 13/28 Unit (절반!)
🔗 Phase 4 시작 — DB 접근 성능의 핵심