Spring Data Source 헷갈리지 않고 설정하기

(작성자: 정경호)

Data Source 설정이 어려운 이유

Data Source를 설정하는건 한번 설정하고 나면 다시 볼일이 없다. 보통은 다른 동료가 설정을 해주고 나면 문제가 생길때까진 볼일이없다. (우리도 마찬가지였고…) 그래서 Cache, Spring Security 도 같은 문제가 생긴다.

하지만 Relaxed Binding에서 적은 것 처럼 Data Source 설정 또한 간단한 내용이므로 조금만 학습하면 쉽게 설정할 수 있다. Data Source를 학습하며 어려웠던 url과 jdbc-url 같이 같아 보이는 필드가 왜 따로 존재하는지 url 필드는 어디서 오는건지 이런게 어려운데. 그건 아래 다 정리 해놨다.

미리 알아야하는 지식

💡 DataSource를 설정하는 방법은 크게 두개다

👆👆👆 이게 정말 중요하다. 두개가 뭐가 있냐면

spring.datasource spring.datasource.hikari

spring.datasource는 DataSourceProperties class 를 사용한다.

spring.datasource.hikari는 HikariConfig class 를 사용한다.

위 두개를 잘 기억하고 예시를 확인해보자

예시로 살펴보기

위 이미지는 우리 BE의 application.yaml 의 일부이다. 여기서 datasource와 hikari를 확인할 수 있다. 자사몰 프로젝트는 기본 설정을 못하는데 그 이유는 multi datasource를 사용하기 때문이다. 하지만 결국 같은 방식으로 설정을 할 수 있다. 아래 이미지를 보자.

개인적으로 위 내용이 상당히 재밌었는데, 우리가 yaml에 적은 필드와 같은 필드 이름이 이미 자바 클래스로 만들어져있다. 생각해보면 당연히 만들어져있어야한다. 😌😌

또 재밌는 포인트는 이미 위에있는 필드들이 이미 아래 문서에 다 적혀있다. 더 자세히보고 싶다면 클래스를 보면 좋겠지만 간단히 보려면 문서만 봐도 어떤 필드가 있는지 이미 다 확인이 가능하다. (코멘트도 잘 적혀있다)

yaml과 자바 클래스가 어떻게 연결되고 어떤 문서를 봐야하는지 이해했다면 이제 쉽게 Data Source를 설정할 수 있다.

Data Source 설정하기

위에서 언급한 spring.datasource, spring.datasource.hikari 두개의 설정 방법을 모두 살펴보자.

💡 아래 내용은 이 문서를 기반으로 만들었다.

1. spring.datasource

아래와 같은 yaml 일때 오른쪽 처럼 DataSourceProperties Bean을 생성하면 yaml의 설정값을 가져올 수 있다.

app:
  datasource:
    url: "jdbc:mysql://localhost/test"
    username: "dbuser"
    password: "dbpass"
    pool-size: 30
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSourceProperties headDataSourceProperties() {
  return new DataSourceProperties();
}

2. spring.datasource.hikari

만약 hikari (아마 대부분 hikari 쓰겠지만…..)를 쓰고 싶다면 다음과 같이 설정할 수 있다.

app:
  datasource:
    hikari:
      jdbc-url: "jdbc:mysql://localhost/test"
      username: "dbuser"
      password: "dbpass"
      maximum-pool-size: 30
@Bean
@ConfigurationProperties("app.datasource")
public HikariDataSource dataSource() {
	return DataSourceBuilder.create().type(HikariDataSource.class).build();
}

위에 자세히 보면 url → jdbc-url , pool-size → maximum-pool-size 로 바꼈다. 바뀐 이유는 위에 언급했던 class, data properties에서 오는 것이므로 정확한 필드를 알고 싶다면 문서에서 필드 이름을 확인하면 된다.

보통은 위와 같이 각 상황에 맞게 Data Source를 생성하는데, 우리가 사용하는 것 처럼 두가지 방식을 조합할 수도 있다. (SpringBoot 공식문서에서 이 방식을 추천한다)

3. spring.datasource + named property

app:
  datasource:
    url: "jdbc:mysql://localhost/test"
    username: "dbuser"
    password: "dbpass"
    hikari:
      maximum-pool-size: 30
@Bean
@Primary
@ConfigurationProperties("app.datasource")
public DataSourceProperties dataSourceProperties() {
	return new DataSourceProperties();
}

@Bean
@ConfigurationProperties("app.datasource.hikari")
public HikariDataSource dataSource(DataSourceProperties properties) {
	return properties.initializeDataSourceBuilder().type(HikariDataSource.class).build();
}

3번째 방식을 살펴보면 1번째에 있는 datasource namespace에서 hikari namespace를 따로 빼서 조합하는걸 볼 수 있다. 이렇게하게 되면 공통으로 쓸 수 있는 필드와 3rd party에 필요한것만 따로 나눌 수 있으므로 특정 모듈에 종속되지 않을 수 있다.

사실을 말하자면

이건 뻥이다. 설정하는 방법은 더 많다. 여기서 보면 20개 정도 되는 DB를 설정할 수 있다. 하지만 겁먹지 마라 결국 다 같다. 2개를 이해했다면 20개도 이해할 수 있다.

결론

이렇게 Data Source를 설정하는 방법과 어떤 필드가 있는지 살펴봤다. Data Source를 설정하는 방법은 공식문서에 아주 자세히 나와있으므로 내가 쓴 설정방법은 자세히 읽어보지 않아도 좋다(🥹). 하지만 위에 있는 미리 알아야하는 지식 은 반드시 자세히 한번 보길 바란다. 왜냐면 위 정보들이 흩어져있어 정보를 모으기가 쉽지 않기 때문이다. 시간을 꽤 소모하게 되므로 한번 보길 권한다.

참고

Data Access 3.3.3

Appendix Common Application Properties