david's daily developer note

[BE] Spring - DI (Dependency Injection) 본문

[Develop] Web/Back-end

[BE] Spring - DI (Dependency Injection)

mouse-david 2022. 6. 27. 01:59
728x90

Spring DI (Dependency Injection)

Spring Container는 Bean이라고 부르는 자바 객체의 생명 주기를 자동으로 관리한다. 

Spring Container는 객체 인스턴스를 싱글톤으로 관리되지만, 내부적으로 CGLIB 방식으로 오버라이딩되어,
다른 목적으로 사용되는 같은 타입의 인스턴스를 알아서 관리해준다.
일단 싱글톤 관리는 GC로 발생하는 오버헤드를 줄일 수 있다는 장점이 있다. 
https://docs.spring.io/spring-framework/docs/current/reference/html/index.html

Spring Container가 객체간 의존 관계를 자동으로 연결하는 것을DI (Dependency Injection), 의존성 주입이라고 한다.

public class Client {
    
    private ExampleService service;

    Client() {
        service = new ExampleService();
    }
}


의존성은 코드 명시적인데, 생성자 주입, 필드 주입등 다양한 방법이 있고, Spring 4부터는 생성자 주입을 권장하고 있다.

// This class accepts a service in its constructor.
Client(Service service) {
    
    // The client can verify its dependencies are valid before allowing construction.
    if (service == null) {
        throw new InvalidParameterException("service must not be null");
    }

    // Clients typically save a reference so other methods in the class can access it.
    this.service = service;
}

Spring의 DI를 위하여 주입을 코드 명시하지만, 관리에 대한 책임은 프레임워크가 가진다. 
예를 위의 예제에서는 Service 객체가 생성자로 입력되는 코드이며, 의존성 관계를 생성자 주입 방식으로 명시하였다.
Container는 어플리케이션이 생성 시점에 Service 객체 생성/등록하며, Service객체를 Client객체로 의존성을 주입한다.

여기서 개발자는 Container가 의존성 생성/주입 제어를 담당하기 때문에, 복잡한 객체간 종속으로 발생하는 예외에 대한 고민을 적게(?)할 수 있고 비니지스 목적의 코드만 집중할 수 있다.

이 처럼, 프레임워크가 핵심 모델의 제어를 담당하는 것을
제어의 역전 (Inversion of Control, IoC) 이라고 한다.

728x90