KSUG에서 DI 번역 얘기를 하다가 DI라는 용어를 처음 만든 사람이 생각했던 dependency의 의미를 한번 살펴봤다. KSUG메일링리스트에 썼던 글을 옮겨 놓는다.

원 글은 http://groups.google.com/group/ksug/browse_thread/thread/efb8cb41a9fc43e1

그 이전에 논의 했던 DI번역에 관한 것은 http://groups.google.com/group/ksug/browse_thread/thread/bfd8580df8971303/166b8a987d1daf9c#166b8a987d1daf9c

——————————————————————————–

이전의 DI 용어 번역 논의에서 한 부분을 차지했던 dependency에 대해서 좀 더 생각해보고 싶습니다.
Dependency Injection이라는 용어를 처음 만들어서 제안했던 사람은 Martin Fowler입니다. 스프링이 사용한 방식을
IoC라는 너무 느슨하고 일반적인 용어로 부르는 것보다는 그 특성을 잘 나타낸 구체적인 용어를 사용하는 것이 좋겠다고 생각해서 제안한
것이죠.

그의 IoC/DI 소개 글은 매우 유명합니다. 스프링 레퍼런스 문서에서도 IoC개념을 위해서 1.0 문서 때부터 이 문서를 읽도록
권장하고 있습니다.
http://www.martinfowler.com/articles/injection.html

이 글에 나타난 dependency에 대한 설명을 좀 살펴볼 필요가 있습니다.

I’m going to start by talking about the various forms of dependency njection, but I’ll point out now that that’s not the only way of emoving the dependency from the application class to the plugin mplementation

이 글에 나타난 dependency에 대한 설명을 좀 살펴볼 필요가 있습니다. DI에 대해서 먼저 설명한다고 하면서 그것이 애플리케이션
클래스에서 dependency를 제거하는 유일한 방법은 아니다라고 이야하기 하고 있습니다.  DL(service locator)도 있다는
설명을 위한 것인데, 아무튼 여기서 관건은 DI란 application class에서 dependency를 제거하는 방법의 일종이라는
것입니다.

좀 더 구체적인 설명을 보죠.

The key benefit of a Dependency Injector is that it removes the dependency that the MovieLister class has on the concrete MovieFinder implementation

예제에 나온 MovieLister -> MovieFinder(interface) -> MovieFinderImpl 관계를 가지고
설명하기를 DI의 장점은 dependency를 제거하는 것인데, dependency란 MovieList클래스가
MovieFinderImpl 클래스에 대해서 가지고 있는 것
이라고 되어 있습니다.

내용은 쉽습니다. MovieList가 MovieFinder라는 인터페이스에만 의존하고 있어야지, MovieFinderImpl에 의존하고
있으면 안된다는 것이고, 그 것을 완벽하게 제거하기 위해서는 인터페이스를 도입할 뿐더러, 그 DI를 통해서 외부에서 dependency를
주입해주도록 해야 한다는 것입니다.

자 그럼 여기서 제거 된다는 dependency란 무엇일까요? 그것은 MovieLister안에 가지고 있는 구체적인 클래스에 대한 모든
정보를 말합니다. 그 정보를 가지고 있기 때문에 발생하는 모델링 타임의 의존관계(dependency relationship) 또는
의존하고 있는 성질(?)이라고 추상적으로 말할 수 있는 의존성(dependency)입니다.

적어도 여기서 볼때 dependency란 런타임시에 컨테이너가 집어넣어주는 dependent object가 아님을 분명히 알 수
있습니다.
오히려 그것은 모델링 타임시 코드레벨에서 가지고 있을 수 있는 의존관계(UML에서 쓰는 용어이죠)를 가리킨다는 것이라고 볼 수 있습니다.
코드에서는 제거해주고 대신 IoC/DI컨테이너가 대신 부여(주입)해준다는 것이죠.

즉, MovieLister 코드에 나타날 수 있는 특정 클래스에 대한 의존관계(또는 의존성)을 외부로 제거하는 것이 DI라는
설명입니다.

물론 나중에 DI 방식의 컨테이너가 해주는 일은 구체적로 런타임시 의존객체를 전달해주어서 그것과 런타임 의존관계를 만들어주는 것입니다.
구현 메카니즘으로 보면 dependent object injection이라고 할 수 있지만, 그 개념을 보자면 코드레벨에서 구체클래스에
의존관계를 가지지 않도록 해주는 것이 DI 라는 것입니다.

그래서 DI라는 용어를 처음 고안한 Martin Fowler의 아이디어에 따르면

DI에서 dependency를 의존객체라고 보는 것은 적절치 않습니다.
대신 코드 레벨에서 제거했지만, 런타임시에 가지게 해주는 의존관계 또는 의존성으로 보는 것이 좋습니다.

http://publib.boulder.ibm.com/infocenter/radhelp/v6r0m1/index.jsp?top…
에서 볼 수 있 듯이, 한쪽 클래스가 다른 클래스에 의존하고 있는 것을 UML에서는 dependnecy relationship이라고
표현합니다.
위의 설명에서 제거한다는 dependency란 바로 그것을 말하고 있고(have dependency on a class), 그런면에서
의존관계라고 이해하는 것이 DI 개념을 가장 잘 설명한 dependency의 해석이라고 봅니다.

물론 DI에서 dependency의 뜻이 그렇다는 것이지, 그래서 용어번역도 그래야 맞다고 주장할 생각은 없습니다. 번역이란 또 다른 이유와 목적을 위해서 원개념과 다른 대안번역어를 가질 수 있기 때문이니까요.

그래도 의존객체는 쫌 그렇네요. 상위 개념을 너무 로우레벨의 실현방법으로 대치시켜버린 듯한 느낌이

Related posts:

  1. DI의 본질 – 다이나믹 (타입) 언어는 Dependency Injection이 필요없는가?
  2. Code Organization & Cyclic Dependency Problem
  3. Dependecy Injection에는 Prototype Scope가 없다
  4. Dependency Injection 표준화?
  5. EJB3의 Dependency Injection
  6. JSR-330 Dependency Injection for Java 최종 승인
  7. 마이크로 DI(dependency injection)
  8. Spring 3.0 (42) Spring Dependency Matrix 업데이트
  9. Spring 3.0 (7) Spring 3.0 Dependency Matrix
  10. Spring 3.0 (53) Spring Dependency Matrix 업데이트
  11. Maven 재도전기 (1)

Facebook comments:

to “Dependency Injection의 Dependency란 무엇인가?”

  1. thanks for share!

  2. thank you for share!

  3. thank you for share!

  4. thank you for share!

Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

© 2017 Toby's Epril Suffusion theme by Sayontan Sinha