ASP.NET2009.04.15 18:07
당연히 잘 되겠지 라는 생각을 하며, 이 글을 쓰려고 자료 찾고 시행착오 겪고 한게 벌써 8시간 째다.
자료가 이렇게도 없다니 ㅠㅠ, 아마 ASP.NET MVC 에 SPRING.NET 의 Facade 패턴의 DI 를 직접 구현 한 첫번째 글이 될것 같다. ㅡㅡ; 약간 비슷한 자료는 많이 찾았는데, 구현 하고자 하는 자료가 없어서 엄청 애 먹었다.

이전 강좌에서 참조 추가를 했는데, 몇개가 빠져 다시 확실하게 추가 하고 넘어가자.
참조 추가 하는 방법은 아니깐 참조된 파일만 나열하자면... 우선 일반적으로 SPRING.NET 을 설치 하였다면 참조할 경로는 C:\Program Files\Spring.NET 1.2.0\bin\net\2.0\release 이다. 여기서,

antlr.runtime.dll
Common.Logging.dll
Spring.Aop.dll
Spring.Core.dll
Spring.Web.dll

이렇게 다섯개를 참조 하면된다. antlr.runtime 은 아직 잘 모르겠고, 하다보면 뭐 하는 녀석인지 알게 되겠지.. ㅡㅡ; 참고로 www.antlr.org 에 가면 자세한 설명이 있다.

Common.Logging 은 원래 스프링이 자바버전에는 미니 Log4j 를 가지고 있다. 마찬가지로, 스프링 프레임웍으로 개발을 할때 스프링 자체적으로 뱉어내는 로그 들을 확인해 보기 위해 추가 한다. 안해도 상관없지만, 자동으로 콘솔창에 로그가 찍히는걸 보고 싶으면 추가!!

이렇게 추가 했으면, 처음으로 해야 할 것이 web.config 를 수정해야 하는 일이다.


... 이라고 된 부분은 프로젝트 생성할때 만들어 지는 코드 이므로, 해당 섹션에 맞게 위 코드를 추가 하면 된다.

그리고 web.config 와 같은 위치에 objects.xml 이라는 파일을 하나 생성 하고 코드는 아래와 같이 넣는다.


폴더 구조가 아래 그림과 같도록 Service 폴더를 하나 추가 한다. 추가 후에 SpringBoardFacade.vb 라는 인터페이스와 SpringBoardImpl.vb 클래스, SpringControllerFactory.vb 클래스를 만든다.

SpringBoardFacade.vb 는 아래와 같다.


SpringBoardImpl.vb 는 아래와 같다.


SpringControllerFactory.vb 는 아래와 같다.


그리고, Global.asax 의 Application_Start() 메서드에 다음과 같이 한줄을 추가 하도록 한다.

위 세 코드를 설명하자면, 우선 SpringBoardFacade 인터페이스는 SpringBoardImpl 클래스의 인터페이스 이다. SpringBoardImpl 클래스는 Facade 패턴에 쓰일 가장 중요한 클래스 이고, iBATIS.NET 과 연동할때 중심이 될 클래스 이다.
코드에 그냥 Test() 라는 메서드 하나를 둔게, ASP.NET MVC 에서 라우팅을 통해 컨트롤러로 갔을때 제대로 DI 가 되는지 테스트 해 보기 위해서 넣은 코드이다. 실제 게시판 코딩할때는 삭제 될 메서드 이다.

마지막으로 SpringContrllerFactory 클래스는 Global.asax 에서 어플리케이션 스타트 할때 objects.xml 을 미리 로드 하기 위한 System.Web.Mvc.IControllerFactory 구현부 이다.

그럼 마지막으로, HomeController.vb 를 다음과 같이 수정한다.

SPRING Framework 이나 오픈소스 프레임웍의 가장 단점이 세팅하기가 정말 어렵다는 점인데, 역시나 오늘 하루 출근해서 계속 요것만 한것 같다. ㅠㅠ

이렇게 코딩을 하고, 세팅한 이유는 위 HomeController 클래스의 19번째줄 Debug.Pring(sbFacade.Test()) 요게 제대로 나오는지 테스트 한 것이였다. ㅡ..ㅡ;
 
ASP.NET MVC 위에서 MVC 흐름을 자연스럽게 타면서, SPRING.NET 의 Core 부분의 DI를 구현 해 본것이다.

실행후 직접 실행창에 다음과 같은 로그가 찍히면 성공!!


사실 여기 까지의 셋팅이 자바에서도 마찬가지로 굉장히 힘들었던 부분이다.

