JdbcTemplateConfiguration은 DataSourceAvailableCondition 조건을 만족하도록 저수준의 @Conditional 애너테이션을 붙였다. 원래는 DataSource 빈이 있거나 자동 구성으로 생성하도록 요구한다. DataSource 빈이 있으면 @Bean 애너테이션이 붙은 jdbcTemplate() 메서드가 JdbcTemplate 빈을 구성한다. 하지만 jdbcTemplate() 메서드에 @ConditionalOnMissingBean 애너테이션이 붙어 있기 때문에 JdbcOperations 타입의 빈(JdbcTemplate이 구현하는 인터페이스)이 없을 때만 빈을 구성한다.
DataSourceAutoConfiguration을 비롯하여 스프링 부트의 자동 구성 클래스는 여기서 보여 준 것보다 훨씬 많은 일을 한다. 하지만 방금 다룬 내용만으로도 스프링 부트가 조건부 구성을 어떻게 활용하여 자동 구성을 구현하는지는 충분히 알 수 있을 것이다.
예제와 직접 관련이 있는 것만 추리면 자동 구성에 있는 조건에 따라 구성이 다음과 같이 결정된다.
• H2가 클래스패스에 있으므로 내장 H2 데이터베이스를 생성한다. 생성하는 빈 타입은 javax.sql.DataSource다. DataSource는 하이버네이트(Hibernate) 같은 JPA 구현체가 데이터베이스에 접속할 때 필요하다.
• 하이버네이트 엔티티 매니저(Entity Manager)가 (스프링 데이터 JPA로 전이적으로) 클래스패스에 있으므로 (스프링의 LocalContainerEntityManagerFactoryBean과 JpaVendorAdapter를 포함하여) 하이버네이트를 다룰 때 필요한 빈을 자동 구성한다.
• 스프링 데이터 JPA가 클래스패스에 있으므로 리포지토리 인터페이스에서 구현체를 자동으로 생성하려고 스프링 데이터 JPA를 구성한다.
• Thymeleaf가 클래스패스에 있으므로 Thymeleaf가 스프링 MVC의 뷰 옵션으로 구성된다(Thymeleaf 템플릿 리졸버, 템플릿 엔진, 뷰 리졸버 포함). 템플릿 리졸버는 클래스패스의 루트를 기준으로 /templates 위치에 있는 템플릿을 해석하도록 구성된다.
• 웹 스타터 의존성 덕분에 스프링 MVC가 클래스패스에 있으므로 스프링 DispatcherServlet을 구성하고 스프링 MVC를 활성화한다.
• 예제는 스프링 MVC 웹 애플리케이션이므로 리소스 핸들러는 클래스패스의 루트를 기준으로 /static 위치에 있는 정적 콘텐츠를 제공하도록 등록된다(리소스 핸들러는 /public, /resources, /META-INF/resources의 정적 콘텐츠도 제공한다).
• (웹 스타터 의존성 덕분에 전이적으로) 톰캣이 클래스패스에 있으므로 8080 포트에서 수신 대기하는 내장 톰캣 컨테이너를 시작한다.
여기서 핵심은 스프링 부트 자동 구성이 스프링을 구성하는 일을 하므로 여러분은 애플리케이션을 작성하는 일에만 집중할 수 있다는 것이다.