Spring Bootでプロパティファイルを読み込む方法


外部のAPIサービスを利用した開発を行うときに、アクセスキーとアクセストークンを求められる場合があります。

規模が小さいうちは、

String accessKey="hoge"; //アクセスキー
String accessSecret="fuga"; //アクセストークン

とソースコードにベタ打ちするのも一つの手段ではありますが、アプリケーションの規模が大きくなってくるとやはり外部の値はプロパティファイルにもたせて管理したくなります。

そこで、今回はSpring Bootの環境下で、プロパティファイルを読み込むような実装の手順についてまとめてみます。

1.src/main/resourcesにプロパティファイルを配置

src/main/resources下に読み込みたいプロパティファイルを配置します。

awesome.properties

awesome.accessKey=thisisaccesskey9876
awesome.accessSecret=thisisaccesssecrettoken1234

2.Springの@PropertySourceアノテーションで読み込み

Spring Bootでプロパティファイルの値を読み込むには、@PropertySourceと@Valueを使用します。

また、APIのaccessKeyとaccessTokenをひとまとめにしたValueObjectを作成し、Bean Configurationで呼び出せるように設定してみます。

@Configuration
@PropertySource(value = "classpath:awesome.properties")
public class AwsSESConfig {

  @Value("${awesome.accessKey}")
  private String accessKey;

  @Value("${awesome.accessSecret}")
  private String accessSecret;

  @Bean
  public AwesomeAPIConfig awesomeAPIConfig {
    return new AwesomeAPIToken(accessKey,accessSecret);
  }
}

ValueObject


public class AwesomeAPIConfig {

  private String accessKey;
  private String accessSecret;

  public AwesomeAPIConfig(String key,String secret){
    this.accessKey = key;
    this.accessSecret = secret;
  }

  public String getAccessKey(){
    return accessKey;
  }

  public String getAccessSecret(){
    return accessSecret;
  }

}

これで、APIのアクセストークンとシークレットキーの組をSpringのServiceから@Autowiredで呼べるようになります。


@Service
public class SomeService {
  @Autowired
  private AwesomeAPIConfig config;

  public void doSomething(){
    //config.getAccessKey() などを使用して外部のAPIを叩く処理を記述します
  }
}

githubに外部APIのアクセスキーなどを公開したくないときは

github上で自分のリポジトリを管理している場合、publicリポジトリに外部APIのアクセスキー・アクセストークンを記述したソースを残すことはセキュリティ上好ましくありません。

ソースにベタ打ちする弊害が、ここでも出てくるわけですね。

企業のシステム開発であればだいたいPrivateリポジトリで管理するのでさしたる問題はありませんが、個人のポートフォリオとしてソースコードを公開する場合などに困ったことになります。

というわけで、githubに外部APIのアクセスキーを公開したくない場合に取るべき方法について説明します。

default.propertiesなどを作って構造だけ書く

必要な構造のみをawesome.default.propertiesなど、名前を変えて記述します。

構造は同じですが、もちろん値はダミーにしておくことに注意しましょう。

awesome.accessKey=*********
awesome.accessSecret=********

コミットする場合はこのdefault.propertiesのみをコミットします。

本体を.gitignoreで無視する

ローカルにある、実体のpropertiesファイルを.gitignoreに追加してコミットされないようにします。

本来の値は、secret gistとかで管理しましょう。

例えば他の端末で開発する場合には、ソースコードをクローンし、その後awesome.default.propertiesをawesome.propertiesという名前でコピーし、secret gistなどから本来のアクセスキーをコピペします。

このようにすることで、アクセスキーなどに変更による余計なgitの差分を発生させずに、複数端末で開発を行うことができます。