노트

스프링 부트 자동 설정

Spring Boot Auto-configuration

백엔드#spring · 연결된 개념 6개

쉽게 말하면

스프링 부트는 가구와 가전이 다 들어간 풀옵션 원룸 같아요. 의존성 버전과 서버 연결을 일일이 맞추지 않아도 필요한 기본 빈을 알아서 깔아 줘서, 짐만 풀면 바로 앱을 띄울 수 있어요.

비유가 깨지는 곳 풀옵션과 달리 내가 같은 빈을 직접 정의하면 그쪽이 우선해요. 대신 무엇이 깔렸는지 모르면 추적이 어려워서 debug=true 자동 설정 리포트나 Actuator의 conditions 엔드포인트를 읽어요.

스프링 부트는 스프링 앱을 만들 때 반복되던 설정(의존성 버전 맞추기, 서블릿 컨테이너 연결, 배포)을 관례(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

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 의존성 주입 (DI)

    객체가 필요한 협력 객체를 직접 new로 만들지 않고, 바깥(스프링 컨테이너)에서 넣어 받는 방식. 무엇을 언제 만들고 어떻게 연결할지의 제어가 내 코드에서 컨테이너로 넘어가므로 제어의 역전(Inversion of Control, IoC)이라고도 부른다.

  • Lombok

    Lombok은 게터·세터·생성자·toString 같은 반복 코드를 어노테이션으로 대신 생성해 주는 자바 라이브러리다. 컴파일할 때 어노테이션 처리기(annotation processor)가 바이트코드(bytecode)에 메서드를 넣는다. 스프링과는 별개 라이브러리라 따로 추가한다.

  • 시큐리티 필터체인

    Spring Security는 요청이 컨트롤러에 닿기 전에 서블릿 필터(servlet filter) 묶음에서 인증·인가를 처리한다. SecurityFilterChain 빈으로 어떤 경로를 열고 막을지 선언한다.

  • Bean Validation

    Bean Validation은 객체 필드에 제약 어노테이션(constraint annotation)을 붙여 입력을 검증하는 자바 표준이다(Jakarta Validation, 구현체는 Hibernate Validator). 스프링은 컨트롤러 파라미터에 @Valid가 붙으면 바인딩 직후 검증을 실행한다.

  • 스프링 AOP

    AOP(Aspect-Oriented Programming, 관점 지향 프로그래밍)는 로깅·트랜잭션·보안·실행 시간 측정처럼 여러 클래스에 흩어져 반복되는 횡단 관심사(cross-cutting concern)를 한 곳에 모아, 비즈니스 코드를 건드리지 않고 메서드 호출 앞뒤에 끼워 넣는 방법이다. 스프링 AOP는 이를 프록시로 구현한다.

보기 옵션