@ComponentScan
@ComponentScan์ @Component ๋ฐ @Service, @Repository, @Controller, @Configuration๋ฑ๊ณผ ๊ฐ์ด @Component๊ฐ ๋ถ์ด์๋ Class๋ค์ ์๋์ผ๋ก Scanํ์ฌ ์คํ๋ง Bean์ผ๋ก ๋ฑ๋กํด์ฃผ๋ ์ญํ ์ ์ํํฉ๋๋ค.
@Component๋ ํด๋์ค์ ์ฌ์ฉ๋๋ฉฐ, ๋น์ผ๋ก ๋ฑ๋ก๋ ๋์๋ ํด๋์ค๋ช
์ ์ฌ์ฉํ์ฌ ๋ฑ๋กํฉ๋๋ค.
์ด๋, ํด๋์ค์ ๋งจ ์๊ธ์๋ง ์๋ฌธ์๋ก ๋ฐ๊ฟ์ ์ ์ฅํฉ๋๋ค.
๋ง์ฝ Member ํด๋์ค์ ๊ฒฝ์ฐ์๋ Bean์ผ๋ก ๋ฑ๋ก๋๋ ๊ฒฝ์ฐ member๋ก ๋ฑ๋ก๋๋ ๊ฒ์ ๋๋ค.
@ComponentScan์ ๋ฒ์
๊ธฐ๋ณธ ๊ฐ์ผ๋ก๋ @ComponenetScan์ด ์ฌ์ฉ๋ ํจํค์ง๋ฅผ ์์ ์์น๋ก ํ์ฌ, ํด๋น ํจํค์ง์ ํ์ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ชจ๋ ํ์ํฉ๋๋ค.
๋ง์ฝ ํ์์ ๊ธฐ์ค์ด ๋๋ ํจํค์ง๋ฅผ ์ง์ ์ง์ ํด์ฃผ๊ณ ์ถ๋ค๋ฉด basePackages ์ต์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@ComponentScan( basePackages = "hello.core" }
์ด๋ฌ๋ฉด hello.core ํจํค์ง๋ฅผ ํฌํจํด์ ํ์์ ์๋ ๋ชจ๋ ํจํค์ง๋ฅผ ํ์ํฉ๋๋ค.
๋ํ basePackageClasses ์์ฑ์ ํตํด ํด๋์ค๋ฅผ ์ง์ ํ๋ฉด, ์ง์ ํ ํด๋์ค์ ํจํค์ง๋ฅผ ํ์ ์์ ์์น๋ก ์ง์ ํ ์ ์์ต๋๋ค.
๋น ์ด๋ฆ์ด ์ค๋ณต๋๋ ๊ฒฝ์ฐ
๋น ์ด๋ฆ์ด ์ค๋ณต๋๋ ๊ฒฝ์ฐ์๋ ๋ ๊ฐ์ง ์ํฉ์ด ์์ต๋๋ค.
์๋ ๋น ๋ฑ๋ก vs ์๋ ๋น ๋ฑ๋ก
ConflictingBeanDefinitionException ์ค๋ฅ๊ฐ ๋ฐ์ํฉ๋๋ค
์๋ ๋น ๋ฑ๋ก vs ์๋ ๋น ๋ฑ๋ก
๊ธฐ๋ณธ์ ์ผ๋ก๋ ์๋ ๋น ๋ฑ๋ก์ด ์ฐ์ ๊ถ์ ๊ฐ์ง๋๋ค. (์๋ ๋น์ด ์๋ ๋น์ ์ค๋ฒ๋ผ์ด๋ฉ)
๊ทธ๋ฌ๋ ์คํ๋ง ๋ถํธ์์๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ก ๊ธฐ๋ณธ ๊ฐ์ ๋ฐ๊พธ์์ต๋๋ค.(์ํ๋ฉด ์ค์ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํฉ๋๋ค)
์ค์บ ๊ธฐ๋ณธ ๋์
- @Componet - ๊ธฐ๋ณธ
- @Controller - ์คํ๋ง MVC ์ปจํธ๋กค๋ฌ์์ ์ฌ์ฉ
- @Service - ์คํ๋ง ๋น์ฆ๋์ค ๋ก์ง์์ ์ฌ์ฉ, ํน๋ณํ ๊ธฐ๋ฅ์ ์์ผ๋ ๊ฐ๋ฐ์๋ค์ด ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ด ์ฌ๊ธฐ์ ์๊ฒ ๊ตฌ๋ ํ๊ณ ์ธ์ํ๋ ์ฉ๋
- @Repository - ์คํ๋ง ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์์ ์ฌ์ฉ, ๋ฐ์ดํฐ ๊ณ์ธต์ ์์ธ๋ฅผ ์คํ๋ง ์์ธ๋ก ๋ณํ
- @Configuraton - ์คํ๋ง ์ค์ ์ ๋ณด์์ ์ฌ์ฉ. ์คํ๋ง ๋น์ด ์ฑ๊ธํค์ ์ ์งํ๋๋ก ์ถ๊ฐ ์ฒ๋ฆฌ
ํด๋น ์ด๋ ธํ ์ด์ ๋ค์ ๋ชจ๋ ๋ด๋ถ์ ์ผ๋ก @Componet๊ฐ ๋ถ์ด์๋ ์ด๋ ธํ ์ด์ ๋ค์ ๋๋ค.
๋์์์ ์ ์ธํ๊ฑฐ๋, ํฌํจ์ํค๊ณ ์ถ์ ๊ฒฝ์ฐ
Filter๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- includeFilters : ์ปดํฌ๋ํธ ์ค์บ ๋์์ ์ถ๊ฐ๋ก ์ง์ ํฉ๋๋ค
- excludeFilters : ์ปดํฌ๋ํธ ์ค์บ์์ ์ ์ธํ ๋์์ ์ง์ ํฉ๋๋ค
์์
์ปดํฌ๋ํธ ์ค์บ ๋์์ ์ถ๊ฐํ๋ ๊ฒฝ์ฐ
import java.lang.annotation.*;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CustomIncludeComponent {
}
@CustomIncludeComponent
public class IncludeClass {
}
์ปดํฌ๋ํธ ์ค์บ ๋์์์ ์ ์ธํ๋ ๊ฒฝ์ฐ
import java.lang.annotation.*;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CustomExcludeComponent {
}
@CustomExcludeComponent
public class ExcludeClass {
}
์ ์ฉ
@ComponentScan(
includeFilters = {
@ComponentScan.Filter(type=FilterType.ANNOTATION, classes=CustomIncludeComponent.class)
},
excludeFilters = {
@ComponentScan.Filter(type=FilterType.ANNOTATION, classes=CustomExcludeComponent.class)
}
)
@Configuration
public class CustomConfig {
}
FilterType์ ์ต์
- ANNOTATION: ๊ธฐ๋ณธ๊ฐ, ์ ๋ ธํ ์ด์ ์ ์ธ์ํด์ ๋์ํฉ๋๋ค.
- ASSIGNABLE_TYPE: ์ง์ ํ ํ์ ๊ณผ ์์ ํ์ ์ ์ธ์ํด์ ๋์ํฉ๋๋ค.
- ASPECTJ: AspectJ ํจํด์ ์ฌ์ฉํฉ๋๋ค
- REGEX: ์ ๊ท ํํ์์ ์ฌ์ฉํฉ๋๋ค.
- CUSTOM: TypeFilter ๋ผ๋ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ ์ฒ๋ฆฌํฉ๋๋ค.
Reference
'๐๏ธ Spring > ๊ธฐ๋ณธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] @Qualifier ๋์ ์ด๋ ธํ ์ด์ ์ ์ง์ ๋ง๋ค์ด๋ณด์ (0) | 2021.12.11 |
---|---|
[Spring] @Autowired (0) | 2021.12.11 |
[Spring] @Configuration (0) | 2021.12.11 |
[Spring] ์ฑ๊ธํค (feat. ์ฑ๊ธํค์ ๊ตฌํํ๋ ์ฌ๋ฌ ๋ฐฉ์) (2) | 2021.12.11 |
[Spring] ์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น (0) | 2021.12.11 |