다음 포스팅에서는 iBATIS.NET 을 붙이는 작업을 하도록 해야겠다.
Posted by dotnetpower

댓글을 달아 주세요

  1. 황선우

    C#으로 따라하고 있습니다 ^^
    테스트 프로젝트의 HomeCotroller 에서 에러가 납니다.
    HomeController 의 생성자 매개변수가 추가되서 그런 것 같은데요.
    일단 테스트 프로젝트의 HomeCotroller.cs를 삭제를 하고 빌드는 됩니다.

    근데 빌드된뒤 SpringControllerFactory.cs에서 NullException 에러가 나네요
    희한하게 favicon.ico 가 없다는 에러가...

    열심히 따라하고 있으니까 ^^ 끝까지 잘 마무리해주세요
    언제나 건강하고 행복하시고 즐프하시길~

    2009.04.21 10:35 [ ADDR : EDIT/ DEL : REPLY ]
    • 포스팅 하면서 뭔가를 빠뜨린것 같네요..
      http://dotnetpower.tistory.com/36 에 5번째 강좌까지의 소스포함되어 있으니 참고 바랍니다.

      2009.04.22 15:35 신고 [ ADDR : EDIT/ DEL ]
  2. 저 이렇게 하신 이유를 잘 모르겠습니다. ASP .NET MVC의 ControllerFactory에서 이미 저 HomeController를 가지고 있기 때문에 저렇게 할 필요가 없는 것 아닌가요?? 결국은 MVC의 DefaultControllerFactory와 하는 일이 차이가 없는 코드가 된 것 같은데요. 이부분에 대한 설명좀 부탁드리겠습니다. 감사합니다.

    2010.02.23 16:09 [ ADDR : EDIT/ DEL : REPLY ]
    • 어떤 부분을 말씀하시는지 잘 모르겠지만, 우선 SpringControllerFactory 는 요청시 Web.config 에서 aspx 페이지 핸들러를 가로채기 위한 방법이고, HomeController 쪽은 Spring.net 으로 종속객체 주입을 위한 방법입니다. 지금은 프로젝트가 작아서 불필요해 보일수도 있지만, 프로젝트가 커지고 관리되는 모듈이 많을때 유지보수가 유용한 방법입니다.

      2010.02.24 09:32 신고 [ ADDR : EDIT/ DEL ]

ASP.NET2009.04.14 09:53
앞서 환경셋팅과 디비를 만들었다면, 이번에는 프로젝트 생성하고 Spring.net 의 환경 셋팅을 해 보자.

아래 그림과 같이 [프로젝트 형식]-[웹]-[ASP.NET MVC Web Application] 을 선택하고, 프로젝트 이름을 SpringBoard 로 한다

확인을 누르면 다음과 같은 TDD를 위한 설정화면이 나오는데, 최근 무료 배포된 ASP.NET MVC 책에서 설명한것 처럼 단위 테스트를 위해 필요하니 OK 를 선택 하자.

이제 프로젝트가 생성되었으니, SPRING.NET 과 iBATIS.NET 의 프레임웍을 참조 추가 하도록 한다.
[프로젝트]-[참조 추가]를 선택하고, 우선 SPRING.NET 에서 우리가 사용할 dll 을 참조 추가 한다.

Web, Aop, Core 이 세가지를 사용한다. 다시 한번 설명하자면, Core는 Spring.net 의 핵심 모듈로써, 주로 DI 를 담당하고, AOP는 말 그대로 AOP를 제공한다. Web은 놀랍게도, Spring.Web 네임스페이스는 SPRING Ioc Container 의 제일 상단에 위치하고 있다. 이 말은 ASP.NET MVC에서 Route 하는 부분을 Spring 이 대신 해 줄수 있다는 말이다.

예를 들면 다음 코드와 같다.(이 부분은 예시 이므로 참고만 할것)


3번 줄 부분이 의미 하는것은 확장자가 aspx 인 모든 요청에 대한 처리는 spring의 PageHandlerFactory 가 처리를 하겠다는 말이다.

이부분이 Spring framework 에서 아주아주 중요한데 단시 페이지 라우팅 부분을 위임하는게 아니라, 어플리케이션의 패턴이 바뀌는 부분이다. 왜냐면 기존 ASP.NET MVC에서는 단지 요청의 경로만을 넘겨주고, 중간 Model 에서 값을 셋팅하기 때문에 어떻게 보면 자바에서 설명하는 MVC 모델 2 를 취하는데, 문제는 Dependency 부분이다. 이 부분을 SPRING.NET Framework 에서 해결 해 준다. 즉 페이지 라우팅(View Resolve) 할때, 원하는 클래스를 미리 DI 해서 보낼 수 있다.

