티스토리 뷰

반응형
Spring Container(스프링 컨테이너)

개발자가 직접 객체를 생성한다면 아래와 같이 작성하게 된다

Object obj = new Object();

하지만 Framework의 가장 큰 특징은 코드의 제어권을 가져간다는 것이다 (Framework 와 Library)

Spring Framework의 경우 IoC/DI를 사용하여 의존성을 주입시켜주는데

이때 이 의존성을 주입할 객체를 생성하고 관리하는 것이 바로 스프링 컨테이너이다

그리고 생성된 객체를 빈(Bean)이라고 부른다

 

Configuration

개발자는 스프링 컨테이너에게 객체의 생성과 관리를 맡기기 위해

@Configuration이라는 설정 정보를 사용하여 스프링 컨테이너에 스프링 빈(Bean)을 등록한다

@Configuration
public class AppConfig {
    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(MemberRepository());
    }

    @Bean
    public MemberRepository MemberRepository() {
        return new MemberRepositoryImpl();
    }

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

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

클래스에 Configuration 어노테이션을 사용하면 스프링 컨테이너가

Bean 어노테이션이 적힌 모든 메서드를 호출하여 반환된 객체를 스프링 컨테이너에 등록한다

이렇게 등록이 된 빈들은 메서드 명의 이름으로 스프링 컨테이너에 저장된다

(@Bean(name = "~~~")의 방식으로 Bean의 이름을 따로 지정할 수도 있다)

Bean의 이름은 중복을 허용하지 않기 때문에 항상 유의해서 빈을 등록해야 한다 (중복이 되면 아래와 같은 에러가 발생한다)

org.springframework.beans.factory.NoUniqueBeanDefinitionException:

이렇게 자바코드로 Bean의 설정 정보를 등록하는 방법 말고도 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.MemberRepositoryImpl"/>

    <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 Definition

자바코드로도 xml으로도 빈을 생성할 수 있다

이것이 가능한 이유는 Bean Definition이라는 추상화가 있기 때문인데

풀어서 얘기해보자면 Java 코드를 읽어서 Bean Definition을 생성하든

xml 코드를 읽어서 Beadn Definition을 생성하든 오직 Bean Definition만 있으면 빈을 등록할 수 있다는 것이다

자바 코드로 예를 들자면 @Bean 어노테이션을 입력한 메서드들은

각각 하나의 메타정보가 되어 스프링 컨테이너에 등록이 된다, 이 메타정보가 바로 Bean Definition이다

메타정보 안에 들어가는 내용을 정리해보자면 아래와 같다

 

• BeanClassName : 생성할 빈의 클래스 명

• factoryBeanName : 팩토리 역할의 빈을 사용할 경우 빈의 이름

• factoryMethodName : 빈을 생성할 팩토리 메서드

• Scope : 싱글톤(기본값)

• lazyInit : 스프링 컨테이너를 생성할 때 빈을 생성하는 것이 아니라 실제 런타임까지 생성을 지연처리하는지 여부

• InitMehotdName : 빈을 생성하고 의존관계를 적용한 뒤에 호출되는 초기화 메서드 명

• DestroyMethodName : 빈의 생명주기가 끝나서 제거하기 직전에 호출되는 메서드 명

• Constructor arguments, Properties : 의존관계 주입에서 사용함 (팩토리 역할의 빈을 사용하면 없음)

 

BeanFactory와 Application Context

컨테이너에는 두 종류가 있으나, 결론부터 말하자면 Application Context가 우리가 보통 사용하는 스프링 컨테이너라고 보면 된다

 

1. BeanFactory

스프링 컨테이너의 최상위 인터페이스이며 빈을 관리하고 조회하는 역할을 담당한다

또한 빈과 관련된 기능은 BeanFactory가 제공하는 기능이다

 

2. Application Context

그럼에도 우리가 대부분 사용하는 컨테이너는 Application Context 이다

그 이유는 Application Context 같은 경우 빈 팩토리를 상속받아 빈과 관련된 기능을 제공하는 것은 물론이고

그 외에의 수많은 부가기능들을 함께 제공한다

정리해보자면 빈 팩토리의 기능 + 수 많은 부가 기능을 같이 제공하는 ApplicationContext가 훨씬 더 사용성이 좋다

 

 

이렇게 스프링 컨테이너를 사용하여 스프링 프레임워크는 객체의 생성을 관리하고 제어하며 의존성을 주입한다

 

 

더보기

개인 학습을 위해 작성되는 글입니다.

제가 잘못 알고 있는 점에 대한 지적 / 더 나은 방향에 대한 댓글을 환영합니다.

 

참조 링크:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8/dashboard

https://jjunii486.tistory.com/84

 

 

 

반응형
댓글