본문 바로가기

IT 살이/04. 기술 - 프로그래밍

개발 프레임워크 만들기 대장정 05- Unity 컨테이너 소개

이제 Unity Application Block의 Unity에 대해서 알아보도록 하자. 앞에서 설명했던 예제로 다시 돌아가보자. 프레임워크에서는 단지 인터페이스 변수 logger만을 바라보면 되고, 실제 객체에 대한 타입은 외부에서 제공한다고 했다. config 파일을 통해서 제공할 수도 있을 것이고 API를 통해서 프로그램적으로 제공할 수도 있다. 제공된 실제 로거에 대한 타입 정보를 받아서 인스턴스를 생성하는 것은 Unity가 담당한다고 했다. 

 

참고로 Unity가 실제 로거 객체를 생성하는 것에 대해서 잠깐 이야기 하자. Unity가 실제 로거 객체를 생성하는 방법은 new를 사용하는 일반 객체 생성 방법과 조금 다르다.

Unity
{
    ...
    A a = new A();
    ....
    a.Logger = new FSLogger(); //이건 아니다.
}

대신에 동적으로 인스턴스를 생성하는 방법을 사용한다. new사용하는 정적인 방법은 역시 추후 DBLogger로 설정되는 경우 Unity 코드를 수정해야 한다. new를 사용하게 되면 일종의 하드 코딩이 되는 것이다. 대신에 System.Activator 클래스의 다음과 같은 메소드를 사용해서 동적인 방법으로 인스턴스를 생성하게되면 Unity와 실제 객체 타입과는 어떤 종속 관계도 생성되지 않는다.

Unity
{
    ...
    A a = new A();
    ....
    a.Logger = System.Activator.CreateInstance( concreteLoggerType );
    ...
}

concreteLoggerType 변수는 System.Type객체로서 이것은 config 파일등에 설정한 실제 로거 타입에 대한 문자열을 받아서도 생성할 수 있다. 즉 직접적인 실제 로거 타입과의 종속성은 없어지는 것이다. 이 포스트에서 말하는 "실제 객체에 대한 타입 정보"란 이런 것을 말한다.

 

앞의 두 포스트에서부터 지금까지 필자가 이야기한 것을 정리하면 다음과 같다.

  • 지금까지 타입과 그 타입의 인스턴스(객체)에 대한 구분없이 코딩을 했다면 개발 프레임워크를 공부하는 지금부터는 이것을 분리해서 생각해야 한다.
  • 개발 프레임워크에서 바라보는 것은 인터페이스 또는 베이스 클래스 객체이다.
  • 인터페이스와 베이스 클래스에 대한 실제 객체에 대한 타입 정보는 현장 프로젝트별로 제공해야 한다.

 

Unity에는 프레임워크에서 바라보는 베이스 타입(인터페이스와 베이스 클래스) 과 그것에 대한 실제 구현 타입에 대한 매핑(mapping) 정보를 가지고 있다. 중요한 개념이 나왔다. 매핑 정보 !! 뭣과 뭣에 대한 매핑인지 확인하고 가야 한다. 베이스 타입과 실제 구현 타입과의 매핑 정보!!

 

 

Unity 컨테이너에는 그림처럼 베이스 타입(base type)에 대한 정보와 프로젝트별로 다르게 구현한 실제 타입(concrete type )에 매핑 정보를 가지고 있는 컬렉션이 존재한다. 그래서 프레임워크에서 ILogger 인스턴스를 원하면 실제로는 FSLoggrer 인스턴스를 생성(동적 생성)해서 반환해준다.

 

Unity 컨테이너에서 관리하는 정보중에서 매핑 정보가 중요한 정보이기는 하지만 이것만 관리하는 것은 아니다. Unity 컨테이너에는 애플리케이션 전체 도메인에 영향을 줄 수 있는 전역적인 정보들이 저장되고 또한 뿐만 아니라 애플리케이션의 어디에서든지 요청할 수 있는 서비스 존재하는 부분이다. 다음 포스트에서는 Unity Application Block의 내부 컨테이너 구조를 알아보도록 하자.

 

아직까지는 뜬 구름 잡는 심정일 것이다. 원래 객체 지향 설계라는 것이 설계과정에서는 그렇다. 다음 포스트도 구릅잡기이다. 확실한 코드가 그립겠지만 지금은 제공해 줄 수가 없다. 만약 너무 그립다면 인터넷에서 Unity Application Block을 검색해서 다운로드 받아보길 바란다. 거기에 훌륭한 샘플 코드가 있다. 그러나 지금 상태로라면 별로 보고 싶지 않을 것이다. 머리속에 아키텍쳐가 없는 상태에서 코드만으로는 따라 가기가 벅차다. 특히 상속 관계가 많은 코드일 수록 Visual Studio.NET의 "정의로 이동하기"로 따라가는 것은 한계가 있다. 정의로 이동하면 베이스 타입으로 가버린다. 알고 싶은 것은 실제 구현 내용인데. 코드를 지금 혼자서 보기 힘들다면 좀 기다려보자. 지금은 어떤 예제를 설명해야 할지는 모르겠지만, 정상 코스라면 코드를 설명하는 부분이 언젠가는 있지 않겠는가.