[데브코스] JDBC 2

Updated: Categories:

W4D3 - Data Source(HikariCP) / JDBC Template 에 대해 공부하자!

Data Source

DBCP (DataBase Connection Pool)

  • 앞서 살펴본 DB 커넥션 단계는 3단계로 이루어져 있음
  • DB에 쿼리를 날릴때마다 커넥션을 맺는 과정을 반복하는건 매우 비효율적이다.
  • 따라서 DataSource에 커넥션 풀을 관리하여 반복 생성하지 않도록 한다.
  • 커넥션 close도 실제로 연결을 끊는것이 아닌 커넥션 풀에 반환하는것

image

  • Spring에서는 spring-boot-starter-jdbc 모듈을 설치해 이를 사용할 수 있다
    • HikariCP
    • Spring JDBC


HikariCP

연동방법

  • DataSource Bean을 정의할때 DB 접속정보를 넣어준다
@Bean
public DataSource dataSource() {
    var dataSource = DataSourceBuilder.create()
            .url("jdbc:mysql://주소/DB명")
            .username("호스트명")
            .password("패스워드")
            .type(HikariDataSource.class)
            .build();
    return dataSource;
}
  • 커넥션을 불러올땐 dataSource.getConnection()으로 불러오면 된다!

Connection Pool

  • DataSource에서 커넥션 풀을 어떻게 사용하는지 확인해보자
show status like '%Threads%';

image

  • 연결 전엔 DB에서 스레드 상태를 보면 1개만 연결되어있는걸 확인할 수 있음


@Test
public void 테스트 throws InterruptedException {
    [DB 커넥션 사용 로직]
    Thread.sleep(5000);
}
  • 이제 커넥션을 맺고 스레드를 5초간 멈춘 후 다시 DB를 확인해보면

image

  • 스레드 연결이 10개가 늘어난다.
  • 이를 보면 DB 커넥션이 시작되면 -> 커넥션 풀에 커넥션 10개(default)를 생성한다는 것을 알 수 있다.
  • 커넥션 생성을 늘리려면? -> Bean 정의시 커넥션 수를 정해줄 수 있음
    • dataSource.setMaximumPoolSize() : 우선 Pool 사이즈를 늘려주고
    • dataSource.setMinimumIdle() : 생성할 커넥션 수를 정해준다


JDBC Template

Untitled Diagram (2)

  • query(쿼리, RowMapper, 쿼리인자값, ...) : 결과값을 여러개 받아올 때 List로 반환됨.
  • queryForObject(쿼리, RowMapper, 쿼리인자값, ...)
    • 결과값을 하나만 받아오고 싶을 때
    • 쿼리에 인자값을 넣어 날림 (내부에서 PreparedStatement가 동작함)
    • count 같이 결과가 int 값 하나 나올때도 사용한다. -> (쿼리, Integer.class)
  • update(쿼리, 쿼리인자값, ...) : 업데이트 후 성공했다면 1을 리턴