1. 序章

YAMLは、構成ファイルで使用される人間にわかりやすい表記法です。 Spring Boot のプロパティファイルよりも、このデータのシリアル化を好むのはなぜですか? 読みやすさと繰り返しの削減に加えて、YAMLはデプロイメントのコードとして構成を記述するのに最適な言語です。

同様に、Spring DevOps にYAMLを使用すると、 12 Factor Authenticator が推奨するように、環境での構成変数の保存が容易になります。

このチュートリアルでは、Spring YAMLとプロパティファイルを比較して、一方を他方よりも使用する主な利点を確認します。 ただし、プロパティファイルの構成よりもYAMLを選択することは、個人的な好みの決定である場合があることを忘れないでください。

2. YAML表記

YAMLは、「 YAML Ai n’tMarkupLanguage」の再帰的頭字語の略です。 次の特性を提供します。

  • より明確で人間に優しい
  • 階層構成データに最適
  • マップ、リスト、スカラータイプなどの拡張機能をサポートします

これらの機能により、YAMLはSpring構成ファイルの完璧なコンパニオンになります。  YAMLを使い始めた人のために、ここで注意が必要です。インデントのルールがあるため、最初は少し面倒な作業になる可能性があります。

それがどのように機能するか見てみましょう!

3. SpringYAML構成

前のセクションで述べたように、YAMLは構成ファイル用の並外れたデータ形式です。 はるかに読みやすく、プロパティファイルよりも拡張された機能を提供します。 したがって、プロパティファイルの構成よりもこの表記を推奨することは理にかなっています。 さらに、バージョン1.2以降、YAMLはJSONのスーパーセットです。

さらに、Springでは、アーティファクトの外部に配置された構成ファイルが、パッケージ化されたjar内の構成ファイルをオーバーライドします。 Spring構成のもう1つの興味深い機能は、実行時に環境変数を割り当てる可能性です。 これは、DevOpsデプロイメントにとって非常に重要です。

スプリングプロファイルを使用すると、環境を分離して、さまざまなプロパティを適用できます。 YAMLは、同じファイルに複数のプロファイルを含める可能性を追加します。

注:この機能は、SpringBoot2.4.0のプロパティファイルでもサポートされています。

この場合、展開の目的で、テスト、開発、本番の3つがあります。

spring:
  profiles:
    active:
    - test

---

spring:
  config:
    activate:
      on-profile: test
name: test-YAML
environment: testing
servers:
  - www.abc.test.com
  - www.xyz.test.com
  
---

spring:
  config:
    activate:
      on-profile: prod
name: prod-YAML
environment: production
servers:
  - www.abc.com
  - www.xyz.com
    
---

spring:
  config:
    activate:
      on-profile: dev
name: ${DEV_NAME:dev-YAML}
environment: development
servers:
  - www.abc.dev.com
  - www.xyz.dev.com

注:2.4.0より前のバージョンのSpring Bootを使用する場合は、ここで使用した spring.config.activate.on-profile ではなく、spring.profilesプロパティを使用する必要があります。 。

次に、デフォルトでテスト環境を割り当てる spring.profiles.activeプロパティを確認しましょう。 ソースコードを再構築せずに、さまざまなプロファイルを使用してアーティファクトを再デプロイできます。

Springのもう1つの興味深い機能は、環境変数を介してプロファイルを有効にできることです。

export SPRING_PROFILES_ACTIVE=dev

この環境変数の関連性は、テストセクションで確認できます。 最後に、環境から値を直接割り当てるYAMLプロパティを構成できます。

name: ${DEV_NAME:dev-YAML}

環境変数が構成されていない場合は、デフォルト値dev-YAMLが使用されていることがわかります。

4. 繰り返しと読みやすさの削減

YAMLの階層構造は、構成プロパティファイルの上位レベルを減らす方法を提供します。 例を使って違いを見てみましょう。

component:
  idm:
    url: myurl
    user: user
    password: password
    description: >
      this should be a long 
      description
  service:
    url: myurlservice
    token: token
    description: >
      this should be another long 
      description

プロパティファイルを使用すると、同じ構成が冗長になります。

component.idm.url=myurl
component.idm.user=user
component.idm.password=password
component.idm.description=this should be a long \
                          description
component.service.url=myurlservice
component.service.token=token
component.service.description=this should be another long \ 
                              description

YAMLの階層的な性質により、読みやすさが大幅に向上します。 繰り返しを避けることだけでなく、よく使用されるインデントは、構成の内容と目的を完全に説明します。 YAMLでは、バックスラッシュ\が付いたプロパティファイルの場合と同様に、コンテンツを>文字で複数行に分割することができます。

5. リストと地図

YAMLとプロパティファイルを使用してリストとマップを構成できます。

値を割り当ててリストに保存するには、次の2つの方法があります。

servers:
  - www.abc.test.com
  - www.xyz.test.com
  
external: [www.abc.test.com, www.xyz.test.com]

どちらの例でも同じ結果が得られます。 プロパティファイルを使用した同等の構成は、読みにくくなります。

servers[0]=www.abc.test.com
servers[1]=www.xyz.test.com

external=www.abc.test.com, www.xyz.test.com

繰り返しますが、YAMLバージョンはより人間が読める形式で明確です。

同様に、マップを構成できます。

map:
  firstkey: key1
  secondkey: key2

6. テスト

それでは、すべてが期待どおりに機能しているかどうかを確認しましょう。 アプリケーションのログを確認すると、デフォルトで選択されている環境がテスト中であることがわかります。

2020-06-11 13:58:28.846  INFO 10720 --- [main] com.baeldung.yaml.MyApplication: ...
using environment:testing
name:test-YAML
servers:[www.abc.test.com, www.xyz.test.com]
external:[www.abc.test.com, www.xyz.test.com]
map:{firstkey=key1, secondkey=key2}
Idm:
   Url: myurl
   User: user
   Password: password
   Description: this should be a long description

Service:
   Url: myurlservice
   Token: token
   Description: this should be another long description

次の環境でDEV_NAMEを構成することにより、名前を上書きできます。

export DEV_NAME=new-dev-YAML

devプロファイルを使用してアプリケーションを実行すると、環境の名前が変わることがわかります。

2020-06-11 17:00:45.459  INFO 19636 --- [main] com.baeldung.yaml.MyApplication: ...
using environment:development
name:new-dev-YAML
servers:[www.abc.dev.com, www.xyz.dev.com]

SPRING_PROFILES_ACTIVE = prod を使用して、実稼働環境で実行してみましょう。

export SPRING_PROFILES_ACTIVE=prod

2020-06-11 17:03:33.074  INFO 20716 --- [main] ...
using environment:production
name:prod-YAML
servers:[www.abc.com, www.xyz.com]

7. 結論

このチュートリアルでは、プロパティファイルと比較したYAML構成の使用の複雑さについて説明しました。

YAMLは人間にやさしい機能を提供し、繰り返しを減らし、プロパティファイルバリアントよりも簡潔であることを示しました。

いつものように、コードはGitHubから入手できます。