[TIL 50일차] Spring 컨테이너 생성 과정

이건·2024년 8월 8일

Spring 컨테이너 생성 과정

1. 컨테이너 설정

스프링 컨테이너를 설정하기 위해 XML 파일이나 자바 클래스를 사용하여 애플리케이션의 구성 정보를 정의한다. 예를 들어, XML 파일에서는 <bean> 태그를 사용하여 객체를 정의하고, 자바 클래스에서는 @Configuration 어노테이션과 @Bean 어노테이션을 사용할 수 있다.

XML 설정 예시

<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="myBean" class="com.example.MyClass"/>
</beans>

자바 설정 예시

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean
    public MyClass myBean() {
        return new MyClass();
    }
}

2. 컨테이너 생성

스프링 컨테이너는 ApplicationContext 인터페이스의 구현체를 사용하여 생성된다. 일반적으로 ClassPathXmlApplicationContext 또는 AnnotationConfigApplicationContext 클래스를 사용하여 컨테이너를 생성한다.

XML 기반 컨테이너 생성

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

자바 기반 컨테이너 생성

ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

3. 빈 초기화

컨테이너가 생성되면 정의된 빈(객체)이 초기화된다. 이 과정에서 의존성 주입이 이루어지고, 필요한 경우 @PostConstruct 어노테이션이 붙은 메서드가 호출된다.

@Configuration
public class AppConfig {

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

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

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

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

4. 빈 사용

초기화가 완료된 후, 애플리케이션의 다른 구성 요소에서 컨테이너를 통해 빈을 요청하여 사용할 수 있다.

MyClass myBean = context.getBean(MyClass.class);

5. 컨테이너 종료

애플리케이션이 종료될 때는 ApplicationContext를 종료하여 사용된 리소스를 해제한다. 일반적으로 스프링 부트 애플리케이션에서는 JVM 종료 시 자동으로 처리된다.

결론

스프링 컨테이너는 애플리케이션의 객체 생명주기를 관리하고 의존성을 주입하는 역할을 한다. 이를 통해 코드의 모듈성을 높이고 유지보수를 용이하게 한다.

0개의 댓글