-
[Spring] DI 의존성 주입Spring Core 2024. 7. 2. 23:10
의존성 주입 DI (Dependency Injection)
- DI란 의존 관계 주입 혹은 의존성 주입이라고 불린다
- Spring은 객체의 의존 관계를 의존 관계 주입을 통해 관리한다
- 스프링 컨테이너에서 객체의 생명주기를 관리하고 객체의 의존관계도 관리한다
왜 필요할까?
public interface Fruit { }
public class Peach implements Fruit{ }
public class WaterMelon implements Fruit { }
public class Store { private final Fruit fruit; public Store() { this.fruit = new Peach(); } }
Store 클래스에서 생성자를 보면 필드의 fruit가 Peach()로 구현이 되어 생성 된다
만약 여기서 Store가 peach가 아닌 watermelon를 가지게 하고 싶다 하면 코드의 수정이 필요하다
이 말은 즉, Store 클래스는 Fruit에 의존적이다
여기에서 직접 생성을 하게 하는 것이 아닌 의존성을 주입을 통해서 한다고 하면 객체간의 의존성을 줄일 수 있게 된다
장점
- 코드에서 객체 생성에 관여하지 않아도 되기 때문에 객체 사이의 의존도를 낮춘다
- 유연하고 확장성이 뛰어난 코드 작성이 가능해 진다
의존성 주입 방식
- 필드 주입
- setter 주입
- 생성자 주입
필드 주입
@Service public class StoreService { @Autowired private StoreRepository storeRepository; }
객체의 필드에 직접 의존성을 주입하는 방법이다
@Autowired를 통해 DI 컨테이너가 직접 필드에 접근하도록 한다
setter 주입
@Service public class StoreService { private StoreRepository storeRepository; @Autowired public void setStoreRepository(StoreRepository storeRepository) { this.storeRepository = storeRepository } }
객체를 생성 하고 필요한 필드 값, 의존성을 세터 메서드를 통해서 주입하는 방식
생성자(Constructor) 주입
@Service public class StoreService { private final StoreRepository storeRepository; @Autowired public StoreService(StoreRepository storeRepository) { this.storeRepository = storeRepository; } }
객체가 생성될 때 필요한 의존성을 생성자 파라미터를 통해 주입하는 방식이다
인스턴스가 생성될때 1회 호출되는 것을 보장하고
필드에 final 키워드를 사용할 수 있다
세개 중에 어떤걸 써야할까?
일단 스프링에서는 생성자 주입 방식을 권장하고 있다
그 이유는?
객체의 불변성(immutable)
생성자 주입 방식을 사용하면 객체가 생성되는 시점에 생성자를 호출하여 최초로 1번만 주입한다
그래서 불변 객체를 보장한다 -> 객체의 일관성
객체를 포함한 클래스가 생성되는 시점에 포함된 객체들도 반드시 생성되기 때문에 객체가 비어 있을 가능성도 없어진다
IoC컨테이너?, DI 컨테이너?
Ioc라는 개념은 전의 글
https://hyeonni.tistory.com/81
[Spring] IOC 제어의 역전
제어의 역전 IOC(Inversion of Control)제어의 역전이라는 의미이고 제어의 흐름을 바꾼다고 한다메소드나 객체의 호출 작업을 개발자가 결정하는 것이 아닌 외부에서 결정 되는 것 이다 코드로
hyeonni.tistory.com
여기서 보면 된다
IoC 컨테이너는 뭐고 DI 컨테이너는 뭘까?
-> 쉽게 말해서 IoC를 하는 컨테이너, DI를 하는 컨테이너이다
위 글에서 AppConfig 개념이 나오는데 AppConfig는 객체를 생성하고 관리하면서 의존관계를 연결해 준다
=> 이게 IoC컨테이너, DI 컨테이너라고 한다
최근에는 의존관계 주입에 초점이 맞춰져서 DI 컨테이너라고 한다
'Spring Core' 카테고리의 다른 글
[Spring] IOC 제어의 역전 (0) 2024.07.01 [Spring] 스프링 빈(Bean) 등록 방법 (0) 2024.05.30 [Spring] 스프링 빈(Bean) 이란? (0) 2024.05.30 [Spring] Java Bean? Spring Bean? (1) 2024.05.28 SOLID 원칙 (0) 2024.04.30