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

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の比較表
| 機能 | YAML | Properties |
|---|---|---|
| ネストした設定 | ネイティブな階層構造 | ドット記法 |
| 1ファイルでの複数プロファイル | --- 区切り | #--- または !--- 区切り |
| リストの記法 | YAMLのネイティブ配列 | インデックス記法 [0]、[1] |
| コメント | 任意の行で # | 任意の行で # または ! |
@PropertySourceでの読み込み | 不可 | 可能 |
| 同じ場所に両方のファイルがある場合 | 上書きされる | 優先される |
| 学習コスト | インデントに依存 | 最小限 |
最後の2行は、面接で候補者が見落としやすいポイントです。Spring Boot公式リファレンスの外部設定の章には、YAMLファイルは@PropertySourceや@TestPropertySourceで読み込めないこと、application.propertiesとapplication.ymlが同じ場所にある場合は.propertiesの値が優先されることが明記されています。公式の推奨は、アプリケーション全体で1つの形式に統一することです。
基本構文の比較
PropertiesファイルとYAMLファイルの最も基本的な違いは、その構文にあります。Propertiesファイルはフラットなキー・バリュー形式を採用し、YAMLは階層構造を表現できます。
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=trueYAMLファイルの構文
# 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: trueYAML形式では、インデントによる階層構造が視覚的に明確であり、関連する設定項目がグループ化されます。一方、Propertiesファイルはシンプルで、各行が独立しているため、特定の設定を検索しやすいという利点があります。
プロファイル管理の違い
Spring Bootのプロファイル機能は、YAMLとPropertiesのどちらでも、プロファイルごとのファイルと1ファイル内の複数ドキュメントの両方に対応しています。
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=WARNYAMLでのプロファイル管理
# 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: WARNYAMLの---セパレータを使用することで、単一ファイル内で複数のプロファイル設定を定義できます。これはファイル数を減らし、設定の全体像を把握しやすくする利点があります。
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の表現力が際立ちます。
リスト構造の比較
# 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# 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の可読性は明らかに優れています。
設定プロパティクラスとの統合
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; }
}環境変数とプレースホルダー
両形式とも、環境変数やプレースホルダーの使用をサポートしています。
# 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}# 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の面接対策モジュールにあります。
# 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/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は起動時に設定ファイルを一度だけ読み込み、その後はキャッシュされた値を使用します。
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、サーブレットパラメータ、テスト用アノテーションも含まれます)。
- コマンドライン引数(
--server.port=9000) SPRING_APPLICATION_JSON(環境変数またはシステムプロパティに埋め込んだJSON)- Javaシステムプロパティ(
-Dserver.port=9000) - OS環境変数(
SERVER_PORT=9000) - 設定データファイル(
application.yml、application.propertiesとそれぞれのプロファイル別ファイル) @PropertySourceアノテーションSpringApplication.setDefaultPropertiesによるデフォルトプロパティ
5番目の中にはもう1段階の順序があります。プロファイル別ファイルは汎用ファイルを上書きし、パッケージされたjarの外にあるファイルはjar内のファイルを上書きします。同じ場所では.propertiesが.ymlを上書きします。application.ymlに設定した値が黙って無視される理由(隣に残ったapplication.properties)を説明できる候補者は、実際のデバッグ経験を示せます。
Q3: @Value と @ConfigurationProperties の違いは?
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: 機密情報を含む設定値はどのように扱いますか?
シークレットをバージョン管理にコミットしてはいけません。基本は環境変数の参照です。
# 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に置いたまま、通常の値と同じようにバインドできます。
# application.properties
spring.datasource.password=ENC(nrmZtkF7T0kjG/VodDvBw93Ct8EgjCA+)# 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. 環境固有設定の分離
# application.yml - 共通設定のみ
spring:
application:
name: my-service
profiles:
active: ${SPRING_PROFILES_ACTIVE:dev}3. 機密情報の管理
# 機密情報は環境変数から取得
spring:
datasource:
password: ${DB_PASSWORD}
app:
jwt:
secret: ${JWT_SECRET}4. 起動時のバリデーション
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リファレンス:Externalized Configuration:プロパティソースの順序、
#---による複数ドキュメントのPropertiesファイル、YAMLに対する.propertiesの優先、@PropertySourceでYAMLを読み込めないこと - Spring Bootのリリース:現行のGAリリースは4.1.2(2026年10月)
- Jasypt Spring Boot README:
ENC(...)構文、デフォルトのアルゴリズム、Spring Boot 3.5以降の要件
今すぐ練習を始めましょう!
面接シミュレーターと技術テストで知識をテストしましょう。
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-MailletSharpSkill 創業者
10 年以上フルスタック開発に携わっています。SharpSkill を運営し、ここで公開される内容に責任を負っています。
2026年10月27日 更新
共有
関連記事

2026年フリーランスJava Spring Boot開発者の仕事:案件の探し方、単価相場、面接対策
2026年のSpring Bootフリーランス案件市場を解説。欧州の日額単価相場、案件の見つけ方、技術面接の準備方法まで網羅した実践ガイド。

2026年のJava Spring Boot開発者の求人動向:求人の探し方、給与相場、面接対策
2026年のJava Spring Boot開発者求人の探し方、給与相場、技術要件、リモートワーク動向、面接対策を解説します。

Spring Boot Observability 2026年完全ガイド: OpenTelemetry、分散トレーシング、面接対策
Spring Boot 3.4のObservation API、OpenTelemetryとの連携、分散トレーシングの実装方法を解説。Micrometer TracingとOTLPエクスポートの設定、実践的な面接質問も網羅。