CS

S)Spring_10_스프링 컴포넌트 스캔 Component Scan & DI 자동 주입

99duuk 2024. 4. 15. 18:54

■ 스프링 컨테이너란?

 

스프링에서 자바 객체는 Bean이라고 한다.
스프링 컨테이너는 bean의 생명 주기를 관리(생성, 관리, 제거 등)하며, 생성된 bean에 추가적인 기능을 제공한다.

 

 

 

■ 컴포넌트 스캔(Component Scan)

Bean으로 등록될 준비가 된 클래스들을 스캔하여 

Bean으로 등록해주는 과정을 말한다.

 

애플리케이션이 시작될 때 자동으로 수행된다.

 

 

 

 

 

□ 스캔 대상

@Component 어노테이션이 붙어있는 클래스들은 전부 컴포넌트 스캔의 대상이 된다. 

 

          @Component                      컴포넌트 스캔에서 사용

          @Configuration                   스프링 설정 정보에서 사용

          @Service                              컴포넌트 스캔, 스프링 비즈니스 로직에서 사용

          @Repository                         스프링 데이터 접근 계층에서 사용

          @Controller                          컴포넌트 스캔, 스프링 MVC 컨트롤러에서 사용

 

 

 

스캔 설정한 패키지의 하위 패키지에 있는 클래스를 스캔한다.

 

 

 

 

 

 

 

 

 

 

□ Sample

(servlet-context.xml)

<context:component-scan> 태그를 사용하여 지정한 패키지와 그 하위에 있는 모든 클래스를 스캔한 후, 

 

.xml

<context:component-scan base-package="com.example.demo" />

 

java Config

@Configuration
@ComponentScan("com.example.demo")
public class AppConfig {

    @Bean
    public SampleComponent sampleComponent() {
        return new SampleComponent();
    }

    @Bean
    public SampleConfiguration sampleConfiguration() {
        return new SampleConfiguration();
    }

    @Bean
    public SampleRepository sampleRepository() {
        return new SampleRepository();
    }

    @Bean
    public SampleController sampleController() {
        return new SampleController();
    }
}

 

 

 

@Component, @Configuration, @Service, @Repository, @Controller 등의 어노테이션이 부여된 클래스들을

스프링 빈으로 자동 등록한다.

@Component
public class SampleComponent { }

@Configuration
public class SampleConfiguration { }

@Repository
public class SampleRepository { }

@Controller
public class SampleController { }

 

 

스프링 컨테이너는 이렇게 등록한 빈을 ApplicationContext에서 관리한다. 

 

 

 

 

 

 

 

□ 충돌 방지

스프링은 컴포넌트를 스캔할 때 클래스 이름을 기반으로 빈을 등록한다.

그 결과 동일한 이름을 가진 빈이 여러 개 존재할 경우 충돌이 발생할 수 있다. 

 

ex) package.a와 package.b에 모두 SampleService가 있다. 이들을 스캔하여 빈으로 등록할 경우 충돌이 발생할 수 있다.

 

 

이를 해결하기 위해

빈의 이름을 명시적으로 지정하거나,

@Qualifier 어노테이션을 사용하여

 

특정 빈을 선택할 수 있다.

 

 

 

ex)

@Component("uniqueName")
@Component("dog")
public class Dog implements Animal { }

@Component("cat")
public class Cat implements Animal { }



<context:component-scan base-package="com.example.demo.animals" use-default-filters="false">
    <context:include-filter type="assignable" expression="com.example.demo.animals.Cat"/>
</context:component-scan>

@Qualifier은 동일한 타입의 빈이 여러 개 있을 때 어떤 빈을 주입할지 지정할 수 있다.

 

 

 

 

 

 

 


 

■ 의존성 자동 주입

 

자동 주입은 bean 간의 의존성을 자동으로 해결하는 매커니즘이다.

주로 생성자 주입(Constructor Injection), 필드 주입(Field Injection), 세터 주입(Setter Injection) 방식을 통해 이루어진다.

 

@Autowired는 이러한 주입의 방법 중 하나이다. 

 

[생성자 주입(Constructor Injection), 필드 주입(Field Injection), 세터 주입(Setter Injection)]

더보기

생성자 주입 : 빈을 생성할 때 생성자를 통해 주입

 

필드 주입 : 주입할 빈을 선언된 필드에 직접 주입

 

세터 주입 : 세터 메서드를 통해 주입

 

일반 메서드 주입 : 해당 빈을 생성한 후에 해당 일반 메서드를 호출해 주입

자동 주입은 코드의 유연성과 가독성을 높여주며, 

코드량을 줄여주고 의존성을 쉽게 관리할 수 있도록 도와준다. 

또한, 의존성 주입을 위한 xml / java Config 설정이 필요 없다.

 

 

 

 

 

□ Example

@Autowired는 다양한 주입 방법 중 하나이다.

사용이 간편하고, 타입을 기반으로 주입하기 때문에 주로 사용된다.

@Service
public class SampleService {
    private final SampleComponent sampleComponent;
    private final SampleConfiguration sampleConfiguration;
    private final SampleRepository sampleRepository;
    private final SampleController sampleController;

    @Autowired
    public SampleService(SampleComponent sampleComponent, 
                         SampleConfiguration sampleConfiguration, 
                         SampleRepository sampleRepository, 
                         SampleController sampleController) {
        this.sampleComponent = sampleComponent;
        this.sampleConfiguration = sampleConfiguration;
        this.sampleRepository = sampleRepository;
        this.sampleController = sampleController;
    }

}

 

이렇게 하면 스프링은 'SampleService'의 생성자를 통해 

자동으로 'SampleComponent, SampleConfiguration, SampleRepositoy, SampleController'를 주입한다.

 

 

 

 

 

 

 


컴포넌트 스캔 (Component Scan)

애플리케이션에 있는 모든 클래스를 자동으로 스캔하여

스프링 컨테이너에 bean으로 등록하는 기능

 

-> xml 설정 파일이나 java 설정 클래스에서 

      bean을 명시적으로 등록할 필요 없이 

      애플리케이션을 더욱 간단하고 유연하게 구성할 수 있다. 

 

 

 

DI 자동 주입 (Dependency Injection)

스프링에서 의존성 주입을 자동으로 처리하는 기능

개발자가 코드에서 의존성을 명시적으로 설정할 필요 없이

스프링 컨테이너가 알아서 관리한다.

 

@Autowired, @Injection 등의 어노테이션을 사용하여 

필요한 의존성을 자동으로 주입할 수 있으며

 

-> 코드의 유지보수성과 테스트 용이성을 향상 시킬 수 있다.

'CS' 카테고리의 다른 글

CS)Spring_11_스프링 MVC 패턴  (0) 2024.05.20
CS)Spring_10_빈 라이프 사이클  (0) 2024.04.25
S)Spring_09_스프링 컨테이너  (2) 2024.04.10
S)Spring_09_스프링DI  (0) 2024.04.09
S)DB_08_JOIN  (0) 2024.04.02