😹

recordとapplication.properties(yaml)を使って隠蔽したい値を使ってみた

2024/03/23に公開

はじめに

DB接続用のusernameやpasswordなどの値をapplication.properties(yaml)に書くと思います。
今回、個人開発ではJWTトークンを使って認証周りを実装するにあたり、SignInKey取得のためのdecodeSecretKeyをどこに置くかで迷っていました。
平文でapplication.properties(yaml)に置くのに抵抗があったのと、@Valueを単純に使うよりもRecordを使った方がメリットが多そうだったので、今回この記事を書きました!

TL;DR

  1. recordクラスの作成
    • @ConfigurationProperties(“xxx”)をclassレベルに付与
  2. mainメソッドがあるファイルのclassレベルに@EnableConfigurationProperties(hoge.class)を付与
    • ①で作成したrecordクラスをアノテーションの引数に指定
  3. (任意)application.propertiesとは別のyyy.propertiesファイルを作成
    • {prefixで指定した値}.${Recordのフィールド名}=zzzを設定
  4. application.propertiesに「{prefixで指定した値}.${Recordのフィールド名}=zzz」を入力
    • ③で別のファイルを作成している場合は、spring.config.import=optional:{作成したファイル名.properties}を先頭に書く
      • 各値は${}の形式で値を使用する

開発環境

  • PC
    • MacBook Pro
    • macOS(Sonoma)
  • Other
    • JDK Version
      • 17.0.6
    • Spring Boot Version
      • 3.0.2

メリ・デメ

メリット

  1. プロパティ名を変更したい場合など、変更が楽
  2. UT作成が簡単


VS CodeやIntelliJなどIDEのrefactor機能を使えば、recordであればフィールド名の変更で確実に使用箇所を直してくれる。
@Valueを使用する場合、keyの文字列を指定するのでCtrl(Cmd) + shift + Fで、テストコード含めて確認する必要がある。

 // sample.hogeを使用している箇所全て直っているか不安
  @Value("${sample.hoge}") 
  private String hoge;


こちらの記事にて紹介してるのでぜひ!

デメリット

  1. application.propertiesに直接書けば良ので、使い方次第で冗長

実装方法

1) recordクラスの作成

  • フィールド名は任意
  • @ConfigurationPropertiesをclassレベルに付与
SampleConfigProperties.java
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties("sample")
public record SampleConfigProperties(String hoge) {
}
  • @ConfigurationProperties("sample")
    • "sample"はprefixとなり、"hoge"がプロパティになる
      • sample.hogeのイメージ(後ほど詳しく解説します)

もし@ConfigurationPropertiesを詳しく知りたい方はこちら
https://qiita.com/cfg17771855/items/905da3100ae99c5197f0

2) @EnableConfigurationProperties(hoge.class)を付与

  • mainメソッドがあるファイルのclassレベルに@EnableConfigurationProperties(hoge.class)を付与
  • @ConfigurationPropertiesを付けたクラスを、@Configurationクラスに@EnableConfigurationPropertiesアノテーションで指定してBeanに登録する。
    • ちなみに、@SpringBootApplicationアノテーションの@SpringBootConfigurationの中に@Configurationが含まれてます
SampleAppApplication.java
@EnableConfigurationProperties(NoteTakingAppConfigProperties.class)
public class SampleAppApplication {
  public static void main(String[] args) {
  SpringApplication.run(SampleAppApplication.class, args);
 }
}

3) (任意)application.propertiesとは別のpropertiesファイルを作成

  • 1) Recordクラスの作成でrecordクラスに設定したprefixとフィールド名を使用する
  • 最終的にapplication.propertiesに直接DB接続用の値などを書かなくてもいいようにしたい場合にこちらがおすすめ
secrets.properties
sample.hoge=hogehoge
DB_USER=root
DB_PASSWORD=password
  • ちなみに、ファイル名はなんでも良い(foo.propertiesでもbar.propertiesとか)
  • SampleConfigProperties.javaのhogeフィールドに"hogehoge"を代入

4) application.propertiesの修正

  • 3) (任意)application.propertiesとは別のpropertiesファイルを作成をしてない場合
    • 1) recordクラスの作成でrecordクラスに設定したprefixとフィールド名を使用し、値を定義
application.properties
sample.hoge=hogehoge
  • 3) (任意)application.propertiesとは別のpropertiesファイルを作成をしている場合
    • spring.config.import=optional:{作成したファイル名.properties}を先頭に挿入
    • recordクラス以外の値(DB接続用の値など)は${}で書く
      • 例)${DB_USER}
application.properties
spring.config.import=optional:secrets.properties
spring.datasource.username=${DB_USER}
spring.datasource.password=${DB_PASSWORD}

まとめ

Lombokを使っているとほぼほぼ使うことが少ないrecordをこんな形で使えるのは知りませんでした。。
筆者はapplication.propertiesとは別のpropertiesファイルを作成し、.gitignoreファイルで作成したpropertiesファイルを指定することでGitHubなどの公開したくない情報を隠蔽しています!
より良い実装やご指摘などがあれば、お気軽にコメントでお願いします🙏

GitHubで編集を提案

Discussion