Spring Boot YAML vs Properties: Yapılandırma Karşılaştırması ve Mülakat Soruları 2026

Spring Boot 4.1'de application.yml ve application.properties karşılaştırması: sözdizimi, çoklu profil dosyaları, öncelik kuralları, Jasypt ile şifrelenmiş gizli bilgiler ve mülakatlarda sorulan yapılandırma soruları.

Spring Boot YAML vs Properties yapılandırma karşılaştırması

Spring Boot iki yapılandırma formatını destekler: YAML (application.yml) ve Properties (application.properties). Her ikisi de aynı amaca hizmet eder, ancak sözdizimi, okunabilirlik ve belirli kullanım senaryolarında farklılık gösterir. Bu karşılaştırma, pratik farklılıkları analiz eder ve Spring Boot harici yapılandırma konusunda mülakatlarda karşılaşılan soruları ele alır.

Hızlı Karar Rehberi

Derin iç içe yapılandırma veya birden fazla profil içeren projeler için YAML tercih edilmelidir. Basit düz yapılandırmalar veya YAML sözdizimine aşina olmayan ekiplerle çalışırken Properties kullanılmalıdır.

Spring Boot Properties ve YAML: Bir Bakışta Farklar

Güncel sürüm hattı olan Spring Boot 4.1'de her iki format da aynı Environment nesnesini besler ve aynı şekilde bağlanır. Farklar sözdiziminde, birkaç yükleme kuralında ve iki dosya birlikte bulunduğunda ne olduğunda ortaya çıkar.

ÖzellikYAMLProperties
İç içe yapılandırmaDoğal hiyerarşiNokta gösterimi
Tek dosyada çoklu profil--- ayırıcısı#--- veya !--- ayırıcısı
Liste sözdizimiDoğal YAML dizileriİndeks gösterimi [0], [1]
YorumlarHerhangi bir satırda #Herhangi bir satırda # veya !
@PropertySource ile yüklenebilirHayırEvet
İki dosya aynı konumdaGeçersiz kılınırÖncelik kazanır
Öğrenme eğrisiGirintiye duyarlıMinimal

Adayların genellikle gözden kaçırdığı satırlar, @PropertySource ve aynı konumdaki iki dosyayla ilgili olanlardır. Spring Boot harici yapılandırma referansı, YAML dosyalarının @PropertySource veya @TestPropertySource ile yüklenemeyeceğini ve application.properties ile application.yml yan yana bulunduğunda .properties değerinin kazandığını belirtir. Resmi öneri, tüm uygulama için tek bir format seçmektir.

YAML ve Properties Arasındaki Sözdizimi Karşılaştırması

En belirgin fark, her formatın hiyerarşik veriyi nasıl temsil ettiğidir. Properties dosyaları her satırda nokta gösterimi kullanırken, YAML iç içe geçmeyi ifade etmek için girintileme kullanır.

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=${DB_PASSWORD}
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.show-sql=false

Eşdeğer YAML yapılandırması ilgili ayarları görsel olarak gruplar:

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

spring:
  datasource:
    url: jdbc:postgresql://localhost:5432/mydb
    username: admin
    password: ${DB_PASSWORD}
  jpa:
    hibernate:
      ddl-auto: validate
    show-sql: false

YAML, birden fazla özellik aynı öneki paylaştığında tekrarı azaltır. Properties dosyasında spring.datasource üç kez görünürken, YAML bunu bir kez tanımlar.

Spring Boot Yapılandırmasında Profil Yönetimi

Spring Boot profilleri, geliştirme, staging ve üretim ortamları için farklı yapılandırmalar sağlar. Her iki format da profile özgü dosyaları ve çoklu belge dosyalarını destekler.

Klasik yaklaşım her profil için bir dosya kullanır:

properties
# application-dev.properties
server.port=8080
spring.datasource.url=jdbc:h2:mem:devdb
logging.level.root=DEBUG

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

