[Spring Framework] Component Scan
Component Scan
์คํ๋ง์ ์ค์ ์ ๋ณด๊ฐ ์์ด๋ ์๋์ผ๋ก ์คํ๋ง ๋น์ ๋ฑ๋กํ๋ ์ปดํฌ๋ํธ ์ค์บ์ด๋ผ๋ ๊ธฐ๋ฅ์ ์ ๊ณต ์์กด๊ด๊ณ๋ ์๋์ผ๋ก ์ฃผ์ ํ๋
@Autowired
๋ผ๋ ๊ธฐ๋ฅ๋ ์ ๊ณต
package hello.core;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import static org.springframework.context.annotation.ComponentScan.*;
@Configuration
@ComponentScan(
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes =
Configuration.class))
public class AutoAppConfig {
}
- ์ปดํฌํดํธ ์ค์บ์ ์ฌ์ฉํ๋ ค๋ฉด ๋จผ์
@ComponentScan
์ ์ค์ ์ ๋ณด์ ๋ถ์ฌ์ฃผ๋ฉด ๋๋ค. - ๊ธฐ์กด์ AppConfig์ ๋ค๋ฅด๊ฒ @Bean์ผ๋ก ๋ฑ๋กํ ํด๋์ค๊ฐ ํ๋๋ ์๋ค.
์ปดํฌ๋ํธ ์ค์บ์ ์ด๋ฆ ๊ทธ๋๋ก
@Component
์ ๋ ธํ ์ด์ ์ด ๋ถ์ ํด๋์ค๋ฅผ ์ค์บํด์ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค.@Component
๋ฅผ ๋ถ์ฌ์ฃผ์.
- ์์
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
- Appconfig์์๋
@Bean
์ผ๋ก ์ง์ ์ค์ ์ ๋ณด๋ฅผ ์์ฑํ๊ณ , ์์กด๊ด๊ณ๋ ์ง์ ๋ช ์ํ๋ค. ํ์ฌ๋ ์ด๋ฐ ์ค์ ์ ๋ณด ์์ฒด๊ฐ ์๊ธฐ ๋๋ฌธ์ ์์กด๊ด๊ณ ์ฃผ์ ๋ ํด๋์ค ์์์ ํด๊ฒฐํด์ผ ํ๋ค. @Autowired
๋ ์์กด๊ด๊ณ๋ฅผ ์๋์ผ๋ก ์ฃผ์ ํด์ค๋ค.
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy
discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
@Autowired
๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฑ์์์ ์ฌ๋ฌ ์์กด๊ด๊ณ๋ ํ๋ฒ์ ์ฃผ์ ๋ฐ์ ์ ์๋ค.
import hello.core.AutoAppConfig;
import hello.core.member.MemberService;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import
org.springframework.context.annotation.AnnotationConfigApplicationContext;
import static org.assertj.core.api.Assertions.*;
public class AutoAppConfigTest {
@Test
void basicScan() {
ApplicationContext ac = new
AnnotationConfigApplicationContext(AutoAppConfig.class);
MemberService memberService = ac.getBean(MemberService.class);
assertThat(memberService).isInstanceOf(MemberService.class);
}
}
AnnotationConfigApplicationContext
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ธฐ์กด๊ณผ ๋์ผํ๋ค.- ์ค์ ์ ๋ณด๋ก
AutoConfig
ํด๋์ค๋ฅผ ๋๊ฒจ์ค๋ค.
๊ฒฐ๊ณผ
ClassPathBeanDefinitionScanner - Identified candidate component class:
.. RateDiscountPolicy.class
.. MemberServiceImpl.class
.. MemoryMemberRepository.class
.. OrderServiceImpl.class
@ComponentScan
์@Component
๊ฐ ๋ถ์ ๋ชจ๋ ํด๋์ค๋ฅผ ์คํ๋ง ๋น์ผ๋ก ๋ฑ๋กํ๋ค.- ์ด๋ ์คํ๋ง ๋น์ ๊ธฐ๋ณธ ์ด๋ฆ์ ํด๋์ค๋ช
์ ์ฌ์ฉํ๋ ๋งจ ์๊ธ์๋ง ์๋ฌธ์๋ฅผ ์ฌ์ฉํ๋ค.
- ๋น ์ด๋ฆ ๊ธฐ๋ณธ ์ ๋ต: MemberServiceImpl ํด๋์ค memberServiceImpl
- ๋น ์ด๋ฆ ์ง์ ์ง์ : ๋ง์ฝ ์คํ๋ง ๋น์ ์ด๋ฆ์ ์ง์ ์ง์ ํ๊ณ ์ถ์ผ๋ฉด
@Component("memberService2")
์ด๋ฐ์์ผ๋ก ์ด๋ฆ์ ๋ถ์ฌํ๋ฉด ๋๋ค.
- ์์ฑ์์
@Autowired
๋ฅผ ์ง์ ํ๋ฉด, ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์๋์ผ๋ก ํด๋น ์คํ๋ง ๋น์ ์ฐพ์์ ์ฃผ์ ํ๋ค. - ์ด๋ ๊ธฐ๋ณธ ์กฐํ ์ ๋ต์ ํ์
์ด ๊ฐ์ ๋น์ ์ฐพ์์ ์ฃผ์
ํ๋ค.
getBean(MemberRepository.class)
์ ๋์ผํ๋ค๊ณ ์ดํดํ๋ฉด ๋๋ค.
์ฐธ์กฐ : Spring ํต์ฌ์๋ฆฌ
Leave a comment