ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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
Designed by Tistory.