스프링 빈
- 스프링 IoC Container가 관리하는 객체
빈과 의존성 주입
- 직접 의존성을 주입하려면 의존 관계를 파악하고 있어야 하므로 매우 복잡하고 많이 객체가 중복 생성됨
- 의존성 주입이 필요한 객체를 bean으로 등록하면 IoC Container가 알아서 객체를 생성하고 의존성을 주입
- 스프링 IoC 컨테이너가 특정 객체의 라이프 사이클을 관리
- 의존성을 사용하는 로직에만 집중할 수 있다
빈과 싱글턴
- 객체를 싱글턴으로 만들면 다형성을 이용하지 못함
- 해당 객체가 공유 객체가 되므로 단위테스트가 어렵다
스프링 IoC에서 빈을 관리하는 방법
- spring IoC 컨테이너가 생성될 때 Configuration Metadata(Annotation, Java config, Xml)를 로드
- Configuration Metadata에 등록된 빈을 생성
- 빈 생성 시점에서 해당 빈의 Scope(빈의 범위)를 확인하며 기본값으로는 싱글톤(Singleton)이 적용된다.
- 만약, 해당 빈의 Scope가 싱글톤이면, 빈은 한 개만 생성된다. 그리고 생성된 빈은 Spring IoC 컨테이너에 등록된다.
- 빈이 등록된 후, 필요한 곳에서 해당 빈을 가져다가 사용한다.
- IoC컨테이너는 각 scope마다 Registry를 갖는다
- key와 value형태로 데이터를 저장하고 빈의 이름을 key로, 객체를 value로 저장
빈 설정시 주의점
- bean scope를 싱글턴으로 할 경우 상태를 가지면 안됨
- bean은 생성, 존재, 적용되는 범위인 bean scope를 설정하면 요청이 올 때마다 새로운 객체를 생성하게 할 수 있음 ex) @Scope("prototype")
- 의존성을 자동 주입해야할 인터페이스의 구현체가 여러개일 경우 충돌
- annotation을 활용하면 의존성 주입시 우선순위를 정할 수 있음 ex) @Primary , @Qualifier