스프링 부트는 스프링 앱을 만들 때 반복되던 설정(의존성 버전 맞추기, 서블릿 컨테이너 연결, 배포)을 관례(convention over configuration)로 대신해 주는 도구다. 클래스패스(classpath)에 무엇이 있는지 보고 필요한 빈을 자동으로 등록하고, 웹 서버를 내장해 java -jar 하나로 실행된다.
부트 이전과 이후
- 이전: 의존성 버전을 직접 맞추고,
web.xml에DispatcherServlet을 등록하고, WAR(Web Application Archive)로 묶어 외부 Tomcat에 배포했다 - 이후: starter 하나로 호환되는 의존성 묶음을 받고, 자동 설정이 기본 빈을 깔고, 내장 서버로 실행한다
핵심 기능
- starter:
spring-boot-starter-webmvc(부트 3.x까지는-web),-data-jpa,-security처럼 목적별 의존성 묶음 - 자동 설정(auto-configuration): "클래스패스에 이게 있고, 사용자가 같은 빈을 직접 만들지 않았다면 기본 빈을 만든다"는 조건부 설정. 내가 빈을 정의하면 그쪽이 우선한다
- 외부 설정:
application.yml과 환경변수로 동작을 바꾼다(스프링 설정 외부화와 프로파일) - 운영 기능: Actuator로 헬스 체크·지표 노출, DevTools로 코드 변경 시 빠른 재시작
@SpringBootApplication
@SpringBootApplication // = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan
public class App {
public static void main(String[] args) { SpringApplication.run(App.class, args); }
}@ComponentScan때문에 메인 클래스 패키지 아래만 스캔된다. 메인 클래스는 최상위 패키지에 둔다(스프링 빈과 IoC 컨테이너)- 특정 자동 설정을 끄려면
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) debug=true로 실행하면 어떤 자동 설정이 적용됐고(positive matches) 왜 빠졌는지(negative matches) 리포트가 나온다. "이 빈은 왜 생겼지?"를 추적할 때 쓴다server.port=0은 빈 포트를 무작위로 잡는다. 같은 앱을 여러 개 띄워 시험할 때 쓴다
트레이드오프
관례가 많아 처음엔 빠르지만, 자동 설정이 무엇을 깔았는지 모르면 문제를 추적하기 어렵다. 숨은 동작이 새어 나오는 누수 추상화의 전형이라, 자동 설정 리포트와 Actuator의 beans·conditions 엔드포인트를 읽는 습관이 도움이 된다. 요청이 컨트롤러까지 가는 길은 Spring MVC 요청 흐름를 본다.
책: 3장. 첫 엔드포인트
출처: Spring Boot 문서: Starters · Auto-configuration · Disabling Specific Auto-configuration Classes · @SpringBootApplication