의존 자동 주입
앞서 스프링의 DI 설정에 대해 살펴봤다. 설정 클래스는 다음과 같이 주입할 의존 대상을 생성자나 메서드를 이용해서 주입했다. 이 코드는 의존 대상을 설정 코드에서 직접 주입한다.
의존 대상을 설정 코드에서 직접 주입하지 않고 스프링이 자동으로 의존하는 빈 객체를 주입해주는 기능도 있다. 이를 자동 주입이라고 한다.
스프링 부트의 부상과 더불어 자동 주입 방식이 더욱 자주 쓰이게 되었다.
=> 설정코드에서 생성자 혹은 세터 메서드를 호출해 명시적으로 의존 설정을 해주어야 했다. 자동 주입을 하게되면 이러한 명시적 설정을 생략할 수 있다.
@Autowired 어노테이션을 이용한 의존 자동 주입
스프링에서 의존 자동 주입을 설정하는 방법에는 여러가지가 있지만 주로 @Autowired 어노테이션을 이용해 설정한다. 자동 주입 기능을 사용하면 스프링이 알아서 의존 객체를 찾아서 주입한다. 따라서 설정에 의존 객체를 명시하지 않아도 된다.
자동 주입 기능을 사용하는 방법은 매우 간단하다. 의존을 주입할 대상에 @Autowired 어노테이션을 추가하면 된다. 필드에 @Autowired 어노테이션이 붙어 있으면 스프링이 해당 타입의 빈 객체를 찾아서 필드에 할당한다.
@Qualifier 어노테이션을 이용한 의존 객체 선택
같은 class에서 생성된 다른 객체를 Bean으로 등록할 수 있다. 이 경우 @Qualifier 어노테이션을 이용해 같은 타입의 빈 객체를 구분해 의존성을 부여할 수 있다.
@Qualifier 어노테이션은 두 위치에서 명시한다. 첫 번째는 @Bean 어노테이션을 붙인 빈 설정 메서드이고, 두 번째는 주입 될 위치를 지정하는 @Autowired 아래이다.
빈 설설정에 @Qualifier 어노테이션이 없으면 빈의 이름을 한정자로 지정한다. @Autowired 어노테이션도 @Qualifier 어노테이션이 없으면 필드나 파라미터이름을 한정자로 사용한다.
Bean 객체를 스캔할 때 @Qualifier로 지정된 값을 우선적으로 한다.
컴포넌트 스캔
@Component 어노테이션으로 스캔 대상 지정
자동 주입과 함께 사용하는 추가 기능이 컴포넌트 스캔이다. 컴포넌트 스캔은 스프링이 직접 클래스를 검색해서 빈으로 등록해주는 기능이다. 설정 클래스에 빈으로 사용하지 않아도 원하는 클래스를 빈으로 등록할 수 있으므로 컴포넌트 스캔 기능을 사용하면 설정 코드가 크게 줄어든다.
스프링이 검색해서 빈으로 등록할 수 있으려면 클래스에 @Component 어노테이션을 추가해야 한다. @Component 어노테이션은 해당 클래스를 스캔 대상으로 표시한다.
@Component 어노테이션에 인자를 전달하면 그 값을 빈으로 등록할 때의 이름으로 사용한다. 값을 주지 않은 경우에는 클래스 이름의 첫 글자를 소문자로 바꾼 이름을 빈 이름으로 사용한다.
@ComponentScan 어노테이션으로 스캔 설정
@Component 어노테이션을 붙인 클래스를 스캔해서 스프링 빈으로 등록하려면 설정 클래스에 @ComponenScan 어노테이션을 적용해야 한다.
@ComponentScan(basePackages = {"spring"})
위 코드에서 @ComponentScan 어노테이션의 basePackages 속성값은 {"spring"}이다. 이 속성은 스캔 대상 패키지 목록을 지정한다.
기본 스캔 대상
- @Component
- @Controller
- @Service
- @Repository
- @Aspect
- @Configuration
위 목록 중 @Aspect 어노테이션을 제외한 나머지 어노테이션은 실제로 @Component 어노테이션에 대한 특수 어노테이션이다.
'Backend > spring' 카테고리의 다른 글
WEB/WAS, Servlet (0) | 2022.02.17 |
---|---|
빈 라이프사이클, AOP (0) | 2022.01.13 |
Spring DI (0) | 2022.01.08 |
Spring ApplicationContext, IoC, Singleton (0) | 2022.01.08 |
스프링 빈과 의존관계 (0) | 2021.11.24 |