본문 바로가기
문제 해결, 기술 비교/개인프로젝트(북클럽)

DataSourceBuilder, yml의 원리 및 @ConfigurationProperties 적용

코동이 2022. 12. 16.

개요


 일반적으로 mysql DB 접속 정보를 application.yml에 설정했는데, master-slave를 구성하면서 DB 정보들을 java 설정 쪽으로 가져와야 했습니다.

 

1. 해당 정보를 어떻게 가져올 수 있는지 고민하던 중, DataSource로 받아오며, 손쉽게 DataSourceBuilder를 이용할 수 있다는 것을 알고 정리합니다.

 

2. @ConfigurationProperties을 통해서 application.yml에서 원하는 정보를 가져올 수 있습니다. 

 

 

DataSourceBuilder란?


DataSourceBuilder는 공통 구현과 설정으로 DataSource를 편리하게 만들 수 있는 클래스입니다.  이 빌더에 의해서 구현할 수 있는 pooling Datasource에는 Hikari, Tomcat JDBC Pool, Apache DBCP2, Oracle UCP 등이 있습니다.

 

Spring에서는 @Bean@ConfigurationProperties를 사용해서 간단한 설정을 제공합니다.

 

 

 

yml 이름 및 경로 설정 원리


yml 설정을 사용하기 위해서 spring-boot-starter-parent 의존성이 필요합니다. gradle에 spring-boot 플러그인을 사용하면 자동으로 의존성 관리 플러그인들이 적용이 되므로 사용자는 아무런 상관없이 사용하면 됩니다.

 

https://docs.spring.io/spring-boot/docs/1.4.5.RELEASE/reference/html/build-tool-plugins-gradle-plugin.html

 

build.gradle에 아래처럼 plugin을 등록하면 끝입니다.

 

//플러그인 등록
plugins {
    id 'org.springframework.boot' version '1.4.5.RELEASE'
}

 

플러그인에 등록된 버전에 따라서 spring-boot-starter-parent의 버전이 결정됩니다.

 

 

  • spring-boot-starter-parent 내부코드

Intellij에서 External Libraries에서는 spring-boot-starter-parent을 찾지 못해서 직접 파일을 검색해서  찾은 후 yml이 설정되는 곳을 발견했습니다.

  <resource>
    <directory>${basedir}/src/main/resources</directory>
    <filtering>true</filtering>
    <includes>
      <include>**/application*.yml</include>
      <include>**/application*.yaml</include>
      <include>**/application*.properties</include>
    </includes>
  </resource>
  <resource>
    <directory>${basedir}/src/main/resources</directory>
    <excludes>
      <exclude>**/application*.yml</exclude>
      <exclude>**/application*.yaml</exclude>
      <exclude>**/application*.properties</exclude>
    </excludes>
  </resource>
</resources>

 

위의 코드를 보면 <directory>${basedir}/src/main/resources </directory>의 경로 하위에 있는 application*.yml, application*.yaml, application*.properties을 모두 읽는 것을 알 수 있습니다. 

 

 

 

코드 실습


 DataSource를 만드는 방법은 직접 자바단에서 설정하는 방법과 application.yml에서 설정하는 방법 총 2가지를 알아보겠습니다.

 

  • 1. 직접 설정하기
@Configuration
@SpringBootApplication
public class MyApplication {
    @Bean
    public DataSource datasource() {
        return DataSourceBuilder.create()
                .driverClassName("com.mysql.cj.jdbc.Driver")
                .url("jdbc:mysql://localhost:3306/project3")
                .username("root")
                .password("root")
                .build();
    }

    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

 

DatasourceBuilder에서 직접 driverClassName, url, username, password를 지정해서 생성합니다.

 

 

  • 2. application.yml, application.properties에서 설정 가져오기
@SpringBootApplication
public class ScrJmixApplication {
    public static void main(String[] args) {
        SpringApplication.run(ScrJmixApplication.class, args);
    }

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

 

@ConfigurationProperties, @Bean으로 기존 설정을 가져올 수 있습니다.

(prefix = "main.datasource")는 main.datsource를 접두사로 가지고 있는 설정을 가져온다는 의미입니다.

 

#application.yml

main:
  datasource:
    url: jdbc:mysql://34.125.215.241:3306/bookclub?serverTimezone=UTC&characterEncoding=UTF-8
    jdbc-url: jdbc:mysql://34.125.215.241:3306/bookclub?serverTimezone=UTC&characterEncoding=UTF-8
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: bookroot
    password: 1234

 

구체적인 설정이 없이도 main.datasource로 url, jdbc-url, driver-class-name, username, password에 접근 가능합니다

@Bean으로 dataSource를 등록했기 때문에, 필요한 곳에서 dataSource 이름으로 등록된 빈을 사용하면 됩니다.

 

 

참고


Spring DataSourceBuilder tutorial with examples

반응형