chap 5 1 - JAVA-JIKIMI/SPRING-IN-ACTION-5 GitHub Wiki

ꡬ성 속성 μ‚¬μš©ν•˜κΈ° :: μžλ™-ꡬ성 μ„ΈλΆ€ μ‘°μ •ν•˜κΈ°

μžλ™ - ꡬ성(auto configuration)은 μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ„ λ‹¨μˆœν™”ν•΄ μ€€λ‹€.

μŠ€ν”„λ§ XML κ΅¬μ„±μœΌλ‘œ 속성 값을 μ„€μ •ν•˜λ˜ μ§€λ‚œ 10년간은

λͺ…μ‹œμ μœΌλ‘œ λΉˆμ„ κ΅¬μ„±ν•˜μ§€ μ•Šκ³ λŠ” 속성을 μ„€μ •ν•˜λŠ” λ§ˆλ•…ν•œ 방법이 μ—†μ—ˆλ‹€.

λ‹€ν–‰μŠ€λŸ½κ²Œλ„ μŠ€ν”„λ§ λΆ€νŠΈλŠ” ꡬ성 속성(configuration property)을 μ‚¬μš©ν•˜λŠ” 방법을 μ œκ³΅ν•œλ‹€.

μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈμ—μ„œ ꡬ성 속성은 빈의 속성이닀.

그리고 JVM μ‹œμŠ€ν…œ 속성, λͺ…λ Ήν–‰ 인자, ν™˜κ²½ λ³€μˆ˜ λ“±μ˜ μ—¬λŸ¬ κ°€μ§€ μ›μ²œ 속성 μ€‘μ—μ„œ μ„€μ •ν•  수 μžˆλ‹€.

이 μž₯μ—μ„œλŠ” 타코 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— μƒˆλ‘œμš΄ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λŠ” 것을 μž μ‹œ λ©ˆμΆ”κ³  ꡬ성 μ†μ„±μ˜ 이λͺ¨μ €λͺ¨λ₯Ό μ‚΄νŽ΄λ³Ό 것이닀.

ꡬ성 속성을 μ•Œμ•„ 두면 μ΄ν›„μ˜ 진도λ₯Ό λ‚˜κ°€λŠ” 데 ν™•μ‹€νžˆ 도움이 되기 λ•Œλ¬Έμ΄λ‹€.

μš°μ„  μŠ€ν”„λ§ λΆ€νŠΈκ°€ μžλ™μœΌλ‘œ κ΅¬μ„±ν•˜λŠ” 것을 μ„ΈλΆ€ μ‘°μ •ν•˜κΈ° μœ„ν•΄ ꡬ성 속성을 μ‚¬μš©ν•˜λŠ” 방법뢀터 μ•Œμ•„λ³΄μž.


μŠ€ν”„λ§μ—λŠ” μ„œλ‘œ λ‹€λ₯΄λ©΄μ„œλ„ 관련이 μžˆλŠ” 두 κ°€μ§€ ν˜•νƒœμ˜ ꡬ성이 μžˆλ‹€.

  • 빈 μ—°κ²° : μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈμ—μ„œ 빈으둜 μƒμ„±λ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»΄ν¬λ„ŒνŠΈλ“€μ΄ μƒν˜Έκ°„μ— μ£Όμž…
  • 속성 μ£Όμž… : μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈμ—μ„œ 빈의 속성 값을 μ„€μ •ν•˜λŠ” ꡬ성

μžλ°” 기반 κ΅¬μ„±μ—μ„œ @Bean μ• λ…Έν…Œμ΄μ…˜μ΄ μ§€μ •λœ λ©”μ„œλ“œλŠ” μ‚¬μš©ν•˜λŠ” 빈의 μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ³  속성 값도 μ„€μ •ν•œλ‹€.

예λ₯Ό λ“€μ–΄, μŠ€ν”„λ§μ— λ‚΄μž₯된 H2 DBλ₯Ό DataSource둜 μ„ μ–Έν•˜λŠ” λ‹€μŒμ˜ @Bean을 보자.

@Bean
public DataSource dataSource() {
    return new EmbeddedDatabaseBuilder()
            .setType(EmbeddedDatabaseType.H2)
            .addScript("schema.sql")
            .addScript("user_data.sql","ingredient_data.sql")
            .build();
}

