[BackEnd] 2. Spring Container

김재혁·2023년 10월 25일

BackENd

목록 보기
2/7

0. Preview

지난 시간 우리는 DI 주입에 대해서 알아보았다. 그럼 Spring 프레임워크를 사용하여 어떻게 더 편리하게 DI 를 주입하여 올바른 소프트웨어를 구현할 수 있을까? 오늘은 Spring Container가 무엇이고 어떻게 의존성을 주입하는지 알아보자!

1. Spring Container란?

사실 Spring Container 라는 용어는 다른 용어로도 대체가 가능하다. DI컨테이너, IOC 컨테이너로도 불리는데 상황에 따라 이 세 용어가 서로 대체해서 사용된다.

  • 스프링 컨테이너(Application Context): 스프링 프레임워크에서 제공하는 컨테이너로 Bean 객체를 생성하고 관리하며 객체 간의 의존성을 주입 --> 이것은 DI와 IOC 개념을 구현하는 주체
    • Bean: Bean 이란 일반적으로 클래스의 인스턴스, 메서드를 나타내며 스프링 컨테이너에 의해 객체로 생성. 실제 인스턴스로 사용됨
  • DI 컨테이너: 객체 간의 의존성을 주입하는 역할을 강조하는 용어로 사용.

  • IOC 컨테이너: 객체의 생명주기와 제어 흐름을 애플리케이션 코드 대신 컨테이너에 위임하는 개념을 강조. 스프링은 이러한 IOC 컨테이너 역할도 수행한다.

1-1. Spring Container 생성

구현체를 외부에서 주입하는 AppConfig Class에 메소드들을 Bean으로 등록한 뒤 스프링 컨테이너를 살펴보자!

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();
    }
}

  • 스프링 컨테이너는 설정 정보를 참고해서 의존관계를 주입(DI) 한다.

  • 빈 이름은 메서드 이름을 디폴트로 사용한다

  • 빈 이름을 직접 부여할 수 있다.

또한, Bean 이 무엇이 있는지 직접 조회도 가능하다! Bean 객체 중 부모 타입의 Bean을 조회하면 자식 타입도 함께 조회한다. 모든 객체의 어머니인 Object 타입으로 조회하면 모든 스프링 Bean을 조회한다.

  • BeanFactory
    • 스프링 컨테이너의 최상위 인터페이스
    • 스프링 Bean을 관리하고 조회하는 역할을 담당한다
    • getBean() 제공
  • ApplicationContext
    • BeanFactory 기능을 모두 상속받아서 제공한다.
    • 메시지 소스: 한국에서 들어오면 한글로, 영어권은 영어로 출력을 해준다
    • 환경변수 : 로컬, 개발 ,운영 환경을 구분해서 처리한다
    • 애플리케이션 이벤트: 이벤트를 발행하고 구독하는 모델을 편리하게 지원한다
    • 편리한 리소스 조회: 파일, 클래스 패스, 외부 드에서 리소스를 편하게 조회

다이어그램을 보면 BeanFactory 등 다양한 클래스를 상속하는 것을 볼 수 있다.

2. 느낀점

  • 스프링컨테이너가 어떻게 Bean을 처리하고 의존성을 주입하는지 알아보았다.
  • 스프링컨테이너는 객체간의 결합도를 낮춘다
  • 근데 실제 환경에선 객체가 계속해서 생성될텐데 메모리 낭비가 심하지 않을까?
  • 다음 포스팅은 이 문제를 해결 할 싱글톤 컨테이너에 대해 알아보자!
profile
아웃라이어 :)

0개의 댓글