
이 포스트는 백기선님의 예제로 배우는 스프링 강의를 듣고 정리한 내용입니다.
IoC(Inversion of Control)은 말 그대로 제어가 역전(제어권이 뒤바꿈)되었다는 것이다.
도대체 제어권이 뒤바뀌었다는 말이 무엇일까?
IoC에 대해 이해하려면, IoC가 아닌 그냥 일반적인 자바 코드에서의 제어권부터 이해해야한다.
일반적으로는 자기가 사용할 의존성을 아래 코드와 같이 자기가 만들어서 사용한다.
OwnerController의 생성자 안에서 직접 OwnerRepository의 인스턴스를 만들어 자신의 필드인 repository에 대입하고 있다.
class OwnerController {
private OwnerRepository repository = new OwnerRepository();
}
IoC 코드에서는 자신의 의존성을 자신이 관리하지 않는다.
즉, 위 코드를 예시로 들면 OwnerController는 OwnerRepository의 인스턴스를 사용을 하긴 하지만 자신이 만들지는 않는다.
아래 코드가 IoC 방식으로 작성한 코드이다.
@Controller
class OwnerController {
private final OwnerRepository owners;
public OwnerController(OwnerRepository clinicService) {
this.owners = clinicService;
}
}
위 코드를 보면, OwnerController는 OwnerRepository 인스턴스를 직접 생성하지 않고 생성자의 매개변수를 통해 받고 있다.
즉 누군가 밖에서 의존성을 주는 것이다.
이렇게 하여 의존성을 관리하는 일은 더이상 OwnerController가 아닌 OwnerController 밖에서 해주게 된다.
이렇게 밖에서 의존성을 관리해주는 것을 "의존성을 주입한다"고 하여 DI(Dependency Injection)이라고도 한다.
DI도 IoC의 일부이다.
이 IoC는 반드시 스프링을 통해서 구현되어야하는 것은 아니다.
그냥 아래처럼 순수한 자바 코드로도 구현할 수 있다.
아래 코드는 OwnerController 인스턴스를 만드는 테스트 메소드의 일부이다.
package org.springframework.samples.petclinic.owner;
import org.junit.Test;
public class OwnerControllerTest {
@Test
public void create() {
OwnerRepository repo = new OwnerRepository();
OwnerController controller = new OwnerController(repo);
}
}
이런 식으로 테스트 코드와 같은 외부에서 OwnerRepository 클래스의 인스턴스를 만들어 OwnerController의 생성자의 매개변수로 넘겨주는 식으로 순수한 자바 코드로 구현하는 것도 DI이자 IoC이다.
하지만 스프링 프레임워크로 DI를 편리하게 할 수 있다.
스프링이 관리하는 Bean으로 등록이 되면, 스프링에 있는 IoC 컨테이너가 OwnerController를 만들때, 필요한 타입의 Bean을 찾아서 주입을 해준다.
즉 스프링이 아래의 역할을 자동으로 해주는 것이다.