TIL

182일차(모험 91일차) - 스프링 빈 조회 - 동일한 타입이 둘 이상

haedal-uni 2022. 3. 15. 21:01
728x90

[add] 동일한 타입이 둘 이상 [#13] #17

중복을 만들기 위해서는 AppConfig에 손을 대야한다.

손을 대지 않고 Config 파일을 새로 만든다.

 

 

기존에는 아래코드를 사용했지만

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

⬇️ 이번 테스트에서는 Config 파일을 새로 만들 것이기 때문에 AppConfig 대신 새로운 Config 작성

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);

 

 

 

Config 만들기

@Configuration 
static class SameBeanConfig {  }

static 쓰는 장점?

class 안에 class를 썼다라는 것은 static class SameBeanConfig {  } 는 

ApplicationContextSameBeanFindTest 안에서만 쓰겠다는 뜻이다. 

* 참고) https://lu-delight.tistory.com/447

https://siyoon210.tistory.com/141https://johngrib.github.io/wiki/java-inner-class-may-be-static/

 

 

 

    @Bean
    public MemberRepository memberRepository1(){
        return new MemoryMemberRepository();
    }

    @Bean
    public MemberRepository memberRepository2(){
        return new MemoryMemberRepository();
    }

* bean의 이름이 다르고 인스턴스 타입이 같을 수 있다.

 

 

 

AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);
@Configuration
static class SameBeanConfig {

    @Bean
    public MemberRepository memberRepository1(){
        return new MemoryMemberRepository();
    }

    @Bean
    public MemberRepository memberRepository2(){
        return new MemoryMemberRepository();
    }

}

스프링 컨테이너가 뜰 때 SameBeanConfig만 가지고 실행한다.

여기에는 스프링 컨테이너가 스프링 bean 2가지만 등록을 한다.

memberRepository1, memberRepository2

 

 

 

실행하면 → NoUniqueBeanDefinitionException 에러 발생

 

 

 

Test가 성공시키도록 변경

public class ApplicationContextSameBeanFindTest {

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SameBeanConfig.class);

    @Test
    @DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다.")
    void findBeanByTypeDuplicate() {
    MemberRepository bean = ac.getBean(MemberRepository.class));
    }
    
    @Configuration
    static class SameBeanConfig {
    // 생략
    }
}

⬇️

@Test
@DisplayName("타입으로 조회시 같은 타입이 둘 이상 있으면, 중복 오류가 발생한다.")
void findBeanByTypeDuplicate() {
    assertThrows(NoUniqueBeanDefinitionException.class,
    () -> ac.getBean(MemberRepository.class));
}

* import static ~

 

 

 

 

빈 이름으로 지정

 

 

 

특정 타입 모두 조회

ac.getBeansOfType() 을 사용하면 해당 타입의 모든 빈을 조회할 수 있다

 

728x90