본문 바로가기
Spring Core

[Spring] DI 의존성 주입

by hyeonit 2024. 7. 2.

 

의존성 주입 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