1. 의존성(의존 관계)이란?
객체를 생성 및 사용함에 있어, 하나의 객체가 다른 객체를 필요로 하는 상태(관계)
= 다른 객체를 참조
2. 의존성 주입(DI)이란?
객체 간의 관계(의존성)를 외부에서 결정해주는 방식으로,
객체를 직접 생성하는 대신 외부에서 생성한 후 주입하는 방법이다.
3. 의존성 주입의 장점
- 코드의 재사용성, 유연성이 높아진다. 하나의 작업만 수행하는 작은 객체는 많은 상황에서 재결합하고 재사용하기가 쉽기 때문이다.
- 객체간 결합도가 낮기 때문에 한 클래스를 수정했을 때 다른 클래스도 수정해야 하는 상황을 막아준다.
- 유지보수가 쉬우며 테스트가 용이해진다.
- 확장성을 가진다.
4. 의존성 주입의 3가지 방법
생성자 주입(Construct Injection)
의존성을 생성자의 매개변수로 전달받는 방법으로 객체가 생성될 때 필요한 의존성을 반드시 제공해야 하므로, 주입받은 의존성은 불변이다.(제일 선호)
public class Engine {
// 엔진 관련 코드
}
=======================
public class Car {
private final Engine engine;
// 생성자를 통해 Engine 의존성을 주입받음
public Car(Engine engine) {
this.engine = engine;
}
}
필드 주입(Field Injection)
클래스의 필드에 직접 @Autowired 어노테이션을 사용하여 의존성을 주입받는 방법입니다. 스프링이 자동으로 필드를 초기화합니다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Car {
@Autowired // 필드에 의존성을 주입
private Engine engine;
public void start() {
// 엔진을 사용하여 차를 시작하는 코드
}
}
세터 주입(Setter Injection)
의존성을 세터 메서드를 통해 주입받는 방법입니다. 객체가 생성된 후 필요한 의존성을 설정할 수 있습니다.
public class Car {
private Engine engine;
// 세터 메서드를 통해 Engine 의존성을 주입받음
public void setEngine(Engine engine) {
this.engine = engine;
}
public void start() {
// 엔진을 사용하여 차를 시작하는 코드
}
}
- 생성자 주입: 필수 의존성을 주입받아 객체를 생성하며, 불변성을 유지할 수 있다.
- 필드 주입: 코드가 간결하지만 가독성이 떨어질 수 있고, 테스트에 불리할 수 있다.
- 세터 주입: 의존성을 선택적으로 주입받을 수 있지만, 초기화 순서에 주의해야 한다.
'Java > Spring' 카테고리의 다른 글
[Spring] DAO / DTO / VO (0) | 2024.09.22 |
---|---|
[Spring] 스프링 빈(Bean) (0) | 2024.09.22 |
[Spring] 제어의 역전(IoC) (0) | 2024.09.22 |