감자튀김 공장🍟

[Spring] Dependency Injection(DI)란? 본문

JAVA/Spring

[Spring] Dependency Injection(DI)란?

Potato potage 2022. 4. 17. 11:52
반응형

1. Dependency Injection(의존성 주입) 이란?

DI는 기본적으로 객체가 필요로하는 객체(의존성)를 스스로 구성하게 하는 대신 제공하는 것이다. 의존성을

하거나 스텁할 수 있기 때문에 테스트에 매우 유용한 기술이다. 더 간단하게 풀어보자면 두 객체 간의 결합도를 낮추기 위해 객체 사이에 인터페이스를 놓아 의존 관계가 고정되지 않도록 하는 것이다.

 

2. Dependency Injection이 필요한 이유

public class MyPet {
	private PetType pet;
	
	public MyPet() {
		this.pet = new Cat();
	}
}

PetType객체에는 Cat과 Dog이 있다고 가정한다.

위의 코드와 같은 경우에 MyPet객체는 PetType을 의존하고 있음을 알 수 있다(정확히 말하자면 Cat을).

이런 경우에 아래와 같은 문제점들이 나타난다.

  1. MyPet객체가 PetType에 의존하고 있으며
  2. MyPet객체가 PetType의 생성을 제어하며
  3. PetType객체의 변화가 MyPet겍체의 변화까지 이끌어낸다.

MyPet에 Cat뿐만 아니라 Dog, Bird등의 객체들이 추가될때마다 계속해서 MyPet 생성자에 변경이 필요하며 이를 유연성이 떨어진다고 본다.

따라서 우리는 MyPet과 PetType의 결합도를 낮춰야한다. 이를 위해서 외부에서 의존성을 주입(Injection)해야한다.

 

3. Dependency Injection 하기

먼저 여러 동물들이 더 MyPet에 추가될 수 있기 때문에 여러 동물들을 PetType이라는 Interface로 설정한다.

public interface PetType {

}
public class Cat implements PetType {

}

이제 결합도를 낮추고(제거하고) 외부에서 의존성을 주입하면 아래와 같은 코드가 된다.

public class MyPet{
    public PetType pet;
    
    public MyPet(PetType pet) {
        this.pet = pet;
    }
}

여기서 Spring이 DI 컨테이너를 필요로 하는 이유를 알 수 있는데, 우선 MyPet에서 PetType 객체를 주입하기 위해서는 애플리케이션 실행 시점에 필요한 객체(빈)를 생성해야 하며, 의존성이 있는 두 객체를 연결하기 위해 한 객체를 다른 객체로 주입시켜야 하기 때문이다.

예를 들어 다음과 같이 Cat이라는 객체를 만들고, 그 객체를 PetType로 주입시켜주는 역할을 위해 DI 컨테이너가 필요하게 된 것이다.

public class BeanFactory {

    public void store() {
        // Bean의 생성
        PetType Cat = new Cat();
    
        // 의존성 주입
        PetType pet = new PetType(Cat);
    }
    
}

그리고 이러한 개념은 제어의 역전(Inversion of Control, IoC)라고 불리기도 한다. 어떠한 객체를 사용할지에 대한 책임이 BeanFactory와 같은 클래스에게 넘어갔고, 자신은 수동적으로 주입받는 객체를 사용하기 때문이다. (실제 Spring에서는 BeanFactory를 확장한 Application Context를 사용한다.)

 

4. DI의 장점

  1. 변경에 취약하지 않다.
    • 컴포넌츠의 의존성이 줄어들면 변화에 덜 취약하다(코드 변경이 덜 까다로워 진다.)
  2. 코드의 재사용화가 가능하다.
    • 일부 인터페이스의 다른 구현이 다른 부분에서 필요하다면 필요한 구성 요소는 해당 구현과 함께 작동하도록 구현해야 한다. 즉, 코드를 변경할 필요가 없다.
  3. 객제 생성과 분리된 사용이 가능하다.

 

 

참고 자료

https://effortguy.tistory.com/141

 

[Spring Boot] Mockito (1) - Mock이란?, Mockito 소개

이번 포스팅에선 Mock을 만들고 여러 기능들을 제공하는 Mock 프레임워크 Mockito에 대해 알아보겠습니다. Mock이란? Mockito에 대해 설명하기 전에 Mock에 대한 개념부터 설명하겠습니다. Mock은 한글로 "

effortguy.tistory.com

http://blog.gtiwari333.com/2011/05/understanding-dependency-injection-and.html

 

Understanding Dependency Injection and its Importance, A tutorial

java, image processing, hidden markov model, mfcc, android, code, data structure , numerical method, audio processing, project configuration

blog.gtiwari333.com

https://mangkyu.tistory.com/150

 

[Spring] 의존성 주입(Dependency Injection, DI)이란? 및 Spring이 의존성 주입을 지원하는 이유

1. 의존성 주입(Dependency Injection)의 개념과 필요성 [ 의존성 주입(Dependency Injection) 이란? ] Spring 프레임워크는 3가지 핵심 프로그래밍 모델을 지원하고 있는데, 그 중 하나가 의존성 주입(Depende..

mangkyu.tistory.com

 

반응형

'JAVA > Spring' 카테고리의 다른 글

[Spring] java.lang.UnsupportedClassVersionError  (0) 2022.07.01
[Spring] MVC 패턴 알아보기  (0) 2022.04.19
[Spring] Aspect Oriented Programming (AOP)이란?  (0) 2022.04.18
[Spring] Spring 개요  (0) 2022.04.15
Comments