2022. 2. 7. 17:42ใBackend/๐ฟ Spring
1. ์ปดํฌ๋ํธ ์ค์บ๊ณผ ์์กด๊ด๊ณ ์๋ ์ฃผ์
์ปดํฌ๋ํธ ์ค์บ ๋ฑ์ฅ ๋ฐฐ๊ฒฝ
@Bean ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๊ฑฐ๋ XML ์ ํ๊ทธ ๋ฑ์ ํตํด ์ค์ ์ ๋ณด์ ์ง์ ๋ฑ๋กํ ์คํ๋ง ๋น์ ๋์ดํ์ง๋ง, ๋ฑ๋กํ ๋น์ด ์๋ฐฑ๊ฐ์ง๊ฐ ๋๋ฉด ๋ฒ๊ฑฐ๋กญ๋ค.
@Component Scan
@Component ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ๋น์ ๋ชจ์กฐ๋ฆฌ ์ฐพ์๋ด๊ณ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค.
@Configuration ์ ์ ์ด์ @Component ๋ฅผ ํฌํจํ๊ธฐ ๋๋ฌธ์ ์ถฉ๋ ๋ฐฉ์ง
๋ฅผ ์ํด filter ๋ฅผ ์ฌ์ฉ.
@Configuration // ํํฐ ํ์
์ annotation ์ผ๋ก ์ง์
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class))
public class AutoAppConfig {
}
๊ธฐ์กด์ AppConfig ์ ๋ฌ๋ฆฌ @Bean ์ผ๋ก ๋ฑ๋กํ ์ปดํฌ๋ํธ๊ฐ ํ๋๋ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก AppConfig ์ ์ฌ์ฉํ ๊ฐ์ฒด๋ฅผ ์ผ์ผ์ด ๋น ๋ฑ๋กํ์ง ์๊ณ , ๊ทธ์ @Component ๋ง ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค. (ํจ์ฌ ๊ฐํธํ๋ค!)
์์กด๊ด๊ณ ์๋ ์ฃผ์
Q. ๊ทธ๋ ๋ค๋ฉด AppConfig ์์ ์๋
์ผ๋ก ์ค์ ํ ์์กด๊ด๊ณ ์ฃผ์
์ ์ด๋ป๊ฒ ํ๋?
A. @Autowired ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ค.
์ด์ AppConfig ํ์ผ์์๋ ์์กด๊ด๊ณ ์ฃผ์
์ ์๋
์ผ๋ก (์ฝ๋๋ก) ์์ฑํ์์ง๋ง, AutoAppConfig ํ์ผ์์๋ ์์กด๊ด๊ณ ์ฃผ์
์ด ์๋
์ผ๋ก ์ด๋ค์ง๋ค. ์ด๋ป๊ฒ? ๋ฐ๋ก @Autowired ๋ฅผ ์ฌ์ฉํ์ฌ.
์ปดํฌ๋ํธ ์ค์บ์ผ๋ก ์ธํด ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋ก๋ ํด๋์ค๋, ์์ ์ ์์ฑ์์ @Autowired
๋ฅผ ์ง์ ํ๋ค. ๊ทธ๋ฌ๋ฉด ์คํ๋ง ์ปจํ
์ด๋๊ฐ ์๋์ผ๋ก ํด๋น ์คํ๋ง ๋น์ ์ฐพ์์ ์ฃผ์
ํ๋ค. ์ด ๋ ๊ธฐ๋ณธ ์กฐํ ์ ๋ต์ ํ์
์ด ๊ฐ์ ๋น์ ์ฐพ์ ๋จผ์ ์ฃผ์
ํ๋ค.
์์ฑ์์ @Autowired ์ด๋ ธํ ์ด์ ์ ๋ณด๊ณ , ์คํ๋ง ์ปจํ ์ด๋๋ ์๋์ผ๋ก ํด๋น ์คํ๋ง ๋น์ ์ฐพ์ ์์กด์ฑ์ ์ฃผ์ ํด์ค๋ค.
์ค์บ์์ ์์น ์ค์
basePackages ๋ฅผ ํ์ํ ํจํค์ง์ ์์ ์์น๋ก ์ค์ ํ๋ค.
ํด๋น ํจํค์ง๋ฅผ ํฌํจํ์ฌ ํ์ ํจํค์ง๋ฅผ ๋ชจ๋ ํ์ํ๋ค .
๊ด๋ก
ํจํค์ง ์์น๋ฅผ ์ง์ ํ์ง ์๊ณ , ์ค์ ์ ๋ณด ํด๋์ค์ ์์น๋ฅผ ํ๋ก์ ํธ ์ต์๋จ์ ๋๋ ๊ฒ์ด๋ค. ์ต๊ทผ ์คํ๋ง ๋ถํธ๋ ์ด ๋ฐฉ๋ฒ์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ค.
์ปดํฌ๋ํธ ์ค์บ์ ๊ธฐ๋ณธ ๋์
@Component
: ์ปดํฌ๋ํธ ์ค์บ์์ ์ฌ์ฉ
@Controller, @Service, @Repository @Configuration: ๋ชจ๋ ๋ด๋ถ์ @Component
๊ฐ ๋ถ์ด์๋ค.
์คํ๋ง๋ถํธ์์๋
@SpringBootApplication ๋ด๋ถ์ @Component ๊ฐ ๋ถ์ด์์ด ์ปดํฌ๋ํธ ์ค์บ์ ๋์์ด ๋๋ค. ๋๋ฌธ์ ๋ฐ๋ก ์ด๋ ธํ ์ด์ ์ ๋ถ์ผ ํ์๊ฐ ์๋ค.
@Component ์ @Bean ์ด๋ ธํ ์ด์ ์ ์ฐจ์ด๋ฅผ ์ดํดํด์ผํ๋ค.
- @Bean ์ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๊ฐ ์ปจํธ๋กค ๋ถ๊ฐ๋ฅํ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ Bean ์ผ๋ก ๋ฑ๋กํ๊ณ ์ถ์ ๊ฒฝ์ฐ์ ์ฌ์ฉ๋๋ค.
- ๋ฐ๋๋ก ๊ฐ๋ฐ์๊ฐ ์ง์ ์ปจํธ๋ก ๊ฐ๋ฅํ ํด๋์ค์ ๊ฒฝ์ฐ์ @Compnent ๋ฅผ ์ฌ์ฉํ๋ค.
- @Bean ์ setter, builder ๋ฑ์ ํตํด ์ฌ์ฉ์๊ฐ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํด์ ์์ฑํ ์ธ์คํด์ค๋ฅผ ์คํ๋ง์๊ฒ ๊ด๋ฆฌํ๋ผ๊ณ ๋งก๊ธฐ๋ ๊ฒ
- @Component ๋ ํด๋์ค๋ฅผ ์คํ๋ง ๋ณด๊ณ ์์์ ์ธ์คํด์ค ์์ฑํ ํ์ ๋ฑ๋กํ๋ผ๊ณ ๋งก๊ธฐ๋ ๊ฒ ์ฐจ์ด๊ฐ ์๋ฐ.
2. ํํฐ
includeFilter : ์ค์บ์ ๋์์ ๋ช ํํ ํ๊ธฐ ์ํด ์ฌ์ฉ
excludeFilter : ์ปดํฌ๋ํธ ์ค์บ์์ ์ ์ธํ ๋์์ ์ง์
์ ๋ ธํ ์ด์ ์์ฑ
@Target(ElementType.TYPE)
: TYPE → Class ๋ ๋ฒจ์ ๋ถ๋ ์ ๋
ธํ
์ด์
@MyIncludeComponent
public class BeanA {
}
@MyExcludeComponent
public class BeanB {
}
public class ComponentFilterAppConfigTest {
@Test
void filterScan() {
ApplicationContext ac = new AnnotationConfigApplicationContext(ComponentFilterAppConfig.class);
BeanA beanA = ac.getBean("beanA", BeanA.class);
Assertions.assertThat(beanA).isNotNull();
assertThrows(
NoSuchBeanDefinitionException.class,
() -> ac.getBean("beanB", BeanB.class)
);
}
@Configuration
@ComponentScan(
includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
)
static class ComponentFilterAppConfig {
}
}
3. ์ค๋ณต ๋ฑ๋ก๊ณผ ์ถฉ๋
๋๋ช ์ ๋น์ด ์กด์ฌํ ๋
- ์๋ ๋น ๋ฑ๋ก vs ์๋ ๋น ๋ฑ๋ก
- ConflictBeanDefinitionException ์์ธ ๋ฐ์
- ์๋ ๋น ๋ฑ๋ก vs ์๋ ๋น ๋ฑ๋ก
์๋
๋น ๋ฑ๋ก๊ณผ ์๋
๋น ๋ฑ๋ก์์ ๋์ผํ ๋น ์ด๋ฆ
์ผ๋ก ์ธํด ์ถฉ๋์ด ๋ฐ์ํ๋ฉด, ์ฐ์ ์๋
๋น ๋ฑ๋ก์ด ์ฐ์ ๊ถ์ ๊ฐ์ง๋ค.
>>> ์๋ ๋น ๋ฑ๋ก์ ๋จ๋ ๋ก๊ทธ: Overriding bean definition for bean 'memoryMemberRepository' with a different definition: replacing
์คํ๋ง ๋ถํธ์์ ์๋ ๋น ๋ฑ๋ก์ ์๋ฌ
>>> Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true
์คํ๋ง์์๋ ์๋์ผ๋ก ๋ฑ๋กํ ๋น์ด ์ฐ์ ๊ถ์ ๊ฐ์ง๋ฉฐ ์ค๋ฒ๋ผ์ด๋๋ฅผ ํ์ง๋ง, ์คํ๋ง ๋ถํธ์์๋ ์ค๋ฒ๋ผ์ด๋ ์ค์ ์ false ๋ก ๋๊ธฐ ๋๋ฌธ์ ์ค๋ฒ๋ผ์ด๋ฉ ๋์ง ์๊ณ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค. => ์ฆ ๋๋ช ์ ๋น์ ์ฌ์ฉํ์ง ๋ชปํ๊ฒ ์ฌ์ ์ ๋ง๋๋ค.
'Backend > ๐ฟ Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Springboot] java: You aren't using a compiler supported by lombok, so lombok will not work and has been disabled. (0) | 2022.03.05 |
---|---|
[Springboot] log ์ ์ฉ ์ log symbol: variable log ์๋ฌ (0) | 2022.03.04 |
์ฑ๊ธํค ์ปจํ ์ด๋ (0) | 2022.02.06 |
์คํ๋ง ์ปจํ ์ด๋์ ์คํ๋ง ๋น (0) | 2022.02.04 |
[Spring] Service, ServiceImpl ์ ๊ด๊ณ (feat. OCP) (1) | 2022.02.02 |