만일 μŠ€ν”„λ§ λΆ€νŠΈλ₯Ό μ‚¬μš©μ€‘μ΄ μ•„λ‹ˆλΌλ©΄ 이 λ©”μ„œλ“œ(dataSource)λ₯Ό 톡해 DataSource λΉˆμ„ ꡬ성할 수 μžˆλ‹€.

ν•˜μ§€λ§Œ μŠ€ν”„λ§ λΆ€νŠΈλ₯Ό μ‚¬μš© 쀑일 λ•ŒλŠ” μžλ™-ꡬ성이 DataSource λΉˆμ„ ꡬ성해쀀닀.

μŠ€ν”„λ§ λΆ€νŠΈλŠ” λŸ°νƒ€μž„ μ‹œμ— H2 μ˜μ‘΄μ„± 라이브러리λ₯Ό μ°Ύκ³  DataSource λΉˆμ„ μžλ™μœΌλ‘œ μ°Ύμ•„ μŠ€ν”„λ§ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ»¨ν…μŠ€νŠΈμ— μƒμ„±ν•œλ‹€.

그리고 ν•΄λ‹Ή 빈이 SQL 슀크립트λ₯Ό μ‹€ν–‰ν•˜μ—¬ DB에 μ μš©μ‹œν‚¨λ‹€.

κ·ΈλŸ¬λ‚˜ SQL 슀크립트 파일의 이름을 λ‹€λ₯΄κ²Œ μ§€μ •ν•˜κ³  μ‹Άκ±°λ‚˜ 3개 이상을 μ§€μ •ν•΄μ•Ό ν•œλ‹€λ©΄?

λ°”λ‘œ 이런 κ²½μš°μ— μœ„ μ½”λ“œμ™€ 같이 ꡬ성 속성을 μ‚¬μš©ν•  수 μžˆλ‹€.

μŠ€ν”„λ§ ν™˜κ²½ 좔상화 μ΄ν•΄ν•˜κΈ°

μŠ€ν”„λ§ ν™˜κ²½ μΆ”μƒν™”λŠ” ꡬ성 κ°€λŠ₯ν•œ λͺ¨λ“  속성을 ν•œ κ³³μ—μ„œ κ΄€λ¦¬ν•˜λŠ” κ°œλ…μ΄λ‹€.

즉, μ†μ„±μ˜ 근원을 μΆ”μƒν™”ν•˜μ—¬ 각 속성을 ν•„μš”λ‘œ ν•˜λŠ” 빈이 μŠ€ν”„λ§ μžμ²΄μ—μ„œ ν•΄λ‹Ή 속성을 μ‚¬μš©ν•  수 있게 ν•΄μ€€λ‹€.

μŠ€ν”„λ§ ν™˜κ²½μ—μ„œλŠ” λ‹€μŒκ³Ό 같은 μ†μ„±μ˜ κ·Όμ›μœΌλ‘œλΆ€ν„° μ›μ²œ 속성을 κ°€μ Έμ˜¨λ‹€.

  • JVM μ‹œμŠ€ν…œ 속성
  • 운영체제의 ν™˜κ²½ λ³€μˆ˜
  • λͺ…λ Ήν–‰ 인자
  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 속성 ꡬ성 파일

그리고 μŠ€ν”„λ§ ν™˜κ²½μ—μ„œλŠ” 이 속성듀을 ν•œ ꡰ데둜 λͺ¨μ€ ν›„ 각 속성이 μ£Όμž…λ˜λŠ” μŠ€ν”„λ§ λΉˆμ„ μ‚¬μš©ν•  수 있게 ν•΄μ€€λ‹€.

예λ₯Ό λ“€μ–΄ portλ₯Ό application.properties νŒŒμΌμ΄λ‚˜ application.yml νŒŒμΌμ— μ§€μ •ν•  수 μžˆλ‹€.

ν˜Ήμ€ java λͺ…λ Ήμ–΄ μ˜΅μ…˜μ΄λ‚˜ 운영체제 ν™˜κ²½ λ³€μˆ˜μ— μ„€μ •ν•  μˆ˜λ„ μžˆλ‹€.

