[Spring] IoC(Inversion of Control) 컨테이너

clean·2024년 2월 22일

Spring 입문 강의

목록 보기
2/6
post-thumbnail

IoC 컨테이너의 역할

  • 빈(bean)을 만들어줌
  • Bean들 사이에 의존성을 엮어 줌
  • 컨테이너가 가지고 있는 Bean들을 제공해줌
	private final OwnerRepository owners;
    
	public OwnerController(OwnerRepository clinicService) {
		this.owners = clinicService;
	}

여기서 OwnerRepository는 빈으로 등록되어있다.
따라서 스프링이 OwnerController를 만들 때, IoC 컨테이너가 빈으로 등록돼 있는 객체 중 OwnerRepository와 타입이 일치하는 객체를 찾아 자동으로 의존성을 주입해준다.

의존성 주입은 Bean들 끼리만 가능하다. (즉 위 예시에서는 의존성을 주입받는 OwnerController와 주입이 되는 OwenrRepository가 모두 빈으로 등록되어 있다.)
즉, 스프링 IoC 컨테이너 안에 들어있는 객체들끼리만 의존성 주입을 할 수 있다.
IoC 컨테이너 밖에 있는 객체에 주입을 해주는 방법이 있다고는 하지만, 잘 쓰지 않으며 추천하지 않는다.
기본적으로는 스프링 IoC 컨테이너 안에있는 빈 객체들끼지 의존성 주입을 해준다.

여기서 빈으로 등록된 OwnerRepository는 싱글톤 객체이다. 즉 전체 어플리케이션에서 그 클래스 타입을 가진 객체가 딱 하나 존재하는 것이다.
이렇게 스프링 IoC 컨테이너를 이용하여 싱글톤 인스턴스를 편리하게 관리할 수 있다.

  • 참고. IoC 컨테이너 직접 이용하기
	// IoC 컨테이너
	private final ApplicationContext applicationContext;
    private final OwnerRepository owners;


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

	@GetMapping("/bean")
	@ResponseBody
	public String bean() {
		// OwnerController의 해시값을 볼 수 있다.
		return "bean: " + applicationContext.getBean(OwnerController.class);
	}

이런 식으로 applicationContext 인스턴스의 getBean() 메소드를 통해서 빈들의 해시값을 볼 수도 있다.
하지만 이렇게 IoC 컨테이너를 직접 쓸 일은 많지 않다.

참고로, Bean으로 등록된 객체는 싱글톤이므로

	@GetMapping("/bean")
	@ResponseBody
	public String bean() {
		// OwnerController의 해시값을 볼 수 있다.
		return "bean: " + applicationContext.getBean(OwnerRepository.class) + "\n  owners: " + owners;
	}

이렇게 response를 리턴했을 때, 빈으로 등록된 객체의 해시값과 owners라는 변수에 담긴 객체의 해시값이 동일한 것을 확인할 수 있다. (같은 객체임)

스프링에서 IoC 컨테이너의 종류

  • ApplicationContext
  • BeanFactory

둘다 IoC 컨테이너이지만, 보통 ApplicationContext를 더 많이 사용한다.
ApplicationContext는 ListableBeanFactory 인터페이스를 확장한 인터페이스로, ListableBeanFactory보다 더 많은 기능을 제공한다.

Reference

https://www.inflearn.com/course/spring_revised_edition/dashboard

profile
블로그 이전하려고 합니다! 👉 https://onfonf.tistory.com 🍀

0개의 댓글