Root-context 추가
- webapp\WEB-INF\spring\root-context.xml
- 패키지 명을 다음과 같이 추가<context:component-scan base-package="org.zerock.sample" />
컴포넌트 스캔 & 의존관계 주입 시작
- 지금까지 스프링 빈(Bean)을 등록할 때 구성파일에 @Bean 을 사용했다
--> 관리할 빈이 많아지면 관리하기 번거로워 진다
- 굳이 빈 설정파일을 만들지 않거나, @Bean을 안쓰고 빈 등록을 할 수 있다
--> @Component 과Component Scan를 사용하면!
- 설정파일이 없다면 의존관계는 어떻게 주입할까?
--> @Autowired를 사용해 자동 의존관계 주입을 한다
컴포넌트 스캔(Component Scan)
[ 정의 ]
- @Component를 가진 모든 대상을 가져와서 빈에 등록하기 위해 찾는 과정
( 빈 설정파일 + @Bean을 통해 빈을 하나하나 지정할 필요가 없음)
[ 특징 ]
- 빈 이름 기본 전략 : 가장 앞 문자를 소문자로 바꾼 것이 빈 이름이 된다
ex) MemberServiceImpl --> memberServiceImpl
빈 이름을 수동으로 지정 : @Component("지정할 이름")
- 기본적인 컴포넌트 스캔 대상
- @Component : 컴포넌트 스캔에서 사용
- @Controller : 스프링 MVC 컨트롤러에서 사용
- @Service : 스프링 비즈니스 로직에서 사용
- @Repository : 스프링 데이터 접근 계층에서 사용
- @Configuration : 스프링 설정 정보에서 사용
- 컴포넌트 스캔 범위
- @ComponentScan 어노테이션이 있는 파일의 패키지 아래를 찾는다.
- basePackages / basePackageClasses로 지정도 가능
- 권장 방법 : 구성파일에 등록시 프로젝트 최상단에 두기
(SpringBoot 사용시라면 @SpringBootApplication에 포함되어있어서 자동으로 최상단으로 유지된다)
[ 주의할 점 ]
- DiscountPolicy라는 인터페이스를 상속받는 RateDiscountpolicy와 FixDiscountpolicy가 있을 때 둘 중 내가 사용할 것만 빈에 등록해야 하기 때문에 한 곳에만 @Component를 붙여야함!
--> 아니면 @Qulifier 이나, @Primary를 사용해야 한다!
- 수동 빈 등록 vs 자동 빈 등록
: 자동으로 빈을 등록 한 상태에서 수동 등록 파일과 이름이 겹칠 경우에는
수동 빈 파일이 우선권을 가진다. 하지만, 최근 SpringBoot는 오류를 낸다!
[ 옵션 ]
- 특정 어노테이션을 포함 / 제외 시킬 수 있음
- includeFilters : 컴포넌트 스캔 대상으로 추가
- excludeFilters : 컴포넌트 스캔 대상에서 제외
- FilterType 옵션
- ANNOTATION : 기본값, 어노테이션을 인식해 동작
- ASSIGNABLE_TYPE : 지정한 타입과 자식 타입을 인식해 동작
- ASPECTJ : AspectJ 패턴 사용
- REGEX : 정규 표현식
- CUSTOM : TypeFilter이라는 인터페이스를 구현해서 처리
[ 정리 ]
- 사실 어노테이션을 건드릴 일은 많지 않음 (존재하는 어노테이션이 충분해서)
- 가끔 특정 어노테이션을 제외하게 할 수 있음
- 기본 설정에 최대한 맞추어 사용하는 것이 관례
- 자동 의존관계 주입(Auto Dependency Injection)
[ 정의 ]
- 의존관계 주입을 스프링 컨테이너에 등록된 빈(Bean)에서 찾아서 설정하는 방법
[ 설명 ]
- 스프링 빈 설정 파일이 없어진다면 해당 파일에서 해주던 의존관계 주입을 해주는 것이 필요함
--> @Autowired 를 사용하면 된다.
- 의존성 주입이 필요한 파일의 생성자에서 어노테이션 사용
[ 원리 ]
1) 스프링 컨테이너가 @Component를 찾아 모두 스프링 빈으로 등록!
2) 의존성이 필요한 부분에서 @Autowired태그가 있다면 등록된 스프링 빈에서 찾아서 의존관계 주입 설정!