⚡️ComponentScan
스프링에서 빈을 등록할 때 XML 혹은 JavaConfig에 Bean을 직접 등록시켜주곤 했습니다.
관리해야할 빈이 많아진다면 직접 빈을 등록해주는 작업 또한 많아져 번거롭겠죠?
ComponentScan은 직접 클래스 파일을 스캔하는 과정을 통해 의존성을 주입하고 빈을 등록합니다.
📌 컴포넌트 스캔 대상
클래스에 다음과 같은 어노테이션이 선언되어 있을 때 스캔 과정에서 빈으로 등록합니다.
- @Component : 기본적으로 스프링에서 관리되는 객체임을 표시하기 위해 사용
- @Controller : MVC 패턴 중 컨트롤러에 사용, 별도로 @RequestMapping 사용 가능
- @Repository : 데이터 입출력 (DAO)에 사용, 예외 작업 제공
- @Service : 비즈니스 로직에 사용, 추가적인 exception handling 가능
🔎 빈 이름 변경
빈 이름 Default는 클래스 이름의 첫번째 알파벳을 소문자로 바꾸면 됩니다.
만약 이름을 바꿔야한다면 @Component("빈 이름")과 같이 어노테이션에 직접 부여할 수 있습니다.
📌 컴포넌트 스캔 제외
- @IgnoreDuringScan : 스캔하지 않을 클래스에 선언하면 대상에 포함하지 않음
📌 XML에서 사용
<context:component-scan base-package="패키지명"/>
base-package에 스캔할 패키지를 넣어준 뒤, 패키지에 포함된 클래스를 스캔합니다.
GenericXmlApplicationContext factory =
new GenericXmlApplicationContext("classpath:패키지명/XML파일명.xml");
BeanClass scanBean = factory.getBean("beanClass", BeanClass.class);
설정파일이 XML이기 때문에 GenericXmlApplicationContext를 통해 컨테이너를 생성합니다.
컨테이너를 생성할 땐 컴포넌트 스캔을 사용한 xml 파일을 위와 같이 불러온 뒤
getBean() 메소드를 사용해 등록한 빈을 불러올 수 있습니다.
📌 JavaConfig에서 사용
@Configuration
@ComponentScan(basePackages = "패키지명")
public class JavaConfig {
}
XML 설정 파일 대신 자바 클래스를 사용할 땐
@Configuration 어노테이션을 통해 설정파일임을 명시하고,
@ComponentScan과 basePackages에 스캔할 패키지의 이름을 넣어줍니다.
AnnotationConfigApplicationContext factory =
new AnnotationConfigApplicationContext(클래스명.class);
BeanClass scanBean = factory.getBean("beanClass", BeanClass.class);
설정파일이 자바 클래스기 때문에 AnnotationConfigApplicationContext를 통해 컨테이너를 생성합니다.
설정 클래스를 (클래스명.class)에 넣어주어 컨테이너에 전달한 뒤
getBean() 메소드로 등록한 빈을 불러올 수 있습니다.
📌 의존성 주입 (DI)
[Spring/스프링] 제어의 역행(IoP)과 의존성 주입(Dependency Injection, DI)
⚡️ 제어의 역행 (IoP) 제어의 역행은 간단히 객체 생성과 의존 관계를 직접 처리하는게 아니라 소스에 의존관계가 명시되지 않도록 컨테이너가 대신 처리한다고 설명할 수 있습니다. 이는 스
lasbe.tistory.com
3가지 의존성 주입에 대한 자세한 내용은 전에 작성한 글에 소개되어 있으니 참고 바랍니다.
댓글