1. Connection Pool 학습 테스트를 했다.
📍 JDBC
- JDBC란
- 자바 프로그램이 DB와 연결되어 데이터를 주고 받을 수 있게 해주는 인터페이스 (자바 표준)
- 응용프로그램과 DB간의 통신을 중간에서 번역해주는 역할
- JDBC 기능
- Connection : 연결 (특정 DB와의 연결정보를 가지는 interface)
- Statement : SQL을 담은 내용 (SQL query문을 DB에 전송하는 방법을 정의한 interface)
- ResultSet : SQL 요청 응답 (SELECT 구문 실행 결과를 조회할 수 있는 방법을 정의한 interface)
- 자바는 이렇게 표준 인터페이스를 정의해두었다. 이제부터 개발자는 이 표준 인터페이스만 사용해서 개발하면 된다.
그런데 인터페이스만 있다고해서 기능이 동작하지는 않는다. - -> 이 JDBC 인터페이스를 각각의 DB 벤더(회사)에서 자신의 DB에 맞도록 구현해서 라이브러리로 제공하는데,
이것을 JDBC 드라이버라 한다.
(ex. MySQL DB에 접근할 수 있는 것 - MySQL JDBC 드라이버 / Oracle DB에 접근할 수 있는 것 - Oracle JDBC 드라이버)
📍 Connection Pool
기존에는 DB를 사용해야 할 때마다 connection을 획득했다.
connection을 새로 만드는 것은 과정도 복잡하고 시간도 많이 많이 소모되는 일이다.
Connection Pool : connection을 미리 생성해두고 사용하는 방법
📍 DataSource
커넥션을 얻는 방법
- DriverManager 를 직접 사용 (매번 connection 새로 생성)
- 커넥션 풀을 사용 (connection을 미리 생성해두고 재사용)
애플리케이션 로직에서 DriverManager 를 사용해서 커넥션을 획득하다가 HikariCP 같은 커넥션 풀을 사용하도록 변경하려면 어떻게 해야할까?
커넥션을 획득하는 애플리케이션 코드도 함께 변경해야 한다. 의존관계가 DriverManager 에서 HikariCP 로 변경되기 때문이다. 추가적으로 둘의 사용법도 조금씩 달라서 개발자가 공부해야한다.
자바에서는 이런 문제를 해결하기 위해 javax.sql.DataSource 라는 인터페이스를 제공한다.
DataSource 는 커넥션을 획득하는 방법을 추상화 하는 인터페이스이다.
이 인터페이스의 핵심 기능은 커넥션 조회이다.
📍 HikariCP
HikariCP의 pool size는 몇으로 설정하는게 좋을까?
HikariCP를 사용할 때 적용하면 좋은 MySQL 설정
6차 데모 데이 준비할 때 위 두 글 읽고 하자~
📍 DataSource 설정 방법
1) Bean으로 등록
javax.sql.DataSource 인터페이스를 구현하는 클래스를 만들고 Bean으로 등록
(DataSource를 여러 개 사용하거나 세부 설정을 하려면 빈을 직접 생성하는 방법을 사용한다)
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("your.driver.ClassName");
dataSource.setUrl("jdbc:your_database_url");
dataSource.setUsername("your_database_username");
dataSource.setPassword("your_database_password");
return dataSource;
}
}
import javax.sql.DataSource;
@Configuration
public class DataSourceConfig {
public static final int MAXIMUM_POOL_SIZE = 5;
private static final String H2_URL = "jdbc:h2:./test;DB_CLOSE_DELAY=-1";
private static final String USER = "sa";
private static final String PASSWORD = "";
@Bean
public DataSource hikariDataSource() {
final var hikariConfig = new HikariConfig();
hikariConfig.setPoolName("gugu");
hikariConfig.setJdbcUrl(H2_URL);
hikariConfig.setUsername(USER);
hikariConfig.setPassword(PASSWORD);
hikariConfig.setMaximumPoolSize(MAXIMUM_POOL_SIZE);
hikariConfig.setConnectionTestQuery("VALUES 1");
hikariConfig.addDataSourceProperty("cachePrepStmts", "true");
hikariConfig.addDataSourceProperty("prepStmtCacheSize", "250");
hikariConfig.addDataSourceProperty("prepStmtCacheSqlLimit", "2048");
return new HikariDataSource(hikariConfig);
}
}
2) application.properties 또는 application.yml 파일
application.properties
spring.datasource.url=jdbc:your_database_url
spring.datasource.username=your_database_username
spring.datasource.password=your_database_password
spring.datasource.driverClassName=your.driver.ClassName
application.yml
spring:
datasource:
url: jdbc:your_database_url
username: your_database_username
password: your_database_password
driverClassName: your.driver.ClassName
📍 학습테스트 진행 내용
connectionPool에서 자유롭게 connection을 꺼내 쓸 수 있다.
(connection을 쓰고 나면 닫는게 아니라 connection Pool로 반환된다)
HikariConfig를 이용해 HikariCP에 대한 설정을 해줄 수 있다.
만든 config 파일을 HikariDataSource에 넣어주면 설정대로 데이터 소스가 세팅된다.
20개의 thread가 동시에 "Before acquire"
하지만 5개의 thread가 먼저 "After acquire"
0.5초 후 5개의 thread ...
2. JDBC 만들기 미션 1단계를 했다.
https://github.com/woowacourse/jwp-dashboard-jdbc/pull/283
ㅎㅎㅎ 레벨 2때 잘 정리해둬서 그런가 생각보다 쉬웠다!
📍 함수형 인터페이스 (https://catsbi.oopy.io/e980e4b7-fde3-4ceb-91f9-181ce2e7b507)
- 1 개의 추상 메소드를 갖는 인터페이스
- static 메소드와 default메소드가 유무 상관 x. 추상 메소드가 1개만 있어야 한다
- @FunctionalInterface 어노테이션이 없어도 함수형 인터페이스로 동작하고 사용하는 데 문제는 없지만,
인터페이스 검증과 유지보수를 위해 붙여주는 게 좋음'
3. [펀잇] Grafana No Data 이슈
알고보니 저번주 목요일부터 거의 일주일동안 모니터링이 안되고 있었다.
원인은 cloudfront를 붙이면서 도메인 매핑을 바꿔놔서..!
기존에는 프론트 정적파일을 ec2에 둬서 도메인을 ec2의 ip에 매핑해뒀었는데,
프론트 정적파일을 s3로 옮기고 cloudfront로 서빙하면서 도메인을 cloudfront로 매핑했다.
prometheus.yml에는 funeat.site에서 데이터를 가져오도록 해놨기 때문에
cloudfront어쩌고/actuator 어쩌고로 요청을 보내고 있었던 것..!
(서버가 아닌 cloudfront로 요청을 보내고 있었던 것)
그래서 prometheus.yml에 ec2 ip로 매핑했더니
해결~
으음 모니터링 시스템 구조가 포트가 막 섞여있어서 헷갈린다. 한번 날잡고 정리해둬야겠다.
(내가 했지만 오랫만에 보니까 또 까먹게 되네 ... 기억 날 때 해두자)
4. [펀잇] 추석 연휴 전 DB 백업
다음주에 망고랑 같이 DB 백업 자동화 하기로 했다!
하지만 추석 연휴 동안 무슨 일이 일어날지 모르니.. 일단 수동으로 백업해뒀다.
mysqldump -u [사용자 계정] -p [패스워드] [원본 데이터베이스명] > [생성할 백업 DB명].sql