■ 스프링 컨테이너란?
스프링에서 자바 객체는 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 |