개발기록
article thumbnail
Published 2024. 11. 30. 20:31
스프링 컨테이너와 스프링 빈 Spring

스프링 컨테이너란

스프링 컨테이너란 빈의 생명주기를 관리하며,

관련된 설정 정보를 읽어 관리할 빈에 대한 정보를 얻습니다.

bean에 대한 정보를 기술하는 파일은 주로 class파일 또는 xml파일로 작성합니다.

 

중간 지점에 있는 Application Context가 스프링 컨테이너이며,

해당 인터페이스를 아래의 구현체들은

빈 설정파일을 연결할 때 사용합니다. 

 

 

스프링 컨테이너의 생성

public class ApplicationContextBasicFindTest {

    1. ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
    	// AppConfig.class파일로 작성한 경우
    
    2. ApplicationContext ac2 = new GenericXmlApplicationContext("appConfig.xml");
	// appConfig.xml파일로 작성한 경우
}

 

 

 

 

먼저 new AnnotationConfigApplicationContext(AppConfig.class);

로 인해 빈 스프링 컨테이너가 생성됩니다.

 

스프링 컨테이너에 빈 등록하기

그림과 같이 컨테이너에 AppConfig에서 설정한 정보에 따라

bean이 등록되고, 이제 해당 빈을 사용할 수 있게 됩니다.

 

 

빈 이름 규칙

- 빈 이름은 @Bean(name= "사용할 빈 이름")을 통해 직접 부여할 수 있습니다.

- 기본값은 name을 지정하지 않고, 메서드 이름으로 생성됩니다.(바로 위 그림의 빨간 동그라미)

- 빈 이름은 항상 다른 이름을 부여해야 합니다.( 덮어 씌어지거나, 오류가 발생할 수 있음)

 

의존관계 설정

 

그림과 같이 의존관계가 설정되며, 스프링 빈 등록이 완료된다.

 

 

BeanFactory와 ApplicationContext

BeanFactory

- 스프링 컨테이너의 최상위 인터페이스

- 스프링 빈을 관리, 조회하는 역할 담당

- getBean()을 제공한다.

- bean과 관련된 주요 메서드는 대부분 BeanFactory의 기능이다.

 

ApplicationContext

- Bean과 관련된 수많은 BeanFactory에서 제공한다.

- 하지만 수많은 부가기능이 필요한데, ApplicationContext는 그러한 부가기능을 가진 인터페이스를 상속받는다.

- 주요 부가기능

    1. 메시지 소스를 활용한 국제화 기능 : 출력 언어를 지정할 수 있다.(영어, 한국어 등)

    2. 환경변수 : 로컬, 개발, 운영 등을 구분하여 처리할 수 있다.

    3. 애플리케이션 이벤트 : 이벤트를 발행하고 구독하는 모델을 편리하게 지원한다.

    4. 편리한 리소스 조회 : 파일, 클래스패스, 외부 등에서 리소스를 편리하게 조회할 수 있다.

- 따라서 BeanFactory를 직접 사용하기보다, 부가기능이 포함된 ApplicationContext를 사용한다.

- BeanFactory나 ApplicationContext를 스프링 컨테이너라 한다.

 

AnnotationConfigApplicationContext

- 스프링 컨테이너의 구현체로, 빈 설정과 관련된 파일을 입력하여 스프링 컨테이너를 생성한다.

 

Bean설정 형식 - 자바코드, XML

자바 코드 설정 사용(애노테이션 기반)

@Configuration
public class AppConfig {

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

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

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

    @Bean
    public DiscountPolicy discountPolicy(){
//        return new FixDiscountPolicy();
        return new RateDiscountPolicy();
    }

}

 

 

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>

 

빈을 생성하고 싶을 경우 bean태그를 사용한다.

각각의 속성은 아래와 같다.

- id : 생성될 빈의 id

- class : 생성할 객체, 패키지 경로까지 모두 입력한다.

- constructor-arg : 의존하고 있는 bean 정보

- name : 생성자의 인자 이름

- ref : 주입할 빈

즉, name 매개변수에 ref로 지정된 빈을 주입합니다.

 

자바코드와 XML의 차이

- 먼저 코드의 작성방식이 조금 차이가 있다.(형식은 거의 동일)

- ApplictionContext인터페이스를 구현하는 구현체가 변경된다.

    - java코드 : AnnotationConfigApplicationContext

    - XML : GenericXmlApplicationContext

- 해당 구현체들을 통해 빈 설정 정보를 등록한 후에는 동일하게 빈을 사용할 수 있다.

 

 

스프링 빈 설정 메타 정보 - BeanDefinition

자바코드, XML 또는 기타 다른 파일을 사용하여 여러 가지 방법으로 Bean을 등록할 수 있다.

다양한 방법으로 등록할 수 있는 이유는 BeanDefinition이라는 추상화가 존재하기 때문이다.

 

 

java파일, .xml파일, .xxx 어떤 설정을 사용하던 BeanDefinition만 만들면 된다.

 

그리고 스프링 컨테이너는 어떤 정보로 bean을 생성한지는 궁금하지 않다.

그저 BeanDefinition만 알면된다.

 

BeanDefinition은 빈 설정 메타정보라 하며,

스프링 컨테이너는 이 메타정보를 기반으로 스프링 빈을 생성한다.

 

Java코드

AnnotationConfigApplicationContext는 AnnotatedBeanDefinitionReader를 사용해서

AppConfig.class를 읽고 BeanDefinition을 생성한다.

 

XML

GenericXmlApplicationContext는 XmlBeanDefinitionReader를 사용해서 

appConfig.xml 설정정보를 읽고 BeanDefinition을 생성한다.

 

기타

새로운 형식의 설정 정보가 추가되면, XxxBeanDefinitionReader를 만들어서

BeanDefinition 을 생성하면 된다.

 

스프링 컨테이너는 생성된 BeanDefinition을 기반으로 bean을 생성한다.

 

 

 

 

김영한 선생님의 스프링 핵심원리 기본 강의를 참고하여 작성하였습니다.

 

'Spring' 카테고리의 다른 글

[Spring] 싱글톤 컨테이너와 @Configuration  (0) 2024.12.03
[Spring] SRP, DIP, OCP 적용하기  (0) 2024.11.28
profile

개발기록

@HO0214

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!