본문으로 건너뛰기

2.3 스타터 의존성과 자동 설정 (AutoConfiguration 원리)

과거 순수 Spring Framework 웹 프로젝트를 구성하려면, Tomcat 서버를 별도 설치하고, web.xmlroot-context.xml 같은 수많은 XML 환경 파일에 트랜잭션 매니저, 컴포넌트 스캔 범위, DB 커넥션 풀을 눈 빠지게 외워서 적어야만 간신히 서버가 떴습니다.

하지만 스프링 부트(Spring Boot) 는 이 막대한 고통을 단 두 가지 핵심 마법으로 완벽히 박살냈습니다. 그 핵심이 바로 스타터(Starter)자동 설정(Auto-Configuration) 입니다.


📦 1. 스타터 의존성 (Starter Dependencies)

스프링 부트 프로젝트의 build.gradle을 보면, 일반적인 외부 라이브러리들처럼 버전을 길게 명시하지 않고, 오직 뭉터기 이름표 하나만 달랑 줍니다.

dependencies {
// 마법의 스타터 조합 (단 1줄!)
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// 버전 번호가 필요 없습니다. 부트 부모 버전에 맞춰 완벽히 호환되는 라이브러리가 끌려옵니다.
}

스프링 부트 스타터(spring-boot-starter-*) 는 일종의 "종합 선물 세트 상자"입니다. 내가 웹 애플리케이션을 만들고 싶으면 굳이 Jackson(JSON 변환기), Spring MVC 모듈 코어, Tomcat 내장 서버, 유효성 검사 라이브러리 버전들을 하나하나 끙끙대며 맞출 필요가 없습니다. 부트 팀이 수만 번의 테스트를 통해 지금 부트 버전에 호환성이 가장 완벽히 맞는 버전의 모듈 십 수개를 하나의 세트로 묶어놓은 규격 을 제공하기 때문입니다.


🎩 2. 스프링 부트 3대 주축 마법의 주문 (@SpringBootApplication)

Application을 가동하는 최상단 Main 클래스를 보면 무심코 적혀있는 저 마법의 어노테이션이 사실 스프링 부트 자동화의 영혼 그 자체입니다.

@SpringBootApplication // 마법의 3가지 기능 묶음 어노테이션
public class BootApplication {
public static void main(String[] args) {
SpringApplication.run(BootApplication.class, args);
}
}

@SpringBootApplicationCtrl 로 클릭해서 내부를 열어보면 3가지 최강 어노테이션이 뭉쳐진 복합체라는 걸 알 수 있습니다.

  1. @SpringBootConfiguration: "이 클래스가 가장 최상단 기준 설정 파일 베이스캠프임"
  2. @ComponentScan: "이 클래스가 위치한 폴더부터 그 아랫단 하위 폴더들을 싸그리 뒤져서 @Service, @Controller 가 붙은 걸 전부 메모리 빈(Bean)으로 로딩해라"
  3. @EnableAutoConfiguration: 이것이 자동 설정 매직 의 진짜 주연입니다.

⚙️ 3. 조건부 자동 설정 (@EnableAutoConfiguration) 배후 원리

스프링 부트가 "알아서 다 해준다"는 건 어떻게 작동하는 걸까요? 부트 내부적으로 spring.factories (스프링 3.0부터는 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports)라는 긴 명부에 100개가 넘는 "미리 만들어둔 친절한 공장 세팅 클래스" 목록이 적혀있습니다.

애플리케이션이 구동될 때, 부트는 현재 나의 프로젝트 classpath(build.gradle 다운로드 목록)무슨 라이브러리가 있는지 쓱 스캔 합니다. (이것이 조건부 판별 어노테이션인 @ConditionalOnClass, @ConditionalOnMissingBean 등의 역할입니다.)

// 부트 내부의 DispatcherServlet 자동 설정 클래스 원문 예시
@AutoConfiguration
@ConditionalOnClass(DispatcherServlet.class) // 네 build.gradle에 웹 스타터가 깔렸구나?
public class DispatcherServletAutoConfiguration {

@Bean
@ConditionalOnMissingBean(name = "dispatcherServlet") // 근데 니가 아직 직접 만들진 않았지?
public DispatcherServlet dispatcherServlet() {
return new DispatcherServlet(); // 그럼 내가 알아서 제일 베스트 조합으로 만들어서 꽂아줄게!
}
}
  1. "어? spring-boot-starter-web이 있네? 거기 톰캣이랑 웹 설정 조건에 부합하네!" ➡️ "그냥 통과, 내가 알아서 내장 Tomcat 서버 포트 8080에 띄울게!"
  2. "어? DataSource 접속 정보는 설정했는데 JdbcTemplate 빈은 아직 안 만들었네?" ➡️ "@ConditionalOnMissingBean 발동, 내가 알아서 기본 규격 만들어 줄게!"

스프링 부트는 개발자가 수동으로 커스텀 빈을 명시(오버라이드)하지 않은 나머지 빈 구멍들을, 눈치껏 외부 라이브러리 존재 유무 조건에 맞물려 알아서 최적값으로 꽉 채워주는 프레임워크입니다.


🎯 4. 실전 고수 팁 (Pro Tips)

💡 자동 설정 제외하기 (Exclude) 실무를 하다 보면 부트의 '과잉 친절'이 거슬리거나 의도치 않은 대형 충돌 버그를 낼 때가 있습니다. (예: 데이터베이스 접속 유저 환경 변수를 아직 세팅 안 했는데 부트가 무지성으로 DB 빈을 만들려다 오류가 파바박 터짐)

이럴 때는 내가 원치 않는 모듈의 자동 설정 클래스를 강제로 제거(exclude) 시켜서 끄면 됩니다.

// "자꾸 DataSource 빈 만들려다가 터지지 말고, DB 로딩 모듈 아예 꺼라!"
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

이렇게 끄면 외부 DB 접속 정보를 검사하지 않고 애플리케이션이 화면만 가진 채 쾌적하게 켜집니다.