Kim-Baek 개발자 이야기

[스프링 핵심원리] 24. 스프링 빈 조회 - 기본 본문

개발/Spring

[스프링 핵심원리] 24. 스프링 빈 조회 - 기본

김백개발자 2021. 10. 27. 17:16
김영한님의 [스프링 핵심 원리] 강의를 정리하고, 내가 생각한 내용까지 정리하는 포스팅

지난번에는 컨테이너에 등록된 모든 빈을 조회해보았다. 이번에는 하나의 빈을 조회하는 방법들에 대해서 기본적으로 사용되는 방식들에 대해서 알아볼 수 있도록 하겠다.

먼저 이전과 동일하게 스프링 컨테이너인 ApplicationContext의 구현체를 만들어서 빈을 가져오게 된다. 줄여서 ac 라고 사용할 수 있도록 하겠다. ac 에서 빈을 가져오는 메소드에 대해서 알아보겠다.

  1. ac.getBean ( 빈이름, 타입 )
  2. ac.getBean ( 타입 )

위의 두 가지 방식으로 빈을 가져올 수 있는데, 상황에 맞게 본인이 필요한 것을 쓰면 되겠다. 그런데 조회 대상의 스프링 빈이 없으면 어떻게 될까? 

NoSuchBeanDefinitionException: No bean named 'xxxxx' available

이렇게 사용자가 찾으려는 빈의 이름으로 등록된 빈이 없다고 친절하게 알려준다. 예제 코드를 통해서 다시한번 살펴보도록 하자

package core.order.beanfind;

import core.order.AppConfig;
import core.order.member.MemberService;
import core.order.member.MemberServiceImpl;
import org.junit.jupiter.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.assertThat;


public class ApplicationContextBasicFindTest {
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("빈 이름으로 조회")
    void findBeanByName() {
        MemberService memberService = ac.getBean("memberService", MemberService.class);
        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 findBeanByNameX() {
        //MemberService xxxxx = ac.getBean("xxxxx", MemberService.class);
        Assertions.assertThrows(NoSuchBeanDefinitionException.class,
                () -> ac.getBean("xxxxx", MemberService.class));
    }
}

테스트 케이스를 살펴보자. 위에서 언급했던 메소드를 동일하게 사용하고 있는 것을 알 수 있다. 여기서 빈의 타입을 파라미터로 넣어줄 경우에 구체타입을 써도 되고, 인터페이스를 써도 된다는 것도 알 수 있다.

 

https://github.com/bgc8214/spring-core/tree/step11

 

GitHub - bgc8214/spring-core: 스프링 핵심기술 프로젝트

스프링 핵심기술 프로젝트. Contribute to bgc8214/spring-core development by creating an account on GitHub.

github.com

반응형
Comments