TIL

IoC & DI

haseung22 2024. 10. 7. 21:08

IoC (Inversion of Control)란 ?

IoC란 제어의 역전이라 부른다

제어의 역전이란 메서드나 객체의 호출 작업을 개발자가 아닌 외부에서 결정되는 것을 의미한다.

객체의 의존성을 역전시켜 객체 간의 결합도를 줄이고 유연한 코드를 작성할 수 있게하여

가독성 및 코드 유지 보수를 편하게 할 수 있게 한다.

 

DI (Dependency Injection)란 ?

DI란 의존성 주입이라 부르며 객체를 직접 생성하는게 아닌 외부(IoC 컨테이너)에서

생성한 후 주입시켜주는 방식이다.

DI를 사용한다면 의존성이 줄어들고 가독성이 높아지며 코드의 재사용성이 높아진다는

장점이 있습니다.

 

의존성 주입 방식으로는 3가지가 있다.

  • 생성자 주입
  • Set 메서드를 이용한 주입
  • 필드 주입

 이 3가지 중에서 스프링에서 권장하는 의존성 주입 방식은 생성자 주입이다.

 

생성자 주입

생성자를 통해 의존관계를 주입한느 방법으로 생성자를 호출 시에 딱 한번만 호출 되는 것을 보장한다.

public class Consumer {

    private final Food food;

    public Consumer(Food food) {
        this.food = food;
    }
}

 

Set  메서드를 이용한 주입

말 그대로 Setter 메서드를 이용하여 의존관계를 주입하는 방식이다.

public class Consumer {

    private Food food;

    public void setFood(Food food) {
        this.food = food;
    }
}

 

필드 주입

필드에 직접 의존관계를 주입하는 방법이다.

코드가 짧아지는 장점이 있지만 외부에서 변경이 불가능하고 테스트 코드를 작성하기 힘들다는 단점이 있다.

public class Consumer {
	
    private Food food;
}

 

위의 3가지 방법중에 스프링에서 생성자 주입을 권장하는 이유는 아래와 같다.

  • 의존관계 설정이 되지 않으면 컴파일 타임에 알 수 있다.
  • 의존성 주입이 필요한 필드를 final 키워드로 선언 가능하다.
  • 스프링에서 순환 참조 감지 기능을 제공하며 순환 참조 시 에러를 보여준다.
  • 테스트 코드 작성이 용이하다.