앞으로 진행될 게시판 개발에서 모든페이지에 Facade 클래스를 주입할 것이다. 이렇게 중앙 집중식으로 처리가 되고, 스프링과 ASP.NET의 오묘한 결합이 얼마나 재미있는 요소가 많은지도 찾게 될 것이다. ^^

이처럼 포스팅 하다가는 게시판 하나에 10페이지가 넘어갈수도 있을것 같은 불안한 예감을 뭘까? ㅡ..ㅡ;
Posted by dotnetpower

댓글을 달아 주세요

  1. 굉장히 재미있는 연재가 될 것 같습니다 ^^

    기대할께요!

    2009.04.14 14:50 [ ADDR : EDIT/ DEL : REPLY ]

ASP.NET2009.04.13 13:02
앞서 포스팅한 내용을 토대로 ASP.NET 으로 간단한 게시판을 제작해 보자.
우선 개발을 위한 환경 셋팅부터...

  • OS : Windows Server 2003; Windows Server 2008; Windows Vista; Windows XP
  • IDE : Visual Studio 2008, Visual Studio 2008 SP1 or Visual Web Developer 2008 SP1
  • Database : MS SQL 2000 or higher
  • Framework : .NET 3.5 SP1
  • ASP.NET MVC 1.0 - Download
  • SPRING.NET 1.2.0 - Download
  • iBATIS.NET DataMapper 1.6.1, DataAccess 1.9.1 - Download

참고로 필자는 Windows Vista Business K, Visual Studio 2008 SP1, MS SQL 2000, .NET Framework 3.5 SP1 이다.

프로젝트 생성 전에 위 프레임웍을 설치 하고, 우선 데이터 베이스 테이블 부터 하나 만들도록 한다.
ASP.NET 개발자들이 항상 들르는 곳중 하나인 Taeyo.pe.kr 의 계층형 게시판과 테이블을 동일하게 만들었다.
게시판 로직에 대한 이해는 태요님의 아티클을 참조 하기 바란다.

테이블명은 ThreadBoard 이며 생성 스크립트는 아래와 같다.


2009-04-16 추가
iBATIS 연동시 빠른 테스트를 위한 샘플데이터 하나를 넣어둔다.

INSERT INTO ThreadBoard (thread, depth, writer, pwd, title, mode, content)
Values (1000, 0, 'admin', 'pwd', '첫번 째 글입니다', 1, '본문 내용입니다')


기본적인 환경 셋팅과 디비 셋팅이 끝났으면, 다음 단계로 넘어간다.
다음단계는 다음 아티클 참고 하시길 ^^;

Posted by dotnetpower

댓글을 달아 주세요

  1. 기대되네요..(^^)
    연재마치시면 훈스Lecture에도 기고를 해주시는건 (^^)

    2009.04.13 19:32 [ ADDR : EDIT/ DEL : REPLY ]
  2. iBATIS.NET 다운로드 주소가 바뀌었네요...
    http://ibatis.apache.org/dotnet.cgi

    2010.03.14 00:11 [ ADDR : EDIT/ DEL : REPLY ]

ASP.NET2009.04.08 19:09

ASP.NET MVC 의 하나의 요청에 대한 Life Cycle을 표현하면 아래와 같다.


기존 웹폼의 Page Controller에 비해서 ASP.NET MVC의 Front Controller 패턴은 요청 하나에 대해서 많은 일들을 한다.
Front Controller 패턴의 경우 요청을 중앙 집중식으로 하여 각각의 로직을 분산 시키는데 효과적이다. 이를 Facade Pattern 이라고도 하는데 Spring Framework 을 사용하기에 용이 하다.


다시말해서 Facade Pattern 으로 설계가 되면 DI(Dependency Injection)가 용이해 지기 때문이다.

위 ASP.NET MVC Life Cycle 에서 클라이언트의 ①요청에 대한 진입점을 Global.asax 에서 미리 정의한 라우팅 맵을 통해 요청이 해당 Controller로 처리된다. Controller는 클라이언트가 요청한 작업을 처리 하기 위해 Model 에서 데이터를 가공하여 다시 Controller로 가져온다.(이 부분은 메서드 호출이라고 생각하면 됨)
원하는 데이터를 가져와서(특정 요청을 처리한 후) System.Web.Mvc.ViewDataDictionary 에 실어서 View로 데이터를 전달한다.

