의존성 주입(dependency injection)

Kyung yup Lee·2020년 12월 27일
0

소프트웨어

목록 보기
1/1

소프트웨어 세계에 몸 담고 있다 보면 자주 듣는 것이 의존성, 의존성 주입 같은 단어를 자주 듣게 된다.

이 의존성은 무엇이고 의존성 주입은 무엇인지 알아둘 필요가 있다.

단어적인 예시로 "아기는 부모님에게 의존적이다. = 아기는 부모님 없으면 못 산다." 일 것이다.

이런 연관 관계를 맺고있는 개체들을 서로 의존하고 있다, 의존성이 있다. 라고 표현한다.

소프트웨어에서 많은 개체는 서로 의존성이 존재한다. 하지만 이 의존성을 잘 다루지 못하면 구현, 유지보수에 엄청난 어려움을 겪게 된다.

예를 들어 아래 코드를 보면,

class Baby{
   	Parent john = new Parent();
        
	public void eat(){
    		john.feed();
       }
    }

Baby 라는 클래스 안에서 john이라는 부모님을 인스턴스화 시켜서 사용하고 있다.

만약 이 프로그램 세상에 baby는 단 하나고, 더 이상 발전할 일이 없다면 위의 코드는 문제가 없다.

하지만 만약 Baby라는 클래스를 상속받는 Kate라는 클래스가 만들어진다고 한다면?

class Kate extends Baby{
	
    ...
}

Kate의 부모님은 john이 아니라면? Kate의 부모님은 feed를 하지 않는 악덕 부모님이라면? 소프트웨어는 이미 꼬이기 시작했다.
Kate 객체가 인스턴스화 된다면 본인의 부모도 아닌 john이라는 객체와 연관이 되고, 그 john이 feed를 하게 된다.

Baby 클래스가 너무 강하게 Parent 클래스와 의존관계를 맺어 유지보수 하는데 문제가 발생한 것이다. 이러면 모든 클래스를 다 뜯어고쳐야 한다.

이것을 해결하는 방법 중 하나가 의존성 주입이다.

의존성을 구현하는 것을 클래스 내부에서 생성하는 것이 아니라 외부에서 주입(injection) 해주는 것이다.

class Baby{
	private Parent parent;

	public Baby(Parent parent){ // parent 를 생성자를 통해 외부에서 가져옴
    	this.parent = parent;
    }
    
    public void eat(){
		parent.feed();
	}
}

class Kate extends Baby{
	public Kate(Parent parent){
    	super(parent);
        
    }
}

class Parent{
	private String name;

	public Parent(String name){
    	this.name = name;
    }

	public void feed(){
    	System.out.println(name + "가 밥을 먹입니다.");
    }
}

public class Main {
	public static void main(String[] args) {
		Parent parent = new Parent("Mose"); // 외부에서 Parent 클래스를 객체화 함
		Kate kate = new Kate(parent); 
		kate.eat();
	}

}

위 코드처럼 수정하면 의존성을 외부에서 주입한 것이다. Kate는 상속받고 있는 Baby 객체에서 Parent 객체를 받아온다. 그리고 이 Baby 클래스에서는 구체적인 Parent 객체를 생성하지 않고, 외부에서 생성자를 통해 입력받는다.

간단한 프로그램이라면 이런 의존성 주입을 위 코드 처럼 수동으로 구현해도 괜찮겠지만 방대한 소프트웨어가 될수록 이 의존성 관리는 어렵게 된다.

때문에 Inversion of control(제어의 역전) 이라는 개념이 도입되게 된다.

프레임워크를 통해 이 의존성 관리를 하는 것이다. 프로그래머가 의존성을 모두 관리하는 것이 많이 어려우니 프레임워크를 통해 인스턴스를 관리함으로서 문제를 해결하는 것이다.

이 모든 개념의 핵심은 추상적인 개념과 구체적인 개념의 명확한 분리이다. 인스턴스는 아주 구체적이다. 이 인스턴스화를 클래스에서 해버리면 추상적인 클래스에 구체적인 개념이 연관되어 버린다. 이런 핵심이 깨지면서 의존성 문제가 발생하게 되는 것이다.

이런 의존성 주입의 개념을 공부하면서 중요하게 생각해야 될 부분은 결국 원리를 파다보면 가장 기본적인 개념으로 가게 된다는 것이다.

profile
성장하는 개발자

0개의 댓글