DI의 약자는? Dependency Injection 즉, 의존성 주입을 의미한다.
한글로 풀이했는데도 무슨 뜻인지 정확히 알 수 없어서 이해하는데 관점을 맞추었다.
A가 B에 의존한다 = A가 B에 영향을 받는다.
= B가 바뀌면 A가 변한다.
위의 뜻 풀이를 좀 더 하자면,
의존도가 떨어진다 == 한 객체가 의존도 주입을 통해 다양한 객체를 이용할 수 있다
즉, 다양한 객체를 이용할 수 있다는 말은 공통의 인터페이스를 주입 받기 만해도 , 실제 형상화된 객체에 따라 동작이 달라진다는 것이다. 따라서 DI는 다형성 기능을 활용 한 것이라 할 수 있다.
이것을 코드에서 찾아보면, 클래스 내의 new가 곧 의존성을 의미한다. new로 생성한 클래스가 문제가 생기면 이 클래스를 사용 하는 클래스의 기능에도 문제가 생기기 떄문이다. 클래스 내에서 클래스를 생성하여 호출 하는 경우에는 변경에 많은 비용이 발생하게 되는데, 이러한 문제를 완화하기 위해, Java에서는 interface를 도입했다. interface를 통해, 만약 변경사항이 발생하더라도 유연하게 대응할 수 있었다.
이처럼, DI는 어떤 객체가 사용하는 의존 객체를 직접 만들어 사용하는게 아니라, 외부에서 주입 받아 사용하는 방법이라고 할 수 있다. 다른 말로 하자면, 의존관계를 외부에서 결정하고 주입하는 것을 의미한다. Spring 관점으로 DI를 설명하자면, IOC container가 개발자 대신 xml파일에 정의된대로 bean 객체를 생성하고 의존성을 대신 주입하는 것을 말한다.
DI의 효과를 정리하자면, 느슨한 결합이 가능하도록 유도 할 수 있고 OCP원칙을 끌어낼 수 있다는 것이다.
OCP : 개방 폐쇄 원칙 ( 확장에는 열려있으나 변경에는 닫혀있어야한다.)
사실 아직 협업에서 직접 뛰어 보지 않아서 DI의 효과가 직접 피부에 와닿지는 않은 탓에, 의존성을 대신 주입하는 게 그렇게 중요한 건가?? 왜?? 라는 의구심이 계속 들었다. 그래서 협업에서 일하는 개발자가 생각하는 DI가 궁금하여 구글링을 해보았다.
알아본 바에 의하면, DI는 의존 주입을 외부 설정에서 할 수 있게 해서 소스를 수정하지 않고도 의존 방법을 바꿀 수 있게 한다는 것이다. 프로그램은 소스에 의존하고 있기 때문에 소스가 바뀌면 프로그램이 바뀌고 프로그램이 바뀌면 배포를 다시 해야하고 배포를 다시 하기 위해서는 품질 검수를 다시 받아야 한다고 한다. 근데 이 복잡한 과정을 거칠 필요없이 DI를 통해 소스 한줄도 안바꾸고 해결하게 된것이다. 즉 , 만약에 현장에서 오라클 DB를 쓰다가 mysql로 바꿔도 소스 한줄 안바꿔도 된다는 것이다.
말만 들어도 완전완전 대박!
DI를 알아보다보면, IOC에 대한 내용도 연관지어서 많이 나왔다 .
IOC의 약자는 Inversion of Control 즉, 제어의 역전을 의미한다. 이것도 분명히 한글인데 이해가 안간다. 좀 더 풀이를 해보자면 코드의 흐름을 제어하는 주체가 바뀌는 것을 의미한다.
코드의 흐름은 오브젝트를 생성하는 것, 오브젝트의 생명주기를 관리하는 것, 메소드를 수행하는 것 등을 의미한다. 일반적인 프로그램은 이러한 행위를 하나부터 열까지 모두 스스로 수행한다. 하지만, IOC를 적용하면, 이러한 흐름 제어를 또다른 제 3자가 수행하게 된다. 즉, IOC는 객체 생명 관리, 흐름 제어를 제 3자인 Framwork에게 위임하는 프로그래밍 모델을 말한다. IOC는 디자인패턴에서도 찾아볼 수 있고 spring이외에 다른 컨테이너를 가진 프레임워크들에서도 찾아볼 수 있다. 범용적인 표현이라 할 수 있다.
DI는 IOC 프로그래밍 모델을 구현하는 방식 중에 하나이다. 의존 관계가 인터페이스에 의해서, 런타임시점에 컨테이너나 팩토리 등의 제3자로부터 의존관계를 주입 받으므로써 다이나믹하게 객체를 주입을 하여 유연한 프로그래밍을 가능하게 하는 패턴으로 좀 더 IOC보다 구첵적인 의미이다.
즉, Spring 에서는 IOC를 구체적으로 DI라는 방식을 통해서 의존성 역전 제어를 하고 있는 것이다.
IOC에 대해 좀더 내가 이해할 수 있게 하는 구체적인 예시를 프로젝트 상에서 찾아보았다. @Service @Controller 가 내 프로젝트 중 IoC 가 사용된 예중 하나라고 생각되었다. 해당 클래스가 어떤 역활을 하는지 어노테이션을 통해 개발자가 직접 주입하는 방법이기 때문이다