DI 와 IOC

반응형
반응형

스프링에서는 다양한 방법으로 DI와 IOC(Injection Of Controller) 를 지원한다.
근데 이들이 어떤것이 존재하는지 알 필요가 있을까? 

내 생각에는 종류를 아는 것도 중요하지만, 용어의 뜻부터 아는 것도 중요하다고 생각이 든다.

먼저 DI는 dependency Injection의 약자로 의존성 역전이 되었다는 의미라 할 수 있다.
여기서 의존성이란 존재함을 의미한다.

일반적으로 의존하고 있다는의미는
마치

부모가 자식을 낳는 듯한 느낌처럼 자식이 탄생하기 위해서는 부모가 반드시 있어야 된다는 뜻이다.
이것을 코드화 시켜보자.

public class Parents {
  public void birth() {
     Child child = new Child();
  }
}

부모가 birth라는 메서드를 이용하면 자식이 탄생하는 것이 일반적인 의존 관계다.
이것이 일반적인 생태계 과정이지만, 문제가 하나 존재한다.
그것은 부모가 삭제가 되어지면 자식도 같이 삭제가 되어진다.
이를 현실세계에서 설명하면 부모가 죽으면 반드시 자식도 죽어야 된다는 뜻이다.
탄생은 현실과 비슷하게 흘러가는 것 같지만, 죽음은 현실과 동떨어지는 느낌이 든다.
만약에 부모가 죽어도 자식은 살게끔 만들 고 싶으면 어떻게 해야 할까?
부모 -> 자식 관계에서
자식 -> 부모 관계로 바꾸면 된다.

이것을 코드로 나타내면 다음과 같다.

public class Parents {
  public void birth(Child child) {
     System.out.println("탄생하였습니다.");
  }
}

이와 같은 의존성을 의존성 역전이라고 부릅니다. 마치 입양을 하는 것 처럼 부모는 이미 탄생한 자식을 가져오는 작업을 합니다.
이렇게 되면 부모는 죽어도 자식은 죽지 않는 시스템이 만들어집니다.

여기서 알 수 있는건 탄생 보다는 죽음이 훨씬더 현실과 맞아야 된다는 것을 알 수 있다.
코드를 보고 이렇게 생각할 수 있다.
저 코드가 저 방법만 고정이 되어질까?
절대 아니다.
다양한 방법으로 자식을 조작할 수 있는 권한이 생긴다. 모든 코드를 작성하는 것은 어렵겠지만,
이런식으로 

public class Parents {
  public Child birth(Child child) {
     return child;
  }
}

그 자식을 리턴 시킬 수 있다.
그에 반면에 의존성 제어가 아닌 코드에서는 무조건 

public class Parents {
  public void birth() {
     Child child = new Child();
  }
}

이 코드를 작성하고 조작해야 한다.
부모쪽 코드가 더러워질 위험이 발생할지도 모른다.
왜냐하면 무조건 자식을 탄생 시켜야 하기 때문이다.

하지만 DI를 이용하게 되면 이미 탄생한 자식이 기때문에 자식이 어떤 방식으로 탄생했는지 신경쓰지 않아도 된다.
이것이 바로 DI를 사용해야 되는 이유다.

굳이 스프링을 사용하지 않아도 DI라는 기술은 얼마든지 사용할 수 있다.

반응형

댓글

Designed by JB FACTORY