YAML, --- ayırıcısını kullanarak tek bir dosya içinde çoklu belge sözdizimini destekler:

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

Properties dosyaları da aynı çoklu belge düzenini destekler. Yalnızca #--- (veya !---) içeren bir satır dosyayı belgelere böler:

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

Ayırıcının önünde boşluk bulunmamalı ve ayırıcı tam olarak üç kısa çizgiden oluşmalıdır. Spring Boot 2.4'ten itibaren spring.config.activate.on-profile özelliği, her iki formatta da eski spring.profiles sözdiziminin yerini aldı.

Mülakat tuzağı

"Properties dosyaları her profil için ayrı dosya gerektirir" sık verilen yanlış bir cevaptır. Çoklu belge .properties dosyaları Spring Boot 2.4'ten beri mevcuttur. Asıl sınırlama tam tersine YAML'dadır: @PropertySource ile yüklenemez.

Profil aktivasyonu, profil grupları ve @Profile bean'leri profiller ve ortam mülakat modülünde çalışılabilir.

Listeler ve Karmaşık Veri Yapıları

YAML, listeleri ve iç içe yapıları temsil etmede mükemmeldir. Bu durum güvenlik kuralları, CORS eşlemeleri veya özel bean yapılandırmaları için önem taşır.

yaml
# application.yml
app:
  security:
    allowed-origins:
      - https://sharpskill.dev
      - https://api.sharpskill.dev
    cors:
      allowed-methods:
        - GET
        - POST
        - PUT
        - DELETE
    jwt:
      secret: ${JWT_SECRET}
      expiration-ms: 86400000

Properties eşdeğeri indeks gösterimi gerektirir:

properties
# application.properties
app.security.allowed-origins[0]=https://sharpskill.dev
app.security.allowed-origins[1]=https://api.sharpskill.dev
app.security.cors.allowed-methods[0]=GET
app.security.cors.allowed-methods[1]=POST
app.security.cors.allowed-methods[2]=PUT
app.security.cors.allowed-methods[3]=DELETE
app.security.jwt.secret=${JWT_SECRET}
app.security.jwt.expiration-ms=86400000

YAML dosyasına yeni bir origin eklemek bir satır eklemek anlamına gelir. Properties'te her mevcut indeks doğru kalmalı ve yeni giriş sıradaki indeks numarasını gerektirir.

Spring Boot mülakatlarında başarılı olmaya hazır mısın?

İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.

@ConfigurationProperties ile Tür Güvenli Yapılandırma

Spring Boot, yapılandırma değerlerini @ConfigurationProperties aracılığıyla Java sınıflarına bağlar. Her iki format da bu anotasyon ile aynı şekilde çalışır.

AppSecurityProperties.javajava
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List;

@ConfigurationProperties(prefix = "app.security")
public record AppSecurityProperties(
    List<String> allowedOrigins,
    CorsConfig cors,
    JwtConfig jwt
) {
    public record CorsConfig(List<String> allowedMethods) {}
    public record JwtConfig(String secret, long expirationMs) {}
}

Spring Boot esnek bağlama, farklı adlandırma kuralları arasında otomatik olarak dönüştürme yapar. app.security.allowed-origins özelliği, kaynağın YAML veya properties olmasından bağımsız olarak allowedOrigins'e bağlanır.

SecurityConfig.javajava
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;

@Configuration
@EnableConfigurationProperties(AppSecurityProperties.class)
public class SecurityConfig {
    
    private final AppSecurityProperties securityProperties;
    
    public SecurityConfig(AppSecurityProperties securityProperties) {
        this.securityProperties = securityProperties;
    }
    
    // CORS configuration using securityProperties.cors().allowedMethods()
}

Spring Security yapılandırma kalıpları hakkında daha fazla bilgi için Spring Security temelleri modülüne bakılabilir.

Spring Boot Yapılandırması Hakkında Yaygın Mülakat Soruları

Yapılandırma, Spring Boot mülakatlarında sık karşılaşılan bir konudur. Mülakatçılar harici yapılandırma, ortama özgü ayarlar ve özellik bağlama anlayışını değerlendirir.

