본문 바로가기
Spring(JAVA Framework)/Spring Core

Spring Bean(스프링 빈)과 등록 방법 (1)

by 걸어가는 신사 2021. 8. 17.

1. 스프링 빈

Spring 컨테이너가 관리하는 자바 객체를 빈(Bean)이라는 용어로 부른다.
  • Spring 컨테이너 안에 있어서 ApplicationContext.getBean()으로 얻어질 수 있는 객체가 빈이다.
  • @Bean이 붙은 메서드의 명을 스프링 빈의 이름으로 사용한다.
  • 스프링 컨테이너에 객체를 스프링 빈으로 등록하고, 스프링 컨테이너에서 스프링 빈을 찾아서 사용한다.

 

2. 스프링 빈 등록 방법

(1) 빈 설정 파일에 직접 빈을 등록 (자바 클래스, xml)

(1-1) Annotation 기반 자바 코드 설정 파일 사용

  • AnnotationConfigApplicationContext() 함수를 사용해서 컨테이너에 자바 설정 파일을 전달한다.

 

src/main/java/hello.core/AppConfig 파일
package hello.core;

import hello.core.discount.DiscountPolicy;
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() {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public OrderService orderService() {
        return new OrderServiceImpl(memberRepository(), discountPolicy());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }

    @Bean
    public DiscountPolicy discountPolicy() {
        return new RateDiscountPolicy();
    }
}
  • 스프링 컨테이너는 @Configuration이 붙은 AppConfig를 설정 정보로 사용한다.
  • @Bean이라 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록한다.

 

AnnotationConfigApplicationContext()를 이용한 Test코드
package hello.core.beanfind;

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

public class AppContext {

    ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);

    @Test
    @DisplayName("자바코드 설정파일")
    void appContext() {
        MemberService memberService = ac.getBean("memberService", MemberService.class);
        Assertions.assertThat(memberService).isInstanceOf(MemberService.class);
    }
}

 

(1-2) XML 설정파일을 사용

  • GenericXmlApplicationContext()를 사용해서 컨테이너에게 xml설정 파일을 전달한다.

 

src/main/resources/appConfig.xml 파일
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="memberService" class="hello.core.member.MemberServiceImpl">
        <constructor-arg name="memberRepository" ref="memberRepository" />
    </bean>
    <bean id="memberRepository"
          class="hello.core.member.MemoryMemberRepository" />
    <bean id="orderService" class="hello.core.order.OrderServiceImpl">
        <constructor-arg name="memberRepository" ref="memberRepository" />
        <constructor-arg name="discountPolicy" ref="discountPolicy" />
    </bean>
    <bean id="discountPolicy" class="hello.core.discount.RateDiscountPolicy" />
</beans>

 

  • id : 빈의 이름
  • class : 패키지명을 포함한 빈으로 정의할 클래스
  • scope : Bean의 스코프 (singleton, session, request...)
  • autowired : autowired할 방법
  • <constructor-arg name = "의존성을 주입받을 인스턴스의 이름" ref="주입하는 bean의 이름>

 

GenericXmlApplicationContext()을 이용한 Test 코드
package hello.core.xml;

import hello.core.member.MemberService;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
import static org.assertj.core.api.Assertions.*;

public class XmlAppContext {

    @Test
    void xmlAppContext() {
        ApplicationContext ac = new
                GenericXmlApplicationContext("appConfig.xml");

        MemberService memberService = ac.getBean("memberService",
                MemberService.class);
        assertThat(memberService).isInstanceOf(MemberService.class);
    }
}

 

지금까지 스프링 빈을 등록할 때 자바코드의 @Bean이나 XML의 <bean> 등을 통해서 설정 정보에 직접 등록
등록해야 할 스프링 빈이 수십, 수백개가 되면 일일이 등록하기 어렵다. 그래서 나온 것이 Component Scanning이다.

 


본 글은 김영한 님의 "스프링 핵심 원리"(인프런) 유료 강의를 들으며 요약, 정리하고 일부 정보를 추가 작성한 것입니다.

반응형

댓글