[Spring] 스프링 빈 조회 - 기본

스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법을 알아보자.


.getBean()

.getBean(스프링 빈 이름, 타입)과 같은 형식으로 사용되고, 이름을 생략하고 .getBean(타입)으로 사용해도 된다. 

 

만약 조회 대상인 스프링 빈이 존재하지 않는다면 다음과 같은 예외가 발생한다.

NoSuchBeanDefinitionException: No bean named '...' available

 

실제로 코드를 작성해보자.

먼저, 빈의 이름으로 조회하는 테스트 코드이다.

package hello.core.beanfind;

import hello.core.AppConfig;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class ApplicationContextBasicFindTest {

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("find Bean by name")
    void findBeanByName(){
        MemberService memberService = ac.getBean("memberService", MemberService.class);
        Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
    }

}

.getBean() 메서드의 첫 번째 파라미터에 빈의 이름이 들어간 것을 확인할 수 있다.

Assertions... 줄을 보면 memberService가 MemberServiceImpl의 인스턴스이면 테스트가 성공한다는 의미이다. 

 

다음으로, 이름 없이 타입으로만 조회하는 코드를 작성해보자.

...
@Test
@DisplayName("find Bean by type without name")
void findBeanByType(){
    MemberService memberService = ac.getBean(MemberService.class);
    Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
}
...

이 경우 이전의 코드에서 첫 번째 파라미터에 들어가는 빈 이름만 지워주면 된다. 똑같은 결과를 얻을 것이다. 

 

마지막으로, 빈 이름으로 조회가 되지 않는 경우(실패할 경우)를 처리하는 코드를 작성해보자. 이것을 해주지 않으면 실패할 경우 오류가 발생할 것이다.

...
@Test
@DisplayName("fail to find Bean")
void failToFindBean(){
    org.junit.jupiter.api.Assertions.assertThrows(NoSuchBeanDefinitionException.class,
            () -> ac.getBean("xxxx",MemberService.class ));
}
...

이 코드의 경우, NoSuchBean... 의 오류가 발생해야만 테스트가 성공한다.