ํด๋น ํฌ์คํ ์ ๊น์ํ๋์ ์ธํ๋ฐ ๊ฐ์(์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ)๋ฅผ ๋ฃ๊ณ ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
@ComponentScan
์ปดํฌ๋ํธ ์ค์บ์ ์ฌ์ฉํ์ง ์๊ณ ์คํ๋ง ๋น์ ๋ฑ๋กํ ๋ ์๋์ ๊ฐ์ด @Bean(๋๋ XML์ <bean>)์ ํตํด์ ์ค์ ์ ๋ณด๋ฅผ ์ง์ ๋ฑ๋กํ ์คํ๋ง ๋น์ ๋์ดํด์ผํ๋ค.
// ์ปดํฌ๋ํธ ์ค์บ์ ์ฌ์ฉํ์ง ์๊ณ ๋น์ ๋ฑ๋กํ๋ Configuration
@Configuration
public class AppConfig {
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
@Bean
public OrderService orderService() {
return new OrderServiceImpl(memberRepository(), discountPolicy());
}
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public DiscountPolicy discountPolicy() {
return new RateDiscountPolicy();
}
...
}
์คํ๋ง์ ์ค์ ์ ๋ณด๊ฐ ์์ด๋ ์๋์ผ๋ก ์คํ๋ง ๋น์ ๋ฑ๋กํ๋ ์ปดํฌ๋ํธ ์ค์บ์ด๋ผ๋ ๊ธฐ๋ฅ๊ณผ ์์กด๊ด๊ณ๋ฅผ ์๋์ผ๋ก ์ฃผ์ ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์๋์ ๊ฐ์ด @ComponentScan ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ฉด ๋น ๋ฑ๋ก์ ์ง์ ํ์ง ์์๋, @Component ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ค์ ์ฐพ์ ๋น์ผ๋ก ๋ฑ๋กํด์ค๋ค.
์ด๋ ๋น๋ค ๊ฐ์ ์์กด ๊ด๊ณ๋ฅผ ๋ช ์ํด์ผ ํ๋๋ฐ ์์ฑ์ ๋๋ ์์กด์ฑ ์ฃผ์ ์ด ํ์ํ ํ๋์ @Autowired ์ด๋ ธํ ์ด์ ์ ๋ถ์ด๊ฒ๋๋ฉด ์๋์ผ๋ก ์ฃผ์ ์ด ์ด๋ฃจ์ด์ง๋ค.
// AutoAppConfig.java
@Configuration
@ComponentScan
public class AutoAppConfig {
}
// MemberServiceImpl.java
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
...
}
@ComponentScan
- @ComponentScan์ @Component๊ฐ ๋ถ์ ๋ชจ๋ ํด๋์ค๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค.
- ์ด๋ ์คํ๋ง ๋น์ ๊ธฐ๋ณธ ์ด๋ฆ์ ํด๋์ค๋ช ์ ์ฌ์ฉํ๋ ๋งจ ์๊ธ์๋ง ์๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ค.
- ๋ง์ฝ ์ง์ ์ด๋ฆ์ ์ง์ ํ๊ณ ์ถ๋ค๋ฉด @Component("customBeanName")์ฒ๋ผ ์ด๋ฆ์ ๋ถ์ฌํ ์ ์๋ค.
@Autowired
- ์์ฑ์์ @Autowired๋ฅผ ์ง์ ํ๋ฉด ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก ํด๋น ์คํ๋ง ๋น์ ์ฐพ์์ ์ฃผ์ ํ๋ค.
- ์ด๋ ๊ธฐ๋ณธ ์กฐํ ์ ๋ต์ ํ์ ์ด ๊ฐ์ ๋น์ ์ฐพ์์ ์ฃผ์ ํ๋ค.
ํ์ ์์น์ ๊ธฐ๋ณธ ์ค์บ ๋์
ํ์ ์์น
ํ์ ์์ ์์น๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ง์ ํ ์ ์๋ค.
@ComponentScan(
basePackages = {"hello.core", "hello.service"},
basePackageClasses = CoreApplication.class
)
- basePackages : ํ์ํ ํจํค์ง์ ์์ ์์น๋ฅผ ์ง์ ํ๋ค. ์ด ํจํค์ง๋ฅผ ํฌํจํด์ ํ์ ํจํค์ง๋ฅผ ๋ชจ๋ ํ์ํ๋ค.
- basePackageClasses : ์ง์ ํ ํด๋์ค์ ํจํค์ง๋ฅผ ํ์ ์์ ์์น๋ก ์ง์ ํ๋ค.
- ๋ง์ฝ ์ง์ ํ์ง ์์ผ๋ฉด @ComponentScan์ด ๋ถ์ ์ค์ ์ ๋ณด ํด๋์ค์ ํจํค์ง๊ฐ ์์ ์์น๊ฐ ๋๋ค.
๊ถ์ฅํ๋ ๋ฐฉ๋ฒ์ ํจํค์ง ์์น๋ฅผ ์ง์ ํ์ง ์๊ณ , ์ค์ ์ ๋ณด ํด๋์ค์ ์์น๋ฅผ ํ๋ก์ ํธ ์ต์๋จ์ ๋๋ ๊ฒ์ด๋ค. ์ต๊ทผ ์คํ๋ง ๋ถํธ๋ ์ด ๋ฐฉ๋ฒ์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ค.
์ฐธ๊ณ ๋ก ์คํ๋ง ๋ถํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์คํ๋ง ๋ถํธ์ ๋ํ ์์ ์ ๋ณด์ธ @SpringBootApplication์ ํ๋ก์ ํธ ์์ ๋ฃจํธ ์์น์ ๋๋ ๊ฒ์ด ๊ด๋ก์ด๊ณ , ์ด @SpringBootApplication ์ค์ ์์ @ComponentScan์ด ๋ค์ด์๋ค.
์ปดํฌ๋ํธ ์ค์บ ๊ธฐ๋ณธ ๋์
- @Component : ์ปดํฌ๋ํธ ์ค์บ์์ ์ฌ์ฉ
- @Controller : ์คํ๋ง MVC ์ปจํธ๋กค๋ฌ์์ ์ฌ์ฉ
- @Service : ์คํ๋ง ๋น์ฆ๋์ค ๋ก์ง์์ ์ฌ์ฉ
- @Repository : ์คํ๋ง ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์์ ์ฌ์ฉ (ํด๋น ์ด๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ฅผ ์คํ๋ง ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์ผ๋ก ์ธ์ํ๊ณ , ๋ฐ์ดํฐ ๊ณ์ธต์ ์์ธ๋ฅผ ์คํ๋ง ์์ธ๋ก ๋ณํํด์ค๋ค)
- @Configuration : ์คํ๋ง ์ค์ ์ ๋ณด์์ ์ฌ์ฉ
ํํฐ
ํํฐ๋ฅผ ํตํด ์ปดํฌ๋ํธ ์ค์บ ๋์์ ์ถ๊ฐ๋ก ์ง์ ํ๊ฑฐ๋ ์ ์ธํ ์ ์๋ค.
@ComponentScan(
includeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyIncludeComponent.class),
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = MyExcludeComponent.class)
)
FilterType ์ต์
- ANNOTATION : ๊ธฐ๋ณธ๊ฐ, ์ด๋ ธํ ์ด์ ์ ์ธ์ํด์ ๋์ํ๋ค.
- ASSIGNABLE_TYPE : ์ง์ ํ ํ์ ๊ณผ ์์ ํ์ ์ ์ธ์ํด์ ๋์ํ๋ค.
- ASPECTJ : AspectJ ํจํด ์ฌ์ฉ
- REGEX : ์ ๊ท ํํ์
- CUSTOM : TypeFilter ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ ์ฒ๋ฆฌ
์ฐธ๊ณ ๋ก @Component๋ฉด ์ถฉ๋ถํ๊ธฐ ๋๋ฌธ์ includeFilters๋ฅผ ์ฌ์ฉํ ์ผ์ ๊ฑฐ์ ์๋ค. excludeFilters๋ ์ฌ๋ฌ๊ฐ์ง ์ด์ ๋ก ๊ฐํน ์ฌ์ฉํ ๋๊ฐ ์์ง๋ง ๋ง์ง๋ ์๋ค.
์ค๋ณต ๋ฑ๋ก๊ณผ ์ถฉ๋
- ์๋ ๋น ๋ฑ๋ก vs ์๋ ๋น ๋ฑ๋ก
- ์ปดํฌ๋ํธ ์ค์บ์ ์ํด ์๋์ผ๋ก ์คํ๋ง ๋น์ด ๋ฑ๋ก๋๋๋ฐ, ๊ทธ ์ด๋ฆ์ด ๊ฐ์ ๊ฒฝ์ฐ ์คํ๋ง์ ConflictingBeanDefinitionException์ ๋ฐ์์ํจ๋ค.
- ์๋ ๋น ๋ฑ๋ก vs ์๋ ๋น ๋ฑ๋ก
- ์๋ ๋น ๋ฑ๋ก์ด ์ฐ์ ๊ถ์ ๊ฐ์ง๋ค.
- ํ์ง๋ง ์ต๊ทผ ์คํ๋ง ๋ถํธ์์๋ ์๋ ๋น ๋ฑ๋ก๊ณผ ์๋ ๋น ๋ฑ๋ก์ด ์ถฉ๋๋๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ก ๊ธฐ๋ณธ ๊ฐ์ ๋ฐ๊พธ์๋ค.
'Spring > [์ธํ๋ฐ] ์คํ๋ง ํต์ฌ ์๋ฆฌ - ๊ธฐ๋ณธํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ๋ง ํต์ฌ ์๋ฆฌ ์ดํด (1) | 2021.05.10 |
---|---|
๊ฐ์ฒด ์งํฅ ์ค๊ณ์ ์คํ๋ง (0) | 2021.04.15 |