2013년 11월 18일 월요일

제어의 역전 ( Inversion of Control, IoC )

객체에서 클라이언트란?

A 객체가 B 객체를 사용할 때, A는 B의 Client 이다.


제어의 역전

사용하고자 하는 오브젝트의 생성과 선택에 대해서 클라이언트가 능동적으로 직접 관여하는 게 전통적인 방식의 프로그래밍 모델이다. 제어의 역전은 클라이언트가 자신이 사용할 오브젝트를 스스로 생성하고 선택하지 않는다. 이 오브젝트의 생성과 제어의 흐름을 담당하는 대상에게 위임한다. 즉, 각각의 모듈들과 그들의 생성과 사용에 대한 제어를 담당하는 대상을 별도로 분리하는 것이 핵심인 프로그래밍 모델이다.

제어의 역전이 사용된 예는 다양하다. 가장 간단한 예로는 디자인 패턴에서 이야기하는 Template Method Pattern 이 될 수 있다. 상위 클래스에서는 제어의 흐름을 담당하고, 하위 클래스에서 실제적으로 구현과 확장을 함으로서 제어의 역전을 경험할 수 있다.

또 다른 예로는 특정 객체의 생성과 그 객체가 사용할 알고리즘(전략)을 결정하는 오브젝트 팩토리를 만드는 것이다. 생성이 되는 객체의 입장에서는 자신이 어떻게 생성이 되는지, 자신이 사용할 전략이 무엇이지 알지 못하고 알 필요도 없다. 이것에 대한 제어는 오브젝트 팩토리 객체가 가지는 것이다.

이 개념을 좀 더 확장해서 프레임워크와 애플리케이션 코드의(또는 비지니스 로직) 관점에서 생각해 볼 수 있다. 이일민님이 쓴 토비의 스프링3 책에서는 이 개념을 이렇게 설명하고 있다.
프레임워크도 제어의 역전 개념이 적용된 대표적인 기술이다. 프레임워크는 라이브러리의 다른 이름이 아니다. 프레임워크는 단지 미리 만들어둔 반제품이나, 확장해서 사용할 수 있도록 준비된 추상 라이브러리의 집합이 아니다. 프레임워크가 어떤 것인지 이해하려면 라이브러리와 프레임워크가 어떻게 다른지 알아야 한다. 라이브러리를 사용하는 애플리케이션 코드는 사용자의 흐름을 직접 제어한다. 단지 동작하는 도중에 필요한 기능이 있을 때, 라이브러리를 능동적으로 사용할 뿐이다. 반면에 프레임워크는 애플리케이션 코드가 프레임워크에 의해 사용된다. 보통 프레임워크 위에 개발한 클래스를 등록해두고, 프레임워크가 흐름을 주도하는 중에 개발자가 만든 애플리케이션 코드가 사용된다. 보통 프레임워크 위에 개발한 클래스를 등록해두고, 프레임워크가 흐름을 주도하는 중에 개발자가 만드는 애플리케이션 코드를 사용하는 방식이다. 최근에는 툴깃, 엔진 라이브러리 등도 유행을 따라서 무작정 프레임워크라고 부르기도 하는데 이는 잘못된 것이다. 프레임워크에는 분명한 제어의 역전 개념이 적용되어 있어야 한다. 애플리케이션 코드는 프레임워크가 짜놓은 틀에서 수동적으로 동작해야 한다.
프레임워크 전체적인 틀위에 필요한 애플리케이션 코드들이 만들어지고, 이것들은 프레임워크에서 정의된 제어 흐름속에서 사용되는 것이다.

참고자료

  • 토비의 스프링, 
  • UML 실전에서는 이것만 쓴다(UML for Java Programmers), 
  • 소프트웨어 개발의 지혜(Agile Software Development : Principles, Patterns, and Practices)





댓글 없음:

댓글 쓰기