Spring Framework, 스프링 프레임워크

https://medium.com/omarelgabrys-blog/spring-a-head-start-introduction-part-1-130aa1b41e47

https://medium.com/omarelgabrys-blog/spring-a-head-start-introduction-part-1-130aa1b41e47

스프링의 핵심 3대 요소는 IoC, AOP, PSA 이다.

https://ooz.co.kr/175

https://ooz.co.kr/175

제어의 역전 (IoC, Inversion of Control) 과 의존성 주입(DI, Dependency Injection)

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. 직접 의존성을 관리하는 경우

자동차와 엔진의 관계를 생각해보자. 자동차가 작동하려면 엔진이 필요하다. 일반적인 프로그래밍에서 개발자는 자동차가 사용할 엔진을 직접 생성해서 사용한다(자동차는 엔진에 의존한다).

// 1. 직접 의존성 관리하는 경우
public class Car {
	private final Engine engine = new SuperEngine(); // new SuperEngine(); compile time

	public void run() { 
		engine.start();
	}
}

2. 의존성을 주입받는 경우

그런데 아래의 코드를 보면 자동차가 아닌 외부에서 엔진을 만들고, 자동차 클래스의 생성자를 통해 주입해주고 있다. 즉, 자동차 내부에서 엔진을 직접 생성하지 않고 외부의 누군가가 엔진을 만들어서 넣어주고 있는 것 이다. 개발자는 그저 엔진이 필요하며, 생성자(또는 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();
	}
}