😹
recordとapplication.properties(yaml)を使って隠蔽したい値を使ってみた
はじめに
DB接続用のusernameやpasswordなどの値をapplication.properties(yaml)
に書くと思います。
今回、個人開発ではJWTトークンを使って認証周りを実装するにあたり、SignInKey取得のためのdecodeSecretKeyをどこに置くかで迷っていました。
平文でapplication.properties(yaml)
に置くのに抵抗があったのと、@Valueを単純に使うよりもRecordを使った方がメリットが多そうだったので、今回この記事を書きました!
TL;DR
-
recordクラスの作成
-
@ConfigurationProperties(“xxx”)
をclassレベルに付与
-
-
mainメソッドがあるファイルのclassレベルに
@EnableConfigurationProperties(hoge.class)
を付与- ①で作成したrecordクラスをアノテーションの引数に指定
-
(任意)
application.properties
とは別のyyy.properties
ファイルを作成-
{prefixで指定した値}.${Recordのフィールド名}=zzz
を設定
-
-
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
- JDK Version
メリ・デメ
メリット
- プロパティ名を変更したい場合など、変更が楽
- UT作成が簡単
①
VS CodeやIntelliJなどIDEのrefactor機能を使えば、recordであればフィールド名の変更で確実に使用箇所を直してくれる。
@Value
を使用する場合、keyの文字列を指定するのでCtrl(Cmd) + shift + F
で、テストコード含めて確認する必要がある。
// sample.hogeを使用している箇所全て直っているか不安
@Value("${sample.hoge}")
private String hoge;
②
こちらの記事にて紹介してるのでぜひ!
デメリット
-
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
のイメージ(後ほど詳しく解説します)
-
- "sample"はprefixとなり、"hoge"がプロパティになる
もし@ConfigurationProperties
を詳しく知りたい方はこちら
@EnableConfigurationProperties(hoge.class)
を付与
2) - mainメソッドがあるファイルのclassレベルに
@EnableConfigurationProperties(hoge.class)
を付与 -
@ConfigurationProperties
を付けたクラスを、@Configuration
クラスに@EnableConfigurationProperties
アノテーションで指定してBeanに登録する。- ちなみに、@SpringBootApplicationアノテーションの
@SpringBootConfiguration
の中に@Configuration
が含まれてます
- ちなみに、@SpringBootApplicationアノテーションの
SampleAppApplication.java
@EnableConfigurationProperties(NoteTakingAppConfigProperties.class)
public class SampleAppApplication {
public static void main(String[] args) {
SpringApplication.run(SampleAppApplication.class, args);
}
}
application.properties
とは別のpropertiesファイルを作成
3) (任意)- 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"を代入
application.properties
の修正
4) -
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などの公開したくない情報を隠蔽しています!
より良い実装やご指摘などがあれば、お気軽にコメントでお願いします🙏
Discussion