개발 학습 실습실

이 사이트의 실습은 자바스크립트를 켜야 움직입니다. 아래는 같은 내용을 글로 적은 것입니다.

공부 › Spring › 스프링 부트

스프링 부트 자동 설정

의존성만 추가했는데 왜 빈이 생기나

스프링 부트는 애플리케이션이 뜰 때 미리 준비된 설정 클래스들을 하나씩 살펴보며 "이 조건이 맞으면 이 빈을 등록한다"를 판단합니다. 조건은 주로 클래스패스에 어떤 라이브러리가 있는지와 개발자가 같은 빈을 직접 등록했는지입니다.

문서·표준 대조 · 스프링 부트 공식 문서

이 실습에 나오는 개념

Spring Boot 자동 설정(Auto-configuration)
클래스패스에 있는 라이브러리와 설정 값을 보고 필요한 빈을 자동으로 등록해 주는 Spring Boot의 기능이다. 예를 들어 JDBC 드라이버와 접속 정보가 있으면 DataSource를 자동으로 구성한다. 각 자동 설정에는 적용 조건이 붙어 있으며, 개발자가 같은 종류의 빈을 직접 등록하면 자동 설정에서 그 빈을 만드는 부분은 적용되지 않는다.
스타터(Starter)
특정 기능에 필요한 라이브러리들을 서로 호환되는 버전으로 묶어 놓은 Spring Boot의 의존성 묶음이다. 웹 스타터(Spring Boot 3까지는 spring-boot-starter-web, Spring Boot 4부터는 spring-boot-starter-webmvc) 하나를 추가하면 Spring MVC, JSON 처리, 내장 톰캣 등이 함께 들어온다. 라이브러리 간 버전 충돌을 직접 맞추는 수고를 덜어 준다.
내장 서버
Spring Boot 애플리케이션 안에 포함되어 함께 실행되는 웹 서버(기본은 톰캣)다. 별도로 서버를 설치하고 애플리케이션을 배포하는 과정 없이 java -jar 명령 하나로 실행할 수 있다.
@Configuration과 @Bean
@Configuration은 빈 정의를 담은 설정 클래스임을 나타내고, 그 안의 @Bean 메서드가 반환하는 객체가 빈으로 등록된다. 직접 수정할 수 없는 외부 라이브러리의 클래스를 빈으로 만들거나 생성 과정을 직접 제어해야 할 때 쓴다. 내가 작성한 클래스는 보통 @Component 계열을 붙여 등록한다.
컴포넌트 스캔
지정한 패키지 아래에서 @Component 계열 애너테이션(@Service, @Repository, @Controller 등)이 붙은 클래스를 찾아 자동으로 빈으로 등록하는 기능이다. Spring Boot에서는 @SpringBootApplication이 붙은 클래스의 패키지와 그 하위 패키지가 기본 대상이다.

이렇게 바꿔 보세요

처음 설정으로 실행하면

  1. 애플리케이션이 시작됩니다. @SpringBootApplication 안의 @EnableAutoConfiguration이 스프링 부트에 들어 있는 자동 설정 클래스 목록(백여 개)을 불러옵니다. 내가 만든 @Configuration과 @Component가 먼저 등록되고, 그다음에 자동 설정들이 하나씩 조건을 평가받습니다.
  2. 내장 서버 자동 설정: web 스타터가 톰캣 라이브러리를 함께 가져왔습니다. 클래스패스에 톰캣이 있으므로 내장 톰캣을 띄우는 빈을 등록합니다. 그래서 별도의 WAS 설치 없이 jar 하나로 실행됩니다.
  3. 스프링 MVC 자동 설정: DispatcherServlet 클래스가 있으므로 DispatcherServlet과 MVC 기본 구성 요소(메시지 컨버터, 핸들러 매핑 등)를 등록합니다.
  4. Jackson 자동 설정: 직접 등록한 JsonMapper가 없으므로 기본 설정의 JsonMapper를 등록합니다.
  5. DataSource 자동 설정: JDBC 클래스가 있고 직접 등록한 DataSource가 없습니다. 설정의 접속 주소로 HikariCP 커넥션 풀을 만들어 등록합니다.
  6. JPA 자동 설정: 앞에서 준비된 DataSource를 사용해 EntityManagerFactory와 JPA용 트랜잭션 매니저를 등록합니다. 자동 설정끼리도 순서가 있어서, DataSource가 먼저 준비된 뒤에 평가됩니다.
  7. Spring Data JPA 자동 설정: JpaRepository를 상속한 인터페이스를 찾아 구현 객체를 만들어 빈으로 등록합니다.
  8. 나머지 자동 설정들: 해당 라이브러리가 클래스패스에 없으므로 대부분 조건에서 탈락합니다. 준비된 설정은 많지만 실제로 적용되는 것은 추가한 의존성에 해당하는 것뿐입니다.

실행 결과

코드

// build.gradle
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-webmvc'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    runtimeOnly 'com.mysql:mysql-connector-j'
}

# application.yml
spring.datasource.url: jdbc:mysql://localhost:3306/shop

// 자동 설정 클래스 안은 이런 식이다
// @ConditionalOnClass(DataSource.class)       클래스패스에 있을 때만
// @ConditionalOnMissingBean(DataSource.class) 직접 등록한 빈이 없을 때만

이 모형의 전제

자동 설정 가운데 대표적인 몇 개만 골라 단순화했습니다. 실제 클래스 이름과 조건은 더 세분돼 있습니다(예: DataSourceAutoConfiguration, JacksonAutoConfiguration, HibernateJpaAutoConfiguration). 조건의 의미와 "직접 등록한 빈이 있으면 물러난다"는 원칙은 스프링 부트 공식 문서의 설명을 따랐습니다. 의존성 이름은 스프링 부트 4 기준입니다(3까지는 웹 스타터의 이름이 spring-boot-starter-web이었습니다). 스프링 부트를 실제로 띄워 대조한 결과는 아닙니다. Jackson 자동 설정이 JsonMapper 타입 빈을 @ConditionalOnMissingBean으로 등록하는 것은 이 PC의 spring-boot-jackson 4.1.1 클래스 파일을 열어 확인했습니다.

앞 실습: REST API와 메시지 컨버터 · 다음 실습: 설정 우선순위

이 실습에 나오는 개념

이 실습에서 보는 것

설정

코드


      
    

그림

실행 비교

이렇게 바꿔 보세요