Inversion of Control의 준말로, 제어권의 역전이라고도 한다.
일반적으로는
객체 내부에서 필요한 기능이 있는 클래스를 생성해서 사용한다. 즉, 제어권이 외부 기능을 사용할 객체에게 있다.
public class Owner {
private VisitRepository visitRepository;
//제어권이 Owner에게 있음
Owner() {
visitRepository = new VisitRepository();
}
}
반면, 스프링에서는
필요한 기능이 있는 객체를 관리하는 컨테이너를 따로 만들고, 해당 컨테이너로부터 객체에게 필요한 기능이 있는 객체를 주입시킨다. 달리 말해, IoC Container는 의존성 주입Dependency Injection을 수행한다.
@Controller
class OwnerController {
private final OwnerRepository owners;
private final VisitRepository visits;
//생성자를 통해 IoC Container가 의존성을 주입해줌
public OwnerController(OwnerRepository clinicService,
VisitRepository visits) {
this.owners = clinicService;
this.visits = visits;
}
}
스프링을 공부하면서 가장 많이 듣게 되는 키워드 중 하나가 바로 Bean이다. 앞선 코드에 @Controller가 있는데, OwnerController가 Bean으로 등록된다는 annotation이다.
일반적으로 자바의 객체는 POJOPlain Old Java Object 객체로 분류된다. 즉, 프레임워크에 종속되지 않은 ✌️평범하고 오래된✌️ 방식의 자바 객체이다. 반면, Bean 객체는 IoC Container 내부에서 생성되고, 의존성 주입을 통해 제공되는 프레임워크에서 관리되는 객체이다.
Bean의 태생과 분류에 대해 이야기하려면 이야기가 길어지므로, 일단은 다음과 같이 이해한다.
Bean 객체는 IoC Container 내부에서 관리되는 객체를 의미한다.