의존 관계 주입(DI)이란?
DI는 의존 관계를 외부에서 결정(주입)해주는 것을 말한다. 스프링에서는 이러한 DI를 담당하는 DI 컨테이너가 존재한다. 이 DI 컨테이너가 객체들 간의 의존 관계를 주입한다.
우리가 Spring 이라는 것을 배울 때 중요한 특징이라고 불리우는 용어가 있다.
의존성 주입 / 의존관계 주입 / 종속성 주입 등
참으로 다양하게 불려오기도 하는 용어이다.
나는 이 용어가 참 낯설게 느껴졌다.
솔직히 와닿지도 않고..
Dependency Injection 이라는 영단어를
그대로 한글로 번역하려다 보니 생긴 문제이지 않을까? 싶다.
나는 그래서 이 용어자체를 이해하기 쉽게, 나만의 방식으로 풀어쓰고 싶다는 생각이 들었다.
일체형 피규어로 한 가지 예를 들어보겠다!
원피스 라는 애니메이션의 주인공들이 타고다니는 "써니호" 라는 배가 있다.
근데.. 어느 날, 뱃머리가(태양모양) 너무 녹슬어, 바꿔야 하는 상황이 오고야 말았다!
그래서 선원들은 배를 고치는 기술자에게 요청해본다.
선원들 : 기술자님~!
뱃머리가 너무 녹슬어서 바꿔야 할 것 같아요!!
어서 바꿔주세요 !!기술자 : 네? 그럼 다 부셔야 하는데요.....
그렇다. 마치 일체형으로 된 피규어처럼 생성된 이 써니호는
모두가 너무 끈끈하게 연결되어 있어서 고작 뱃머리 하나만 교체하려고 해도,
우당탕탕 부셔야하는 너무나도 많은 노력과 작업이 필요한 것이다!
이러한 표현을 서로 의존(결합)관계가 너무 높다 == 끈끈하다 라고 하는 것이다.
그럼 아래와 같은 배는 어떨까?
선원들 : 기술자님~!
뱃머리가 너무 녹슬어서 바꿔야 할 것 같아요!!
어서 바꿔주세요 !!기술자 : 오 진짜 편하게 잘 주셨네~ 잠시만 기다려주세요. 5초면 됩니다.
배를 처음부터 마치 레고처럼,
모든 부품 하나하나들을 조립형으로 만들었다면 어떨까?
관리하거나 바꿔끼울 때 너무나도 쉬운 방법이 될 것이다.
여기 배(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 객체를 갈아끼우기만 하면된다!
자 이제는 IoC 라는 개념이 도입되어 설명이 들어갈 것이다!
다음 포스팅으로 이어서 알아보자 :)