이처럼 ꡬ성 속성을 μ„€μ •ν•˜λŠ” λ°©λ²•μ—λŠ” μ—¬λŸ¬ κ°€μ§€κ°€ μžˆλ‹€.

이제 κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” 속성 섀정듀을 μ‚΄νŽ΄λ³΄μž.

데이터 μ†ŒμŠ€ κ΅¬μ„±ν•˜κΈ°

타코 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ production ν™˜κ²½μ—μ„œ μ‚¬μš©ν•˜λ €λ©΄ H2보닀 더 ν™•μ‹€ν•œ DB μ†”λ£¨μ…˜μ΄ ν•„μš”ν•˜λ‹€.

μŠ€ν”„λ§ λΆ€νŠΈλŠ” DataSource λΉˆμ„ μžλ™μœΌλ‘œ κ΅¬μ„±ν•œλ‹€.

ν•˜μ§€λ§Œ 더 κ°„λ‹¨ν•˜κ²Œ DBλ₯Ό μ„€μ •ν•˜λ €λ©΄ ꡬ성 속성을 μ΄μš©ν•˜λ©΄ λœλ‹€.

application.properties νŒŒμΌμ„ μˆ˜μ •ν•΄λ³΄μž.

spring:
  datasource:
    url: jdbc:mysql://localhost/tacocloud
    username: tacouser
    password: tacopassword

κ·Έλ‹€μŒμ— μ ν•©ν•œ JDBC λ“œλΌμ΄λ²„λ₯Ό μΆ”κ°€ν•΄μ•Ό ν•˜μ§€λ§Œ ꡬ체적인 JDBC λ“œλΌμ΄λ²„ 클래슀λ₯Ό μ§€μ •ν•  ν•„μš”λŠ” μ—†λ‹€.

μŠ€ν”„λ§ λΆ€νŠΈκ°€ DB URLλ‘œλΆ€ν„° 찾을 수 있기 λ•Œλ¬Έμ΄λ‹€.

κ·ΈλŸ¬λ‚˜ λ‹€μŒκ³Ό 같이 직접 DB λ“œλΌμ΄λ²„ 클래슀 속성을 μΆ”κ°€ν•  μˆ˜λ„ μžˆλ‹€.

spring:
  datasource:
    url: jdbc:mysql://localhost/tacocloud
    username: tacouser
    password: tacopassword
    driver-class-name: com.mysql.jdbc.Driver

그러면 DataSource λΉˆμ„ μžλ™-ꡬ성할 λ•Œ μŠ€ν”„λ§ λΆ€νŠΈκ°€ μœ„ 속성 섀정을 μ—°κ²° λ°μ΄ν„°λ‘œ μ‚¬μš©ν•œλ‹€.

λ˜ν•œ ν†°μΊ£μ˜ JDBC 컀λ„₯μ…˜ 풀을 classpathμ—μ„œ μžλ™μœΌλ‘œ 찾을 수 μžˆλ‹€λ©΄ DataSource 빈이 그것을 μ‚¬μš©ν•œλ‹€.

κ·Έλ ‡μ§€ μ•Šλ‹€λ©΄ μŠ€ν”„λ§ λΆ€νŠΈλŠ” λ‹€μŒ 쀑 ν•˜λ‚˜μ˜ 컀λ„₯μ…˜ 풀을 classpathμ—μ„œ μ°Ύμ•„ μ‚¬μš©ν•œλ‹€.

  • HikariCP
  • Commons DBCP 2

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹œμž‘λ  λ•Œ DBλ₯Ό μ΄ˆκΈ°ν™”ν•˜λŠ” SQL 슀크립트의 μ‹€ν–‰ 방법을 이번 μž₯ μ•žμ—μ„œ μ–˜κΈ°ν–ˆμ—ˆλ‹€.

λ‹€μŒκ³Ό 같이 μ„€μ •ν•˜λ©΄ 더 κ°„λ‹¨ν•˜κ²Œ μ§€μ •ν•  수 μžˆλ‹€.

spring:
  datasource:
    schema:
      - order-schema.sql
      - ingredient-schema.sql
      - taco-schema.sql
      - user-schema.sql
    data:
      - ingredients.sql

