더북(TheBook)

JdbcTemplateConfigurationDataSourceAvailableCondition 조건을 만족하도록 저수준의 @Conditional 애너테이션을 붙였다. 원래는 DataSource 빈이 있거나 자동 구성으로 생성하도록 요구한다. DataSource 빈이 있으면 @Bean 애너테이션이 붙은 jdbcTemplate() 메서드가 JdbcTemplate 빈을 구성한다. 하지만 jdbcTemplate() 메서드에 @ConditionalOnMissingBean 애너테이션이 붙어 있기 때문에 JdbcOperations 타입의 빈(JdbcTemplate이 구현하는 인터페이스)이 없을 때만 빈을 구성한다.

DataSourceAutoConfiguration을 비롯하여 스프링 부트의 자동 구성 클래스는 여기서 보여 준 것보다 훨씬 많은 일을 한다. 하지만 방금 다룬 내용만으로도 스프링 부트가 조건부 구성을 어떻게 활용하여 자동 구성을 구현하는지는 충분히 알 수 있을 것이다.

예제와 직접 관련이 있는 것만 추리면 자동 구성에 있는 조건에 따라 구성이 다음과 같이 결정된다.

H2가 클래스패스에 있으므로 내장 H2 데이터베이스를 생성한다. 생성하는 빈 타입은 javax.sql.DataSource다. DataSource는 하이버네이트(Hibernate) 같은 JPA 구현체가 데이터베이스에 접속할 때 필요하다.

하이버네이트 엔티티 매니저(Entity Manager)가 (스프링 데이터 JPA로 전이적으로) 클래스패스에 있으므로 (스프링의 LocalContainerEntityManagerFactoryBeanJpaVendorAdapter를 포함하여) 하이버네이트를 다룰 때 필요한 빈을 자동 구성한다.

스프링 데이터 JPA가 클래스패스에 있으므로 리포지토리 인터페이스에서 구현체를 자동으로 생성하려고 스프링 데이터 JPA를 구성한다.

Thymeleaf가 클래스패스에 있으므로 Thymeleaf가 스프링 MVC의 뷰 옵션으로 구성된다(Thymeleaf 템플릿 리졸버, 템플릿 엔진, 뷰 리졸버 포함). 템플릿 리졸버는 클래스패스의 루트를 기준으로 /templates 위치에 있는 템플릿을 해석하도록 구성된다.

웹 스타터 의존성 덕분에 스프링 MVC가 클래스패스에 있으므로 스프링 DispatcherServlet을 구성하고 스프링 MVC를 활성화한다.

예제는 스프링 MVC 웹 애플리케이션이므로 리소스 핸들러는 클래스패스의 루트를 기준으로 /static 위치에 있는 정적 콘텐츠를 제공하도록 등록된다(리소스 핸들러는 /public, /resources, /META-INF/resources의 정적 콘텐츠도 제공한다).

(웹 스타터 의존성 덕분에 전이적으로) 톰캣이 클래스패스에 있으므로 8080 포트에서 수신 대기하는 내장 톰캣 컨테이너를 시작한다.

 

여기서 핵심은 스프링 부트 자동 구성이 스프링을 구성하는 일을 하므로 여러분은 애플리케이션을 작성하는 일에만 집중할 수 있다는 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.