Spring Boot YAML vs Properties:設定ファイル比較と面接質問 2026年版

Spring Boot 4.1のapplication.ymlとapplication.propertiesを比較します。構文、1ファイルでの複数プロファイル、優先順位のルール、Jasyptによる暗号化、面接で問われる設定の質問を解説します。

Spring Boot YAML vs Properties:設定ファイル比較と面接質問 2026年版

Spring Bootはapplication.yml(YAML)とapplication.properties(Properties)の2つの設定形式を標準でサポートしています。現行のリリースラインであるSpring Boot 4.1では、どちらの形式も同じEnvironmentに読み込まれ、バインドの仕組みも共通です。違いは構文、いくつかの読み込みルール、そして両方のファイルが同じ場所にある場合の挙動にあります。

階層の深い設定や複数プロファイルを扱うプロジェクトにはYAML、フラットでシンプルな設定やYAMLに不慣れなチームにはPropertiesが向いています。ただし両形式は完全に同等ではありません。@PropertySourceで読み込めるのはPropertiesだけで、同じ場所に両方のファイルがある場合は.propertiesの値が優先されます。

Spring Boot 4.1におけるYAMLとPropertiesの比較表

機能YAMLProperties
ネストした設定ネイティブな階層構造ドット記法
1ファイルでの複数プロファイル--- 区切り#--- または !--- 区切り
リストの記法YAMLのネイティブ配列インデックス記法 [0]、[1]
コメント任意の行で #任意の行で # または !
@PropertySourceでの読み込み不可可能
同じ場所に両方のファイルがある場合上書きされる優先される
学習コストインデントに依存最小限

最後の2行は、面接で候補者が見落としやすいポイントです。Spring Boot公式リファレンスの外部設定の章には、YAMLファイルは@PropertySourceや@TestPropertySourceで読み込めないこと、application.propertiesとapplication.ymlが同じ場所にある場合は.propertiesの値が優先されることが明記されています。公式の推奨は、アプリケーション全体で1つの形式に統一することです。

基本構文の比較

PropertiesファイルとYAMLファイルの最も基本的な違いは、その構文にあります。Propertiesファイルはフラットなキー・バリュー形式を採用し、YAMLは階層構造を表現できます。

Propertiesファイルの構文

properties
# application.properties
server.port=8080
server.servlet.context-path=/api

spring.datasource.url=jdbc:postgresql://localhost:5432/mydb
spring.datasource.username=admin
spring.datasource.password=secret
spring.datasource.driver-class-name=org.postgresql.Driver

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true

YAMLファイルの構文

yaml
# application.yml
server:
  port: 8080
  servlet:
    context-path: /api

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/mydb
    username: admin
    password: secret
    driver-class-name: org.postgresql.Driver
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        format_sql: true

YAML形式では、インデントによる階層構造が視覚的に明確であり、関連する設定項目がグループ化されます。一方、Propertiesファイルはシンプルで、各行が独立しているため、特定の設定を検索しやすいという利点があります。

プロファイル管理の違い

Spring Bootのプロファイル機能は、YAMLとPropertiesのどちらでも、プロファイルごとのファイルと1ファイル内の複数ドキュメントの両方に対応しています。

Propertiesでのプロファイル管理

properties
# application.properties(共通設定)
spring.application.name=my-application
logging.level.root=INFO

# application-dev.properties
server.port=8080
spring.datasource.url=jdbc:postgresql://localhost:5432/devdb
logging.level.com.example=DEBUG

# application-prod.properties
server.port=80
spring.datasource.url=jdbc:postgresql://prod-db:5432/proddb
logging.level.com.example=WARN

YAMLでのプロファイル管理

yaml
# application.yml
spring:
  profiles:
    active: dev

---
spring:
  config:
    activate:
      on-profile: dev
server:
  port: 8080
logging:
  level:
    root: DEBUG

---
spring:
  config:
    activate:
      on-profile: prod
server:
  port: 80
logging:
  level:
    root: WARN

YAMLの---セパレータを使用することで、単一ファイル内で複数のプロファイル設定を定義できます。これはファイル数を減らし、設定の全体像を把握しやすくする利点があります。

