Spring/Spring ๊ธฐ๋ณธ

[์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ] - 11. ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋นˆ ์กฐํšŒํ•˜๊ธฐ

hello_u 2023. 2. 3. 15:04

 

์ปจํ…Œ์ด๋„ˆ์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ๋นˆ ์กฐํšŒ

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์— ์‹ค์ œ ์Šคํ”„๋ง ๋นˆ๋“ค์ด ์ž˜ ๋“ฑ๋ก ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด๋ณด์ž.

 

 

์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ

public class ApplicationContextInfoTest {

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

 

ApplicationContext ๋ฅผ ์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ผ ํ•œ๋‹ค.

 

AppConfig.class ๋ฅผ ๊ตฌ์„ฑ ์ •๋ณด๋กœ ์ง€์ •ํ–ˆ๋‹ค.

 

 

 

๋ชจ๋“  ๋นˆ ์ถœ๋ ฅํ•˜๊ธฐ

@Test
@DisplayName("๋ชจ๋“  ๋นˆ ์ถœ๋ ฅํ•˜๊ธฐ")
void findAllBean() {
    String[] beanDefinitionNames = ac.getBeanDefinitionNames();
    for (String beanDefinitionName : beanDefinitionNames) {
        Object bean = ac.getBean(beanDefinitionName);
        System.out.println("name = " + beanDefinitionName + " object = " + bean);
    }
}

ac.getBeanDefinitionNames() : ์Šคํ”„๋ง์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ๋นˆ ์ด๋ฆ„์„ ์กฐํšŒํ•œ๋‹ค.

ac.getBean() : ๋นˆ(bean) ์ด๋ฆ„์œผ๋กœ ๋นˆ ๊ฐ์ฒด(์ธ์Šคํ„ด์Šค)๋ฅผ ์กฐํšŒํ•œ๋‹ค.

 

 

์‹คํ–‰ํ•˜๋ฉด ์Šคํ”„๋ง์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ๋นˆ ์ •๋ณด๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.



 

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นˆ ์ถœ๋ ฅํ•˜๊ธฐ

์Šคํ”„๋ง์ด ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋นˆ์€ ์ œ์™ธํ•˜๊ณ , ๋‚ด๊ฐ€ ๋“ฑ๋กํ•œ ๋นˆ๋งŒ ์ถœ๋ ฅํ•ด๋ณด์ž.

 

BeanDefinition beanDefinition = ac.getBeanDefinition(beanDefinitionName);

getBeanDefinition : Bean์— ๋Œ€ํ•œ ์ •๋ณด(BeanDefinition) ๊บผ๋‚ด๊ธฐ 

 

 

//Role ROLE_APPLICATION: ์ง์ ‘ ๋“ฑ๋กํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นˆ
//RolE ROLE_INFRASTRUCTURE: ์Šคํ”„๋ง์ด ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋นˆ
if (beanDefinition.getRole() == BeanDefinition.ROLE_APPLICATION){

์Šคํ”„๋ง์ด ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋นˆ์€ getRole() ๋กœ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ROLE_APPLICATION : ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ๋นˆ

ROLE_INFRASTRUCTURE : ์Šคํ”„๋ง์ด ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋นˆ

 

 

์ถœ๋ ฅํ•˜๊ธฐ

Object bean = ac.getBean(beanDefinitionName);
System.out.println("name = " + beanDefinitionName + " Object = " + bean);

 

 

์‹คํ–‰ํ•˜๋ฉด ๋‚ด๊ฐ€ ๋“ฑ๋กํ•œ ๋นˆ ์ •๋ณด๋งŒ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

 

์Šคํ”„๋ง ๋นˆ ์กฐํšŒ - ๊ธฐ๋ณธ

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ์—์„œ ์Šคํ”„๋ง ๋นˆ์„ ์ฐพ๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ์กฐํšŒ ๋ฐฉ๋ฒ•

ac.getBean(๋นˆ์ด๋ฆ„, ํƒ€์ž…)

ac.getBean(ํƒ€์ž…)

 

 

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

 

์Šคํ”„๋ง ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑ 

 

@Test
@DisplayName("๋นˆ ์ด๋ฆ„์œผ๋กœ ์กฐํšŒ")
void findBeanByName() {
    MemberService memberService = ac.getBean("memberService", MemberService.class);
    assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}

InstanceOf :  MemberServiceImpl.class ๊ฐ€ memberService ํƒ€์ž…์œผ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ฅผ ๋ฌป๋Š” ๊ฒƒ

 

 

 

์กฐํšŒ๊ฐ€ ์•ˆ๋  ๋•Œ (์‹คํŒจ ํ…Œ์ŠคํŠธ)

 

@Test
@DisplayName("๋นˆ ์ด๋ฆ„์œผ๋กœ ์กฐํšŒX")
void findBeanByNameX() {
    MemberService xxxx = ac.getBean("xxxx", MemberService.class);
}

 

์ปจํ…Œ์ด๋„ˆ์—๋Š” "xxxx" ์ด๋ฆ„์œผ๋กœ ๋œ ๋นˆ์€ ์กด์žฌํ•˜์ง€ ์•Š์•„์„œ ์กฐํšŒ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค

 

 

NoSuchBeanDefinitionException ์—๋Ÿฌ

 

 

assertThrows(NoSuchBeanDefinitionException.class, 
        () -> ac.getBean("xxxx", MemberService.class);

 

assertThrows : ์ด ์˜ˆ์™ธ๊ฐ€ ํ„ฐ์ ธ์•ผ ์„ฑ๊ณต 

() -> ์ด ๋กœ์ง์„ ์‹คํ–‰ ํ–ˆ์„ ๋•Œ

 

 

์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒ ->  ํ…Œ์ŠคํŠธ ์„ฑ๊ณต

 

 

๋™์ผํ•œ ํƒ€์ž…์ด ๋‘˜ ์ด์ƒ , ์ค‘๋ณต์ผ ๋•Œ (์‹คํŒจ ํ…Œ์ŠคํŠธ)

 

์ปจํ…Œ์ด๋„ˆ์— ๊ฐ™์€ ํƒ€์ž…์˜ ์Šคํ”„๋ง ๋นˆ์ด ๋‘˜ ์ด์ƒ์ธ ๊ฒฝ์šฐ 

 

@Configuration
public class AppConfig {
    
    @Bean
    public DiscountPolicy discountPolicy() {
        return new RateDiscountPolicy();
    }

    @Bean
    public DiscountPolicy discountPolicy2() {
        return new RateDiscountPolicy();
    }

 

ํƒ€์ž…์œผ๋กœ ์กฐํšŒ์‹œ ๊ฐ™์€ ํƒ€์ž…์˜ ์Šคํ”„๋ง ๋นˆ์ด ๋‘˜ ์ด์ƒ์ด๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

@Test
@DisplayName("ํƒ€์ž…์œผ๋กœ ์กฐํšŒ์‹œ ๊ฐ™์€ ํƒ€์ž…์ด ๋‘˜ ์ด์ƒ ์žˆ์œผ๋ฉด, ์ค‘๋ณต ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค")
void findBeanByTypeDuplicate() {
     DiscountPolicy bean = ac.getBean(DiscountPolicy.class);
}

 

 

NoUniqueBeanDefinitionException ์—๋Ÿฌ ๋ฐœ์ƒ

 

 

@Test
@DisplayName("ํƒ€์ž…์œผ๋กœ ์กฐํšŒ์‹œ ๊ฐ™์€ ํƒ€์ž…์ด ๋‘˜ ์ด์ƒ ์žˆ์œผ๋ฉด, ์ค‘๋ณต ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค")
void findBeanByTypeDuplicate() {
    assertThrows(NoUniqueBeanDefinitionException.class,
            () -> ac.getBean(DiscountPolicy.class));
}

 

assertThrows : ์ด ์˜ˆ์™ธ๊ฐ€ ํ„ฐ์ ธ์•ผ ์„ฑ๊ณต 

() -> ์ด ๋กœ์ง์„ ์‹คํ–‰ ํ–ˆ์„ ๋•Œ

 

 

 

ํƒ€์ž…์œผ๋กœ ์กฐํšŒ์‹œ ๊ฐ™์€ ํƒ€์ž…์˜ ์Šคํ”„๋ง ๋นˆ์ด ๋‘˜ ์ด์ƒ์ด๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

 

DiscountPolicy discountPlociy2 = ac.getBean("discountPlociy2", DiscountPolicy.class);

์ด๋•Œ๋Š” ๋นˆ ์ด๋ฆ„์„ ์ง€์ •ํ•˜์ž.

 

 

 

ac.getBeansOfType() ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ํƒ€์ž…์˜ ๋ชจ๋“  ๋นˆ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

Map<String, MemberService> beansOfType = ac.getBeansOfType(MemberService.class);

 

Map<key,value> ์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค  

 

 

@Test
@DisplayName("ํŠน์ • ํƒ€์ž…์„ ๋ชจ๋‘ ์กฐํšŒํ•˜๊ธฐ")
void findAllBeanByType() {
    Map<String, DiscountPolicy> beansOfType = ac.getBeansOfType(DiscountPolicy.class);
    for (String key : beansOfType.keySet()) {
        System.out.println("key = " + key + " value = " + beansOfType.get(key));
    }
    System.out.println("beansOfType = " + beansOfType);
    assertThat(beansOfType.size()).isEqualTo(2);
}

 

 

 

 

 

 

 

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

 

์Šคํ”„๋ง ํ•ต์‹ฌ ์›๋ฆฌ - ๊ธฐ๋ณธํŽธ - ์ธํ”„๋Ÿฐ | ๊ฐ•์˜

์Šคํ”„๋ง ์ž…๋ฌธ์ž๊ฐ€ ์˜ˆ์ œ๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋ฉด์„œ ์Šคํ”„๋ง์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์Šคํ”„๋ง ๊ธฐ๋ณธ๊ธฐ๋ฅผ ํ™•์‹คํžˆ ๋‹ค์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค., - ๊ฐ•์˜ ์†Œ๊ฐœ | ์ธํ”„๋Ÿฐ...

www.inflearn.com