ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 빈 조회 - 기본☆
    FrameWork/Spring&Spring-boot 2022. 1. 1. 13:01

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

    • 'ac.getBean('빈이름' , '타입')
    • 'ac.getBean(타입)'
    • 조회 대상 스프링 빈이 없으면 예외 발생

             -'NoSuchBeanDefinition: No bean nasted 'xxxx' avaliable'

     

     

    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.context.annotation.AnnotationConfigApplicationContext;
    
    import static org.assertj.core.api.Assertions.*;
    import static org.junit.jupiter.api.Assertions.*;
    
    class ApplicationContextBasicFindTest {
    
        AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
    
        @Test
        @DisplayName("빈 이름으로 조회")
        void findBeanByName(){
            MemberService memberService = ac.getBean("memberService", MemberService.class);
            //System.out.println("memberService = " + memberService);
            //System.out.println("memberService.getClass() = " + memberService.getClass());
    
            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);
            //System.out.println("memberService = " + memberService);
            //System.out.println("memberService.getClass() = " + memberService.getClass());
    
            assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
        }
    
    
        @Test
        @DisplayName("빈 이름으로 조회x")
        void findBeanByNameX(){
            //ac.getBean("xxxx",MemberService.class);
            assertThrows(NoSuchBeanDefinitionException.class,
                    () -> ac.getBean("xxxx", MemberService.class));
        }
    }
    

     

     

    인터페이스로 조회하면 인터페이스의 구현체가 대상이된다.

     

    @Bean
    public MemberService memberService(){
        return new MemberServiceImpl(memberRepository());
    }
    

    -> 스프링빈에 등록된 Instance 타입을 보고 결정이 되기 때문에, 꼭 인테페이스 타입으로 객체를 불러올 필요는 없다.

      

          하지만, 굳이 구제적인 구현체를 type으로 지정할 필요는 없다.(유연성이 떨어진다.)

           항상 역할구현을 구분하고, 역할(인터페이스)에 의존해야하기 때문이다.

     

     

     

     

     

    .assertThrows(예외,로직)

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

    -> 왼쪽에 로직을 실행하면, 오른쪽의 예외가 터져야한다는 의미

        

        즉. 예외가 발생해야 pass 

     

     

    [출처 : 김영한. 스프링 핵심 원리-기본편. 인프런]

     

    댓글

Designed by Tistory.