1. 애플리케이션 시작과 커넥션 풀 초기화
1.1 Spring Boot 시작과 자동 구성
@SpringBootApplication 어노테이션으로 애플리케이션 시작
@EnableAutoConfiguration에 의해 자동 구성 프로세스 시작
spring.factories에서 DataSourceAutoConfiguration 로드
HikariDataSourceConfiguration이 활성화 (spring-boot-starter-data-jpa에 기본 포함)
1.2 HikariCP의 커넥션 풀 생성
- application.yml/properties의 DB 설정 로드
- HikariCP가 설정된 최대 풀 사이즈만큼 DB 서버에 커넥션 요청
- 각 커넥션 요청마다:
- TCP/IP 연결 수립
- DB 서버의 인증/권한 검증
- DB 서버에서 User Thread 할당
- 세션 및 메모리 리소스 할당
- 생성된 각 커넥션을 HikariPool이 PoolEntry 객체로 래핑하여 관리
- ConcurrentBag을 사용하여 커넥션들을 관리 (스레드 안전한 풀 관리)
2. 클라이언트의 쿼리 요청과 처리 과정
2.1 커넥션 획득
- 서비스/레포지토리 계층에서 쿼리 실행 필요
- DataSource.getConnection() 호출
- HikariPool에서 사용 가능한 커넥션 검색:
- ThreadLocal 캐시 확인 (재사용 가능한 커넥션)
- ConcurrentBag에서 유휴 커넥션 확인
- 모든 커넥션이 사용 중이면 타임아웃까지 대기
2.2 쿼리 실행과 DB 처리
- 획득한 커넥션으로 PreparedStatement 생성
- executeQuery/executeUpdate 호출
- 애플리케이션 스레드가 TCP/IP를 통해 DB 서버로 쿼리 전송
- DB 서버에서의 처리:
- 매핑된 User Thread가 쿼리 수신
- 쿼리 파싱 및 실행 계획 수립
- 실제 데이터 처리 수행
- 결과를 TCP/IP로 응답
- 애플리케이션에서 결과 수신 및 처리
- 커넥션을 HikariPool에 반환 (실제 DB 연결은 유지)
3. 스레드 관리
3.1 애플리케이션 서버
- 톰캣의 스레드 풀에서 관리되는 스레드들
- 각 스레드는 JVM 스레드 → OS 스레드와 1:1 매핑
- 이 스레드들이 커넥션을 사용하여 DB와 통신
3.2 DB 서버
- Receiver Thread: 클라이언트의 연결 요청 처리
- User Thread: 실제 쿼리 실행을 담당
- 모든 스레드는 OS 스레드로 동작
3.3 전체 구조
- 애플리케이션 스레드와 DB User Thread는 서로 다른 프로세스의 스레드
- TCP/IP 연결을 통해 1:1로 매핑되어 통신
- 총 OS 스레드 = 애플리케이션 스레드 수 + DB 스레드 수
4. 주요 이점
-
커넥션 재사용
- TCP 연결 수립 오버헤드 감소
- DB 인증/권한 검증 생략
- 리소스 할당 비용 절감
-
리소스 관리
- 동시 연결 수 제한으로 DB 서버 보호
- 효율적인 커넥션 관리로 성능 최적화
- ThreadLocal 캐시로 커넥션 재사용 최적화
-
안정성
- 스레드 안전한 커넥션 관리
- 타임아웃 처리로 리소스 고갈 방지
- 커넥션 유효성 검사로 안정적인 운영
5. 참고
The New MySQL Thread Pool
DB 인사이드 | MySQL Architecture - 8. InnoDB : 동작 원리