Spring Boot 애플리케이션의 DB 연결 및 쿼리 처리 과정

한봉훈·2025년 1월 20일

1. 애플리케이션 시작과 커넥션 풀 초기화

1.1 Spring Boot 시작과 자동 구성

  1. @SpringBootApplication 어노테이션으로 애플리케이션 시작
  2. @EnableAutoConfiguration에 의해 자동 구성 프로세스 시작
  3. spring.factories에서 DataSourceAutoConfiguration 로드
  4. HikariDataSourceConfiguration이 활성화 (spring-boot-starter-data-jpa에 기본 포함)

1.2 HikariCP의 커넥션 풀 생성

  1. application.yml/properties의 DB 설정 로드
  2. HikariCP가 설정된 최대 풀 사이즈만큼 DB 서버에 커넥션 요청
  3. 각 커넥션 요청마다:
    • TCP/IP 연결 수립
    • DB 서버의 인증/권한 검증
    • DB 서버에서 User Thread 할당
    • 세션 및 메모리 리소스 할당
  4. 생성된 각 커넥션을 HikariPool이 PoolEntry 객체로 래핑하여 관리
  5. ConcurrentBag을 사용하여 커넥션들을 관리 (스레드 안전한 풀 관리)

2. 클라이언트의 쿼리 요청과 처리 과정

2.1 커넥션 획득

  1. 서비스/레포지토리 계층에서 쿼리 실행 필요
  2. DataSource.getConnection() 호출
  3. HikariPool에서 사용 가능한 커넥션 검색:
    • ThreadLocal 캐시 확인 (재사용 가능한 커넥션)
    • ConcurrentBag에서 유휴 커넥션 확인
    • 모든 커넥션이 사용 중이면 타임아웃까지 대기

2.2 쿼리 실행과 DB 처리

  1. 획득한 커넥션으로 PreparedStatement 생성
  2. executeQuery/executeUpdate 호출
  3. 애플리케이션 스레드가 TCP/IP를 통해 DB 서버로 쿼리 전송
  4. DB 서버에서의 처리:
    • 매핑된 User Thread가 쿼리 수신
    • 쿼리 파싱 및 실행 계획 수립
    • 실제 데이터 처리 수행
    • 결과를 TCP/IP로 응답
  5. 애플리케이션에서 결과 수신 및 처리
  6. 커넥션을 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. 주요 이점

  1. 커넥션 재사용

    • TCP 연결 수립 오버헤드 감소
    • DB 인증/권한 검증 생략
    • 리소스 할당 비용 절감
  2. 리소스 관리

    • 동시 연결 수 제한으로 DB 서버 보호
    • 효율적인 커넥션 관리로 성능 최적화
    • ThreadLocal 캐시로 커넥션 재사용 최적화
  3. 안정성

    • 스레드 안전한 커넥션 관리
    • 타임아웃 처리로 리소스 고갈 방지
    • 커넥션 유효성 검사로 안정적인 운영

5. 참고

The New MySQL Thread Pool
DB 인사이드 | MySQL Architecture - 8. InnoDB : 동작 원리

profile
백엔드 기록

0개의 댓글