์ปดํฌ๋ํธ ์ค์บ๊ณผ ์์กด๊ด๊ณ ์๋ ์ฃผ์ ์์ํ๊ธฐ
@Configuration
public class AppConfig {
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
์ง๊ธ๊น์ง ์คํ๋ง ๋น์ ๋ฑ๋กํ ๋๋
์๋ฐ ์ฝ๋์ @Bean์ด๋ XML์ <bean> ๋ฑ์ ํตํด์ ์ค์ ์ ๋ณด์ ์ง์ ๋ฑ๋กํ ์คํ๋ง ๋น์ ๋์ดํ๋ค.
์ด๋ ๊ฒ ๋ฑ๋กํด์ผ ํ ์คํ๋ง ๋น์ด ์์ญ, ์๋ฐฑ๊ฐ๊ฐ ๋๋ฉด ์ผ์ผ์ด ๋ฑ๋กํ๊ธฐ๋ ๊ท์ฐฎ๋ค
๊ทธ๋์ ์คํ๋ง์ ์ค์ ์ ๋ณด๊ฐ ์์ด๋ ์๋์ผ๋ก ์คํ๋ง ๋น์ ๋ฑ๋กํ๋ ์ปดํฌ๋ํธ ์ค์บ์ด๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
๋ ์์กด๊ด๊ณ๋ ์๋์ผ๋ก ์ฃผ์
ํ๋ @Autowired ๋ผ๋ ๊ธฐ๋ฅ๋ ์ ๊ณตํ๋ค.
@Configuration
@ComponentScan(
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
Configuration.class)
)
public class AutoAppConfig {
}
์ปดํฌ๋ํธ ์ค์บ์ ์ด๋ฆ ๊ทธ๋๋ก @Component ์ ๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ฅผ ์ค์บํด์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค.
์ปดํฌ๋ํธ ์ค์บ์ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์ @ComponentScan ์ ์ค์ ์ ๋ณด์ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค.
๊ธฐ์กด์ AppConfig์๋ ๋ค๋ฅด๊ฒ @Bean์ผ๋ก ๋ฑ๋กํ ํด๋์ค๊ฐ ํ๋๋ ์๋ค!
ํํฐ
์ฐธ๊ณ : ์ปดํฌ๋ํธ ์ค์บ์ ์ฌ์ฉํ๋ฉด @Configuration ์ด ๋ถ์ ์ค์ ์ ๋ณด๋ ์๋์ผ๋ก ๋ฑ๋ก๋๊ธฐ ๋๋ฌธ์,
AppConfig, TestConfig ๋ฑ ์์ ๋ง๋ค์ด๋์๋ ์ค์ ์ ๋ณด๋ ํจ๊ป ๋ฑ๋ก๋๊ณ , ์คํ๋์ด ๋ฒ๋ฆฐ๋ค.
๊ทธ๋์ excludeFilters ๋ฅผ ์ด์ฉํด์ ์ค์ ์ ๋ณด๋ ์ปดํฌ๋ํธ ์ค์บ ๋์์์ ์ ์ธํ๋ค.
๋ณดํต ์ค์ ์ ๋ณด๋ฅผ ์ปดํฌ๋ํธ ์ค์บ ๋์์์ ์ ์ธํ์ง๋ ์์ง๋ง, ๊ธฐ์กด ์์ ์ฝ๋๋ฅผ ์ต๋ํ ๋จ๊ธฐ๊ณ ์ ์งํ๊ธฐ ์ํด์ ์ด ๋ฐฉ๋ฒ์ ์ ํํ๋ค.
@Configuration
@ComponentScan(
includeFilters = @Filter(type = FilterType.ANNOTATION, classes =
MyIncludeComponent.class),
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
MyExcludeComponent.class)
includeFilters : ์ปดํฌ๋ํธ ์ค์บ ๋์์ ์ถ๊ฐ๋ก ์ง์ ํ๋ค.
excludeFilters : ์ปดํฌ๋ํธ ์ค์บ์์ ์ ์ธํ ๋์์ ์ง์ ํ๋ค.
์ฐธ๊ณ : @Component ๋ฉด ์ถฉ๋ถํ๊ธฐ ๋๋ฌธ์, includeFilters ๋ฅผ ์ฌ์ฉํ ์ผ์ ๊ฑฐ์ ์๋ค.
excludeFilters ๋ ์ฌ๋ฌ๊ฐ์ง ์ด์ ๋ก ๊ฐํน ์ฌ์ฉํ ๋๊ฐ ์์ง๋ง ๋ง์ง๋ ์๋ค.
> ํนํ ์ต๊ทผ ์คํ๋ง ๋ถํธ๋ ์ปดํฌ๋ํธ ์ค์บ์ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋๋ฐ, ๊ฐ์ธ์ ์ผ๋ก๋ ์ต์ ์ ๋ณ๊ฒฝํ๋ฉด์ ์ฌ์ฉํ๊ธฐ ๋ณด๋ค๋
์คํ๋ง์ ๊ธฐ๋ณธ ์ค์ ์ ์ต๋ํ ๋ง์ถ์ด ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํ๊ณ , ์ ํธํ๋ ํธ์ด๋ค.
@Component
public class MemberServiceImpl implements MemberService {
๊ฐ ํด๋์ค๊ฐ ์ปดํฌ๋ํธ ์ค์บ์ ๋์์ด ๋๋๋ก @Component ์ ๋ ธํ ์ด์ ์ ๋ถ์ฌ์ฃผ์.
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
์ ์ AppConfig์์๋ @Bean ์ผ๋ก ์ง์ ์ค์ ์ ๋ณด๋ฅผ ์์ฑํ๊ณ , ์์กด๊ด๊ณ๋ ์ง์ ๋ช ์ํ๋ค.
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
์ด์ ๋ ์ด๋ฐ ์ค์ ์ ๋ณด ์์ฒด๊ฐ ์๊ธฐ ๋๋ฌธ์, ์์กด๊ด๊ณ ์ฃผ์ ๋ ์ด ํด๋์ค ์์์ ํด๊ฒฐํด์ผ ํ๋ค.
@Autowired ๋ ์์กด๊ด๊ณ๋ฅผ ์๋์ผ๋ก ์ฃผ์ ํด์ค๋ค.
@Autowired ๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฑ์์์ ์ฌ๋ฌ ์์กด๊ด๊ณ๋ ํ๋ฒ์ ์ฃผ์ ๋ฐ์ ์ ์๋ค.
ํ ์คํธ ํด๋ณด๊ธฐ
public class AutoAppConfigTest {
@Test
void basicScan() {
ApplicationContext ac = new AnnotationConfigApplicationContext(AutoAppConfig.class);
MemberService memberService = ac.getBean(MemberService.class);
assertThat(memberService).isInstanceOf(MemberService.class);
}
}
AppConfig ๊ฐ ์๋
AutoAppConfig ์ค์ ์ ๋ณด๋ฅผ ๊ตฌ์ฑ์ ๋ณด๋ก ์ฌ์ฉํ๋ ์ปจํ ์ด๋ ์์ฑ
์คํํด๋ณด๋ฉด ๊ธฐ์กด๊ณผ ๊ฐ์ด ์ ๋์ํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์์กด๊ด๊ณ ์ฃผ์ ์ด ์ด๋ป๊ฒ ๋์ํ๋์ง ๊ทธ๋ฆผ์ผ๋ก ์์๋ณด์.
1. @ComponentScan
@ComponentScan ์ @Component ๊ฐ ๋ถ์ ๋ชจ๋ ํด๋์ค๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค.
์ด๋ ์คํ๋ง ๋น์ ๊ธฐ๋ณธ ์ด๋ฆ์ ํด๋์ค๋ช ์ ์ฌ์ฉํ๋ ๋งจ ์๊ธ์๋ง ์๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ค.
๋น ์ด๋ฆ ๊ธฐ๋ณธ ์ ๋ต: MemberServiceImpl ํด๋์ค memberServiceImpl
๋น ์ด๋ฆ ์ง์ ์ง์ : ๋ง์ฝ ์คํ๋ง ๋น์ ์ด๋ฆ์ ์ง์ ์ง์ ํ๊ณ ์ถ์ผ๋ฉด
@Component("memberService2") ์ด๋ฐ์์ผ๋ก ์ด๋ฆ์ ๋ถ์ฌํ๋ฉด ๋๋ค.
2. @Autowired ์์กด๊ด๊ณ ์๋ ์ฃผ์
์์ฑ์์ @Autowired ๋ฅผ ์ง์ ํ๋ฉด, ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก ํด๋น ์คํ๋ง ๋น์ ์ฐพ์์ ์ฃผ์ ํ๋ค.
์ด๋ ๊ธฐ๋ณธ ์กฐํ ์ ๋ต์ ํ์ ์ด ๊ฐ์ ๋น์ ์ฐพ์์ ์ฃผ์ ํ๋ค.
getBean(MemberRepository.class) ์ ๋์ผํ๋ค๊ณ ์ดํดํ๋ฉด ๋๋ค.
์ค๋ณต ๋ฑ๋ก๊ณผ ์ถฉ๋
์ปดํฌ๋ํธ ์ค์บ์์ ๊ฐ์ ๋น ์ด๋ฆ์ ๋ฑ๋กํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
๋ค์ ๋๊ฐ์ง ์ํฉ์ด ์๋ค.
- ์๋๋น๋ฑ๋กvs์๋๋น๋ฑ๋ก
- ์๋๋น๋ฑ๋กvs์๋๋น๋ฑ๋ก
์๋ ๋น ๋ฑ๋ก vs ์๋ ๋น ๋ฑ๋ก
์ปดํฌ๋ํธ ์ค์บ์ ์ํด ์๋์ผ๋ก ์คํ๋ง ๋น์ด ๋ฑ๋ก๋๋๋ฐ, ๊ทธ ์ด๋ฆ์ด ๊ฐ์ ๊ฒฝ์ฐ ์คํ๋ง์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ๋ค.
ConflictingBeanDefinitionException ์์ธ ๋ฐ์
@Component("service")
public class MemberServiceImpl implements MemberService {
@Component("service")
public class OrderServiceImpl implements OrderService {
์ด๋ฆ์ด ๊ฐ์ ๊ฒฝ์ฐ
์๋ ๋น ๋ฑ๋ก vs ์๋ ๋น ๋ฑ๋ก
@Component
public class MemoryMemberRepository implements MemberRepository {
์๋ ๋น ๋ฑ๋ก
@Bean(name = "memberRepository")
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
์๋ ๋น ๋ฑ๋ก
์ด ๊ฒฝ์ฐ ์๋ ๋น ๋ฑ๋ก์ด ์ฐ์ ๊ถ์ ๊ฐ์ง๋ค.
๋ฌผ๋ก ๊ฐ๋ฐ์๊ฐ ์๋์ ์ผ๋ก ์ด๋ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ํ๋ค๋ฉด, ์๋ ๋ณด๋ค๋ ์๋์ด ์ฐ์ ๊ถ์ ๊ฐ์ง๋ ๊ฒ์ด ์ข๋ค.
ํ์ง๋ง ํ์ค์ ๊ฐ๋ฐ์๊ฐ ์๋์ ์ผ๋ก ์ค์ ํด์ ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋ง๋ค์ด์ง๊ธฐ ๋ณด๋ค๋
์ฌ๋ฌ ์ค์ ๋ค์ด ๊ผฌ์ฌ์ ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋ง๋ค์ด์ง๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด๋ค!
์ต๊ทผ ์คํ๋ง ๋ถํธ์์๋ ์๋ ๋น ๋ฑ๋ก๊ณผ ์๋ ๋น ๋ฑ๋ก์ด ์ถฉ๋๋๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ก ๊ธฐ๋ณธ ๊ฐ์ ๋ฐ๊พธ์๋ค.
์๋, ์๋์ ์ฌ๋ฐ๋ฅธ ์ค๋ฌด ์ด์ ๊ธฐ์ค
์ด๋ค ๊ฒฝ์ฐ์ ์ปดํฌ๋ํธ ์ค์บ๊ณผ ์๋ ์ฃผ์ ์ ์ฌ์ฉํ๊ณ
์ด๋ค ๊ฒฝ์ฐ์ ์ค์ ์ ๋ณด๋ฅผ ํตํด์ ์๋์ผ๋ก ๋น์ ๋ฑ๋กํ๊ณ , ์์กด๊ด๊ณ๋ ์๋์ผ๋ก ์ฃผ์ ํด์ผ ํ ๊น?
๊ฒฐ๋ก ๋ถํฐ ์ด์ผ๊ธฐํ๋ฉด, ์คํ๋ง์ด ๋์ค๊ณ ์๊ฐ์ด ๊ฐ ์๋ก ์ ์ ์๋์ ์ ํธํ๋ ์ถ์ธ๋ค.
์๋ ๋น ๋ฑ๋ก์ ์ธ์ ์ฌ์ฉํ๋ฉด ์ข์๊น?
์ ํ๋ฆฌ์ผ์ด์ ์ ํฌ๊ฒ ์ ๋ฌด ๋ก์ง๊ณผ ๊ธฐ์ ์ง์ ๋ก์ง์ผ๋ก ๋๋ ์ ์๋ค.
์
๋ฌด ๋ก์ง ๋น: ์น์ ์ง์ํ๋ ์ปจํธ๋กค๋ฌ, ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ด ์๋ ์๋น์ค,
๋ฐ์ดํฐ ๊ณ์ธต์ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฑ์ด ๋ชจ๋ ์ ๋ฌด ๋ก์ง์ด๋ค.
๋ณดํต ๋น์ฆ๋์ค ์๊ตฌ์ฌํญ์ ๊ฐ๋ฐํ ๋ ์ถ๊ฐ๋๊ฑฐ๋ ๋ณ๊ฒฝ๋๋ค.
๊ธฐ์ ์ง์ ๋น: ๊ธฐ์ ์ ์ธ ๋ฌธ์ ๋ ๊ณตํต ๊ด์ฌ์ฌ(AOP)๋ฅผ ์ฒ๋ฆฌํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ์ด๋, ๊ณตํต ๋ก๊ทธ ์ฒ๋ฆฌ ์ฒ๋ผ ์ ๋ฌด ๋ก์ง์ ์ง์ํ๊ธฐ ์ํ ํ๋ถ ๊ธฐ์ ์ด๋ ๊ณตํต ๊ธฐ์ ๋ค์ด๋ค.
์ ๋ฌด ๋ก์ง์ ์ซ์๋ ๋งค์ฐ ๋ง๊ณ , ํ๋ฒ ๊ฐ๋ฐํด์ผ ํ๋ฉด ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ฆฌํฌ์งํ ๋ฆฌ ์ฒ๋ผ ์ด๋์ ๋ ์ ์ฌํ ํจํด์ด ์๋ค.
์ด๋ฐ ๊ฒฝ์ฐ ์๋ ๊ธฐ๋ฅ์ ์ ๊ทน ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. ๋ณดํต ๋ฌธ์ ๊ฐ ๋ฐ์ํด๋ ์ด๋ค ๊ณณ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ๋ช
ํํ๊ฒ ํ์
ํ๊ธฐ ์ฝ๋ค.
๊ธฐ์ ์ง์ ๋ก์ง์ ์ ๋ฌด ๋ก์ง๊ณผ ๋น๊ตํด์ ๊ทธ ์๊ฐ ๋งค์ฐ ์ ๊ณ , ๋ณดํต ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ๊ฑธ์ณ์ ๊ด๋ฒ์ํ๊ฒ ์ํฅ์ ๋ฏธ์น๋ค.
๊ทธ๋ฆฌ๊ณ ์ ๋ฌด ๋ก์ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋๊ฐ ๋ฌธ์ ์ธ์ง ๋ช ํํ๊ฒ ์ ๋๋ฌ๋์ง๋ง,
๊ธฐ์ ์ง์ ๋ก์ง์ ์ ์ฉ์ด ์ ๋๊ณ ์๋์ง ์๋์ง ์กฐ์ฐจ ํ์ ํ๊ธฐ ์ด๋ ค์ด ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
๊ทธ๋์ ์ด๋ฐ ๊ธฐ์ ์ง์ ๋ก์ง๋ค์ ๊ฐ๊ธ์ ์๋ ๋น ๋ฑ๋ก์ ์ฌ์ฉํด์ ๋ช ํํ๊ฒ ๋๋ฌ๋ด๋ ๊ฒ์ด ์ข๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ๊ด๋ฒ์ํ๊ฒ ์ํฅ์ ๋ฏธ์น๋ ๊ธฐ์ ์ง์ ๊ฐ์ฒด๋ ์๋ ๋น์ผ๋ก ๋ฑ๋กํด์
๋ฑ! ์ค์ ์ ๋ณด์ ๋ฐ๋ก ๋ํ๋๊ฒ ํ๋ ๊ฒ์ด ์ ์ง๋ณด์ ํ๊ธฐ ์ข๋ค.
์ ๋ฆฌ
ํธ๋ฆฌํ ์๋ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ์
์ง์ ๋ฑ๋กํ๋ ๊ธฐ์ ์ง์ ๊ฐ์ฒด๋ ์๋ ๋ฑ๋ก
๋คํ์ฑ์ ์ ๊ทน ํ์ฉํ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์๋ ๋ฑ๋ก์ ๊ณ ๋ฏผํด๋ณด์