BackEnd/Spring

Spring IoC, DI의 이해

일락。 2023. 11. 29. 09:48

스프링의 IoC, DI 대체 왜 알고 넘어가야 하는가?

일반적으로 자바 개발자라고 하면  spring을 주력으로 사용한다.

정부에서 지원하는 사업들이 다양화 되고 있지만 국내는 아직  Java가 일선이기에..

이왕 spring을 할거라면 해당 프레임워크의 메커니즘과 철학에 대해서도 알아볼 필요가 있다.

IoC란?

IoC는 Inversion of Control의 줄임말로 직역하면 제어의 역전이다.

JAVA를 학습한 사람이라면 객체를 사용할 때에는 필요한 곳에서 객체를 생성해 사용했을 것이다.

 

public class A {
    B b = new B();
}

 

IoC(제어의역전)은 객체(Class)를 직접 생성하지 않고  외부에서 관리하는 객체를 가져와 사용하는 것을 의미한다.

제어의 역전을 적용 시 하단의 코드의 형태로 바뀐다.

 

public class A {
    private B b;
}

 

이렇게 보듯이 직접 객체를 생성한 것이 아니라 어딘가에서 객체를 받아온 것으로 추측할 수 있다.

 

DI(Dependency Injection)란?

 

스프링에서 객체들을 관리하기 위해 제어의 역전을 사용하며 그 제어의 역전을 구현하기 위해 사용하는 방법이 DI이다.

DI는 Dependency Injection의 줄임말로 직역하면 의존성 주입이라고 한다. 

 

어떤 객체(Class)가 다른 객체에 의존한다는 의미라 좀 어렵게 들릴 순 있으나 소스코드를 보면 아주 간단하다.

다음 소스는 IoC/DI를 기초로 하는 Spring 코드이다.

밑 소스는 개발자가 직접 B 객체를 선언만 했을 뿐 직접 객체를 생성하지는 않았다.  즉 객체를 주입받았다 볼 수 있다.

 

@AutoWired라는 에너테이션이 등장하여 당황할 수 있다.

해당 에너테이션은 스프링 컨테이너에 있는 빈이라는 것을 주입하는 역할을 한다.

빈은 스프링 컨테이너에서 관리하는 객체를 의미한다.

 

public class A {
    // A에서 B를 주입받음
    @Autowired  
    private B b;
}

 

방금 전 설명했던 것처럼 의존성 주입이 되었기 때문에 프로그램은 정상적으로 실행된다.

스프링 컨테이너에서 객체 B를 생성하여 A에게 의존성을 주입했기 때문이다.

그림3 스프링 컨테이너를 이용한 객체 사용 방법 (출처 : http ://private.tistory.com/39)