λ˜λŠ” λͺ…μ‹œμ μΈ 데이터 μ†ŒμŠ€ ꡬ성 λŒ€μ‹  JNDI(Java Naming and Directory Interface)에 κ΅¬μ„±ν•˜λŠ” 방법도 μžˆλ‹€.

spring:
  datasource:
    jndi-name: java:/comp/env/jdbc/tacoCloudDs

단, μœ„ 속성을 μ§€μ •ν•˜λ©΄ 기쑴에 μ„€μ •λœ λ‹€λ₯Έ 데이터 μ†ŒμŠ€ ꡬ성 속성은 λ¬΄μ‹œλœλ‹€.

λ‚΄μž₯ μ„œλ²„ κ΅¬μ„±ν•˜κΈ°

portκ°€ 0으둜 μ„€μ •λ˜λ©΄ μ–΄λ–»κ²Œ 될까? λ¬΄μž‘μœ„λ‘œ ν¬νŠΈκ°€ μ„ νƒλ˜μ–΄ μ„œλ²„κ°€ μ‹€ν–‰λœλ‹€.

이것은 μžλ™ν™”λœ 톡합 ν…ŒμŠ€νŠΈλ₯Ό μ‹€ν–‰ν•  λ•Œ μœ μš©ν•˜λ‹€.

즉, λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” ν…ŒμŠ€νŠΈλ“€μ΄ 같은 포트 번호λ₯Ό μ‚¬μš©ν•˜κ²Œ λ˜λŠ” 것을 막을 수 μžˆλ‹€.

MSA ν™˜κ²½κ°™μ΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ‹œμž‘λ˜λŠ” ν¬νŠΈκ°€ μ€‘μš”ν•˜μ§€ μ•Šμ„ λ•Œλ„ μœ μš©ν•˜λ‹€.

ν•œνŽΈ, μ„œλ²„μ— κ΄€λ ¨ν•΄μ„œλŠ” 포트 외에도 μ€‘μš”ν•œ 것이 더 μžˆλ‹€.

그쀑 ν•˜λ‚˜κ°€ HTTPS μš”μ²­ 처리λ₯Ό μœ„ν•œ μ»¨ν…Œμ΄λ„ˆ κ΄€λ ¨ 섀정이닀.

λ¨Όμ € JDK의 keytool λͺ…λ Ήν–‰ μœ ν‹Έλ¦¬ν‹°λ₯Ό μ‚¬μš©ν•΄μ„œ ν‚€μŠ€ν† μ–΄λ₯Ό 생성해야 ν•œλ‹€.

keytool 은 Keystore 기반으둜 μΈμ¦μ„œμ™€ ν‚€λ₯Ό 관리할 수 μžˆλŠ” μ»€λ§¨λ“œ λ°©μ‹μ˜ μœ ν‹Έλ¦¬ν‹°λ‘œ, JDK 에 ν¬ν•¨λ˜μ–΄ μžˆλ‹€.

keytool -keystore mykeys.jks -genkey -alias tomcat -keyalg RSA

keytool이 μ‹€ν–‰λ˜λ©΄ μ €μž₯ μœ„μΉ˜ λ“±μ˜ μ—¬λŸ¬ 정보λ₯Ό μž…λ ₯λ°›λŠ”λ°, 무엇보닀 μš°λ¦¬κ°€ μž…λ ₯ν•œ λΉ„λ°€λ²ˆν˜Έλ₯Ό 잘 κΈ°μ–΅ν•΄ λ‘λŠ” 것이 μ€‘μš”ν•˜λ‹€.

μ—¬κΈ°μ„œλŠ” letmein을 λΉ„λ°€λ²ˆν˜Έλ‘œ μ§€μ •ν•  것이닀.

ν‚€μŠ€ν† μ–΄ 생성이 λλ‚œ ν›„μ—λŠ” λ‚΄μž₯ μ„œλ²„μ˜ HTTPSλ₯Ό ν™œμ„±ν™”ν•˜κΈ° μœ„ν•΄ λͺ‡ κ°€μ§€ 속성을 μ„€μ •ν•΄μ•Ό ν•œλ‹€.

이 속성듀은 λͺ¨λ‘ λͺ…령행에 μ§€μ •ν•  수 μžˆλ‹€.

