0. 시작하기 전
JDBC 란?
- JDBC( Java Database Connectivity ) 란 자바에서 데이터베이스에 접속하기 위한 표준 인터페이스를 뜻함
- 데이터베이스와 연결할 때마다 새로운 커넥션을 생성 & 연결하는 비용을 줄이기 위한 기술
JDBC 커넥션 풀 구현체란?
- 커넥션 풀링 기능을 제공하는 라이브러리
- 데이터베이스에 연결할 때 생성된 커넥션 풀에서 사용
- 커넥션 풀 크기, 커넥션 대기 시간, 커넥션 최대 최소 수 등 설정 가능
- 구현체 종류 : Apache Commons DBCP, HikariCP, Tomcat JDBC 등
Hikari 란?
- Spring Framework에서 사용되는 데이터베이스 커넥션 풀 라이브러리
- HikariCP라고도 불림
- 빠르고 경량화된 JDBC 커넥션 풀 구현체
- Spring Hikari는 데이터베이스 커넥션 풀을 관리하는 데 매우 효율적
Hikari 장점
- 다른 커넥션 풀 라이브러리와 비교했을 때 더 빠른 응답 시간과 더 낮은 메모리 사용량을 제공
- 설정이 간단하고 사용하기 쉬우며, 대부분의 경우 디폴트 설정을 그대로 사용해도 높은 성능을 보장
결론
- Spring Hikari는 Spring Boot에서 기본 커넥션 풀 라이브러리로 사용됨
- Spring 애플리케이션에서 데이터베이스 연결을 관리할 때 많이 사용됨
1. yml 파일과 config 파일
application.yml
primary:
datasource:
hikari:
jdbc-url: jdbc:postgresql://localhost:0000/dbName
driver-class-name: org.postgresql.Driver
username: 이름
password: 비번
hibernate:
"[hibernate.hbm2ddl.auto]": none
property:
"[hibernate.dialect]": org.hibernate.dialect.PostgreSQLDialect
"[hibernate.show_sql]": true
"[hibernate.hbm2ddl.auto]": none
"[hibernate.cache.use_second_level_cache]": false
"[hibernate.cache.use_query_cache]": false
secodary:
datasource:
hikari:
jdbc-url: jdbc:postgresql://localhost:0000/dbName
driver-class-name: org.postgresql.Driver
username: 이름
password: 비번
hibernate:
"[hibernate.hbm2ddl.auto]": none
property:
"[hibernate.dialect]": org.hibernate.dialect.PostgreSQLDialect
"[hibernate.show_sql]": true
"[hibernate.hbm2ddl.auto]": none
"[hibernate.cache.use_second_level_cache]": false
"[hibernate.cache.use_query_cache]": false
PrimaryDataSourceConfig
- 두 번째, 세 번째 등 다른 테이블도 연동할 때는 같은 파일을 생성하면 된다.
- 옮길 때는 "com.example~" 부분을 연결할 테이블과 레파지토리의 경로를 옮기면 된다.
package com.example.Voc.config;
import com.zaxxer.hikari.HikariConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.autoconfiguAre.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.env.Environment;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import com.zaxxer.hikari.HikariDataSource;
import java.sql.SQLException;
import java.util.HashMap;
@Configuration
@EnableJpaRepositories(
entityManagerFactoryRef = "primaryEntityManagerFactory",
transactionManagerRef = "primaryTransactionManager",
basePackages = "com.example.primary.repository"
)
@Slf4j
public class PrimaryDataSourceConfig {
@Autowired
private Environment environment;
@Bean(value = "PrimaryHibernateProperties")
@ConfigurationProperties("primary.datasource.hibernate")
public HashMap<String, Object> PrimaryHibernateProperties() {
return new HashMap<String, Object>();
}
@Primary
@Bean
public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(primaryDataSource());
em.setPackagesToScan("com.example.primary.entity");
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
final HashMap<String, Object> properties = PrimaryHibernateProperties();
System.out.println("properties Map ="+properties);
System.out.println("properties Map ="+properties);
em.setJpaPropertyMap(properties);
return em;
}
@Primary
@Bean
public PlatformTransactionManager primaryTransactionManager() {
final JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(primaryEntityManagerFactory().getObject());
return transactionManager;
}
@Primary
@Bean
@ConfigurationProperties("primary.datasource.hikari")
public HikariConfig hikariConfig() {
HikariConfig hikariConfig = new HikariConfig();
return hikariConfig;
}
@Primary
@Bean
public DataSource primaryDataSource() {
return new HikariDataSource(hikariConfig());
}
}
'SpringBoot > 활용' 카테고리의 다른 글
[ Spring 기본 ] Jpa 이용해서 db 에 entity 추가 (0) | 2023.01.18 |
---|---|
[ Spring 기본 ] Spring 환경 IntelliJ에 구축 (0) | 2023.01.11 |