: 객체가 JVM안에 하나만 있어야 하는 것
스프링 컨테이너도 싱글톤 컨테이너이다.
스프링 컨테이너는 인스턴스를 싱글톤(1개만 생성)으로 관리한다
웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다. 그리고 요청에 따라 각각 새로운 객체가 생성된다.
-> 이러한 요청들이 많고 계속되는데, 요청이 올때마다 객체를 만들어야 하는 문제가 발생한다.
스프링 컨테이너 덕분에 고객의 요청이 올 때 마다 객체를 생성하는 것이 아니라, 이미 만들어진 객체를 공유해서 효율적으로 재사용할 수 있다.
객체 인스턴스를 하나만 생성해서 공유하는 싱글톤 방식은 여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지(stateful)하게 설계하면 안된다.
-> 무상태로 설계해야 하고 가급적 값을 수정하면 안된다.
AppConfig
와 같은 설정정보가 없어도 스프링 컨테이너에 스프링 빈을 등록하는 방법
스프링 빈을 등록할 때 자바 코드의 @Bean
이나 XML의 <bean>
등을 통해서 설정 정보에 직접 등록할 수 있다.
하지만 등록할 빈이 많은 경우, 등록할때 누락이나 오류가 발생할 수 있다. 이때 컴포넌트 스캔을 이용해서 자동으로 스프링 빈을 등록하게 할 수 있다.
@ComponentScan은 @Component가 붙은 클래스를 찾아서 자동으로 스프링 빈으로 등록을 해준다.
@ComponentScan(
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
@ComponentScan이 되어 있으면 스프링 컨테이너가 클래스를 다 뒤져서 @Component 가 붙은 것들을 스프링 컨테이너에 자동으로 등록한다. 이때 모두 싱글톤으로 등록이 된다.
생성자에 @Autowired가 붙어있으면 생성자를 실행하면서 스프링 컨테이너에 있는 빈 이름을 탐색한다. 그래서 요청된 빈과 같은 타입이 있는지 조회하고 있으면 찾아서 요청된 의존관계에 주입한다.
컴포넌트 스캔은 @Component 뿐만 아니라 다음과 내용도 추가로 대상에 포함한다.
: 컴포넌트 스캔에서 사용