티스토리 뷰

spring cloud config client를 사용하여 갱신된 config 정보를 받아오기위해선 /actuator/refresh 를 호출해야한다. 그런데 이때 전혀 신경도 쓰지않았던 Hikari 에서 예외가 발생하는 경우가 있다.


java.lang.IllegalStateException: The configuration of the pool is sealed once started.  Use HikariConfigMXBean for runtime changes. 


이런 에러메세지가 나오는데 정확히 파본건 아니지만 refresh 를 하면서 config들을 갱신할때 Hikari 쪽을 호출하는듯 하다. 이것도 확인해본건 아니지만 아래처럼 @ConfigurationProperties 애노테이션을 사용해서 생성할때만 에러가 날듯 하다.


@ConfigurationProperties(prefix = "datasource")
@Bean(name = "dataSource")
public DataSource dataSource() {
return DataSourceBuilder.create().build();
}


뭐 여튼 이 문제를 해결하는 방법은 3가지 정도가있다.


1. @RefreshScope

DataSource 설정부분에 @RefreshScope 애노테이션을 붙인다. 애노테이션을 붙이면 Hikari도 refresh 가 가능해진다. 아래에 이어갈 2, 3번 방법도 궁극적으론 다 똑같은 해결책을 다른방법으로 제시한 내용들이다.


2. HikariDataSource

DataSource 반환타입을 HikariDataSource로 구체화시켜준다. RefreshAutoConfiguration.java 클래스를 보면 이런 내용이 있다.


private Set<String> refreshables = new HashSet<>(
Arrays.asList("com.zaxxer.hikari.HikariDataSource"));


저 타입에 맞춰주면 에러는 뜨지않게된다. 보통 인터페이스로 쓰기에 위쪽에 있는 코드처럼 javax.sql.DataSource 을 반환타입으로 지정하게되는데 구체적으로 HikariDataSource 로 명시하면 된다. 3번이 없으면 이 방법을 썼었을텐데 3번이 있어서 난 이방법은 쓰지않았다. 타입명시는 이런식으로 해주면 된다.


return DataSourceBuilder.create().type(HikariDataSource.class).build();


3. config

2번 방법에 있는 List 안에 javax.sql.DataSource 를 넣는 PR을 이미 누군가 올렸다.

( https://github.com/spring-cloud/spring-cloud-commons/pull/395 )


그런데 그 PR은 거절당했는데 대안으로 알려준 방법이 config 설정을 하는것이다.


spring.cloud.refresh.extra-refreshable=javax.sql.DataSource 


해당 PR을 거절하면서 Hikari 하나를 위해서 javax.sql.DataSource 를 코드에 추가할수는 없다는 이유를 말했는데 납득은 가나 Spring boot 2 의 기본 cp 라이브러리가 Hikari 인걸 생각하면 나중에라도 뭔가 다른 방법이 나오지않을까 싶다.(문서에 명확히 명시해주거나)

'Java > spring' 카테고리의 다른 글

Spring Cloud Config 2  (1) 2018.12.08
Spring Cloud Config 1  (0) 2018.12.07
Spring DI  (3) 2018.01.21
Spring Bean 초기화/소멸  (0) 2017.11.17
static factory method를 이용한 spring bean 생성  (4) 2017.11.16
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함