처음부터 차근차근

db 설정정보 외부 파일로 옮기기 본문

Framework/Spring

db 설정정보 외부 파일로 옮기기

_soyoung 2022. 8. 10. 22:40
반응형

스프링 부트로 프로젝트를 하면서 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

반응형
Comments