κ·ΈλŸ¬λ‚˜ ꡉμž₯히 λΆˆνŽΈν•˜λ‹€. λŒ€μ‹  application.properties λ˜λŠ” application.yml νŒŒμΌμ— μ„€μ •ν•˜μž.

  port: 8443
  ssl:
    key-store: file://path/to/mykeys.jks
    key-store-password: letmein
    key-password: letmein

server.ssl.key-store 속성은 ν‚€μŠ€ν† μ–΄ 파일이 μƒμ„±λœ 경둜둜 μ„€μ •λ˜μ–΄μ•Ό ν•œλ‹€.

μ—¬κΈ°μ„œλŠ” 운영체제의 파일 μ‹œμŠ€ν…œμ—μ„œ ν‚€μŠ€ν† μ–΄ νŒŒμΌμ„ λ‘œλ“œν•˜κΈ° μœ„ν•΄ file://λ₯Ό URL둜 μ§€μ •ν•˜μ˜€λ‹€.

κ·ΈλŸ¬λ‚˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ JAR νŒŒμΌμ— ν‚€μŠ€ν† μ–΄ νŒŒμΌμ„ λ„£λŠ” κ²½μš°λŠ” classpath:λ₯Ό url둜 μ§€μ •ν•˜μ—¬ μ°Έμ‘°ν•΄μ•Ό ν•œλ‹€.

그리고 server.ssl.key-store-password와 server.ssl.key-password μ†μ„±μ—λŠ” ν‚€μŠ€ν† μ–΄λ₯Ό 생성할 λ•Œ μ§€μ •ν–ˆλ˜ λΉ„λ°€λ²ˆν˜Έλ₯Ό μ„€μ •ν•œλ‹€.

이 λͺ¨λ“  속성이 μ œλŒ€λ‘œ μ„€μ •λ˜λ©΄ 우리 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ 8443 포트의 HTTPS μš”μ²­μ„ κΈ°λ‹€λ¦°λ‹€.

λ‘œκΉ… κ΅¬μ„±ν•˜κΈ°

λŒ€λΆ€λΆ„μ˜ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ€ λ‘œκΉ…μ„ μ œκ³΅ν•œλ‹€.

기본적으둜 μŠ€ν”„λ§ λΆ€νŠΈλŠ” μ½˜μ†”μ— 둜그 λ©”μ‹œμ§€λ₯Ό μ“°κΈ° μœ„ν•΄ Logback을 톡해 λ‘œκΉ…μ„ κ΅¬μ„±ν•œλ‹€.

μ΄λ•Œ κΈ°λ³Έ λ‘œκΉ… μˆ˜μ€€μ€ INFOλ‹€.

λ‘œκΉ… ꡬ성을 μ œμ–΄ν•  λ•ŒλŠ” classpath의 λ£¨νŠΈμ—(src/main/resources) logback.xml νŒŒμΌμ„ μƒμ„±ν•˜λ©΄ λœλ‹€.

<configuration>
    <appender name="STDOUT" class="ch.qos. logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} – "Γ³msg%n
            </pattern>
        </encoder>
    </appender>
    <logger name="root" level="INFO"/>
    <root level="INFO">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>

λ‘œκΉ…μ— μ‚¬μš©λ˜λŠ” νŒ¨ν„΄μ„ μ œμ™Έν•˜λ©΄ 이 Logback ꡬ성은 logback.xml 파일이 없을 λ•Œμ˜ κΈ°λ³Έ λ‘œκΉ… ꡬ성과 λ™μΌν•˜λ‹€.

λ‘œκΉ… κ΅¬μ„±μ—μ„œ κ°€μž₯ 많이 λ³€κ²½ν•˜λŠ” 것은 λ‘œκΉ… μˆ˜μ€€κ³Ό 둜그λ₯Ό μˆ˜λ‘ν•  νŒŒμΌμ΄λ‹€.

μŠ€ν”„λ§ λΆ€νŠΈμ˜ ꡬ성 속성을 μ‚¬μš©ν•˜λ©΄ logback.xml νŒŒμΌμ„ μƒμ„±ν•˜μ§€ μ•Šκ³  둜그 섀정을 λ³€κ²½ν•  수 μžˆλ‹€.

