<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Spring-Boot on kastori</title><link>http://blog.kastori.dev/tags/spring-boot/</link><description>Recent content in Spring-Boot on kastori</description><generator>Hugo -- gohugo.io</generator><language>ko-kr</language><lastBuildDate>Tue, 19 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="http://blog.kastori.dev/tags/spring-boot/index.xml" rel="self" type="application/rss+xml"/><item><title>[Spring 완전 정복 #4] Spring Boot — xml 없이 바로 뜨는 이유, 자동설정 원리 완전 분석</title><link>http://blog.kastori.dev/tech/2026-05-19-spring-04-boot-auto-configuration/</link><pubDate>Tue, 19 May 2026 00:00:00 +0000</pubDate><guid>http://blog.kastori.dev/tech/2026-05-19-spring-04-boot-auto-configuration/</guid><description>&lt;h2 id="왜-xml-설정-없이-서버가-뜨는-걸까"&gt;&lt;a href="#%ec%99%9c-xml-%ec%84%a4%ec%a0%95-%ec%97%86%ec%9d%b4-%ec%84%9c%eb%b2%84%ea%b0%80-%eb%9c%a8%eb%8a%94-%ea%b1%b8%ea%b9%8c" class="header-anchor"&gt;&lt;/a&gt;&amp;ldquo;왜 xml 설정 없이 서버가 뜨는 걸까?&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;Spring Boot를 처음 접하면 놀랍다. &lt;code&gt;main()&lt;/code&gt; 메서드 하나, &lt;code&gt;@SpringBootApplication&lt;/code&gt; 어노테이션 하나만 있는데 Tomcat이 뜨고, JPA 연결이 설정되고, JSON 변환까지 된다. 아무것도 설정하지 않았는데.&lt;/p&gt;
&lt;p&gt;이 &amp;ldquo;마법&amp;quot;의 이름은 **자동설정(Auto-configuration)**이다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="spring-boot-이전--설정-지옥"&gt;&lt;a href="#spring-boot-%ec%9d%b4%ec%a0%84--%ec%84%a4%ec%a0%95-%ec%a7%80%ec%98%a5" class="header-anchor"&gt;&lt;/a&gt;Spring Boot 이전 — 설정 지옥
&lt;/h2&gt;&lt;p&gt;Spring 단독으로 웹 애플리케이션을 만들려면 설정 파일이 여러 개 필요했다.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;web.xml → DispatcherServlet 등록
applicationContext.xml → Bean 설정
dispatcher-servlet.xml → MVC 설정
pom.xml → 의존성 + 버전 수동 관리
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;더 큰 문제는 의존성 버전이었다. Spring 버전에 맞는 Hibernate 버전, 그에 맞는 Jackson 버전&amp;hellip; 개발자가 직접 호환성을 맞춰야 했다. 버전 충돌 오류는 흔한 일이었다.&lt;/p&gt;
&lt;p&gt;Spring Boot는 이 &amp;ldquo;설정 지옥&amp;quot;을 없앤다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="springbootapplication-분해하기"&gt;&lt;a href="#springbootapplication-%eb%b6%84%ed%95%b4%ed%95%98%ea%b8%b0" class="header-anchor"&gt;&lt;/a&gt;@SpringBootApplication 분해하기
&lt;/h2&gt;&lt;p&gt;Spring Boot 진입점에 붙이는 이 어노테이션은 실제로 세 개의 어노테이션을 합친 것이다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@SpringBootApplication&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;MyApplication&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;static&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;(String&lt;span style="color:#f92672"&gt;[]&lt;/span&gt; args) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; SpringApplication.&lt;span style="color:#a6e22e"&gt;run&lt;/span&gt;(MyApplication.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;, args);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;@SpringBootApplication
 ├─ @SpringBootConfiguration : @Configuration과 동일 — Bean 설정 클래스
 ├─ @EnableAutoConfiguration : 자동설정 활성화 ← 핵심
 └─ @ComponentScan : 현재 패키지 하위 컴포넌트 자동 스캔
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;핵심은 &lt;code&gt;@EnableAutoConfiguration&lt;/code&gt;이다. 이것이 &amp;ldquo;클래스패스를 보고 Bean을 자동으로 등록&amp;quot;하는 자동설정을 켠다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="자동설정-동작-원리"&gt;&lt;a href="#%ec%9e%90%eb%8f%99%ec%84%a4%ec%a0%95-%eb%8f%99%ec%9e%91-%ec%9b%90%eb%a6%ac" class="header-anchor"&gt;&lt;/a&gt;자동설정 동작 원리
&lt;/h2&gt;&lt;p&gt;Spring Boot는 애플리케이션이 시작될 때 클래스패스에 어떤 라이브러리가 있는지 확인하고, 그에 맞는 Bean을 자동으로 등록한다.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;spring-boot-starter-web 의존성 추가
 → 클래스패스에 Tomcat, Spring MVC 라이브러리 존재 확인
 → TomcatAutoConfiguration → 내장 Tomcat Bean 자동 등록
 → DispatcherServletAutoConfiguration → DispatcherServlet Bean 자동 등록
 → 개발자가 아무것도 안 해도 웹서버가 뜸
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;자동설정 클래스들은 어떤 조건에서 Bean을 등록할지 &lt;code&gt;@Conditional&lt;/code&gt; 계열 어노테이션으로 선언한다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@ConditionalOnClass&lt;/span&gt;(DataSource.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// DataSource 클래스가 클래스패스에 있고&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@ConditionalOnMissingBean&lt;/span&gt;(DataSource.&lt;span style="color:#a6e22e"&gt;class&lt;/span&gt;) &lt;span style="color:#75715e"&gt;// DataSource Bean이 아직 없을 때만&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;DataSourceAutoConfiguration&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;@Bean&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; DataSource &lt;span style="color:#a6e22e"&gt;dataSource&lt;/span&gt;() { ... }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;@ConditionalOnMissingBean&lt;/code&gt;이 핵심이다. &lt;strong&gt;개발자가 직접 Bean을 등록하면 자동설정 Bean은 등록되지 않는다.&lt;/strong&gt; 커스텀 설정이 자동설정을 덮어쓸 수 있는 이유다.&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;어노테이션&lt;/th&gt;
 &lt;th&gt;조건&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;@ConditionalOnClass&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;특정 클래스가 클래스패스에 있을 때&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;@ConditionalOnMissingBean&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;해당 타입 Bean이 없을 때&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;@ConditionalOnProperty&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;특정 프로퍼티 값이 설정되었을 때&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;@ConditionalOnWebApplication&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;웹 애플리케이션일 때&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;어떤 자동설정이 적용됐는지 보려면 &lt;code&gt;--debug&lt;/code&gt; 플래그로 실행하면 된다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="스타터--의존성-버전-충돌-해결"&gt;&lt;a href="#%ec%8a%a4%ed%83%80%ed%84%b0--%ec%9d%98%ec%a1%b4%ec%84%b1-%eb%b2%84%ec%a0%84-%ec%b6%a9%eb%8f%8c-%ed%95%b4%ea%b2%b0" class="header-anchor"&gt;&lt;/a&gt;스타터 — 의존성 버전 충돌 해결
&lt;/h2&gt;&lt;p&gt;스타터는 관련 의존성을 하나의 패키지로 묶어 제공한다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!-- 이것 하나로 Spring MVC + Tomcat + Jackson이 한 번에 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style="color:#f92672"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span style="color:#f92672"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;스타터&lt;/th&gt;
 &lt;th&gt;포함 내용&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;starter-web&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Spring MVC, Tomcat, Jackson&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;starter-data-jpa&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Spring Data JPA, Hibernate, JDBC&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;starter-security&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Spring Security&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;starter-test&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;JUnit 5, Mockito, AssertJ&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;starter-validation&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;Hibernate Validator, Bean Validation&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;버전은 &lt;code&gt;spring-boot-dependencies&lt;/code&gt; BOM(Bill of Materials)이 관리한다. 개발자는 버전을 명시하지 않아도 Spring Boot가 검증된 호환 버전을 자동으로 선택한다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!-- 버전 명시 불필요 --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;com.fasterxml.jackson.core&lt;span style="color:#f92672"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;jackson-databind&lt;span style="color:#f92672"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="내장-서버--java--jar-한-줄로-실행"&gt;&lt;a href="#%eb%82%b4%ec%9e%a5-%ec%84%9c%eb%b2%84--java--jar-%ed%95%9c-%ec%a4%84%eb%a1%9c-%ec%8b%a4%ed%96%89" class="header-anchor"&gt;&lt;/a&gt;내장 서버 — java -jar 한 줄로 실행
&lt;/h2&gt;&lt;p&gt;Spring Boot는 Tomcat을 jar 안에 내장한다. 별도 WAS 설치 없이 실행된다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./mvnw package
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;java -jar target/myapp-0.0.1-SNAPSHOT.jar
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tomcat 대신 다른 서버를 쓰고 싶다면 교체할 수 있다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!-- Undertow 사용 (논블로킹, 경량) --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style="color:#f92672"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-web&lt;span style="color:#f92672"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;exclusions&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;exclusion&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style="color:#f92672"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-tomcat&lt;span style="color:#f92672"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/exclusion&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/exclusions&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style="color:#f92672"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-undertow&lt;span style="color:#f92672"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="프로파일--환경별-설정-분리"&gt;&lt;a href="#%ed%94%84%eb%a1%9c%ed%8c%8c%ec%9d%bc--%ed%99%98%ea%b2%bd%eb%b3%84-%ec%84%a4%ec%a0%95-%eb%b6%84%eb%a6%ac" class="header-anchor"&gt;&lt;/a&gt;프로파일 — 환경별 설정 분리
&lt;/h2&gt;&lt;p&gt;개발, 스테이징, 운영 환경마다 DB URL, 로그 레벨, 외부 API 키가 다르다. 프로파일로 분리한다.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;application.yml # 공통 설정
application-dev.yml # 개발 환경
application-prod.yml # 운영 환경
&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# application-dev.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;spring&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;datasource&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;url&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;jdbc:h2:mem:testdb &lt;/span&gt; &lt;span style="color:#75715e"&gt;# 개발은 인메모리 DB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;logging&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;level&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;root&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;DEBUG&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# application-prod.yml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;spring&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;datasource&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;url&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;jdbc:postgresql://prod-db:5432/mydb&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;logging&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;level&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;root&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;WARN&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;프로파일 활성화는 실행 시 지정한다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;java -jar myapp.jar --spring.profiles.active&lt;span style="color:#f92672"&gt;=&lt;/span&gt;prod
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 또는 환경변수로&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SPRING_PROFILES_ACTIVE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;prod java -jar myapp.jar
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="설정-우선순위-높을수록-우선"&gt;&lt;a href="#%ec%84%a4%ec%a0%95-%ec%9a%b0%ec%84%a0%ec%88%9c%ec%9c%84-%eb%86%92%ec%9d%84%ec%88%98%eb%a1%9d-%ec%9a%b0%ec%84%a0" class="header-anchor"&gt;&lt;/a&gt;설정 우선순위 (높을수록 우선)
&lt;/h3&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;1. 커맨드라인 인수 --server.port=9090
2. 환경변수 SERVER_PORT=9090
3. application-{profile}.yml
4. application.yml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;운영 환경에서 민감 정보(DB 패스워드, API 키)는 환경변수나 외부 설정 관리 시스템으로 주입하는 것이 안전하다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="configurationproperties--타입-안전한-설정-바인딩"&gt;&lt;a href="#configurationproperties--%ed%83%80%ec%9e%85-%ec%95%88%ec%a0%84%ed%95%9c-%ec%84%a4%ec%a0%95-%eb%b0%94%ec%9d%b8%eb%94%a9" class="header-anchor"&gt;&lt;/a&gt;@ConfigurationProperties — 타입 안전한 설정 바인딩
&lt;/h2&gt;&lt;p&gt;여러 설정값을 하나의 클래스로 묶을 때 &lt;code&gt;@Value&lt;/code&gt;보다 &lt;code&gt;@ConfigurationProperties&lt;/code&gt;가 낫다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;payment&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;api-key&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;abc123&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;timeout&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;5000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;retry-count&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@ConfigurationProperties&lt;/span&gt;(prefix &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;payment&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;@Component&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;public&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;PaymentProperties&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; String apiKey;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; timeout;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;private&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; retryCount;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// getter/setter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;@Value(&amp;quot;${payment.api-key}&amp;quot;)&lt;/code&gt;로 하나씩 꺼내는 것보다 타입 안전하고, IDE 자동완성도 지원된다.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="actuator--운영-모니터링"&gt;&lt;a href="#actuator--%ec%9a%b4%ec%98%81-%eb%aa%a8%eb%8b%88%ed%84%b0%eb%a7%81" class="header-anchor"&gt;&lt;/a&gt;Actuator — 운영 모니터링
&lt;/h2&gt;&lt;p&gt;Actuator를 추가하면 애플리케이션 상태를 HTTP 엔드포인트로 조회할 수 있다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;groupId&amp;gt;&lt;/span&gt;org.springframework.boot&lt;span style="color:#f92672"&gt;&amp;lt;/groupId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;spring-boot-starter-actuator&lt;span style="color:#f92672"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/dependency&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;엔드포인트&lt;/th&gt;
 &lt;th&gt;설명&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/actuator/health&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;앱 상태 (UP/DOWN) — 쿠버네티스 헬스체크에 활용&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/actuator/metrics&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;JVM 메모리, HTTP 요청 수, 응답 시간 등&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;&lt;code&gt;/actuator/env&lt;/code&gt;&lt;/td&gt;
 &lt;td&gt;현재 적용된 설정값 (민감 정보 주의)&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;운영 환경에서는 &lt;code&gt;health&lt;/code&gt;, &lt;code&gt;info&lt;/code&gt;, &lt;code&gt;metrics&lt;/code&gt;만 노출하고 나머지는 차단하는 것이 안전하다.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;management&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;endpoints&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;web&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;exposure&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;include&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;health,info,metrics&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id="마치며"&gt;&lt;a href="#%eb%a7%88%ec%b9%98%eb%a9%b0" class="header-anchor"&gt;&lt;/a&gt;마치며
&lt;/h2&gt;&lt;p&gt;Spring Boot가 &amp;ldquo;설정 없이 동작&amp;quot;하는 이유는 세 가지다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;자동설정&lt;/strong&gt;: 클래스패스를 보고 &lt;code&gt;@Conditional&lt;/code&gt; 조건에 따라 Bean을 자동 등록한다. 개발자 Bean이 있으면 자동설정은 물러난다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;스타터 + BOM&lt;/strong&gt;: 관련 의존성을 묶어 제공하고, 버전 충돌을 Spring Boot가 관리한다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;내장 서버&lt;/strong&gt;: Tomcat이 jar 안에 들어있어 별도 WAS 설치가 필요 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;다음 편에서는 Spring Transaction — &lt;code&gt;@Transactional&lt;/code&gt;의 동작 원리, 전파속성, 격리수준을 정리한다.&lt;/p&gt;</description></item></channel></rss>