Soru: Yapılandırma kaynaklarının öncelik sırası nedir?

Spring Boot, yapılandırmayı belirli bir sırada birden fazla kaynaktan yükler. Daha yüksek öncelikli kaynaklar düşük öncelikli olanları geçersiz kılar (liste, JNDI, servlet parametreleri ve test anotasyonlarını da kapsayan resmi listenin sadeleştirilmiş hâlidir):

  1. Komut satırı argümanları (--server.port=9000)

  2. SPRING_APPLICATION_JSON (bir ortam değişkeni veya sistem özelliği içinde satır içi JSON)

  3. Java sistem özellikleri (-Dserver.port=9000)

  4. İşletim sistemi ortam değişkenleri (SERVER_PORT=9000)

  5. Config data dosyaları (application.yml, application.properties ve bunların profil varyantları)

  6. @PropertySource anotasyonları

  7. SpringApplication.setDefaultProperties ile varsayılan özellikler

  8. adımın içinde ikinci bir sıralama vardır: profile özgü dosyalar genel dosyaları, paketlenmiş jar dışındaki dosyalar da jar içindekileri geçersiz kılar. Aynı konumda .properties dosyası .yml dosyasını geçersiz kılar. application.yml içinde ayarlanan bir değerin neden sessizce yok sayıldığını (yanında unutulmuş bir application.properties) açıklayabilen bir aday, gerçek hata ayıklama deneyimi olduğunu gösterir.

Soru: YAML yerine properties ne zaman tercih edilmelidir?

Properties dosyalarının belirli durumlarda avantajları vardır:

  • @PropertySource ile yükleme: YAML bu şekilde yüklenemez, bu nedenle anotasyonla içe aktarılan ek dosyaların .properties olması gerekir
  • Ekip aşinalığı: Properties sözdizimi Spring Boot'a yeni başlayan geliştiriciler için daha basittir
  • Tek satırlık değerler: İç içe geçme olmayan düz yapılandırmalar YAML'dan bir şey kazanmaz
  • Girinti hatası riski yok: YAML'da yanlış yere konmuş bir boşluk, bir anahtarı sessizce yanlış üst öğenin altına taşır

YAML şu durumlarda daha iyi çalışır:

  • Yapılandırma derin iç içe geçme içeriyorsa (üç veya daha fazla seviye)
  • Listeler sık değişiklik gerektiriyorsa
  • Karmaşık yapılandırmalarda okunabilirlik önemliyse

Soru: Hassas yapılandırma değerleri nasıl yönetilir?

Gizli bilgiler asla versiyon kontrolüne commit edilmemelidir. Spring Boot birkaç yaklaşım sunar:

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

Üretim sistemleri için Spring Cloud Config Server veya HashiCorp Vault merkezi gizli bilgi yönetimi sağlar. Actuator izleme rehberi hassas uç noktaların güvenliğini ele alır.

Soru: Jasypt nedir ve Spring Boot özelliklerini nasıl şifreler?

Jasypt Spring Boot, Environment oluşturulurken ENC(...) ile sarılmış değerlerin şifresini çözer. Böylece şifrelenmiş gizli bilgiler application.yml veya application.properties içinde durabilir ve yine de düz değerler gibi bağlanır:

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

Zorunlu tek özellik jasypt.encryptor.password olup varsayılan algoritma PBEWITHHMACSHA512ANDAES_256 şeklindedir. Format fark yaratmaz: aynı ENC(...) değeri hem YAML'da hem properties'te çalışır.

Kıdemli bir adayı ayıran cevap: Jasypt gizli bilgiyi ortadan kaldırmaz, yalnızca yerini değiştirir. Ana parolaya sahip olan herkes depodaki her değerin şifresini çözebilir ve parolayı değiştirmek tüm değerlerin yeniden şifrelenmesi anlamına gelir. Vault veya bir bulut gizli bilgi yöneticisi erişim kontrolü, denetim ve rotasyon ekler; Jasypt bunları sunmaz.

