본문으로 바로가기

[Spring] Spring bean(빈) 조회 - 기본

category Java/Spring 2022. 1. 20. 01:03
반응형

 

 

스프링 컨테이너에서 스프링 빈을 찾는 가장 기본적인 조회 방법은 다음과 같다.

 

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

   · ac.getBean(타입)

 

 

 

 

위 방법을 통해 스프링 빈을 조회해보도록 하자.(AppConfig 활용)

 

 

 

 

 

AppConfig에 등록된 빈들은 아래와 같다.

 

package hello.core;

import hello.core.discount.DiscountPolicy;
import hello.core.discount.FixDiscountPolicy;
import hello.core.discount.RateDiscountPolicy;
import hello.core.member.MemberRepository;
import hello.core.member.MemberService;
import hello.core.member.MemberServiceImpl;
import hello.core.member.MemoryMemberRepository;
import hello.core.order.OrderService;
import hello.core.order.OrderServiceImpl;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean // 스프링 컨테이너에 등록이 됨
    public MemberService memberService() {
        System.out.println("call AppConfig.memberService");
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        System.out.println("call AppConfig.memberRepository");
        return new MemoryMemberRepository();
    }

    @Bean
    public OrderService orderService() {
        System.out.println("call AppConfig.orderService");
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    @Bean
    public DiscountPolicy discountPolicy() {
//        return new FixDiscountPolicy(); // 정액 할인
        return new RateDiscountPolicy();  // 정률 할인
    }

}

 

 

 

 

※ 참고로 조회 대상 스프링 빈이 없으면 아래와 같은 예외가 발생한다.

   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.context.annotation.AnnotationConfigApplicationContext;

import static org.junit.jupiter.api.Assertions.*;

public class ApplicationContextBasicFindTest {

    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("빈 이름으로 조회")
    void findBeanByName() {
        MemberService memberService = ac.getBean("memberService", MemberService.class);
        Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
    }

    @Test
    @DisplayName("이름 없이 타입으로만 조회")
    void findBeanByType() {
        MemberService memberService = ac.getBean(MemberService.class);
        Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
    }

    @Test
    @DisplayName("구체 타입으로만 조회")
    void findBeanByName2() {
        MemberService memberService = ac.getBean("memberService", MemberServiceImpl.class);
        Assertions.assertThat(memberService).isInstanceOf(MemberServiceImpl.class);
    }

    @Test
    @DisplayName("빈 이름으로 조회x")
    void findByNameX() {
        // ac.getBean("xxxx", MemberService.class);
        assertThrows(NoSuchBeanDefinitionException.class,
                () -> ac.getBean("xxxx", MemberService.class));
    }
}

 

총 3가지 방법으로 빈을 조회해보고, 

등록되지 않은 빈을 조회했을 때의 테스트 코드도 작성했다.

 

 

 

 

1. 빈 이름으로 조회

 

 ac.getBean("memberService", MemberService.class)

 

빈 이름(memberService)과 빈의 타입(MemberService.class)를 통해

해당 빈을 조회했다.

 

 

 

 

2. 이름 없이 타입으로만 조회

 

 ac.getBean(MemberService.class)

 

빈 이름을 부여하지 않고, 빈의 타입으로만 조회했다.

 

 

 

 

 

3. 구체 타입으로만 조회

 

 ac.getBean("memberService", MemberServiceImpl.class);

 

빈 이름(memberService)과 빈의 구체 타입(MemberServiceImple.class)를 통해

해당 빈을 조회했다.

 

 

 

 

 

 

* 조회하고자 하는 빈이 없을 경우

 

- 등록하지 않은 스프링 빈(xxxx)를 조회할 경우

   NoSuchBeanDefinitionException 예외처리를 통해 테스트 코드를 진행하도록 했다.

 

 

 

 

 

 

 

 

결과는...

 

 

 

 

 

 

 

모든 테스트 코드가 정상적으로 수행되었다.

 

 

 

 

 

반응형