[스프링] IoC / DI

Lil_Young·2025년 10월 27일

Spring

목록 보기
2/6
post-thumbnail

IoC (Inversion of Control), 제어의 역전

// 개발자가 제어
public class A {}
public class B {
	private A a;
    public B(){
    	this.a = new A();
    }
}

// IoC Container(Spring) 제어
@Component
public class A {}
public class B{
	private A a;
    @Autowired
    public B(A a){
    	this.a = a;
    }
}

1번 코드의 경우 new 키워드를 사용하여 직접 객체를 생성 했지만, 2번 코드는 @Component와 @Autowired를 사용하여 new 키워드가 없음에도 객체가 생성되는 코드이다.
이처럼 개발자가 직접 객체를 관리 하는게 아닌 프레임워크에게 객체 생성 및 생명주기를 맡기는것이 제어의 역전이라 할 수 있다.

DI (Dependency Injection), 의존성 주입

객체간의 의존관계를 직접 생성하는것이 아닌 IoC 컨테이너가 관리하는 Bean을 외부에서 주입받아 의존 관계를 형성하는 것을 DI, "의존성 주입"이라고 한다.

의존성 주입 방법에는 3가지가 있다.

  • DI되는 객체는 반드시 Bean 등록이 되어있어야한다. 아래 코드는 @Component 어노테이션을 이용해 Bean을 등록한 상태이다.
@Component
public class A {}

// 생성자 주입
@Component
public class B {
    private final A a;

    @Autowired
    public B(A a) {
        this.a = a;
    }
}

// Setter 주입
@Component
public class B {
    private A a;

    @Autowired
    public void setA(A a) {
        this.a = a;
    }
}

// 필드주입
@Component
public class B {
    @Autowired
    private A a;
}

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

생성자 주입

순환 참조 예방

  • Application 작동시점에서 순환 참조를 확인할 수 있다.
  • Spring Boot 2.6 부터는 순환 참조가 기본적으로 허용되지 않기 때문에 이하 버전에서만 효과가 있다.

불변성 보장

  • Application 실행 시점에서 의존성이 주입되고 final 키워드를 사용하여 다른 방법과 달리 객체의 불변성을 보장할 수 있다.

테스트의 편리함

  • 컴파일 시점의 객체를 주입받아 테스트 코드 작성이 가능하고, 누락 객체가 있을 경우, 컴파일 시점에서 확인되기 때문에 테스트를 보다 쉽게 할 수 있다.

Setter 주입

  1. 객체 변경이 필요한 경우 사용된다.

필드 주입

  1. 코드가 간결하다.
  2. 프레임워크에 지나치게 의존적이고, 외부에서 변경이 불가능하다.

0개의 댓글