[Spring] 쉽게용어정리 - DI (Dependency Injection) 이란?

곽동현·2023년 9월 29일
0

1) Dependency Injection 의 정의

의존 관계 주입(DI)이란?
DI는 의존 관계를 외부에서 결정(주입)해주는 것을 말한다. 스프링에서는 이러한 DI를 담당하는 DI 컨테이너가 존재한다. 이 DI 컨테이너가 객체들 간의 의존 관계를 주입한다.


2) 의존관계 주입? 의존성 주입? 그게 무슨소리에요 도대체?

우리가 Spring 이라는 것을 배울 때 중요한 특징이라고 불리우는 용어가 있다.

Dependency InJection. 줄여서 DI

의존성 주입 / 의존관계 주입 / 종속성 주입 등
참으로 다양하게 불려오기도 하는 용어이다.

나는 이 용어가 참 낯설게 느껴졌다.
솔직히 와닿지도 않고..

Dependency Injection 이라는 영단어를
그대로 한글로 번역하려다 보니 생긴 문제이지 않을까? 싶다.


나는 그래서 이 용어자체를 이해하기 쉽게, 나만의 방식으로 풀어쓰고 싶다는 생각이 들었다.


3) 일체형에서 조립형으로 !

일체형 피규어로 한 가지 예를 들어보겠다!
원피스 라는 애니메이션의 주인공들이 타고다니는 "써니호" 라는 배가 있다.

근데.. 어느 날, 뱃머리가(태양모양) 너무 녹슬어, 바꿔야 하는 상황이 오고야 말았다!
그래서 선원들은 배를 고치는 기술자에게 요청해본다.

선원들 : 기술자님~!
뱃머리가 너무 녹슬어서 바꿔야 할 것 같아요!!
어서 바꿔주세요 !!

기술자 : 네? 그럼 다 부셔야 하는데요.....

그렇다. 마치 일체형으로 된 피규어처럼 생성된 이 써니호는
모두가 너무 끈끈하게 연결되어 있어서 고작 뱃머리 하나만 교체하려고 해도,
우당탕탕 부셔야하는 너무나도 많은 노력과 작업이 필요한 것이다!

이러한 표현을 서로 의존(결합)관계가 너무 높다 == 끈끈하다 라고 하는 것이다.


그럼 아래와 같은 배는 어떨까?

선원들 : 기술자님~!
뱃머리가 너무 녹슬어서 바꿔야 할 것 같아요!!
어서 바꿔주세요 !!

기술자 : 오 진짜 편하게 잘 주셨네~ 잠시만 기다려주세요. 5초면 됩니다.

배를 처음부터 마치 레고처럼,
모든 부품 하나하나들을 조립형으로 만들었다면 어떨까?

관리하거나 바꿔끼울 때 너무나도 쉬운 방법이 될 것이다.

4) 오케이 이론적으로는 이해 됐어. 그럼 코드로는 어떻게 표현하는데?

일체형

여기 배(Ship)와 뱃머리(Head) 두 가지 클래스가 있다고 상상해보자.



// Ship 클래스는 배를 나타낸다.
public class Ship {
    private Head head; // 배는 뱃머리를 가지고있다.

    public Ship() {
        this.head = new Head(); // 배는 스스로 뱃머리를 생성한다.
    }

    public void start() {
        head.start(); // 배가 뱃머리의 start 메서드를 직접 호출한다.
    }
}

// Head 클래스는 뱃머리를 나타낸다.
public class Head {
    public void start() {
        System.out.println("출항하라!");
    }
}
public class Main {
    public static void main(String[] args) {
        Ship sunnyShip = new Ship(); // 새로운 Ship 객체를 생성한다.

        // 생성한 Ship 객체를 이용해 start를 시작한다.
        sunnyShip.start();
    }
}

Ship 클래스와 Head 클래스가 있다.
Ship 클래스는 생성자에서 new Head()를 사용하여 뱃머리 객체를 직접 생성한다.
이는 Ship 클래스가 Head 클래스와 강하게 결합되어 있음을 의미한다. (일체형)

추후에 뱃머리를 바꾸기위해선 꽤나 까다로울 것 같다는 생각이 들지 않는가?


조금 바꿔보자!

조립형

// 배 클래스
public class Ship {
    private Head head;

    // Head를 주입받는 생성자
    public Head(Head head) {
        this.head = head;
    }

    public void start() {
        head.start();
    }
}
// 뱃머리 클래스
public class Head {
    public void start() {
        System.out.println("출항하라!");
    }
}
public class Main {
    public static void main(String[] args) {
        // Head 객체를 생성.
        Head myHead = new Head();

        // Ship 객체를 생성하면서 Head 객체를 주입.
        Ship sunnyShip = new Ship(myHead);

        // 생성한 Ship 객체를 이용해 배를 시작.
        sunnyShip.start();
    }
}

Ship 클래스는 생성자를 통해 Head을 주입받는다. 이것이 바로 의존성 주입이다! (조립형)

이제는 교체할 때 다른 Head 객체를 갈아끼우기만 하면된다!


5) Spring 프레임워크가 이걸 관리해준다고?

자 이제는 IoC 라는 개념이 도입되어 설명이 들어갈 것이다!
다음 포스팅으로 이어서 알아보자 :)

profile
실패의 경험들을 채워나가기!

0개의 댓글