Skip to content

Latest commit

 

History

History
87 lines (57 loc) · 5.03 KB

File metadata and controls

87 lines (57 loc) · 5.03 KB

들어가기 전에

Spring Boot가 아니라 Spring을 사용하던 시절에는 Bean을 어떻게 등록하였을까요?


xml 설정파일을 통한 등록

<?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 입니다.


Spring에서의 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 Component-Scan이란?

스크린샷 2021-08-23 오후 1 47 18

Spring Boot 프로젝트를 만들면 위와 같이 main 메소드를 포함하는 클래스가 자동으로 만들어집니다. 그리고 @SpringBootApplication 어노테이션이 존재하는데요. 어노테이션 내부 코드를 보면 아래와 같습니다.

스크린샷 2021-08-23 오후 1 49 34

코드를 완벽하게 이해할 순 없지만, ComponentScan 어노테이션이 존재하는 것을 볼 수 있는데요. 이 어노테이션을 통해서 Spring Boot에서는 특정 Bean을 등록하는 어노테이션을 찾아서 자동으로 등록을 해줍니다. Bean으로 등록해주는 어노테이션은 아래와 같습니다.

bean

그 외에 @RestController, @aspect 이런 어노테이션들도 존재하는데요. 이러한 Bean으로 등록해주는 어노테이션만 명시해주면 Component-Scan을 통해서 자동으로 Bean 등록이 되기 때문에 매우 편리합니다.


image

그리고 참고로 com.example.demo 패키지 외부에 있는 어노테이션은 ComponentScan의 대상이 되지 않습니다!