본문 바로가기

전체 글

개발 프레임워크 만들기 대장정 33 - Spring.NET의 Result Mapping ▶ Result Mapping 이란. Result Mapping ! 이것이 뭐냐면 "애플리케이션의 흐름"을 제어하는 방법중의 하나다. 애플리케이션 흐름? Response.Redirect, Server.Transfer 등이 바로 애플리케이션의 흐름을 제어하는 메소드들이다. 여기서 말하는 애플리케이션의 흐름은 페이지의 수행 결과에 따라서 이 페이지 저 페이지로 리다이렉트되는 것을 말하고 있다. Spring.NET에서는 이렇게 결과에 따라서 적절한 페이지로 리다이렉트될 수 있도록 사전에 매핑을 설정할 수 있는 방법이 있다. 페이지 수행 결과 리다이렉트될 대상 페이지 "SUCCESS" OK.aspx "FAIL" Sorry.aspx Spring.NET에서는 이런 설정을 configuration에 포함시킬 수 있다.. 더보기
개발 프레임워크 만들기 대장정 32 - Spring.NET의 MVC 패턴 지원 이번에는 UI 프레임워크에 대해서 알아보도록 하겠다. 여기서 말하는 UI 프레임워크란 Spring.NET이 지원하고 있는 MVC 패턴을 말한다. 패턴을 공부하다보면 주로 제일 먼저 나오는 패턴중의 하나이다. 달봉이도 자바쪽 프로그래밍에 대해서는 잘 모르지만 이야기를 들어보면 자바쪽 웹 프로그램쪽에서는 MVC 패턴에 기반한 프로그래밍이 예전부터 이뤄지고 있다고 한다. 그래서 많은 개발자가 처음 프로그래밍을 배우면서부터 자연스럽게 이 패턴에 익숙해진다는 것이다. 우선 많은 사람들이 MVC 패턴에 대해서 들어봤겠지만 한번 더 간단히 정리해보고 가자. 상세히는 하지 않겠다. 왜? 말빨을 지원해줄만한 지식이 딸린다. 일단 많이 본 그림을 다시 보자. 패턴 공부를 시작한 사람들이라면 많이 봤을 그림이다. 그렇지만 .. 더보기
개발 프레임워크 만들기 대장정 31 - Spring.NET의 데이터 액세스 III 지난 포스트에서 말한대로 이번에는 Spring.NET에서 지원하는 OR매핑( Object Relational Mapping) 기능에대해서 알아본다. AdoTemplate의 Execute류의 메소드를 이용하면 CRUD 모두가 가능하다. 그러나 조회의 경우 Spring.NET의 데이터 접근 모듈에서는 좀 더 특별한 API를 제공한다. 지금까지의 개발 방식에서는 보통 조회를 하면 DataSet으로 넘어오고 이것을 그대로 Biz 레이어, UI 레이어로 넘겨서 레코드별로 루프를 돌면서 필요한 데이터를 꺼내서 작업을 했었다. 그러나 Spring.NET에서는 조회된 각 레코드를 사용자 정의 객체와 매핑시킬 수 있는 기회를 제공하고 있다. 예를 들어 여러 건의 사용자 정보 레코드가 조회되었을 경우 하나의 레코드는 하나.. 더보기
개발 프레임워크 만들기 대장정 30 - Spring.NET의 데이터 액세스 II 앞에서 AdoTemplate을 이용하는 코딩 구조를 알아봤다. 이 포스트에서는 AdoTemplate를 이용해서 DB 데이터에 액세스하는 코드를 살펴본다. Dao 객체, AdoTemplate의 Execute를 호출하기, 이 호출시 콜백 객체( ICommandCallback 객체 또는 CommandDelegate 객체)를 넘겨주기, 콜백객체에서 AdoTemplate에서 넘겨준 command 객체를 이용해서 DB에 접근하기 등의 과정을 염두에 두면서 코드를 따라가 보자. 레이어관점에서 봤을때 DAO객체나 콜백객체 그리고 Spring.NET의 AdoTemplate는 모두 데이터 액세스 레이어에 속하는 객체들이다. ▶ AdoTemplate를 이용하는 샘플 코드 AdoTemplate를 이용할때 개발자가 개발해야 하.. 더보기
개발 프레임워크 만들기 대장정 29 - Spring.NET의 데이터 액세스 I 일반적인 기업형 애플리케이션은 대부분 N티어 구조를 갖는다. 다음 그림은 간단한 N티어 애플리케이션을 표현하고 있다. 참고로 티어는 물리적인 의미이고 레이어는 논리적인 의미라고 한다. 물리적으로 UI 레이어는 웹 애플리케이션의 경우는 웹 서버 그리고 윈폼 애플리케이션은 클라이언트 PC가 될 것이다. 그리고 서비스 레이어와 데이터 액세스 레이어는 보통 하나의 미들티어 서버에 존재한다. 물론 더 복잡한 물리적 구조로도 존재할 수 있다. Spring.NET의 IoC 컨테이너는 UI 애플리케이션 서버(PC)에서도 적용가능하고 미들티어 서버에서도 적용가능하다. 앞 포스트까지는 UI를 제공하는 웹 서버/사용자 PC 또는 미들티어 서버에서 실행될 수 있는 IoC 컨테이너에 대한 얘기를 했다. 그리고 UI 서버와 비즈.. 더보기
개발 프레임워크 만들기 대장정 28 - Spring.NET의 Web Services 지원 Spring.NET IoC 컨테이너나 Spring.NET이 지원하고 있는 AOP 프로그래밍에 대해서 아직 해야할 얘기는 남아있다. 객체 타입 즉 singleton, prototype으로 설정하는 방법 및 객체의 생명주기에 대한 얘기, Attribute를 이용해서 AOP를 구현하는 방식등등. 필요한 얘기이기는 하지만 나중에 하기로 하자. 우선 전체적인 애플리케이션을 구성하는 구성 기술들을 Spring.NET이 어떻게 지원하는지를 알아본다. ■ Spring.NET 웹 서비스 구조 먼저 Spring.NET이 .NET의 Web Services를 어떻게 보완, 지원해주는지 알아보자. Visual Studio.NET 또는 WSDL 커맨드 툴을 이용해서 클라이언트측 프락시를 만들어서 웹 서비스를 사용했던 기존의 구조.. 더보기
개발 프레임워크 만들기 대장정 27 - Spring.NET의 advice 종류와 적용 ■ advice 종류 ▶ around advice 앞에서 알아본 CommonLoggingAroundAdvice 타입은 around advce중의 하나였다. 즉 인터페이스 IMethodInterceptor를 상속해서 Invoke() 메소드를 구현하고 있다. 아래는 IMethodInterceptor의 정의이다. namespace AopAlliance.Intercept { public interface IMethodInterceptor : ... { object Invoke(IMethodInvocation invocation); } } 이 메소드의 인자로 넘어오는 invocation은 인터셉트된 타겟 객체에 대한 호출을 나타낸다. 이 인자의 Proceed() 메소드를 호출하면 인터셉트되어서 중단된 타겟 메소드.. 더보기
개발 프레임워크 만들기 대장정 26 - AOP 적용 예제 II 다음은 AOP를 적용하기 위한 설정으로서 앞 포스트에서 보여준 Spring.Calculator.Web.2005 의 web.config의 일부분이다.\par ??\par ??\par ??\tab \par ??\par ??\par ??\par ??\par ??\par ??\par ??\tab \par ??\tab \par ??\tab \tab \par ??\tab \tab \tab \cf0 CommonLoggingAroundAdvice\cf2 \par ??\tab \tab \par ??\tab \par ??\par ??} --> CommonLoggingAroundAdvice 이 설정은 타겟 객체 AdvancedCalculator의 모든 메소드에 대해서 설정된 advice 로직이 적용된다고 했다. 오늘은 타겟.. 더보기
개발 프레임워크 만들기 대장정 25 - AOP 적용 예제 I ■ 예제 설명 앞에서 본 샘플 프로젝트 솔루션의 구조이다. Spring.Calculator.Web 프로젝트를 실행시켜보면 다음과 같은 결과 페이지가 보인다. 첫번째 링크는 단순한 웹 서비스 메소드를 호출하고 있다. AOP가 적용된 메소드를 호출하기 위해서는 두번째 링크를 클릭해야 한다. 이번 포스트에서는 두번째 링크에 대한 웹 서비스를 AOP 예제로 삼겠다. 두번째 링크를 클릭하면 다음과 같은 웹 서비스 테스트 화면이 나온다. 노출된 메소드중에서 Add 메소드를 클릭해서 적절히 값을 넣고 호출한다. 이 메소드를 호출하고 나서 남는 로그는 다음과 같다. 2008-08-18 23:09:34,406 [DEBUG] Spring.Aspects.Logging.CommonLoggingAroundAdvice - Int.. 더보기
개발 프레임워크 만들기 대장정 24 - Aspect Oriented Programming 개념 II 바로 예제 설명으로 들어가려 했으나 아무래도 AOP 개념에 대해 좀 더 설명이 필요할 것 같다. Aspect Oriented Programming하면 떠올라야 하는 개념은 "타겟 객체에 대한 호출을 중간에서 인터셉트할 수 있는 방법"이라는 것이다. 개발 프레임워크 입장에서 생각해본다면 얼마나 근사한 구조인가. 타겟 객체( 개발자가 개발)에 대한 모든 호출( 개발자가 만든 코드에서의 호출)을 개발 프레임워크에서 캐취할 수 있다는 것은 많은 장점을 가지고 있다. 그리고 실제로 AOP를 구현하기 위해서 개발자가 AOP의 컨셉을 모두 개발할 필요는 없다. advice는 개발자가 C#문법을 이용해서 일반 객체를 정의하듯이 구현하면 된다. 그러나 advice나 pointcut 자체는 Spring.NET의 IoC 컨.. 더보기
개발 프레임워크 만들기 대장정 23 - DI( Dependencies Injection ) 설정 IoC( Inverse of Control 제어권의 역전, 역제어)와 DI( Dependencies Injection)은 같은 의미로 사용된다. 시간적으로 보면 IoC라는 용어가 먼저 나왔고 뒤에 Martin Fowler라는 사람이 개념상 더 적절하지 않냐면서 내놓은 것이 DI다. 필자의 눈에는 차이점을 잘 모르겠고, 개발자에게는 당장 별로 중요한 차이는 아닐듯하다. 컨테이너가 객체를 생성할때 그 객체가 필요로 하는 의존 객체들을 자동 생성해서 할당해준다는 것이다. 컨테이너가 (대상)객체들을 생성할때 의존객체들을 할당해주기 위해서는 대상객체는 의존 객체들을 외부에서 받아들일 수 있는 public 입구(?)가 있어야 한다. 그래야 컨테이너가 대상 객체를 생성해서 공개된 입구로 객체를 할당해 줄 수 있다. .. 더보기
개발 프레임워크 만들기 대장정 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.. 더보기