IoC 컨테이너

이영재·2022년 6월 27일
0

스프링 IoC 컨테이너와 빈


IoC(Inversion of Control)

  • 의존 관계 주입(Dependency Injection)이라고도 한다.
  • 어떤 객체가 사용하는 의존 객체를 직접 만들어 사용하는게 아니라, 주입 받아 사용하는 방법을 말함.

스프링 IoC 컨테이너

  • BeanFactory: Spring IoC 컨테이너의 가장 최상위에 있는 인터페이스로 라이프사이클 인터페이스들을 갖는다.
  • 애플리케이션 컴포넌트의 중앙 저장소
  • 빈 설정 소스부터 빈 정의를 읽어들이고, 빈을 구성하고 제공한다.

  • 스프링 IoC 컨테이너가 관리하는 객체
  • 빈으로 등록되면 좋은 장점
    • 의존성 관리
      • 의존성 주입을 받기 위해서는 빈으로 등록되어 있어야 한다.
    • 스코프
      • 싱글톤: 객체가 하나만 유지.
      • 프로토타입: 매번 다른 객체.
    • 라이프사이클 인터페이스를 지원해준다.

ApplicationContext

  • BeanFactory를 상속 받은 인터페이스
    • IoC 컨테이너로서의 기능 + 추가적인 기능
  • 메시지 소스 처리 기능
  • 이벤트 발행 기능
  • 리소스 로딩 기능
  • etc...



ApplicationContext와 다양한 빈 설정 방법


스프링 IoC 컨테이너의 역할

  • 빈 인스턴스 생성
  • 의존 관계 설정
  • 빈 제공

ApplicationContext 빈 설정 방법

  • 스프링 IoC 컨테이너는 빈 설정 파일이 있어야 한다.

  • ClassPathXmlApplicationContext (XML)

    • new ClassPathXmlApplicationContext(ApplicationConfig.class);
      xml 파일에 bean 으로 등록하거나 component-scan을 사용

      <?xml version=”1.0” encoding=”UTF-8”?>
       <beans xmlns=”...” >
         <bean id=”bookService” class=”me.whiteship.springapplicationcontext.BookService”>
           <property name=”bookRepository” ref=”bookRepository />
         </bean>
         <bean id=”bookRepository” class=”me.whiteship.springapplicationcontext.BookRepository”>
       <beans>
      
      <?xml version=”1.0” encoding=”UTF-8”?>
       <beans xmlns=”...” >
         <context:component-scan base-package=”me.whiteship.springapplicationcontext”/>
       <beans>
      
    • AnnotationConfigApplicationContext (Java)

빈 설정

  • 빈 명세서
  • 빈에 대한 정의를 담고 있다.
    • 이름
    • 클래스
    • 스코프
    • 생성자 아규먼트(constructor)
    • 프로퍼티 (setter)

컴포넌트 스캔

  • 설정 방법
    • XML 설정에서는 context:component-scan
    • 자바 설정에서 @ComponentScan
  • 특정 패키지 이하의 모든 클래스 중에 @Component 애노테이션을 사용한 클래스를 빈으로 자동으로 등록 해 줌.

@Autowired

필요한 의존 객체의 타입에 해당하는 빈을 찾아 주입한다.

동작원리

  • BeanPostProcessor

    • 새로 만든 빈 인스턴스를 수정할 수 있는 라이프 사이클 인터페이스
    • 빈의 initialization이라는 라이프 사이클 이전 또는 그 이후에 부가적인 작업을 할 수 있는 또 다른 라이프 사이클 콜백
        1. postProcessBeforeInitialization methods of BeanPostProcessors
        1. InitializingBean's afterPropertiesSet
        1. a custom init-method definition
        1. postProcessAfterInitailization methods of BeanPostProcessors
  • AutowiredAnnotationBeanPostProcessor extends BeanPostProcessor

    • 스프링이 제공하는 @Autowired와 @Value 애노테이션 그리고 JSR-330의 @Inject 애노테이션을 지원하는 애노테이션을 처리해준다.
      → 해당 하는 빈을 찾아서 주입해준다
    • postProcessBeforeInitialization methods 상속 받아서 사용.
  • 동작 순서

  1. BeanFactory가 자기 안에 등록되어 있는 BeanPostProcessor 타입의 빈들을 찾는다.
  2. 빈으로 등록되어 있는 AutowiredAnnotationBeanPostProcessor를 찾아서 다른 일반적인 빈들한테 해당 로직을 적용한다.



수동 vs 자동 의존관계 주입

  • 수동 의존관계 주입
@Configuration
public class AppConfig {
	@Bean
    public MemberService memberService() {
    	return new MemberServiceImpl(memberRepository());
    }
    
    @Bean
    public MemberRepository memberRepository() {
    	return new MemoryMemberRepository();	
    }
}
  • 자동 의존관계 주입
@Configuration
@ComponentScan
public class AutoAppConfig {
	
}
@Component
public class MemberServiceImpl implements MemberService {
	private final MemberRepository memberRepository;
    
    @Autowired
    public MemberServiceImpl(MemberRepository memberRepository) {
    	this.memberRepository = memberRepository;
    }
}



References

  • 스프링 프레임워크 핵심 기술 - 백기선님 강좌
profile
왜why를 생각하는 두괄롬이 되자!

0개의 댓글