Propertiesファイルも同じ複数ドキュメント構成に対応しています。#---(または!---)だけを含む行がファイルをドキュメントに分割します。

properties
# application.properties
spring.profiles.active=dev
#---
spring.config.activate.on-profile=dev
server.port=8080
logging.level.root=DEBUG
#---
spring.config.activate.on-profile=prod
server.port=80
logging.level.root=WARN

区切り行の先頭に空白を入れてはならず、ハイフンはちょうど3つです。Spring Boot 2.4以降、どちらの形式でも旧来のspring.profilesに代わってspring.config.activate.on-profileプロパティを使用します。

面接の落とし穴

「Propertiesファイルではプロファイルごとにファイルを分ける必要がある」はよくある誤答です。複数ドキュメントの.propertiesファイルはSpring Boot 2.4から使用できます。YAMLの本当の制約は逆方向にあり、@PropertySourceでは読み込めません。

プロファイルの有効化、プロファイルグループ、@Profile付きBeanについてはプロファイルと環境の面接対策モジュールで練習できます。

複雑なデータ構造の表現

リストやマップなどの複雑なデータ構造を扱う場合、YAMLの表現力が際立ちます。

リスト構造の比較

properties
# application.properties - リストの表現
app.allowed-origins[0]=http://localhost:3000
app.allowed-origins[1]=http://localhost:8080
app.allowed-origins[2]=https://example.com

app.security.roles[0].name=ADMIN
app.security.roles[0].permissions[0]=READ
app.security.roles[0].permissions[1]=WRITE
app.security.roles[0].permissions[2]=DELETE
app.security.roles[1].name=USER
app.security.roles[1].permissions[0]=READ
yaml
# application.yml - リストの表現
app:
  allowed-origins:
    - http://localhost:3000
    - http://localhost:8080
    - https://example.com

  security:
    roles:
      - name: ADMIN
        permissions:
          - READ
          - WRITE
          - DELETE
      - name: USER
        permissions:
          - READ

複雑なネスト構造において、YAMLの可読性は明らかに優れています。

設定プロパティクラスとの統合

java
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;

@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {

    private List<String> allowedOrigins;
    private Security security;

    public static class Security {
        private List<Role> roles;

        public static class Role {
            private String name;
            private List<String> permissions;

            // Getters and Setters
            public String getName() { return name; }
            public void setName(String name) { this.name = name; }
            public List<String> getPermissions() { return permissions; }
            public void setPermissions(List<String> permissions) { 
                this.permissions = permissions; 
            }
        }

        // Getters and Setters
        public List<Role> getRoles() { return roles; }
        public void setRoles(List<Role> roles) { this.roles = roles; }
    }

    // Getters and Setters
    public List<String> getAllowedOrigins() { return allowedOrigins; }
    public void setAllowedOrigins(List<String> allowedOrigins) { 
        this.allowedOrigins = allowedOrigins; 
    }
    public Security getSecurity() { return security; }
    public void setSecurity(Security security) { this.security = security; }
}

環境変数とプレースホルダー

両形式とも、環境変数やプレースホルダーの使用をサポートしています。

