
https://medium.com/omarelgabrys-blog/spring-a-head-start-introduction-part-1-130aa1b41e47
스프링의 핵심 3대 요소는
IoC,AOP,PSA이다.

IoC 는 일반적인 개념이며, DI 는 예시 중 하나이다.
스프링에서는 의존성 주입을 통해 느슨한 결합도(copuling)를 만들며, 객체의 의존성을 하드코딩 하는 대신 어노테이션이나 자바코드를 통해 손쉽게 지정할 수 있다. 이게 어떤 의미일까?
아래의 예를 통해 살펴보자.
/*
Engine 의 start 라는 동작을 인터페이스에서 추상화하고
NormalEngine, SuperEngine 이 해당 Engine 의 실제 동작을 구현(implements) 했다고 가정
*/
public interface Engine {
void start();
}
public class NormalEngine implements Engine {
@Override
void start() {
// use 5L oil for 100km/h
}
}
public class SuperEngine implements Engine {
@Override
void start() {
// use 7L oil for 180km/h
}
}
public class Car {...}
자동차와 엔진의 관계를 생각해보자. 자동차가 작동하려면 엔진이 필요하다. 일반적인 프로그래밍에서 개발자는 자동차가 사용할 엔진을 직접 생성해서 사용한다(자동차는 엔진에 의존한다).
// 1. 직접 의존성 관리하는 경우
public class Car {
private final Engine engine = new SuperEngine(); // new SuperEngine(); compile time
public void run() {
engine.start();
}
}
그런데 아래의 코드를 보면 자동차가 아닌 외부에서 엔진을 만들고, 자동차 클래스의 생성자를 통해 주입해주고 있다. 즉, 자동차 내부에서 엔진을 직접 생성하지 않고 외부의 누군가가 엔진을 만들어서 넣어주고 있는 것 이다. 개발자는 그저 엔진이 필요하며, 생성자(또는 setter 등)를 통해 이 엔진이 필요하다고 표현만 하면 된다.
이를 보고 의존성을 주입받는다(제어권이 역전되었다) 라고 말한다.
// 2. 의존성을 주입(Dependency Injection) 받는 경우
public class Car {
private final Engine engine;
public Car(Engine engine) { // Dependency Injection
this.engine = engine;
}
public void run() {
engine.start();
}
}