스프링IoC컨테이너

sieun·2021년 7월 5일
0

spring

목록 보기
1/3

IoC (Inversion of Control)

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


  • 직접 만들어 사용하는 경우
private BookRepository bookRepository = new BookRepository();
  • IoC중에서 생성자 사용하는 경우
private BookRepository bookRepository;
public BookService(BookRepository bookRepository){
	this.bookRepository = bookRepository;
}

IoC컨테이너

  • 객체에 대한 생성 및 생명주기를 관리
  • 다양한 방법으로 Bean을 만들고, Bean들 사이의 의존성을 엮어주며, 그렇게 만들어져 있는 Bean들을 제공해준다.


BeanFactory / ApplicationContext

빈 팩토리(BeanFactory) : IoC컨테이너의 가장 최상위에 있는 인터페이스로서 빈(bean)들을 관리한다는 의미의 컨테이너이다.

  • BeanFactory : 다양한 life-cycle을 통해 스프링이 여러기능을 제공할 수 있다. ex) getBean()
  • ApplicationContext : BeanFactory 상속을 받아 BeanFactory가 가지고 있는 IoC컨테이너의 기능을 가지면서도 추가적인 기능을 제공한다.



DI(Dependency Injection)

  • 의존성 주입은 Bean끼리만 가능하다. 즉, Spring IoC컨테이너 안에 있는 객체끼리만 의존성 주입을 해준다.
  • ApplicationContext가 담고 있는 Bean들은 알아서 주입을 해주기 때문에 직접 쓸 일이 거의 없다.

< 예제 >

public OwnerController(OwnerRepository Serviec, ApplicationContext applicationContext){
	this.owners = Service;
	this.applicationContext = applicationContext;
}

직접 ApplicaitonContext를 사용하는 코드

@GetMapping("/bean")
@ReponseBody
public String bean(){
	return "bean : " + applicationContext.getBean(OwnerController.class);
}

직접 ApplicationContext를 사용하지 않아도 같은 결과가 출력되는 코드

@GetMapping("/bean")
@ReponseBody
public String bean(){
	return "bean : " + owners;
}

위의 예제에서 같은 owners객체의 해시값이 출력되는데 그 이유는 객체 하나를 어플리케이션 전반에서 계속 재사용하기 때문이다. 이러한 인스턴스들은 싱글톤 스코프(Singleton Scope)의 빈으로 등록되어 있다.
싱글톤으로 객체를 만들어 사용하고 싶을 때 IoC컨테이너를 사용하면 편리하다. IoC컨테이너에 아무 어노테이션을 붙이지 않고 빈으로 등록하면 기본적으로 싱글톤 스코프로 빈들이 등록된다.
싱글톤은 항상 같은 객체를 사용하므로 메모리 면에서 효율적이고, 런타임시 이미 컨테이너에 만들어놓은 객체를 사용하므로 성능 최적화에도 유리하다.

profile
열심히 공부중입니다😇

0개의 댓글