처음부터 차근차근
db 설정정보 외부 파일로 옮기기 본문
스프링 부트로 프로젝트를 하면서 db 민감정보를 버전관리에서 제외시키려고 application.properties를 gitignore 처리했었다.
gitignore 처리했더니 mybatis 설정, view 설정 등 다른 사람이 봐도 되는 설정들을 볼 수가 없고, 무엇보다 나중에 git clone 해서 프로젝트를 내려받을 때 application.properties 파일을 따로 생성해야 하는 불편함이 생겼다.
그래서 db의 설정정보를 외부에다 위치시키고, 그 파일을 읽어오는 방식을 사용했다.
1. 먼저 application.porperties 안에 있는 db 설정정보를 없앤다.
# MySQL DB 설정
#spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
#spring.datasource.url=jdbc:mysql://host:port/db
#spring.datasource.username=username
#spring.datasource.password=password
# mybatis 설정
#mybatis.config-location=classpath:/mybatis-config.xml
#mybatis.mapper-locations=classpath:/mappers/*.xml
# view 설정
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
나중에 나오지만 dataSource를 커스텀하여 sqlSessionFactory를 수동으로 만들기 때문에 mybatis의 mapper 설정을 그 때 할거라서 주석처리 했다.
2. 그 다음 원하는 위치에 config.porperties(파일명은 달라도 됨)를 만들고 그 안에다 db 설정에 관한 내용을 적는다.
# MySQL DB 설정
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://host:port/db
spring.datasource.username=username
spring.datasource.password=password
3. 패키지 / config(없으면 새로 생성) / PropertyDataSource 를 만든다.
그 다음 프로퍼티 파일의 내용을 읽어와서 변수에 대입한다.
@Getter
@Configuration
@PropertySource(value="file:프로퍼티파일위치", ignoreResourceNotFound=true)
public class PropertyDataSource {
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
}
@Configuration : 설정파일이라는 것을 알리는 어노테이션
@PropertySource : 프로퍼티 파일을 읽어와서 스프링 프로퍼티에 해당 데이터를 저장하는 어노테이션
ignoreResourceNotFound=true : 프로퍼티를 찾는데 실패하면 무시한다는 뜻
4. 패키지 / config(없으면 새로 생성) / DBConfig 를 만든다.
방금 받아온 db설정을 넣어 dataSource bean 객체를 만들고, SqlSessionFactory bean을 만들 때 커스텀하여 만든 dataSource를 매개변수로 넣는다. 여기서 주석처리한 mybatis mapper와 설정파일 내용도 추가해준다.
@Configuration
@EnableTransactionManagement
@RequiredArgsConstructor
public class DBConfig {
private final PropertyDataSource globalPropertySource;
@Bean
@Primary
public DataSource customDataSource() {
return DataSourceBuilder
.create()
.url(globalPropertySource.getUrl())
.driverClassName(globalPropertySource.getDriverClassName())
.username(globalPropertySource.getUsername())
.password(globalPropertySource.getPassword())
.build();
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSource customDataSource) throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(customDataSource);
PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
sessionFactory.setMapperLocations(resolver.getResources("classpath:/mappers/*.xml")); // mybatis
sessionFactory.setConfigLocation(resolver.getResource("classpath:/mybatis-config.xml")); // mybatis
return sessionFactory.getObject();
}
}
@EnableTransactionManagement : 트랜잭션 관리 기능을 하는 어노테이션
이렇게 하면 db 설정정보를 application.properties에 넣지 않아도 애플리케이션이 정상적으로 실행되는 것을 볼 수 있다.
참고 : https://4urdev.tistory.com/48
'Framework > Spring' 카테고리의 다른 글
JaCoCo를 사용한 code coverage (0) | 2022.08.23 |
---|---|
테스트 주도개발(TDD) (0) | 2022.08.14 |
Builder pattern과 @Builder (0) | 2022.07.29 |
스프링 이니셜라이즈를 이용한 스프링 부트 프로젝트 생성 방법 (0) | 2022.07.12 |
Logback : 로그 색상 수정 (0) | 2022.06.22 |