제어 역전(IoC)

일반적인 자바 개발의 경우 객체를 사용하기 위해서 사용하려는 객체를 선언하고 해당 객체의 의존성을 생성한 후 객체에서 제공하는 기능을 사용한다. 객체를 생성하고 사용하는 일련의 작업을 개발자가 직접 제어하는 구조이다.

@RestController
public class NoDIController {
	private MyService service = new MyServiceImpl();
	
	@GetMapping("/no-di/hello")
	public String getHello() {
		return service.getHello();
	}
}

하지만 제어 역전 (IoC; Inversion of Control)을 특징으로 하는 스프링은 기존 자바 개발 방식과 다르게 동작한다.

IoC를 적용한 환경에서는 사용할 객체를 직접 생성하지 않고 객체의 생명주기 관리를 외부에 위임한다.

여기서 ‘외부'는 스프링 컨테이너(Spring Container) 또는 IoC 컨테이너(IoC Container)를 의미한다.

객체의 관리를 컨테이너에 맡겨 제어권이 넘어간 것을 제어 역전이라고 부르며, 제어 역전을 통해 의존성 주입(DI; Dependency Injection), 관점 지향 프로그래밍(AOP; Aspect-Oriented Programming) 등이 가능해진다.

스프링을 사용하면 객체의 제어권을 컨테이너로 넘기기 때문에 개발자는 비즈니스 로직을 작성하는 데 더 집중할 수 있다.

의존성 주입 (DI)

의존성 주입이란 제어 역전의 방법 중 하나로 사용할 객체를 직접 생성하지 않고 외부 컨테이너가 생성한 객체를 주입받아 사용하는 방식을 의미한다.

스프링에서 의존성을 주입받는 방법은 세 가지가 있다.

스프링에서는 @Autowired라는 어노테이션을 통해 의존성을 주입할 수 있다.

생성자를 통한 의존성 주입

@RestController
public class DIController{

	MyService myService;

	@Autowired
	public DIController(MyService myService) {
		this.myService = myService
	}
	
	@GetMapping("/di/hello")
	public String getHello() {
		return service.getHello();
	}
}