SPRING

[SPRING] 설정값 분리하기, property 값 주입하기 (@Value, application.properties, @PropertySource)

혀내 2022. 2. 28. 12:21
반응형

서론

 설정 값을 그대로 자바 코드 안에서 변수로 사용하다 깃허브에 커밋해 토큰이 노출되는 사고가 발생했다 🙀 앞으로 이런 사고를 미연에 방지하기 위해 .gitignore 처리된 application.properties에서 설정값을 관리하고 자바 파일에 주입할 수 있는 방법에 대해서 소개해보고자 한다.


본론

기존 코드

  • 예시 1
public class GithubApi {
    GitHub github;
    String token = "ghp_NSTFeMadfsdfjkljljasldf";

    public PagedIterator<GHCommit> getCommits(String userId) {
        try { connectToGithub(token); }
  • 예시 2
public class ConversationsHistory {
    static String channelID= "C03001";
    static String token= "xoxb-2402asdjflksdjfl";

    static Optional<List<Message>> conversationHistory = Optional.empty();


 기존 코드는 자바 파일에 토큰 값이 그대로 노출되어 있었다. 토큰이 노출되면 보안 문제도 있지만 여러 코드에 퍼진 토큰 값을 관리하기도 어려워진다.


해결 방법

  • application.properties 파일
spring.datasource.url=jdbc:mysql://localhost...
spring.datasource.username=root
spring.datasource.password=
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# github token
github.token=ghp_Zwy???...

# slack token
slack.token=xoxb-2402-???...


 토큰 값들은 .properties 파일에 따로 저장하도록 한다. 필자는 application.properties에 토큰을 저장했지만, 개별 설정파일을 만들고 싶다면 .properties 확장자 파일을 생성해서 사용하면 된다. 단, 직접 생성한 .properties 파일을 사용하려면 추가적인 설정이 필요하다. 설정 값을 사용하려는 클래스 위에 @PropertiySource 어노테이션으로 어떤 설정 파일을 사용할 것인지 명시해주도록 한다.

 

@PropertySource("classpath:app.properties")
@Component
public class CommitUtil {

    private GitHub github;
    
    @Value("${github.token}")
    private String token;
}



.properties에 있는 설정 값들은 @Value 어노테이션으로 자바 코드 변수에 주입할 수 있다. 그러나 스프링이 어노테이션을 인식하고 값을 자동으로 주입하기 위해서는 해당 클래스가 스프링 빈이 되어야 한다. 빈 설정을 위해서 클래스 위에 @Service, @Conponent, @Configuration 중 용도에 맞게 하나의 어노테이션을 붙여주도록 한다. (추가하지 않으면 @Value 를 붙여도 값이 주입되지 않고 null 변수가 된다.)

 

@Component
public class CommitUtil {

    private GitHub github;

    @Value("${github.token}")
    private String token;
}
반응형