๐ ๋ณธ ๊ธ์ ์ธํ๋ฐ ๊ฐ์ '์คํ๋ง ํต์ฌ ๊ธฐ์ '์ ๋ฃ๊ณ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
Spring 3.1 ๋ถํฐ ๋์
์ด ๋ ๊ฒ์ผ๋ก ํด๋น ์ด๋
ธํ
์ด์
์ ๋ฑ๋กํ๋ฉด XML ํ์ผ์ <context:component-scan>
์ ์ฌ์ฉํ ๊ฒ์ฒ๋ผ ๋น์ผ๋ก ๋ฑ๋กํ๋ ์ด๋
ธํ
์ด์
์ด ๋ถ์ ๋น์ ์๋์ผ๋ก ์ค์บํ์ฌ ๋ฑ๋กํด์ค๋๋ค.
@ComponentScan
์ ์ญํ- ์ค์บ ์์น ์ค์
- ํํฐ : ์ด๋ค ์ด๋ ธํ ์ด์ ์ ์ค์บํ ์ง ๋๋ ์ค์บํ์ง ์์์ง ์ค์
๊ฐ์ฅ ์ค์ํ ์ค์ ์ basePackages
, basePackageClasses
์ค์ ๊ณผ @Filter
๋ฅผ ํตํด ์ค์บ์ ์ ์ธํ ๋์ ์ค์ ์
๋๋ค. ์ฐ์ basePackages
, basePackageClasses
๋ ์ค์บํ ์์น๋ฅผ ์ค์ ํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
basePackages
๊ฐ์ String
์ด๊ธฐ ๋๋ฌธ์ ํจํค์ง๊ฐ ๊ธด ๊ฒฝ์ฐ์๋ ์ผ์ผ์ด ์
๋ ฅํ๊ธฐ์๋ ๋ฒ๊ฑฐ๋กญ๊ธฐ๋ ํ๊ณ String์ผ๋ก ์
๋ ฅํ๋ค๊ฐ ์คํ๊ฐ ๋ ์๋ ์๊ธฐ์ TypeSafe ํ์ง ์์ต๋๋ค.
๊ทธ๋์ TypeSafe ํ ๋ฐฉ๋ฒ์ผ๋ก ์ค์ ํ ์ ์๋ basePackageClasses
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค. basePackageClasses
๋ ์ค์บ ์์น๋ฅผ ํด๋์ค์ ์์น๋ก ๋ฐ์ ์ค์บ์ ์์ํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
@ComponentScan
์ด ๋ถ์ @Configuration
์ด ๋ถ์ ๋์๋ถํฐ ์ค์บ์ ์์ํฉ๋๋ค.
SpringBoot๋ก ์๋ฅผ ๋ค์ด๋ณด๋ฉด, @SpringBootApplication
์ด๋
ธํ
์ด์
์ ๋ค์ด๊ฐ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ์๋์ด ์๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {
@Filter( type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}), @Filter( type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class}
)}
)
public @interface SpringBootApplication {
@AliasFor(annotation = EnableAutoConfiguration.class)
// ์ดํ ์๋ต...
}
@ComponentScan
๊ณผ, @Configuration
์ ๊ตฌํํ @SpringBootConfiguration
์ด ๋ถ์ด์๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
๊ทธ๋ ๊ธฐ ๋๋ฌธ์ Application์ด ์์๋๋ฉด @SpringBootApplication
์ด ๋ถ์ ํด๋์ค๋ฅผ ๊ธฐ์ ์ผ๋ก ํด๋น ํด๋์ค๋ฅผ ํฌํจํ๋ ํจํค์ง์ ๊ทธ ์ดํ์ ํด๋์ค๋ค, ๋๋ ํจํค์ง๋ค์ด ๋ชจ๋ ์ค์บ ๋์์ด ๋ฉ๋๋ค.
๋ง์ฝ, @SpringBootApplication
์ด ๋ถ์ ํด๋์ค ๋ฐ์ ํจํค์ง๊ฐ ์กด์ฌํ๋ค๋ฉด ๊ทธ ํจํค์ง๋ ์ค์บ ๋์์ด ๋์ง ์์ต๋๋ค. ์ดํด๋ฅผ ์ํด ์ฌ์ง์ผ๋ก ์ค๋ช
๋๋ฆฌ๊ฒ ์ต๋๋ค. ์๋์ ๊ฐ์ ํจํค์ง ๊ตฌ์กฐ๊ฐ ์์ต๋๋ค.
๋นจ๊ฐ์์ผ๋ก ํ์๋ ํด๋์ค๊ฐ @SpringBootApplication
์ด ๋ถ์ ํด๋์ค์
๋๋ค. ๊ทธ๋ผ dempspring51 ํจํค์ง์ ์๋ ํด๋์ค๋ค์ ์ค์บ ๋์์ด ๋์ง๋ง, out ํจํค์ง์ ์๋ ํด๋์ค๋ ์ค์บ ๋์์ด ๋์ง ์๋๋ค๋ ๊ฒ ์
๋๋ค.
Filter๋ ์ด๋ค ์ด๋
ธํ
์ด์
์ ์ค์บํ ์ง ๋๋ ํ์ง ์์์ง๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค. ๋ง์ฝ ์ค์บ์์ ์ ์ธํ ๋์์ด ์๋ค๋ฉด excludeFilters
์๋ฆฌ๋จผํธ์ @Filter ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ์ฌ ์ง์ ํ๋ฉด ๋ฉ๋๋ค. 1.1 BasePackageClasses๋ฅผ ์ค๋ช
ํ๋ฉด์ ๋ณด์ฌ๋๋ ธ๋ @SpringBootApplication
์ ๋ณด๋ฉด excludeFilters
์ @Filter ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ค ํด๋์ค๋ฅผ ์ ์ธํ ์ง ์ค์ ํ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
@Component
๊ฐ ๋ถ์ ํด๋์ค๋ @ComponentScan
์ ํตํด ์๋์ผ๋ก ๋น์ผ๋ก ๋ฑ๋ก๋ฉ๋๋ค. ์ ํํ๊ฒ๋ @Component
๊ฐ ๋ถ์ ํด๋์ค ๋๋ @Component
๋ฅผ ๋ฉํ ์ด๋
ธํ
์ด์
์ผ๋ก ๊ฐ๊ณ ์๋ ์ด๋
ธํ
์ด์
์ ์ด๋
ธํ
์ด์
์ด ๋ถ์ ํด๋์ค๊ฐ ์๋ ๋น ๋ฑ๋ก ๋์์ด ๋ฉ๋๋ค.
@Component
๋ฅผ ๋ฉํ ์ด๋
ธํ
์ด์
์ผ๋ก ๊ฐ๊ณ ์๋ ์ด๋
ธํ
์ด์
์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- @Controller
- @Repository
- @Service
- @Configuration
์ค์ ์ค์บ๋์ BeanFactoryPostProcessor์ ๊ตฌํํ ConfigurationClassPostProcessor์ ์ํด ์ฒ๋ฆฌ ๋ฉ๋๋ค.
BeanFactoryPostProcessor
๋ BeanPostProcessor
์ ๋น์ทํ์ง๋ง ์คํ๋๋ ์์ ์ด ๋ค๋ฆ
๋๋ค. BeanFactoryPostProcessor
๋ ๋ค๋ฅธ ๋ชจ๋ ๋น๋ค์ ๋ง๋ค๊ธฐ ์ด์ ์ ์ ์ฉ์ด ๋๋ ๊ฒ์
๋๋ค.
์ฆ,@ComponentSacn
์ ๋ค๋ฅธ ๋น๋ค์ ์ฐพ์ BeanFactoryPostProcessor
๋ฅผ ๊ตฌํํ ConfigurationClassPostProcessor
์ ์ํด ๋น์ผ๋ก ๋ฑ๋ก์ด ๋๋ฉฐ, @Autowired
๋ ๋ฑ๋ก๋ ๋ค๋ฅธ ๋น๋ค์ ์ฐพ์ BeanPostProcessor
์ ๊ตฌํํ AutowiredAnnotationBeanPostProcessor
์ ์ํด ์์กด์ฑ ์ฃผ์
์ ์ ์ฉํ๋ ๊ฒ ์
๋๋ค.
๋ค๋ฅธ ๋น๋ค์ @Controller, @Service, @Bean, @Respository ๋ฑ์ ๋งํฉ๋๋ค.
๐ ์ง๊ณ ๋์ด๊ฐ๊ธฐ
- ๊ทธ๋ ๋ค๋ฉด BeanFactoryPostProcessor -> BeanPostProcessor ์์ผ๋ก ๋์ํ๋ ๊ฒ์ด๋ผ๊ณ ์ดํดํด๋ ๋ ๊น?
- Yes
์ ๋ฆฌํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- BeanPostProcessor
- Spring Bean์ ์์ฑ ์ ํ์ Bean์ ๋ํ ์ด๊ธฐํ ์์ ์ ์ํํ ์ ์๋ค.
- BeanPostProcessor๋ ๋น(๋๋ ๊ฐ์ฒด) ์ธ์คํด์ค์์์ ๋์ํ๋ค. ์ฆ, ์คํ๋ง IoC ์ปจํ ์ด๋๋ ๋น ์ธ์คํด์ค๋ฅผ ์ธ์คํด์คํํ ๋ค์์ BeanPostProcessor๊ฐ ์์ ์ ์ผ์ ์ํํ๋ค.
- BeanFactoryPostProcessor
- Bean์ ์ ์ ์์ฒด๋ฅผ ๋ฐ๊ฟ ์ ์๋ค. BeanPostProcessor๋ณด๋ค ๋จผ์ ์คํ๋๋ค.