개요
일반적으로 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 플러그인을 사용하면 자동으로 의존성 관리 플러그인들이 적용이 되므로 사용자는 아무런 상관없이 사용하면 됩니다.
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 이름으로 등록된 빈을 사용하면 됩니다.
참고
'문제 해결, 기술 비교 > 개인프로젝트(북클럽)' 카테고리의 다른 글
redis 저장소를 cache, session 전용으로 분리하기 (0) | 2022.10.01 |
---|---|
Redis eviction 정책은 무엇을 사용해야 할까? (0) | 2022.09.28 |
페이징에서 JPA N +1 문제 해결하기 (0) | 2022.09.28 |
Mysql Replication 구성하기 (3) | 2022.06.29 |
Redis Persistence AOF vs RDB (0) | 2022.06.28 |