데이터베이스 에서 데이터를 불러오거나 업데이트하는데는 많은 시간이 소요된다.
이런 작업을 처리하는 데는 주로 DB커넥션(데이터베이스 연결)이 필요하며, 이 커넥션을 매번 새로 생성하면 많은 시간과 리소스가 필요하다.
이런 문제를 해결하기 위해 커넥션 풀(Connection Pool)이라는 개념을 사용한다.
커넥션 풀은 미리 여러 개의 DB커넥션을 생성해두고 필요할 때 이를 제공하고 다시 회수하는 방식이다. 이렇게 하면 매번 새로운 커넥션을 생성하고 해제하는 데 드는 비용을 크게 줄일 수 있다.
HikariCP는 가장 인기 있는 커넥션 풀 중 하나로 성능이 우수하며 설정이 간편하다는 장점이 있습니다.
Spring boot 2.0 부터는 기본 커넥션 풀로 HikariCP가 사용된다.
HikakriCP를 설정하고 사용하는 방법은 다음과 같다.
1. HikariConfig 객체 생성 및 설정 : HikariConfig 객체를 생성하고 여기에 DB 서버에 대한 정보와 커넥션 풀에 대한 설정을 입렫한다.
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb");
config.setUsername("dbuser");
config.setPassword("dbpass");
config.addDataSourceProperty("cachePrepStmts", "true");
config.addDataSourceProperty("prepStmtCacheSize", "250");
config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
1.config.addDataSourceProperty("cachePrepStmts", "true");
2.config.addDataSourceProperty("prepStmtCacheSize", "250");
3.config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
위 세줄의 코드는 HikariCP설정에서 MySql 데이터베이스의 성능을 개선하기 위한 것이다.
1 = 이 설정은 Prepared Statement 캐싱을 활성화한다 이는 Prepared Statement를 재사용하게 하여 성능을 향상 시키는데 도움을 준다.
2 = 이 설정은 Prepared Statement 캐시의 크기를 설정한다. 여기서는 250개의 Prepared Statement를 캐시에 보관하도록 설정한다.
3 = 이 설정은 캐시에 저장할 수 있는 Prepared Statement의 최대 길이를 바이트 단위로 설정한다. 여기서는 한 Prepared Statement의 최대 길이를 2048바이트로 설정 한다
이러한 설정은 데이터베이스 작업의 성능을 향상시키는데 도움을 준다. 반복적으로 사용하는 SQL 쿼리가 많은 경우 이설정으로 인해 애플리케이션의 선능이 향상될 수 있다. 하지만 이 설정이 모든 상황에서 최선의 성능을 제공하는 것은 아니며
애플리케이션의 특성에 따라 적절한 값을 선택해야 한다.
2. HikariDataSource 객체 생성 : HikariConfig를 기반으로 HikariDataSource 객체를 생성한다. HikariDataSource는 커넥션 풀에서 커넥션을 관리하는 역활을 합니다.
HikariDataSource ds = new HikariDataSource(config);
3. 커넥션 사용 및 반환 : 필요할 때 HikariDataSource로 부터 커넥션을 얻어서 사용하고 사용이 끝나면 커넥션을 반납한다.
.
Connection con = null; // 선언 부분에서는 커넥션 객체를 null로 초기화합니다.
try {
con = ds.getConnection(); // HikariDataSource 객체(ds)로부터 커넥션을 얻습니다.
// 여기에서 DB 작업을 수행합니다.
} catch (SQLException e) { // SQL 예외가 발생한 경우 처리하는 부분입니다.
// 이 부분에서 에러를 처리합니다. 예를 들어, 로그를 출력하거나 사용자에게 에러 메시지를 보여줄 수 있습니다.
} finally { // finally 블록은 try 블록이 끝난 후에 무조건 실행되는 부분입니다.
if (con != null) { // 커넥션이 null이 아닌지 확인합니다. (즉, 커넥션을 성공적으로 얻었는지 확인합니다)
try {
con.close(); // 커넥션을 닫습니다.
// 여기서 주의할 점은, 이 '닫기' 동작이 실제로는 커넥션을 닫는 것이 아니라 커넥션 풀로 다시 반환하는 것이라는 점입니다.
// 따라서 이 연결은 재사용될 수 있습니다.
} catch (SQLException e) { // 커넥션 닫기 도중에 SQL 예외가 발생한 경우 처리하는 부분입니다.
// 이 부분에서 에러를 처리합니다.
}
}
}
Connection con = null;과 같은 코드에서 null로 초기화하는 이유는 다음과 같습니다:
참조 변수의 기본 값: Java에서 참조 타입의 변수는 기본적으로 null입니다. 변수를 null로 초기화하면, 변수가 아직 아무것도 참조하지 않음을 명시적으로 표현하는 것입니다.
NullPointer 예외 방지: 코드에서 null 값을 가진 변수에 대해 메소드를 호출하려고 하면 NullPointer 예외가 발생합니다. con이라는 변수를 null로 초기화해두면, con에 값이 할당되지 않은 상태에서 메소드를 호출하는 것을 방지할 수 있습니다.
try-catch-finally 블록과 관련한 이유: con 변수는 try 블록 안에서 할당되며, 이 try 블록이 실행되기 전에 con은 아직 값이 할당되지 않았습니다. 하지만 finally 블록에서는 con이 null인지 아닌지를 검사하고, null이 아니라면 연결을 닫습니다. 만약 con을 null로 초기화하지 않고 finally 블록에서 con.close()를 호출하게 된다면, con이 null이 될 수 있으므로 NullPointer 예외가 발생할 수 있습니다.
따라서 null로 초기화하는 것은 안전한 코딩 관습입니다. 이를 통해 변수가 아직 값이 할당되지 않았음을 명시하고, NullPointer 예외를 방지할 수 있습니다.
이렇게 HikariCP를 이용하면 커넥션 관리를 더 효율적으로 할 수 있다
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!