자... 여기서 일반적인 ASP.NET MVC 에 대한 하나의 Life Cycle을 살펴봤는데, 실제 프로젝트를 생성 해 보면, 약간 아쉬운점이 보인다. 가장 처음 들르는곳 Global.asax의 RegisterRouters 메서드 이다.


코드를 보면 라우팅 규칙이 하드코딩 되어있다. 약간 안습(?)이다. 물론 Creativity를 겸비한 개발자는 이 부분을 XML로 config 설정을 할텐데... MVC 모델로 개발하는 이유가 유지보수에 용이한 모델이고 확장이 쉽고 등등.. 하지만 하드코딩되어 있다면 과감하게 외부로 빼는게 좋을듯 하다. 라우팅을 외부로 빼게 되면, 그 정의를 Spring에서 할 수 있고, 진입전에 DI를 쉽게 할 수 있다.

이처럼 라우팅 테이블의 단점을 스프링이 보완해 준다. 또하나...
만약에 어떠한 비즈니스 로직이 있다는 가정하에서 그 비즈니스 로직이 실행되기전 다른 작업, 또는 실행 후 다른작업이 추가가 되어야 할때 SPRING.NET 이 가지고 있는 AOP(Aspect Oriented Programming)의 Advice, Pointcut, Advisor를 통해 가능하다. 이게 바로 또하나의 선물이다.

MVC모델에 대해서 부족한 부분을 채워 주는것이 AOP이며 꼭 ASP.NET MVC 모델로 개발을 해야 할때는 SPRING.NET의 탑재를 심각하게 고민해 보아야 할 부분이다.
Posted by dotnetpower

댓글을 달아 주세요

ASP.NET2009.03.10 09:44

MS에서 종종 좋은기술이 발표된다. WPF, WCF, Silverlight, LINQ 등...

ASP.NET MVC 패턴은 말그대로 프로그래밍 패턴이다.

Model, View, Controller 이렇게 세가지 단위모듈로 로직을 명확하게 나누기 위해서 이다.

나누면 얻게 되는 이득은, 우선 복잡한 로직을 세가지로 나누면서, 유지보수가 용이해 진다.
MVC 패턴이 나온이유도 이와 같은 이치에 의해서 이다.

그렇다면 패턴이라는건 무었일까?

"코어 J2EE패턴" 이라는 책에서는 다음과 같이 정의 한다.
패턴이란, 무엇이 문제이며 그에 대한 해법은 무엇인지 다른 사람들과 서로 의견을 나누는 방법.
또한 패턴은 삼요소 규칙이 존재한다.
1. 정황(context)
2. 문제(problem)
3. 해법(solution)

소프트웨어 엔지니어링 이라는 책에서 프로그래밍이란 문제(problem)를 해결(solving)하는 일련의 행위 라고 말하는데
결국 개발자는 어떠한 문제(problem)나 요구(needs)을 해결(solve)해 주는 역할을 하는 사람이다.

이러한 과정을 거친 결과물이 인도될때 거기서 끝나는것이 아니라 유지보수라는 엄청난 job이 생겨난다.

복잡한 비즈니스로직을 명확하게 MVC로 나누게 되면 유지보수성도 뛰어날 뿐더러 반복되는 실수가 줄어들게된다.
이게 바로 MVC 패턴을 사용하는 가장 중요한 요수이다. 간단히 말해 유지보수가 편해지는 프로그래밍 기법!!

하지만 세상 만사가 그렇듯이 항상 장과 단이 있다.

무조건 좋을수만은 없는게 사실이다.
예를들면 간단한 게시판 리스트를 가져오는 프로그램을 짠다고 했을때 ASP.NET WebForm 에서는 page_load 부분이나
grid, repeater 에 databinding만 하면 됬다.

하지만, MVC 패턴으로 가면 우선 페이지 로딩이 될때 사용자가 어떤 요청을 했는지 Coltroller가 해석을 하고, Model에서 데이터를 가져와서 View에게 화면을 넘겨준다. 일반적인 MVC 패턴에서는 각각의 M,V,C가 하나의 클래스로 구성되어 있다.
물론 비슷한 비즈니스 로직상에는 하나의 클래스 안에 여러가지의 분기문, 메서드가 존재하게 되는것이다.

간단한 사이트를 만들기 위해 무리한 프레임웍을 올리는것보다. 상황에 맞게 잘 선택해야 할 것이다. ^^;



Posted by dotnetpower

댓글을 달아 주세요