IoC와 DI는 소프트웨어 개발에서 객체 간의 의존성을 관리하고 구조를 개선하는게 중요한 개념들이다.
IOC(Inversion of Control)
IoC는 제어의 역전을 의미한다. 전통적인 프로그래밍에서는 프로그램의 흐름과 객체의 생명 주기를 개발자가 직업 제어한다. 그러나 IoC에서는 이러한 제어 권한을 개발자가 아닌 외부 시스템 또는 프레임워크가 맡게 된다.
즉, IoC는 제어 흐름을 개발자가 직접 관리하는 대신, 외부에서 관리하게 하여 프로그램의 유연성을 높이고, 모듈화 및 테스트 용이성을 향상시킨다.
IoC의 주요 형태 중 하나는 DI(Dependency Injection)이다. IoC를 사용하는 프레임워크나 컨테이너는 객체를 생성하고, 객체 간의 의존성을 주입하는 책임을 진다.
DI(Dependency Injection)
DI는 의존성 주입을 의미한다. 의존성 주입은 객체가 자신이 필요한 의존성을 직접 생성하거나 찾는 것이 아니라, 외부에서 주입받는 방법이다. 이렇게 함으로써, 객체 간의 결합도를 낮추고, 코드의 재사용성과 테스트 용이성을 높일 수 있다.
Di는 보통 세 가지 방법으로 구현된다.
- 생성자 주입(ConStructor Injection): 의존성을 객체의 생성자를 통해 주입하는 방법이다. 객체가 생성될때 의존성이 주입되므로, 객체가 완전하게 생성될 때 필요한 모든 의존성이 준비되어 있습니다.
- 세터 주입(Setter Injection): 의존성을 객체의 세터 메서드를 통해 주입하는 방법이다. 객체 생성 후에 세터 메서드를 호출하여 의존성을 주입한다.
- 인터페이스 주입(Interface Injection): 객체가 의존성을 주입 받을 수 있는 인터페이스를 제공하고, 의존성을 주입하는 방법이다. 객체는 이 인터페이스를 통해 의존성을 주입받는다.
간단한 예로 Car 클래스가 Engine이라는 의존성을 가지고 있다고 가정해보자
전통적인 방법
class Engine {
// 엔진 관련 코드
}
class Car {
private Engine engine;
public Car() {
this.engine = new Engine(); // 의존성을 직접 생성
}
// 기타 Car 관련 코드
}
DI를 사용한 방법
class Engine {
// 엔진 관련 코드
}
class Car {
private Engine engine;
// 생성자 주입
public Car(Engine engine) {
this.engine = engine; // 의존성을 주입받음
}
// 기타 Car 관련 코드
}
// 사용 예
Engine engine = new Engine();
Car car = new Car(engine);
DI를 사용하면 Car 클래스는 Engine의 구체적인 구현에 의존하지 않고, 주입받은 Engine에만 의존하게 된다. 이렇게 하면 Engine의 구현이 바뀌더라도 Car 클래스는 영향을 받지 않는다. 이로 인해 코드의 유지보수성과 테스트가 용이해진다.
간단하기 Ioc와 DI를 요약하자면
- IoC (제어의 역전): 프로그램의 흐름이나 객체의 생성과 관리를 프레임워크나 컨테이너가 대신 관리하게 하는 것. 이를 통해 개발자는 핵심 로직에 집중할 수 있음.
- DI (의존성 주입): 객체가 필요한 의존성을 외부에서 주입받는 방식. 객체가 직접 의존성을 만들지 않으므로 코드가 더 깔끔하고 관리하기 쉬움.
'Spring' 카테고리의 다른 글
RESTful API (0) | 2024.08.28 |
---|---|
Entity 연관 관계 1 대 1 관계 (0) | 2024.08.23 |
인증(Authentication)와 인가(Authorization) (0) | 2024.08.20 |
JPA란? (0) | 2024.08.19 |
@RestController, @Controller (0) | 2024.08.18 |