properties
# application.properties
spring.datasource.url=${DATABASE_URL:jdbc:postgresql://localhost:5432/defaultdb}
spring.datasource.username=${DB_USER:root}
spring.datasource.password=${DB_PASSWORD}

app.api-key=${API_KEY:}
app.feature.enabled=${FEATURE_FLAG:false}
yaml
# application.yml
spring:
  datasource:
    url: ${DATABASE_URL:jdbc:postgresql://localhost:5432/defaultdb}
    username: ${DB_USER:root}
    password: ${DB_PASSWORD}

app:
  api-key: ${API_KEY:}
  feature:
    enabled: ${FEATURE_FLAG:false}

spring.config.importによる外部設定の読み込み

spring.config.importプロパティを使うと、デフォルトのsrc/main/resources以外の場所から設定を読み込めます。optional:プレフィックスを付けると、ファイルが存在しなくても起動は失敗しません。ローカル開発ではデフォルト値で動かし、本番では設定サーバーから設定を取得する構成がこれで実現できます。設定ファイルに関する練習問題はapplication.propertiesとYAMLの面接対策モジュールにあります。

yaml
# application.yml - インポート機能
spring:
  config:
    import:
      - optional:file:./config/external.yml
      - optional:configserver:http://config-server:8888
      - classpath:additional-config.yml

---
spring:
  config:
    activate:
      on-cloud-platform: kubernetes
    import:
      - optional:configtree:/etc/config/
java
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.bind.ConstructorBinding;
import java.util.List;

@ConfigurationProperties(prefix = "app.mail")
public record MailProperties(
    String host,
    int port,
    String username,
    String password,
    List<String> recipients
) {
    public MailProperties {
        if (port <= 0 || port > 65535) {
            throw new IllegalArgumentException("Invalid port number");
        }
    }
}

パフォーマンスと起動時間

PropertiesファイルとYAMLファイルの解析パフォーマンスには、実質的な差異はほとんどありません。Spring Bootは起動時に設定ファイルを一度だけ読み込み、その後はキャッシュされた値を使用します。

java
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;

@SpringBootApplication
@ConfigurationPropertiesScan
public class Application {

    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        SpringApplication.run(Application.class, args);
        long endTime = System.currentTimeMillis();
        System.out.println("Startup time: " + (endTime - startTime) + "ms");
    }
}

面接でよく聞かれる質問

Q1: YAMLとPropertiesの主な違いは何ですか?

YAMLは階層構造をインデントで表現でき、複雑なデータ構造(リスト、マップ)の記述が容易です。一方、Propertiesはフラットなキー・バリュー形式で、シンプルな設定に適しています。1ファイルでの複数プロファイル定義は、YAML(---)でもProperties(#---)でも可能です。実際に差が出るのは、@PropertySourceで読み込めるのがPropertiesだけである点と、同じ場所に両方のファイルがある場合に.propertiesが優先される点です。

Q2: 設定ファイルの優先順位を説明してください。

Spring Bootは複数のソースから決まった順序で設定を読み込み、優先度の高いソースが低いソースを上書きします(公式の一覧を簡略化したもので、公式にはJNDI、サーブレットパラメータ、テスト用アノテーションも含まれます)。

  1. コマンドライン引数(--server.port=9000)
  2. SPRING_APPLICATION_JSON(環境変数またはシステムプロパティに埋め込んだJSON)
  3. Javaシステムプロパティ(-Dserver.port=9000)
  4. OS環境変数(SERVER_PORT=9000)
  5. 設定データファイル(application.yml、application.propertiesとそれぞれのプロファイル別ファイル)
  6. @PropertySourceアノテーション
  7. SpringApplication.setDefaultPropertiesによるデフォルトプロパティ

5番目の中にはもう1段階の順序があります。プロファイル別ファイルは汎用ファイルを上書きし、パッケージされたjarの外にあるファイルはjar内のファイルを上書きします。同じ場所では.propertiesが.ymlを上書きします。application.ymlに設定した値が黙って無視される理由(隣に残ったapplication.properties)を説明できる候補者は、実際のデバッグ経験を示せます。

Q3: @Value と @ConfigurationProperties の違いは?

java
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class ValueExample {
    
    @Value("${app.name}")
    private String appName;
    
    @Value("${app.timeout:5000}")
    private int timeout;
    
    @Value("#{${app.map}}")
    private Map<String, String> configMap;
}

@Valueは個別のプロパティ注入に適し、@ConfigurationPropertiesは関連するプロパティのグループ化、型安全性、バリデーション機能を提供します。

Q4: 機密情報を含む設定値はどのように扱いますか?

シークレットをバージョン管理にコミットしてはいけません。基本は環境変数の参照です。

yaml
# application.yml - reference environment variable
spring:
  datasource:
    password: ${DB_PASSWORD}

本番システムでは、Spring Cloud Config ServerやHashiCorp Vaultでシークレットを一元管理します。機密性の高いエンドポイントの保護についてはActuator監視ガイドで解説しています。

Q5: Jasyptとは何で、Spring Bootのプロパティをどのように暗号化しますか?

Jasypt Spring Bootは、Environmentの構築時にENC(...)で囲まれた値を復号します。そのため暗号化したシークレットをapplication.ymlやapplication.propertiesに置いたまま、通常の値と同じようにバインドできます。

properties
# application.properties
spring.datasource.password=ENC(nrmZtkF7T0kjG/VodDvBw93Ct8EgjCA+)
bash
# The master password is supplied at runtime, never committed
java -Djasypt.encryptor.password=$JASYPT_MASTER_KEY -jar app.jar

必須プロパティはjasypt.encryptor.passwordだけで、デフォルトのアルゴリズムはPBEWITHHMACSHA512ANDAES_256です。形式による違いはなく、同じENC(...)の値がYAMLでもPropertiesでも動作します。

シニアの候補者を見分けるのは次の回答です。Jasyptはシークレットを取り除くのではなく、移動させるだけです。マスターパスワードを持つ者はリポジトリ内のすべての値を復号でき、マスターパスワードをローテーションするにはすべての値を再暗号化する必要があります。Vaultやクラウドのシークレットマネージャーはアクセス制御、監査、ローテーションを提供しますが、Jasyptにはそれがありません。

アップグレード前に互換性を確認

4.0.x系のスターター(4.0.4、2026年1月)はJava 17とSpring Boot 3.5以降を要件としており、READMEにはSpring Boot 4の記載がありません。基盤となるJasyptライブラリは2019年5月の1.9.3以降リリースがありません。JasyptベースのプロジェクトをSpring Boot 4へ移行する前に、ブランチでスターターの動作を検証してください。

Spring Bootの面接対策はできていますか?

インタラクティブなシミュレーター、flashcards、技術テストで練習しましょう。

ベストプラクティス

1. 一貫性の維持

プロジェクト内で一つの形式に統一することを推奨します。混在させると、設定の管理が複雑になります。同じ場所にapplication.propertiesとapplication.ymlがあると.propertiesの値が優先されるため、YAML側に書いた値が黙って上書きされます。

2. 環境固有設定の分離

yaml
# application.yml - 共通設定のみ
spring:
  application:
    name: my-service
  profiles:
    active: ${SPRING_PROFILES_ACTIVE:dev}

3. 機密情報の管理

yaml
# 機密情報は環境変数から取得
spring:
  datasource:
    password: ${DB_PASSWORD}

app:
  jwt:
    secret: ${JWT_SECRET}

4. 起動時のバリデーション

java
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Positive;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;

@Validated
@ConfigurationProperties(prefix = "app")
public class ValidatedAppProperties {

    @NotBlank(message = "Application name is required")
    private String name;

    @Positive(message = "Timeout must be positive")
    private int timeout;

    // Getters and Setters
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public int getTimeout() { return timeout; }
    public void setTimeout(int timeout) { this.timeout = timeout; }
}

参考資料

今すぐ練習を始めましょう!

面接シミュレーターと技術テストで知識をテストしましょう。

Spring Boot設定ファイルの選択で押さえるべきポイント

  • YAMLは共通のプレフィックスを持つ設定の重複を減らし、リストも簡潔に書けます
  • Propertiesはフラットな設定や、YAMLの構文に不慣れなチームに向いています
  • Spring Boot 4.1は@ConfigurationPropertiesのバインドとバリデーションにおいて両形式を同等に扱います
  • 1ファイルで複数プロファイルを定義できるのは両形式とも同じです。YAMLは---、Propertiesは#---を使います
  • 同じ場所に両方のファイルがあると.propertiesが優先され、@PropertySourceで読み込めるのはPropertiesだけです
  • 設定の優先順位は決まっており、コマンドライン引数が環境変数を、環境変数がファイルの設定を上書きします
  • 機密情報は環境変数かシークレット管理システムに置きます。JasyptのENC(...)はシークレットをマスターパスワードへ移すだけです
  • 本番環境ではspring.config.importで外部ソースから設定を読み込みます

面接では、両形式の特徴を理解し、実際のユースケースに応じた選択ができることを示すことが求められます。

今日のチャレンジ

Spring Boot のバグを見つけられますか

実際のコード、隠れたバグ、1日1回。アカウントなしで試せます。

Anthony Fillion-Maillet

執筆

Anthony Fillion-Maillet

SharpSkill 創業者

10 年以上フルスタック開発に携わっています。SharpSkill を運営し、ここで公開される内容に責任を負っています。

2026年10月27日 更新

共有

関連記事