본문 바로가기

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

개발 프레임워크 만들기 대장정 39 - 화면 객체 생성 이전 포스트에서는 Spring.NET에서 제공하는 XmlObjectFactory를 이용해서 화면 객체에 대한 정보를 로딩하는 작업을 했다. 이번 포스트에서는 XmlObjectFactory( Spring.NET 컨테이너 )에 화면 객체를 요구하는 작업을 하겠다. 아래 그림의 붉은 색 부분이 오늘 포스트의 주제이다. 컨테이너에 객체를 요구할때는 GetObject(“객체ID”)를 호출해서 그 참조를 얻을 수 있다. dalbong2ObjectFactory.GetObject("01"); 이 메소드 내부 소스를 분석해보면 이전 포스트에서 로딩한 객체 정보를 이용해서 해당 어셈블리를 로딩한 후 그 어셈블리를 통해서 동적으로 객체를 생성해낸다. 문제는 그 어셈블리를 어디에서 로딩하느냐이다. 기본적으로 Spring.NE.. 더보기
개발 프레임워크 만들기 대장정 38 - 화면 정보 로딩 달봉이는 프리젠테이션 레이어를 WPF로 구현할 것이다. ClickOnce로 배포되는 스마트클라이언트 애플리케이션을 염두에 두고 있다. 우선 사용자가 보게 될 시스템의 최종 실행 모습을 미리 보도록 하자. WPF용 애플리케이션을 만들겠지만, 아직 이것으로 만들어진 녀석이 없으니 우선 기존의 Window Form으로 만들어진 녀석을 보자. 사용자가 로그인을 하게 되면 제일 먼저 이런 유사한 화면을 보게 될 것이다. 업무 개발자가 담당할 부분이 가운데 있고, UI 컨테이너가 업무 화면을 둘러싸고 있다. 애플리케이션을 시작하면 UI 컨테이너의 상단과 좌측단에 메뉴가 로딩되고, 메뉴를 클릭하면 업무화면이 동적으로 생성되어 가운데 부분에 출력된다. UI 컨테이너 UI 컨테이너라 함은 말 그대로 Visual을 갖는 .. 더보기
WPF UserControl 베이스 클래스 만들기 Spring.NET의 컨테이너를 UI단에 적용하는 작업은 끝났다. 근데 정리할 시간이 없다. 7월부터 시작하는 UI단 프레임워크 개발 작업이 있다. 이것을 준비해야 하는 관계로 WPF를 좀 더 공부해야 한다. 그래서 정리 순서를 바꾸도록 했다. Spring.NET 컨테이너의 UI단 적용은 다음에 정리해야 할 것 같다. 흔히 기업용 애플리케이션을 제작할때는 윈폼 클래스 또는 사용자 정의 클래스들의 베이스 클래스를 만든다. 그래서 그곳에서 사용자 정보, 권한 정보들을 캐싱해 둔다. 현장의 개발자들은 그것을 상속해서 화면을 만든다. 달봉이도 이런 시나리오를 염두에 두고 WPF에서 제공하는 UserControl의 베이스를 하나 만들려고 했었다. 윈폼 시절의 UserControl을 생각해서 쉽게 될 줄 알았다. .. 더보기
개발 프레임워크 만들기 대장정 37 - POC 애플리케이션 - 개발구조 이미 Spring.NET이 기업형 애플리케이션에 적용되고 있다는 얘기도 가끔 듣고 있다. 그러나 달봉이가 직접 POC( Proof Of Concept) 애플리케이션을 하나 만들어서 Spring.NET이 기업에 어떻게 적용될 수 있는지 나름대로 검토를 해 보고자 한다. 달봉이가 만들 애플리케이션은 흔히 현장에서 사용하고 있는 3 티어 구조를 고려한다. 그리고 사용될 주요 기술은 다음과 같다. UI 레이어 WPF 기반, Spring.NET 컨테이너 통신 방법 Spring.NET 지원의 WCF 비즈니스 레이어 트랜잭션 관리 Spring.NET의 TxScopePlatformTransactionManager Spring.NET 컨테이너 데이터접근 Spring.NET의 DAO ( 그때의 기분이 동하면 NHibern.. 더보기
개발 프레임워크 만들기 대장정 36 - 개발 프레임워크 보안 설계 아직 Spring.NET의 구체적인 API 및 설정 방법 등에 대해서는 모두는 알아보지 않았다. 그러나 사용 컨셉은 알게 되었다. 따라서 최소한 달봉이 머릿속에는 기업용 개발 프레임워크를 만들기 위해서 어떻게 사용해야 하는지는 레이어별로 가닥이 잡힌 듯 하다. 혹시 Spring.NET을 어떻게 사용할까 또는 이것을 이용해서 기업용 개발 프레임워크를 직접 만들 수 있지 않을까 하는 기대를 가지고 이 글을 읽고 있는 독자들이 있다면 달봉이와 같은 마음이길 바란다. 그러나 아직 그렇지 않더라도 실망할 필요는 없을 듯 하다. 사실 달봉이는 몇개의 프레임워크 다뤄본 경험이 있다. 그래서 그것을 염두에 두고 글을 쓰고 있기에 기존의 기업용 개발 프레임워크에서 필요로 하는 요구사항들을 어느 정도는 알고 있다. 그래서.. 더보기
개발 프레임워크 만들기 대장정 35 - Spring.NET 트랜잭션 관리 정리가 힘들었던 포스트였다. AOP에 대한 부분을 연수 전에 작성한 것이라 리마인드를 위해서 그것까지 다시 읽어야했고 읽다 보니 그곳에서도 수정해야 할 부분도 있었다. 어떻게 정리해야 하나 고민이 많았던 부분인데 쌈박하지는 못한 것 같다. 토요일부터 시작해서 오늘에야 끝난다. 이 포스트에서는 Spring이 어떻게 트랜잭션 기능을 제공하는지를 이해할 것이다. 그리고 트랜잭션 기능을 이용하기 위해서 어떻게 설정하는지도 알아본다. “트랜잭션 관리자”, “트랜잭션용 AOP 프락시”, “트랜잭션 어드바이저”, “어드바이스 즉 인터셉터”, “포인트컷”같은 용어를 이해할 필요가 있을 것이다. “AOP 프락시”, “어드바이저”, “어드바이스”, “포인트컷”등은 Spring의 트랜잭션용 용어가 아니라 AOP 용어이다. .. 더보기
개발 프레임워크 만들기 대장정 34 - Spring.NET 트랜잭션 관리(Strategy 패턴) 연수 떠나기 전에 다 하지 못했던, Spring.NET 프레임워크 연재를 계속하기 위해서 다시 공부를 시작했다. 이번에는 Spring.NET이 트랜잭션을 지원하는 방식을 정리하려고 하고 있다. 그러나 이번 포스트의 토픽은 이것이 아니다. Spring.NET이 미들 티어의 트랜잭션 관리를 어떻게 하고 있는지를 설명하기 전에 패턴을 하나 미리 정리하는 것이 나을 것 같았다. Strategy 패턴이 뭐여 달봉이도 이렇게 사용하는 것이 Strategy 패턴이구나 하고 이제서야 알게 되었다. 사실은 이런 패턴을 사용했던 것은 달봉이가 학교 다닐 때부터였다. 다음은 달봉이의 논문에 포함되어 있는 그림이다. 다른 것은 볼 필요없고, 붉은 박스 안을 보자. 교량을 건설하다 보면 어떤 특정 부분의 재료가 ‘빔(beam).. 더보기
ClickOnce 애플리케이션의 자동 시작과 제거 방명록에 어떤 분이 질문을 올렸는데, 답변이 약간 길어져서 포스트로 올린다. 정신적 여유가 없어서 글이 성의없게 작성되었다는 것을 미리 밝힌다. 음...기본적으로 ClickOnce에서는 어플리케이션을 시작 프로그램(Startup)으로의 등록과 제거를 지원하지 않고 있습니다. startup등록은 약간의 꽁수면 됩니다. 사실 clickonce와 startup으로 구글링해보면 만족할 만한 결과가 나옵니다. 제 책에 이 내용을 썼던 것 같은데, 기억이 가물합니다( 지금 원고가 어디로 가 버렸는지 찾을 수가 없습니다.-_-;; ). 요는 ClickOnce 어플리케이션을 설치하면 생성되는 shortcut 파일을 Startup 폴더에 복사하는 방법입니다. 다음 링크를 참조하면 코드가 나와 있습니다. 이 문서에는 xp.. 더보기
블로그 이전 완료 블로그를 티스토리로 이전했다. 그러나 아직 잘못된 링크를 수정하는 작업등 몇 가지가 남아있다. 포스트는 겨우 수작업으로 이전을 했지만, 방명록, 댓글까지는 복구하지 못했다 -_-;; 흔적을 남겨주신 분들께 죄송한 마음이다. 5개월 정도 프로젝트에서 손을 놨더니 적응할 시간이 좀 필요한듯 하다. 몇개월 지나지도 않았는데, 왜 이렇게 새로운 기술이나 개념들이 많이 나왔는지... IT 개발자로 살아남는 것이 어렵다는 것을 새삼 느끼게 된다. 이제 내 생에 가장 여유로왔던 시간으로 기억될 것 같은 순간이 지났다. 이제부터 새로운 마음으로 글쓰기를 다시 시작해볼까 한다. 마음 추스리고 시동을 거는 것이 좀 늦는 타입이라 언제 어떤 주제로 글을 다시 쓰게 될지는 모르겠다. 더보기
개발 프레임워크 만들기 대장정 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 입구(?)가 있어야 한다. 그래야 컨테이너가 대상 객체를 생성해서 공개된 입구로 객체를 할당해 줄 수 있다. .. 더보기