1import{B as e,et as t,mt as n,tt as r}from"./chunks/framework.Bgbhl1zx.js";import"./chunks/assets.ClBA_8PZ.js";var i=JSON.parse(`{"title":"Immutable Configuration Properties","description":"","frontmatter":{"title":"Immutable Configuration Properties","date":"2024-02-01T23:00+09:00","tags":["Spring Boot","Configuration Properties","Constructor Binding"]},"headers":[],"relativePath":"posts/spring-boot-immutable-configuration-properties.md","filePath":"posts/spring-boot-immutable-configuration-properties.md","lastUpdated":1791240792000}`),a={name:`posts/spring-boot-immutable-configuration-properties.md`};function o(e,i,a,o,s,c){return n(),t(`div`,null,[...i[0]||=[r(`<p>ì¤íë§ ë¶í¸ 2.2 ë¶í° @ConstructorBindingì ì¬ì©íì¬ ìì±ì를 ê°ì§ì§ ìë í´ëì¤ë¥¼ ìì±í ì ìì¼ë©° ì¤íë§ ë¶í¸ 3.0 ë¶í°ë @ConstructorBinding ì ì¸ ëìì´ ìì±ìë¡ ì¶ìëì´ ìëì ê°ì´ ì¤íë§ ë¶í¸ 3 ììë ìì±ìê° íëì¸ ê²½ì°ìë êµ³ì´ ì§ì íì§ ìëë¤.</p><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">Getter</span></span> 2<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">RequiredArgsConstructor</span></span> 3<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">ConstructorBinding</span></span> 4<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">ConfigurationProperties</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">prefix</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "feature"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 5<span class="line"><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">public</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> FeatureProperties</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 6<span class="line"><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> private</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> final</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> boolean</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> enabled;</span></span> 7<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 8<span class="line"></span> 9<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">ConfigurationPropertiesScan</span></span> 10<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">EnableConfigurationProperties</span></span> 11<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">SpringBootApplication</span></span> 12<span class="line"><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">public</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Application</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 13<span class="line"><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> public</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> static</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[] </span><span style="--shiki-light:#c13617;--shiki-dark:#FFAB70;">args</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span> 14<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> SpringApplication.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">run</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(Application.class, args);
14</span></span> 15<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 16<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="language-java"><button title="Copy Code" class="copy"></button><span class="lang">java</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">Getter</span></span> 17<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">RequiredArgsConstructor</span></span> 18<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">ConfigurationProperties</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">prefix</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> "feature"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 19<span class="line"><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">public</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> FeatureProperties</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 20<span class="line"><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> private</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> final</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> boolean</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> enabled;</span></span> 21<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span> 22<span class="line"></span> 23<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">ConfigurationPropertiesScan</span></span> 24<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">@</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">SpringBootApplication</span></span> 25<span class="line"><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">public</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> class</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Application</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span> 26<span class="line"><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> public</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> static</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;"> void</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> main</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">String</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[] </span><span style="--shiki-light:#c13617;--shiki-dark:#FFAB70;">args</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span> 27<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> SpringApplication.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">run</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(Application.class, args);</span></span> 28<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }</span></span> 29<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><h5 id="parameter-name-discovery-from-spring-boot-3-1" tabindex="-1">Parameter Name Discovery from Spring Boot 3.1 <a class="header-anchor" href="#parameter-name-discovery-from-spring-boot-3-1" aria-label="Permalink to âParameter Name Discovery from Spring Boot 3.1â">â</a></h5><blockquote><p>Ensure that your compiler is configured to use the '-parameters' flag.</p></blockquote><p>ì¤íë§ ë¶í¸ 3.2 ìì ìì±ì ë°ì¸ë©ì íµí´ Immutable Configuration Properties를 ë§ëë ¤ë ê²½ì° ìì ê°ì ì
29¤ë¥ê° ë°ìí ì ìë¤. ì ì¤ë¥ ë©ìì§ë <a href="https://github.com/spring-projects/spring-boot/issues/38603" target="_blank" rel="noreferrer">MissingParametersFailureAnalyzer</a> ì ìí´ ì¶ë ¥ëë ê²ì¼ë¡ ì¤íë§ ë¶í¸ 3.2 ìì ìì¡´íë ì¤íë§ íë ììí¬ ë²ì ìì ë°ì´í¸ì½ë를 ë¶ìíì¬ íë¼ë¯¸í° ì´ë¦ì ì¶ë¡ í´ì¤ë <a href="https://github.com/spring-projects/spring-framework/issues/29559" target="_blank" rel="noreferrer">LocalVariableTableParameterNameDiscoverer í´ëì¤ê° ì ê±°</a>ëì´ íë¼ë¯¸í° ì´ë¦ì¼ë¡ ì¶ë¡ íë ëìì í´ë¹íë ìì±ì ë°ì¸ë©ì ìí´ <a href="https://github.com/spring-projects/spring-framework/blob/main/spring-core/src/main/java/org/springframework/core/StandardReflectionParameterNameDiscoverer.java" target="_blank" rel="noreferrer">StandardReflectionParameterNameDiscoverer</a> ê° ì¬ì©ë ì ìëë¡ ì»´íì¼ë¬ì ëí´ <code>-parameters</code> ìµì ì ì§ì í´ì¼íë¤.</p><div class="language-groovy"><button title="Copy Code" class="copy"></button><span class="lang">groovy</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#62687b;--shiki-dark:#818e99;">// NOTE: https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x#parameter-name-retention</span></span> 30<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">tasks</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">withType(</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">JavaCompile</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">configureEach {</span></span> 31<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> options</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">compilerArgs</span><span style="--shiki-light:#c62739;--shiki-dark:#F97583;">.</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">add(</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;">"-parameters"</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">)</span></span> 32<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>ë§ì½, ì¸í 리ì ì´ë¥¼ ì¬ì©íê³ ìì¼ë©° ê·¸ëë¤ì´ ìë <strong>Build and run using</strong> ìµì ì¼ë¡ Intellij IDEA를 ì§ì íë í¸ì´ë¼ë©´ ìë° ì»´íì¼ë¬ ìµì ì <code>-parameters</code> ìµì ì ë³ëë¡ ì¤ì í´ì¼íë¤. ìë° ì»´íì¼ë¬ ìµì ì <code>-paramters</code> íë그를 ì¤ì íììë íë¼ë¯¸í° ì´ë¦ ì¶ë¡ ì ìí ì¤ë¥ê° ì¶ë ¥ëë¤ë©´ ì¸í 리ì ì´ê° ìì±í <code>out</code> í´ë를 ìì íê³ ë¤ì ë¹ë를 ìíí´ë³´ëë¡ íì.</p><p><img src="/images/posts/spring-boot-immutable-configuration-properties/01.png" alt="" loading="lazy"></p><blockquote><p>Spring Boot 3.2 ìì Immutable Configuration Properties 를 ì¬ì©í기 ìí´ ìê°ì§ë 못í ì½ì§ì íìµëë¤.</p></blockquote><h4 id="áá ¡á·áá ©-á á µá¼áá ³" tabindex="-1">ì°¸ê³ ë§í¬ <a class="header-anchor" href="#áá ¡á·áá ©-á á µá¼áá ³" aria-label="Permalink to âì°¸ê³ ë§í¬â">â</a></h4><ul><li><a href="https://www.baeldung.com/configuration-properties-in-spring-boot#immutable-configurationproperties-binding" target="_blank" rel="noreferrer">Immutable @ConfigurationProperties Binding</a></li><li><a href="https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0.0-M2-Release-Notes#constructingbinding-no-longer-needed-at-the-type-level" target="_blank" rel="noreferrer">@ConstructingBinding No Longer Needed at the Type Level</a></li><li><a href="https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x#parameter-name-retention" target="_blank" rel="noreferrer">LocalVariableTableParameterNameDiscoverer has been removed in 6.1</a></li><li><a href="https://github.com/spring-projects/spring-framework/issues/29559" target="_blank" rel="noreferrer">Remove LocalVariableTableParameterNameDiscoverer</a></li><li><a href="https://github.com/spring-projects/spring-boot/issues/38603" target="_blank" rel="noreferrer">Failures due to code not being compiled with '-parameters' are hard to identify</a></li></ul>`,12)]])}var s=e(a,[[`render`,o]]);
32export{i as __pageData,s as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.