Spring/스프링 핵심 원리 - 기본편

24. 스프링 빈 조회 - 기본

DEV-HJ 2023. 4. 2. 19:02
반응형

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

- ac.getBean(빈이름, 타입)
- ac.getBean(타입)

 

조회 대상 스프링 빈이 없으면 예외 발생

-  NoSuchBeanDefinitionException: No bean named 'xxxxx' available

 

 

 

예제 코드 (ApplicationContextBasicFindTest.java)

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.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

import static org.assertj.core.api.Assertions.*;

public class ApplicationContextBasicFindTest {

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
    
    @Test
    @DisplayName("빈 이름으로 조회")
    void findBeanById(){
        MemberService memberService = ac.getBean("memberService", MemberService.class);
        System.out.println("memberService = "+ memberService);
        System.out.println("memberService = "+ memberService.getClass());

        // 검증은 Assertions. 아래 테스트 코드는 memberService가 MemberServiceImpl의 인스턴스면 성공함
        Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
    }
    
    @Test
    @DisplayName("이름 없이 타입으로만 조회")
    void findBeanByType(){
        MemberService memberService = ac.getBean(MemberService.class);
        assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
    }

    @Test
    @DisplayName("구체 타입으로 조회")
    void findBeanByName2(){
        // 구체적으로 적는건 안좋다. 역활과 구현으로 구별. 역활에 의존해야해서 이 코드는 좋은 코드가 아니다.
        // 구체 타입으로 조회하면 유연성이 떨어진다
        MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);
        assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
    }

    //테스트는 항상 실패 테스트를 만들어야함
    @Test
    @DisplayName("빈 이름으로 조회X")
    void findBeanByName(){
//       MemberService xxxx = ac.getBean("xxxx", MemberService.class);
        org.junit.jupiter.api.Assertions.assertThrows(NoSuchBeanDefinitionException.class,
                () -> ac.getBean("xxxx", MemberService.class));
    }
}

참고

구체 타입으로 조회하면 변경시 유연성이 떨어진다.


빈 이름으로 조회
이름 없이 타입으로만 조회
구체 타입으로 조회
빈 이름으로 조회 실패시

 

반응형