IoC (Inversion of Control)

<aside> 💡 제어의 역전 - 직접적으로 의존성을 만들지 않고, 외부에서 의존성을 가져온다.

</aside>

스프링을 쓰기 이전까지 자바 기반의 개발은 개발자가 프로그램의 흐름을 직접 제어하는 과정의 연속이었다. 일반적으로 객체를 만들 때 개발자가 직접 new를 통해 객체를 생성한다. 이를 객체의 생성주기를 개발자가 관리한다고 표현할 수 있다.

하지만 스프링을 사용하게 되면 프로그램의 흐름을 스프링 프레임워크가 주도하게 된다. 따라서 객체의 생성주기를 프레임워크가 관리하기 떄문에 이를 두고 **'제어의 역전'(Inversion of Control)**이라고 표현한다.

Bean과 IoC컨테이너

이렇게 스프링프레임워크가 관리하는 객체의 생명주기는 **컨테이너(Container)**라고 불리는 곳에서 관리된다. 스프링 IoC 컨테이너가 관리하는 객체들을 Bean 이라고 부른다. IoC컨테이너에 등록된 객체 (Bean)는 스프링 프레임워크가 알아서 관리 (생명주기 생성, 소멸 등)을 해준다.

스프링에서 의존성을 주입하는 방법

// 생성자를 통해 주입
public OwnerController(OwnerRepository clinicService, VisitRepository visits) {
		this.owners = clinicService;
		this.visits = visits;
	}
@Autowired
private OwnerRepository owners; // 필드에서 @Autowired를 통해 주입
@Autowired
public void setOwners(OwnerRepository owners){ // setter 메서드를 통해 주입
	this.owners = owners;
}