Spring Boot
가 아니라 Spring
을 사용하던 시절에는 Bean
을 어떻게 등록하였을까요?
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
<bean id="bookService" class="com.example.demo.BookService">
<property name="bookRepository" ref="bookRepository" />
</bean>
<bean id="bookRepository" class="com.example.demo.BookRepository">
</bean>
</beans>
예를들면 위와 같이 XML
파일에 Bean
을 등록하였습니다. (그냥 예전에는 이렇게 했구나~ 정도만 알아두면 좋을 거 같습니다!) 하지만 이렇게 xml에 하나하나 Bean으로 등록하는 방법은 굉장히 번거롭기 때문에 새로운 방법이 등장했는데 그것이 바로 component-scan
입니다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.example.demo"/>
</beans>
위와 같이 XML
파일에 어떤 패키지 하위의 Bean들을 스캔할지를 설정할 수 있습니다. 그런데 이 방법도 Java 코드가 아니라 XML
코드로 작성해야 한다는 단점이 존재하는데요. 그래서 XML이 아니라 Java 코드로 할 순 없을까? 해서 나온 방법이 아래와 같습니다.
@Configuration
public class ApplicationConfig {
@Bean
public BookRepository bookRepository() {
return new BookRepository();
}
@Bean
public BookService bookService() {
BookService bookService = new BookService();
bookService.setBookRepository(bookRepository());
return bookService;
}
}
위와 같이 Bean
을 등록하는 방식은 Spring Boot
기반으로 프로젝트를 해도 많이 볼 수 있습니다. 코드를 간단하게 설명하면 @Configuration
은 설정
파일을 위한 Bean
등록 어노테이션이라는 것은 알 수 있을 것입니다. 그리고 @Bean
어노테이션으로 해당 메소드의 return 타입의 Bean
을 등록해주게 됩니다. 이렇게 Java 코드로 Bean
을 등록하니 좀 더 편리해졌는데요.
하지만 이것도 하나하나 Bean으로 등록해야 하는 번거로움이 있기 때문에 약간 아쉬움이 존재합니다.
그래서 하나 더 나온 방법이 현재 스프링 부트에서 사용하는 방법입니다.
Spring Boot 프로젝트를 만들면 위와 같이 main
메소드를 포함하는 클래스가 자동으로 만들어집니다. 그리고 @SpringBootApplication
어노테이션이 존재하는데요. 어노테이션 내부 코드를 보면 아래와 같습니다.
코드를 완벽하게 이해할 순 없지만, ComponentScan
어노테이션이 존재하는 것을 볼 수 있는데요. 이 어노테이션을 통해서 Spring Boot에서는 특정 Bean을 등록하는 어노테이션을 찾아서 자동으로 등록을 해줍니다. Bean으로 등록해주는 어노테이션은 아래와 같습니다.
그 외에 @RestController
, @aspect
이런 어노테이션들도 존재하는데요. 이러한 Bean으로 등록해주는 어노테이션만 명시해주면 Component-Scan
을 통해서 자동으로 Bean 등록이 되기 때문에 매우 편리합니다.
그리고 참고로 com.example.demo
패키지 외부에 있는 어노테이션은 ComponentScan
의 대상이 되지 않습니다!