[Spring] 제어의 역전(IoC)와 의존성 주입(DI)
KUKJIN LEE • 1개월 전 작성
제어의 역전 (IoC)란?
객체의 생성과 그 객체가 어떤 다른 객체와 협력할지를 개발자가 아니라 Spring
프레임워크가 관리합니다. 객체가 스스로 필요한 것을 만들지 않고, 외부에서 받아서 사용한다는 뜻입니다.
프론트 개발자에게 설명한다면?
부모 컴포넌트가 자식 컴포넌트에 props
를 통해 데이터를 전달합니다. 자식 컴포넌트는 그 데이터를 스스로 만들지 않고, 외부로부터 받습니다. Spring
의 IoC
도 비슷합니다. 객체가 직접 다른 객체를 생성하지 않고, 외부에서 필요한 객체를 전달받습니다.
// React 예시
function ChildComponent({ data }) { // 부모로부터 데이터 받음
return <div>{data}</div>;
}
function ParentComponent() {
return <ChildComponent data="Hello, Spring!" />;
}
객체가 직접 의존성을 관리하지 않고, 외부에서 필요한 객체를 주입받습니다.
전통적인 방식에서는 객체가 스스로 의존성을 관리했습니다. new Engine ();
하지만 IoC
에서는 Car가 Engine을 직접 생성하는 대신, 외부에서 주입 받습니다.
public class Car {
private Engine engine;
public Car(Engine engine) {
// this.engine = new Engine(); 직접 객체 생성
this.engine = engine; // 외부에서 의존성 주입
}
public void start() {
engine.start();
}
}
의존성 주입(DI)란?
객체가 필요로 하는 의존성을 외부에서 주입해 주는 방식입니다.
Spring 의존성 주입(DI) 방식
- 생성자 주입 (Constructor Injection): 객체가 생성될 때 의존성을 주입
@Component public class Car { private Engine engine; // 생성자 주입 @Autowired public Car(Engine engine) { this.engine = engine; } public void start() { engine.start(); } }
-
필드 주입 (Field Injection): 코드가 간결해 보이지만, 테스트가 어려워질 수 있고, 객체 상태가 불명확해지는 문제가 존재하기 때문에 권장되는 방식은 아닙니다.
@Component public class Car { @Autowired private Engine engine; // 필드에 직접 주입 public void start() { engine.start(); } }
의존성 주입의 장점
객체가 직접 의존성을 관리하지 않기 때문에 코드의 결합도를 낮추고, 유연성을 높입니다. 객체 간 의존성을 쉽게 교체하거나 확장할 수 있습니다.
특히 Spring의 IoC
와 DI
는 객체의 생성과 관계 관리를 프레임워크가 대신해줌으로써, 객체의 생성과 관리를 신경 쓰지 않고 비즈니스 로직에 집중할 수 있습니다.