본문 바로가기

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

개발 프레임워크 만들기 대장정 22 - 샘플 프로젝트 및 Spring 컨테이너 이 예제는 Spring.NET 레퍼런스 문서의 QuickStart에서 설명되고 있는 예제중의 하나이다. 3.1.7절에 나와 있다. 이 예제를 통해서 설명할 주용 내용은 다음과 같다. ▶컨테이너에 객체들을 등록하는 설정 - 이게 무슨 말인지 기억나는가? Unity Application Block의 컨테이너 프레임워크에서와 유사 아니 동일한 개념의 작업이다. 물론 객체를 등록하는 설정 표현(syntax)은 다르다. ▶DI(dependencies Injection) 설정 - Unity Application Block의 setter injection, constructor injection을 기억하는가? ▶AOP 설정 - aspect(Cross concerns )를 메인 로직에 weaving(minxin)하는 .. 더보기
개발 프레임워크 만들기 대장정 21 - Aspect Oriented Programming 개념 I Aspect지향 프로그래밍! 프레임워크 입장에서는 아주 쓸모있고 중요한 개념이다. 개발자들의 코딩을 화~악 줄여줄 수 있고 또한 프로젝트가 진행하고 있는 도중에도 개발자들의 코드 수정없이 프레임워크단에서 갑의 요청 사항을 최대한 흡수해 줄 수 있는 완충 역할을 할 수 있는 방법이다. 그러나 얼른 와 닫지 않는 용어이다. Object Oriented Programming이라는 용어를 처음 들어을때도 이런 떨떠름한 기분이었을까 하는 생각이 든다. Object가 뭔지 정의를 정확히 내리라면 머뭇거리게 되지만, 그래도 우리는 이것에 대해 이해는 하고 있다. 문장의 주어 또는 목적어로 사용될 수 있는 "놈"들이다. "이 녀석의 어떤 메소드를 호출하면 ..." 또는 "저 녀석의 어떤 메소드를 호출해줘야 ~ 할 수 .. 더보기
개발 프레임워크 만들기 대장정 20 - Spring.NET::IoC 앞으로 포스트를 진행해가는 방법으로는 개념 설명과 그 개념에 필요한 샘플을 적절히 혼합해가는 방법을 사용하겠다. IoC, AOP처럼 새로 등장하는 개념들은 먼저 설명을 하겠다. 그리고 Spring.NET에서 제공하는 다른 유틸성 기능은 어떻게 사용하는지에 대한 샘플 코드로 바로 들어갈 것이다. 필요한 코드들은 sourceforge.net에서 제공하는 샘플들을 사용하도록 하겠다. 이번 포스트에서는 IoC에 대해서 먼저 알아볼 것이다. IoC? 어디서 많이 들어본 것 같은가? 국제 올림픽위원회 ? No ! Inversion of Control의 약자로서 "역제어" 정도로 해석될 수 있겠는데 영 어색하다. 의미는 이렇다. 기존의 프로그래밍에서는 객체 생성의 제어권을 개발자가 가졌다면 그 제어권이 이제 "반대측.. 더보기
개발 프레임워크 만들기 대장정 19 - Spring.NET 이제 다시 개발 프레임워크 얘기로 가 보도록 하겠다. 이제부터는 Spring.NET 프레임워크를 알아볼 것이다. 앞에까지는 Unity Application Block을 알아봤는데 사실 필자는 이것보다 Spring.NET 프레임워크에 대해서 먼저 들었다. 그러나 마음먹고 공부해본적은 없다. 알고 있는 것은 단지 오픈 소스 프로젝트라는 것 그리고 Spring이라는 이름으로 자바쪽에서 먼저 나왔고 Spring.NET 프레임워크는 자바 버전이 .NET쪽으로 포팅된 것이라는 것 정도이다. 며칠동안 틈나는 대로 Spring.NET 레퍼런스를 읽어보고 있다. www.springframework.net에 가보면 문서 및 관련 소스를 받아 볼 수 있다. 원서라서 속도가 나질 않아서 아직 다 읽어보지는 못했다. Unity.. 더보기
개발 프레임워크 만들기 대장정 18 - Unity 구조 정리 뭔가 아쉽다. 쉽게 쓰려고 했는데, 배가 산으로 가버린듯한 기분이다. 아직 Unity 컨테이너 구조가 어떻게 되었는지 머리에 들어오지 않는 사람이 있을 듯하다. 그래서 이번 포스트에서는 Unity 구조를 필자가 파악하고 있는 한도내에서 좀 간단히 정리하려고 한다. Unity 컨테이너에서는 프로그램적으로 모든 필요한 환경 설정을 할 수 있는 방법을 지원하지만 주로 설정을 위해서는 cofiguration을 이용한다. 다음 그림은 Unity 구성을 간단하게 표현해보았다. ■Config 타입 등록 그림의 좌측에는 config 설정이 있다. 프로그램이 실행되기 시작하면 이곳에 설정된 정보는 컨테이너로 등록된다. 등록이 완료되고 나면 컨테이너에 익스텐션도 몇개 그림처럼 확장되어 있을 것이다. 그림에 configur.. 더보기
개발 프레임워크 만들기 대장정 17 - Unity 컨테이너 확장예제 II부 지난 포스트에 계속 이어진다. 혹시 지난 포스트를 읽지 않았다면 먼저 체크해보고 이번 포스트를 읽어가길 바란다. 이번 포스트 다 써놓고 보니 무지 길다. 실시간으로 이해를 하면서 쓰는 글이다 보니 이 모양이다. 다시 읽어보고 싶지 않다. 쓰으...틀린곳 또는 이해가 되지 않은 부분 있다면 코멘트 부탁한다. ■ 예제 시나리오 이 예제에서는 두 개의 Unity 컨테이너를 생성한다. 하나는 표준 컨테이너 stdContainer이고 하나는 확장된 기능을 갖는 customContainer이다. stdContainer는 .NET 애플리케이션이 실행되면 자동으로 생성되는 기본 AppDomain으로 어셈블리를 로딩한다. 그리고 customContainer는 기본 AppDomain에서 별도의 AppDomain을 하나 더.. 더보기
개발 프레임워크 만들기 대장정 16 - Unity 컨테이너 확장예제 I부 이제 Unity 컨테이너를 확장하는 방법을 예제를 통해서 알아보자. 이 포스트에서는 어떻게 strategy를 작성하고 어떻게 객체 생성 과정에 끼워넣을 수 있는지를 알아본다. 그러면서 컨테이너 익스텐션에 대해서도 알아본다. 그러나 필자도 생업이 있는지라 예제를 구상하고 구현할 시간이 없다. 대신에 필자도 공부를 할 겸 훌륭하신 분들이 미리 만들어놓은 예제를 분석하는 수준에서 대신하려 한다. 물론 포스트를 그대로 번역만 하지는 않을 것이다. 필자가 필요한 대로 재구성해서 설명하겠다. 이것이 저작권 또는 지적 재산권 뭐 그런거 침해로 봐야 하는지는 모르겠다. 해외 아티클을 번역해주는 블로그도 많은데....만약 그 아티클을 내 생각대로 재해석해서 설명하면 그것은 법적으로 문제가 있나? 문제가 있을 수 있겠다... 더보기
개발 프레임워크 만들기 대장정 15- ObjectBuilder 계속 이번 포스트에서 Unity 컨테이너 확장에 대해서 포스팅을 할까 했는데 아무래도 ObjectBuilder에 대해서 좀 더 설명을 해야 할 것 같다. 코드를 보니까 바로 예제로 들어가기는 무리인듯 하다. 해서 ObjectBuilder가 객체를 생성하는 과정에 대해서 좀 더 자세히 알아보도록 하겠다. 다음은 바로 앞 포스트에서 보인 그림이다. 그림에서는 stage를 "Stage1", "Stage2"로 정의하고 있다. 그리고 각 stage별로 Strategy를 정의하고 있는데, 다음과 같다 : "Strategy1_1","Strategy1_2" 그리고 "Strategy2_1","Strategy2_2". ObjectBuilder의 Strategy는 IBuilderStrategy라는 인터페이스를 구현해야 한다. 이.. 더보기
개발 프레임워크 만들기 대장정 14- Unity 컨테이너 확장? ObjectBuilder ? 이제 Unity 컨테이너가 하는 일에 대해서 굵직한 것은 거의 모두 알아본 것이나 마찬가지다. 타입 매핑 정보를 등록하고 인스턴스를 얻는 API를 컨테이너가 제공해주고 있다는 것을 알았다. 설명하지 않은 API도 더 있긴 하지만. 그리고 config의 스키마에 대해서도 좀 더 자세히 알아봐야 한다. 그러나 구체적인 사항들에 대해서는 개념과 구조 설명을 먼저 마치고 뒤에 일괄적으로 정리해보도록 하겠다. 물론 장담은 못한다 -_-;; 시간이 없거나 힘들면 관련 웹 페이지에 대한 링크로 대신할 수도 있다. 내가 원하는 방법대로 하겠다. 내 블로그니까. 이번 포스트는 다음 링크의 문서들을 참조했다. 이 문서를 처음부터 읽어서 이해가 가는 독자라면 필자의 이번 포스트는 읽지 않아도 되겠다. ObjectBuilde.. 더보기
개발 프레임워크 만들기 대장정 13- Method Call Injection 앞의 Construction Injection과 Setter Property Injection 포스트를 읽었다면, Method Call Injection이라는 것도 메소드를 호출할때 메소드 파라미터를 ? Unity 컨테이너가? 하는 예상을 할 수도 있겠다. 그렇지 않은가? 아님 말고. ● InjectionMethod 어트리뷰트 InjectionMethod 어트리뷰트가 붙은 샘플 코드이다. public class MyObject { public IMyInterface depObjectA; public MyBaseClass depObjectB; [InjectionMethod] public void Initialize(IMyInterface interfaceObj, MyBaseClass baseObj) { d.. 더보기
개발 프레임워크 만들기 대장정 12- Property(setter) Injection 앞의 포스트에서 Unity 컨테이너가 사용하는 dependency injection중에서 constructor injection에 대해서 알아봤다. 이제 두번째로 Property Injection에 대해서 알아보자. ● Dependency 어트리뷰트 사용 property에 dependency injection 표시는 다음과 같다. public class MyObject { private SomeOtherObject _dependentObject; [Dependency] public SomeOtherObject DependentObject { get { return _dependentObject; } set { _dependentObject = value; } } } 코드처럼 Property에 Depend.. 더보기
개발 프레임워크 만들기 대장정 11- Contructor Injection 이전 포스트에서는 Unity 컨테이너는 자신에 등록된 타입들의 메소드(constructor, setter 속성, 일반 메소드)를 호출할때 "특별한 표시"가 있으면 dependency injection 메커니즘을 활성화 시킨다는 말을 했다. 그 특별한 표시는 어트리뷰트를 이용한다. 그 어트리뷰트는 메소드 타입 즉 constructor, setter 속성, 일반 메소드에 따라 다르다. 이제 이 포스트에서는 세개의 표시를 어떻게 하는지 그리고 그 표시들에 따라서 Unity 컨테이너는 어떻게 작동하는지 즉 dependency injection이 뭔지 좀 더 자세히 알아보자. ● Constructor Injection 표시 Constructor가 호출될때 DI 메커니즘을 활성시키는 방법에는 상황에 따라서 두가지가.. 더보기
개발 프레임워크 만들기 대장정 10- Dependency Injection 패턴 이번 포스트에서는 Unity Application Block에서 사용하고 있는 Dependency Injection 패턴에 대해서 알아본다. UAB에서 구현하고 있는 이 패턴에 대해서 잘 이해하면 프레임워크를 만들때 개발자가 해야 할 일을 프레임워크단에서 공통적으로 해결해 줄 수 있는 유연한 방법을 많이 찾을 수있을 것으로 보인다. 프로젝트가 한참 진행되는 도중이라면 새로운 고객의 요구사항을 수용하기가 참 힘들다. 고객은 단순히 메소드에 파라미터 하나만 더 추가해서 빌드하면 되지 않겠는냐는 식으로 간단히 말한다. 그러나 그 간단한 요구사항이 공통팀과 업무 개발자들에게는 쓰나미로 다가오는 경우가 있다. 이런 경우 Dependency Injection 패턴을 잘 활용하면 업무 개발자가 기존 코드의 수정을 하.. 더보기
개발 프레임워크 만들기 대장정 09- Config를 사용한 등록작업 지난 포스트에서 말한 것처럼 이번에는 타입을 시작 프로그램에서 프로그램적으로 컨테이너에 등록했던 작업을 이제 Config로 분리해내는 작업을 하겠다. Unity 컨테이너의 완전한 Config 스키마는 새로운 것이 나올때마다 하나씩 알아보는 것으로 하겠다. 왜냐고? 지금은 필자도 다 모른다는 것이 가장 큰 이유이고 그리고 모든 것을 지금 설명하는 것은 시기상조일것이라는 생각이다. 지난 포스트의 예제의 시작 프로그램의 코드를 다시 한번 더 보자. namespace FSLoggerConsole { class Program { static void Main(string[] args) { // 편의상 이전 로그 파일이 존재하면 삭제한다. 로그가 누적되면 테스트가 방해되잖아. if (System.IO.File.Ex.. 더보기
개발 프레임워크 만들기 대장정 08- 사용자 정보, 애플리케이션 컨텍스트 객체 추가하기 앞 포스트에서 UAB를 사용해서 개발 프레임워크 구조와 유사하게 로깅 프로그램을 구현했다. 프로젝트가 한참 진행되어 개발 진척도는 50%를 넘어가고 있다. 그런데 어느날 고객이 다음과 같이 무심코 내뱉는다. "현재 비즈니스 메소드를 호출할때 로그를 남기고 있는데, 로그로 사용자 아이디와 이름도 남기고 싶습니다". 업무 프로그램에서 고객 아이디와 이름만 로깅 메소드 Write()로 넘겨주면 되겠지하는 생각이 먼저 떠오르는가? 그럼 불쌍한 개발자는 다시 모든 프로그램을 수정해야 하는가? 그리고 다른 프로젝트에서는 사용자의 아이디, 이름뿐만 아니라 부서 정보도 남겨달라고 하면 어떻게 해야 하나. 그때는 프레임워크의 코드를 또 수정해야 하나? 두 번째 문제부터 해결해보자. 이를 위해서 필자는 사용자 정보 클래스.. 더보기
개발 프레임워크 만들기 대장정 07- Hello 프로그램 with UAB 오늘은 UAB(앞으로는 Unity Application Block을 이렇게 줄이겠다)용 Hello 프로그램을 만들어보고자 한다. 앞에서 계속 얘기했던 FSLogger를 구현해서 사이트별 확장 구조의 로깅 프로그램을 만들 것이다. 다음은 Visual Studio.NET의 개발 구조이다. 디렉토리 구조Hello 프로그램치고 너무 복잡한가? "프로레임워크 만들기 대장정"인만큼 Hello 프로그램 구조도 좀 그럴싸하게 만들어서 현장에서 사용하는 것과 유사하게 만들려고 했다. 그러나 뒤에서 코드를 보면 알겠지만 내용은 암것도 없다. 디렉토리 구조를 먼저 설명한다. 솔루션 폴더 "01 DabongFramework"이 개발 프레임워크 관련 프로젝트들을 포함시킬 부분이다. 뒤에 나올 사이트별 확장 프레임워크와 구분할 .. 더보기
개발 프레임워크 만들기 대장정 06- Unity 컨테이너 구조 이제 Unity 컨테이너를 좀 알아보도록 하자. Unity, Unity 컨테이너, Unity Application Block이라는 표현을 섞어서 사용하지만 모두 같은 개념으로 보면 된다. 사실 이런 프레임워크를 다 이해하지는 못해도 사용할 수는 있다는 것은 지금까지 SI 프로젝트에서의 경험을 통해서 보면 잘 알 것이다. 그러나 우리는 프레임워크를 이해하고 만들려는 사람들이다. 따라서 이 구조를 이해할 필요가 있고 결국에는 그 구조를 바탕으로 해서 나름의 생각대로 설계할 수 있길 바란다. 아직 필자도 이 블럭을 모두 살펴본 것은 아니다. 사실은 지금까지의 경험에 의해 아마 그럴 것이다라는 추정을 가지고 확인해가면서 글을 쓰고 있다. -_-;; Unity Application Block을 설치하면 함께 생기.. 더보기
개발 프레임워크 만들기 대장정 05- Unity 컨테이너 소개 이제 Unity Application Block의 Unity에 대해서 알아보도록 하자. 앞에서 설명했던 예제로 다시 돌아가보자. 프레임워크에서는 단지 인터페이스 변수 logger만을 바라보면 되고, 실제 객체에 대한 타입은 외부에서 제공한다고 했다. config 파일을 통해서 제공할 수도 있을 것이고 API를 통해서 프로그램적으로 제공할 수도 있다. 제공된 실제 로거에 대한 타입 정보를 받아서 인스턴스를 생성하는 것은 Unity가 담당한다고 했다. 참고로 Unity가 실제 로거 객체를 생성하는 것에 대해서 잠깐 이야기 하자. Unity가 실제 로거 객체를 생성하는 방법은 new를 사용하는 일반 객체 생성 방법과 조금 다르다. Unity { ... A a = new A(); .... a.Logger = n.. 더보기
개발 프레임워크 만들기 대장정 04- 인터페이스 vs 클래스 더 진행하기 전에 인터페이스와 베이스 클래스의 차이점을 함 생각해보도록 하자. 객체 지향 설계에 익숙하지 않는 개발자는 타입을 설계할때 인터페이스를 사용해야 할지 아니면 클래스를 사용해야 할지를 구분하지 못한다. 이곳에서 나름대로의 기준을 정리해보고자 한다. 상속을 좀 더 자세히 살펴보자. 그럼 상속에는 성격이 좀 다른 상속들이 존재하는 것을 알 수 있다. 어떤 경우는 데이터를 중심으로 해서 상속관계를 생각하는 경우가 있다. 이 경우는 "객체가 내부적으로 어떻게 동작하는가"에 포커스를 두는 것이다. 부모 객체는 자식에 공통적인 데이터를 가지고 있도록 하고 자식 타입에서 자신만의 특별한 데이터를 추가하도록 설계한다면 바로 데이터를 중심의 상속을 설계하고 있는것이다. 그러나 어떤 경우는 기능 중심으로 해서 .. 더보기
개발 프레임워크 만들기 대장정 03- 인터페이스, 상속, 가상 메소드 Unity Applicaion Block에서는 컨테이너라는 개념을 사용하고 있다. 그 컨테이너를 Unity라고 부르고 있다. 컨테이너라는 것이 무엇을 담고(contain), 그것이 뭘 하는지를 생각해보자. 그러나 그 이전에 잠시 다른 문제에 시간을 할애해야 할 것 같다. 처음에는 바로 컨테이너 개념 설명으로 가려 했으나 이것을 설명하기 전에 인터페이스, 베이스 클래스 그리고 상속을 먼저 생각해봐야 할 것 같다. 앞의 포스트에서 확장성 얘기를 하면서 로깅 예를 들었다. 로깅 저장소가 어디냐에 따라서 로깅하는 로직 구현은 달라질 것이다. 데이터베이스에 로깅하는 넘은 DBLogger라고 하고 파일 시스템에 로깅을 하는 넘을 FSLogger라고 이름을 붙이자. DBLogger는 데이터베이스를 연결해서 그곳에 i.. 더보기