매번 커넥션을 생성하면 시간과 비용이 많이 들기 때문에 커넥션을 미리 생성해 두고 재사용할 목적으로 커넥션 풀을 사용
애플리케이션 시작 시점에 커넥션 풀은 필요한 만큼 커넥션을 확보해서 보관함
클라이언트는 미리 생성되어 있는 커넥션을 객체 참조로 가져다 쓰고 반납함 (이때 커넥션을 종료하지 않은
상태로 반납)
커넥션 풀에 가용한 커넥션이 없으면 해당 스레드는 블록당함
커넥션을 획득하는 방법을 추상화하는 인터페이스
애플리케이션 로직은 DataSource
에만 의존하도록 작성하고, 커넥션 획득 구현체를 변경하고 싶으면 해당 구현체를 DI
하면 됨 (OCP
만족)
스프링은 DriverManager
도 DataSource
를 통해 사용할 수 있도록 DataSource
를 구현한 DriverManagerDataSource
라는 클래스를 제공함
DataSource
를 사용하면 데이터베이스 관련해서 설정
하는 부분과 커넥션을 획득
하는 부분을 분리할 수 있으므로 유지보수
가 용이해짐
스프링 부트 기본 커넥션 풀 오픈소스
애플리케이션을 빠르게 실행시키기 위해 애플리케이션 실행 시점에 별도의 스레드를 사용해서 커넥션 풀에 커넥션을 채움
타겟 커넥션을 HikariProxyConnection
객체로 래핑하고, close()
메서드를 호출했을 때 커넥션을 종료하지 않고 풀에 반납함 (해당 객체는 javax.sql.Connection
인터페이스 구현)
커넥션을 편리하게 닫을 수 있는 유틸 메서드를 제공하는 클래스
closeConnection(...)
, closeStatement(...)
, closeResultSet(...)
제공
SRAM
은 bistable
메모리 셀에 bit
를 저장하고 각 셀은 6개의 트랜지스터
를 사용한 회로로 구현
빠르고, disturbance
에 insensitive
하고, 밀집도가 떨어지고, 비싸고, 전력을 많이 소모하는 특성이 있음
DRAM
의 메모리 셀은 콘덴서와 하나의 트랜지스터
로 구성됨
전하를 10~100ms 내에 잃어버리는 특성을 가지고 있어서 주기적으로 리프레시(읽어서 다시 쓰기)
가 필요함
전원이 꺼져도 정보를 유지하는 메모리로, 통틀어서 ROM
이라고 부름
ROM
에 저장된 프로그램은 종종 펌웨어
라고 칭함 (대표적으로 BIOS(Basic Input/Output System)
)
데이터는 프로세서와 DRAM
메인 메모리 사이에서 버스를 통해 전송됨
CPU
칩은 시스템 버스
를 통해 I/O 브리지
와 연결, I/O 브리지
는 메모리 버스
를 통해 메인 메모리
와 연결
gap
: 디스크 섹터는 갭(gap)
에 의해 나눠지고, 갭에는 섹터를 식별하는 포매팅 비트가 저장됨
multiple zone recording
: 전체 실린더 집합을 recording zone
이라 불리는 서로소 부분집합으로 파티셔닝함, 이때 각 zone은 연속된 실린더로 구성됨, 같은 zone에 속한 실린더 내의 트랙은 같은 수의 섹터를 가짐, 이 섹터 수는 innermost track
에 들어갈 수 있는 섹터 수로 결정됨
디스크는 섹터 크기의 블록 단위로 읽고 씀
섹터에 대한 접근 시간(access time)
은 seek time
, rotational latency
, transfer time
으로 구성됨
이때 transfer time
은 나머지 두 항목에 비해 미미함
디스크는 구조가 복잡하기 때문에 좀 더 간단한 인터페이스로서 운영체제에 섹터 크기의 논리적 블록
을 제공함 (연속적인 숫자로 표현)
논리적 블록과 실제 물리적 디스크 섹터 사이의 매핑은 hardware/firmware device
인 디스크 컨트롤러
가 유지함
운영체제로부터 특정 논리적 블록의 읽기 요청이 오면 컨트롤러의 펌웨어가 테이블을 찾아보고 논리적 블록 번호를 (surface, track, sector) triple
로 변환함, 다음으로 컨트롤러의 하드웨어가 이 triple
을 해석해서 물리적 읽기 동작을 수행함