Back-end/spring boot
DB 연결 확인하지 않고 실행 시작 처리 & DB server가 끊기면 에러 로그 발생하고 시스템 중단되지 않도록 유지하기 / During initialization, Do not check DB connection with disconnected DB server and error log occurs, keeps the system from interrupting [spring boot]
은성 개발자
2024. 7. 26. 23:38
728x90
spring boot 버전 3정도를 사용하고 있는데
datasource를 굳이 hikariDatasource로 지정하지 않아도 spring boot에서 자동으로 hikariDatasource로 해준다.
그래서 HikariPool에서 DB 연결을 확인하고 연결이 잘되면 예외나 에러가 발생하지 않는다.
다만, 연결하지 못하면 아예 종료가 된다는 아이러니한 상황...
[ 겪었던 문제 ]
- DataSource로 지정 → hikaripool로 잡혀버려서 자동으로 hikaripool에서 연결 시도
- → exception 발생하나 hikaripool에서 발생한 exception을 제어하는 방법이 나오지 않았다. (아마 없을 듯.)
DB 연결 확인까지 하고 시작해도 된다~ 는 사람은 필요하지 않겠지만,
내 상황은 다음과 같다.
[ 해결해야할 과제 ]
- 처음 실행 시 1개의 DB만 따로 연결을 초기에 시도하지 않는다.
- DB는 필요한 query가 실행할 때만 연결을 확인하고 사용한다.
그래서 DataSource 나 HikariDataSource를 사용하지 않고,
Common dbcp2의 BasicDataSource를 사용한다.
[ 초기 실행 전에 DB 연결 확인 안하고 시작하는 법 ]
1. gradle 설정
- maven 등 다른 설정은 아래 링크에서 사용하기
https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2/2.12.0
// https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2
implementation group: 'org.apache.commons', name: 'commons-dbcp2', version: '2.12.0'
2. application.yml 설정 (* 주의 *)
- hikaricp에서는 jdbc-url로 설정해야 하고 common dbcp2에서는 url로 설정해야 된다.
spring:
datasource:
url: jdbc:mysql://~(포트까지 주의)
username: root
password: pw
driver-class-name: ~
3. DatasourceConfig.class
- 여기서 BasicDataSource를 지정
- .type(BasicDataSource.class)를 이용해서 명시
- 아래와 같이 설정하면 처음 실행 시 hikaripool에 secondDataSource만 연결 확인을 하고 application이 시작된다.
@Configuration
public class DataSourceConfig {
// BasicDataSource로 지정
@Bean(name = "firstDataSource")
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource firstDataSource() {
return DataSourceBuilder.create().type(BasicDataSource.class).build();
}
// 이 datasource는 Hikaricp에서 관리되게 된다.
@Primary
@Bean(name = "secondDataSource")
@ConfigurationProperties(prefix = "spring.datasource.second")
public DataSource secondDataSource() {
return DataSourceBuilder.create().build();
}
}
4. DataSource.getConnection()
- firstDataSource를 가져와서 getConnection()으로 연결 확인 후 원하는 DB처리를 하면 끝~
- 이렇게 하면 insertData()를 실행할 때마다 연결 확인 후 실행하게 된다.
@Slf4j
@Service
public class testService {
private DataSource firstDataSource;
@Autowired
public ExService(@Qualifier("firstDataSource") DataSource firstDataSource) {
this.firstDataSource = firstDataSource;
}
public void insertData(TestDto testDto) {
try (Connection connection = firstDataSource.getConnection()) {
log.info("Database connected successfully.");
// insert 실행 함수
}
// .. catch 문 생략
} catch (Exception e) {
log.error("Exception in insertData: {}", e.getMessage(),e);
}
}
}
여러분은 고생하지 마세요... 진짜
정보가 영어랑 ChatGPT 써도 안 나오고 미치는 줄 알았다.

728x90
반응형