Yükseltme öncesi uyumluluk kontrolü

4.0.x starter'ı (4.0.4, Ocak 2026) Java 17 ve Spring Boot 3.5+ gerektirir ve README dosyası Spring Boot 4'ü listelemez. Temel Jasypt kütüphanesi, Mayıs 2019'daki 1.9.3 sürümünden bu yana yeni sürüm yayımlamadı. Jasypt tabanlı bir proje Spring Boot 4'e taşınmadan önce starter ayrı bir dalda doğrulanmalıdır.

Başlangıçta @ConfigurationProperties Doğrulama

Spring Boot, @ConfigurationProperties sınıflarını Jakarta Bean Validation anotasyonları ile birleştirildiğinde başlangıçta doğrular.

DatabaseProperties.javajava
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.database")
public record DatabaseProperties(
    @NotBlank String url,
    @NotBlank String username,
    @Positive int poolSize
) {}

app.database.pool-size eksik veya negatifse, uygulama başlangıçta net bir hata mesajı ile hızlı bir şekilde başarısız olur. Bu doğrulama YAML ve properties kaynakları için aynı şekilde çalışır.

Ortama Özgü Yapılandırma Dosyaları

Spring Boot, varsayılan src/main/resources dışında ek yapılandırma dosyası konumlarını destekler. spring.config.import özelliği harici dosyaları yükler:

yaml
# application.yml
spring:
  config:
    import:
      - optional:file:./config/
      - optional:configserver:http://config-server:8888

optional: öneki, dosya mevcut olmadığında başlangıç hatasını önler. Bu kalıp, üretim merkezi bir sunucudan yapılandırma çekerken varsayılan değerlerle yerel geliştirmeyi mümkün kılar. Bu dosyalarla ilgili daha fazla pratik soru application.properties ve YAML mülakat modülünde yer alır.

Kaynaklar

Pratik yapmaya başla!

Mülakat simülatörleri ve teknik testlerle bilgini test et.

Spring Boot Yapılandırması için Temel Çıkarımlar

  • YAML, paylaşılan öneklere sahip yapılandırmalar için tekrarı azaltır ve listeleri daha temiz bir şekilde yönetir
  • Properties dosyaları düz yapılandırmalar ve YAML sözdizimine daha az aşina ekipler için iyi çalışır
  • Spring Boot 4.1, @ConfigurationProperties bağlama ve doğrulama için her iki formatı eşit şekilde ele alır
  • Her iki format da tek dosyada birden fazla profili destekler: YAML'da ---, properties'te #---
  • İki dosya aynı konumda bulunduğunda .properties kazanır ve yalnızca properties dosyaları @PropertySource ile yüklenebilir
  • Yapılandırma önceliği belirli bir sıra izler: komut satırı argümanları ortam değişkenlerini, onlar da dosya tabanlı yapılandırmayı geçersiz kılar
  • Hassas değerler ortam değişkenlerinde veya gizli bilgi yönetim sistemlerinde bulunmalıdır; Jasypt ENC(...) değerleri gizli bilgiyi yalnızca ana parolaya taşır
  • Üretim ortamlarında harici kaynaklardan yapılandırma yüklemek için spring.config.import kullanılmalıdır
Günün meydan okuması

Spring Boot kodundaki hatayı bulabilir misin?

Gerçek bir kod parçası, gizli bir hata, günde bir deneme. Denemek için hesap gerekmez.

Anthony Fillion-Maillet

Yazan:

Anthony Fillion-Maillet

SharpSkill kurucusu

10 yılı aşkın süredir fullstack geliştirici. SharpSkill’i yönetiyor ve burada yayımlanan her şeyden sorumlu.

27 Ekim 2026 tarihinde güncellendi

Etiketler

#spring-boot
#yapılandırma
#yaml
#properties
#mülakat

Paylaş

İlgili makaleler