스프링 Ioc 컨테이너와 빈

1 분 소요

해당 포스팅은 인프런에 등록된 백기선님의 스프링 프레임워크 핵심 기술 강의를 요약한 자료 입니다. 개인 스터디를 위해 강의를 간략하게 요약하여 작성할 예정이며, 저작권에 위반된다면 해당 포스팅을 즉시 비공개로 전환하도록 하겠습니다.

IoC란?

IoC 컨테이너를 설명하기 이전에 IoC가 무엇인지 부터 설명해보도록 하겠습니다. Inversion of Control(제어 역전) 의 약자로써 의존 관계 주입(Dependency Injection)이라고도 하며, 어떤 객체가 사용하는 의존 객체를 객체가 직접 생성하여 사용하는 것이 아니라, 주입받아 사용하는 방법을 말합니다.

public class BookService {
    private BookRepository bookRepository;
    
    // BookService 인스턴스를 생성할때 BookRepository 인스턴스를 주입받는다.
    public BookService(BookRepository bookRepository) {
        this.bookRepository = bookRepository;
    }
}

or

public class BookService {
    // @Autowired 애노테이션을 사용하여 인스턴스를 주입받는다.
	@Autowired
    private BookRepository bookRepository;
}

Note

필자는 위의 두가지 DI 방법 중 첫번째 방법(생성자를 통한 DI)를 선호하고 있습니다. 그 이유는 단위 테스트 시에 테스트를 수행하는 인스턴스가 의존하고 있는 인스턴스를 변경해야 하는 시점이 발생하게 되는데, 아래의 방법으로 해당 문제를 해결하기 어렵기 때문입니다.

IoC 컨테이너

IoC 컨테이너란 등록된 객체(Bean)이 담고 있기 때문에 컨테이너라고 불리며, IoC 기능을 제공하기 때문에 합쳐서 IoC 컨테이너라고 부릅니다. 스프링 초기에는 XML로 설정하는것이 대세였지만 Google Guice가 처음 선보인 애노테이션 기반의 의존성 주입을 스프링에서도 지원하였습니다.

IoC 컨테이너를 왜 사용할까?

여러 개발자들이 스프링 커뮤니티에서 논의하여 만들어낸 여러가지 DI 방법과 Best practice를 모아서 만들어진 프레임워크 이기 때문 안정적입니다.

Bean

IoC 컨테이너를 사용하면서 Bean 이라는 용어가 반복적으로 사용되고 있습니다. Bean을 간단하게 설명하자면 IoC 컨테이너에 등록되어져서 관리되고 있는 객체(인스턴스)를 Bean라고 부릅니다.

왜 빈을 사용할까?

  • 의존성 주입을 받으려면 Bean으로 등록되어야 한다.
  • 대부분의 객체들은 싱글톤 스코프로 생성되더라도 사이드 이펙트가 발생하지 않기 때문입니다.
  • 스프링 IoC에 저장되는 Bean들을 기본적으로 싱글톤으로 생성된다. (다양한 Bean Scope는 여기에서 확인하실 수 있습니다.)
  • 라이프사이클 인터페이스
    • Bean이 생성 라이프사이클를 이용하여 부가적인 처리 가능
    • @PostConstruct, @PreDestroy
      • @PostConstruct: Bean 생성 시 Callback으로 호출
      • @PreDestroy: Bean 소멸 전 Callback으로 호출

태그:

카테고리:

업데이트:

댓글남기기