Lined Notebook

DI(Dependency Injection), IoC(Inversion of Control)

by HeshAlgo

 

1. DI(Dependency Injection)

DI란 의존성 주입을 나타낸다.

미리 외부에서 생성한 객체 인스턴스에 대해서 특정 설정을 통해 객체의 종속성을 정의할수 있는 프로세스입니다.

쉽게 말하자면 어떤 객체가 필요한 객체를 외부에서 밀어넣는 것을 의미합니다.

 

DI 원칙을 사용하면 코드가 더 깔끔해지고 디커플링에 대해서 매우 효과적입니다.

이런 스프링 DI를 주입하는 방법에는 크게 2가지 방법이 있습니다. 

첫번째로 생성자를 통한 주입, 두번째로는 Setter를 통한 주입 이렇게 2가지 입니다.

이전에는 필드를 통한 생성자 주입도 존재했었는데 스프링 공식문서에는 위의 2가지 방법만을 설명하고 있어서 위의 2가지 설정에 대해서만 보도록 하겠습니다.

 

1) 생성자를 통한 주입

- 현재 가장 많이 사용하고 있는 의존 관계 주입 방식입니다. 아래의 예시처럼 여러가지의 객체를 생성자를 통해 주입할 수 있습니다.

@RestController
class ProductController(
    private val orderService: OrderService,
    private val memberServce: MemberService,
) {
	...
}

 

The Spring team generally advocates constructor injection.

스프링 공식문서에서도 해당 생성자를 통한 주입을 선호합니다.

해당 생성자를 통한 주입은 NPE가 전혀 발생되지 않고 val 키워드를 통해 객체의 불변성(Immutability)이 보장됩니다.

 

2) Setter를 통한 주입

- Setter 메소드를 통해 주입하는 방식이다.

아래와 같이 객체의 필드내에서 선언이 되며 Null 체크를 해줘야 한다는 점이 있습니다. 

@RestController
class ProductController{
    lateinit var orderService: OrderService
    lateinit var memberServce: MemberService
}

 

2. IoC(Inversion of Control)

- 제어의 역전을 뜻하며 메소드나 객체의 호출 작업을 개발자가 결정하는것이 아닌 외부에서 결정되는것을 의미합니다.

우리 개발자들은 OrderService, MemberService와 같은 객체들을 직접 구현하고 정의하지만 해당 객체들이 어느 시점에서 호출할것인지 신경쓰지 않습니다. 그냥 스프링 프레임워크가 알아서 객체를 생성하고 메소드를 호출하고 소멸하며 프로그램을 제어하게 됩니다. 

@RestController
class ProductController(
    private val orderService: OrderService,
)

위의 예시를 보면 현재 OrderService는 ProductController의 의존성입니다.

쉽게 말해 ProductController는 OrderService가 있어야 기능을 활용할 수가 있습니다. 

그런데 여기서 ProductController는 OrderService객체가 필요한데 이걸 누가 만들고 누가 관리하는지가 관건입니다.

이제 더 이상 내가 의존성을 관리하지 않고 나 이외의 누군가가(Spring)에게 맡겨 작업을 처리하게 되는겁니다.

 

이렇게 스프링 프레임워크는 IoC 전용 컨테이너를 제공 해줍니다.

그 컨테이너의 가장 핵심적인 인터페이스는 ApplicationContext, BeanFactory 등이 있습니다. 

IoC 컨테이너가 해주는 일은 Bean과 같은 컨테이너 내부에서 만든 객체들의 의존성을 관리해줍니다.

ProductController, OrderService는 전부 ApplicationContext 를 통해 만들어지는 Bean입니다. 

이 컨테이너는 오로지 Bean만을 관리한다는 점을 기억해주면 좋을것 같습니다. 

 

 

 🤔참고 문헌

https://docs.spring.io/spring-framework/reference/core/beans/dependencies/factory-collaborators.html

'Spring Boot' 카테고리의 다른 글

Maven과 Gradle 차이 및 프로젝트 설정  (1) 2024.01.21

블로그의 정보

꾸준히 공부하는 개발 노트

HeshAlgo

활동하기