λ‘œκΉ… μˆ˜μ€€μ„ μ„€μ •ν•  λ•ŒλŠ” logging.level을 μ ‘λ‘μ–΄λ‘œ κ°–λŠ” 속성듀을 μƒμ„±ν•œλ‹€.

그리고 κ·Έλ‹€μŒμ— λ‘œκΉ… μˆ˜μ€€μ„ μ„€μ •ν•˜κΈ° μ›ν•˜λŠ” 둜거의 이름을 뢙인닀.

logging:
  level:
    root: WARN
    org:
      springframework:
        security: DEBUG

λ˜ν•œ μ•Œμ•„λ³΄κΈ° 쉽도둝 μŠ€ν”„λ§ μ‹œνλ¦¬ν‹° νŒ¨ν‚€μ§€ 이름을 λΆ™μ—¬μ„œ ν•œ μ€„λ‘œ μ§€μ •ν•  μˆ˜λ„ μžˆλ‹€.

logging:
  level:
    root: WARN
    org.springframework.security: DEBUG

κ·Έλ‹€μŒμ— 둜그 ν•­λͺ©λ“€μ„ /var/logs/ 경둜의 TacoCloud.log νŒŒμΌμ— μˆ˜λ‘ν•˜κ³  μ‹Άλ‹€λ©΄

logging:
  file:
    path: /var/logs/
    name: TacoCloud.log
  level:
    root: WARN
    org.springframework.security: DEBUG

μ΄λ ‡κ²Œ μ„€μ •ν•˜λ©΄ λœλ‹€.

이 경우 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ /var/logs/에 λŒ€ν•΄ μ“°κΈ° νΌλ―Έμ…˜μ„ κ°–κ³  μžˆλ‹€λ©΄ 둜그 ν•­λͺ©λ“€μ΄ /var/logs/TacoCloud.log에 수둝될 것이닀.

기본적인 둜그 파일의 크기인 10MBκ°€ 가득 차게 되면 μƒˆλ‘œμš΄ 둜그 파일이 μƒμ„±λ˜μ–΄ 둜그 ν•­λͺ©μ΄ 계속 μˆ˜λ‘λœλ‹€.

μŠ€ν”„λ§ 2.0 λΆ€ν„°λŠ” λ‚ μ§œλ³„λ‘œ 둜그 파일이 λ‚¨μœΌλ©° μ§€μ •λœ 일 μˆ˜κ°€ μ§€λ‚œ 둜그 νŒŒμΌμ€ μ‚­μ œλœλ‹€.

λ‹€λ₯Έ μ†μ„±μ˜ κ°’ κ°€μ Έμ˜€κΈ°

ν•˜λ“œμ½”λ”©λœ Stringκ³Ό 숫자 κ°’μœΌλ‘œλ§Œ 속성 값을 μ„€μ •ν•΄μ•Ό ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€.

λ‹€λ₯Έ ꡬ성 μ†μ„±λ“€λ‘œλΆ€ν„° 값을 κ°€μ Έμ˜¬ μˆ˜λ„ μžˆλ‹€.

예λ₯Ό λ“€μ–΄ greeting.welcome μ΄λΌλŠ” 속성을 또 λ‹€λ₯Έ 속성인 spring.application.name의 κ°’μœΌλ‘œ μ„€μ •ν•˜κ³  μ‹Άλ‹€κ³  ν•΄λ³΄μž.

greeting:
  welcome: ${spring.application.name}

λ˜ν•œ λ‹€λ₯Έ ν…μŠ€νŠΈ 속에 ${}λ₯Ό ν¬ν•¨μ‹œν‚¬ μˆ˜λ„ μžˆλ‹€.

greeting:
  welcome: You are using ${spring.application.name}

μ΄λ ‡κ²Œ ꡬ성 속성을 μ‚¬μš©ν•΄μ„œ μŠ€ν”„λ§ 자체의 μ»΄ν¬λ„ŒνŠΈλ₯Ό κ΅¬μ„±ν•˜λ©΄

ν•΄λ‹Ή μ»΄ν¬λ„ŒνŠΈμ˜ 속성 값을 μ‰½κ²Œ μ£Όμž…ν•  수 있고 μžλ™-ꡬ성을 μ„ΈλΆ€ μ‘°μ •ν•  수 μžˆλ‹€.

⚠️ **GitHub.com Fallback** ⚠️