태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

달력

08

« 2017/08 »

  •  
  •  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  •  
  •  
유닛 테스트를 중요하게 생각하여 설계한 코드라면 HttpContext 같이 ASP.NET 프레임워크에 종속되어 테스트가 불가능해지는 클래스들은 진작에 어댑터 등을 이용하여 분리시켜 두었을 것이다. 하지만 이미 작성된 코드가 많은 상황에서 유닛 테스트를 도입할 때에는 HttpContextBase 클래스가 유용하게 사용될 수 있다.

HttpContextBase 클래스는 ASP.NET MVC에서 쓰이는 클래스라서 (Controller.HttpContext Property 참조) 3.5 SP1부터 쓸 수 있고, System.Web.Abstractions 어셈블리(네임스페이스는 System.Web)를 참조에 추가하면 된다.

HttpContextBase 클래스는 기존의 HttpContext 클래스와 완전히 동일한 멤버들을 노출하고 있고, HttpContext 인스턴스를 쉽게 HttpContextBase 인스턴스로 전환할 수 있도록 HttpContextWrapper 클래스를 같이 제공하고 있다. 포함된 어셈블리도 ASP.NET MVC와는 분리된 어셈블리이다. 따라서 ASP.NET 응용프로그램에서도 기존에 HttpContext 인스턴스를 사용하는 곳에서는 동일하게 HttpContextBase 인스턴스를 사용할 수 있다.

ASP.NET MVC의 목표에 맞게, HttpContextBase의 모든 멤버는 virtual로 선언되어 있어서 HttpContext를 사용하는 코드를 쉽게 유닛 테스트 할 수 있게 된다. (Rhino.Mocks 같은 mock framework을 쓴다면 금상첨화)

비록 HttpContext를 쓰던 곳에 HttpContextBase를 그대로 쓸 수 있다고는 하지만 기존의 ASP.NET 코드 상태에 따라서는 당연히 수정이 필요한 곳이 생긴다.
  • 정적(static)으로 선언된 HttpContex.Current 속성을 직접 사용하는 메서드는 HttpContextBase 인스턴스를 파라미터로 받아서 사용하게 수정해야 한다.
  • 혹은 클래스에 HttpContextBase 형식 필드를 추가해서 그것을 사용하도록 수정해야 한다.
  • new HttpContextWrapper(HttpContext.Current) 같은 형태로 클래스 메서드나 생성자의 파라미터로 넘겨주도록 수정한다.
한 가지 특이하게 수정해야 했던 부분은 Reflection을 사용하는 경우였다. 기존의 코드는 HttpModule 내부에서 HttpContext로부터 HttpWorkerRequest를 얻을 때 Type 클래스를 사용하고 있었다. 

request = (HttpWorkerRequest)type.GetProperty("WorkerRequest", bindingAttr).GetValue(context, null);

다행히 이 경우에는 GetService 메서드를 사용하여 수정할 수 있었고, 이 방법이 정석이라고 생각된다.
request = (HttpWorkerRequest)context.GetService(typeof(HttpWorkerRequest));


이런 식으로 HttpContextBase 클래스를 사용하도록 수정하면, HttpContextBase를 통해서 얻는 Request나 Response 인스턴스에도 동일한 패턴이 적용되어 있으므로 쉽게 테스트 가능한 코드를 얻을 수 있게 된다.
신고
Posted by wafe

댓글을 달아 주세요

  1. 남정현 2009.12.27 02:59 신고  댓글주소  수정/삭제  댓글쓰기

    좋은 아티클 보고 갑니다. 웹 프로젝트 수행 때 좋은 시작점이 될듯합니다. :-)

    • wafe 2009.12.27 13:43 신고  댓글주소  수정/삭제

      들러주셔서 고맙습니다. 운영하고 계신 블로그나 데브피아에좋은 글을 올려주셔서 남정현님 성함이 익숙하게 느껴지는데, 이렇게 제 블로그에 댓글까지 남겨주시니 더 기쁘네요.

      텍스트큐브로 이사하신 줄은 몰랐는데 이제 더 자주 뵐 수 있겠네요 ^^

javascript로 ASP.NET AJAX의 UpdatePanel 컨트롤을 업데이트 시키는 방법을 따라하면 일반적인 경우에는 잘 된다.

그러나 마스터 페이지를 사용하는 페이지에 UpdatePanel을 넣은 경우에는 다음과 같이 __doPostBack 했을 때,

__doPostBack('<%= UpdateUpanelBtn.ClientID %>', '');

PostBack은 발생하지만 버튼 이벤트 핸들러에 들어가지를 않아서 원하는대로 화면이 갱신되지 않는다.

왜 잘 안될까 다른 방법을 써서 마구 삽질하다가, 우연히 ClientID 대신 UniqueID로 바꿔봤는데 잘 된다는 것을 알게됐다.

사실 Page_Load 이벤트 같은데 브레이크 포인트를 걸어놓고, 비동기 PostBack이 발생했을 때 Request.Form 컬렉션을 잘 살펴보면, 컬렉션에 들어가 있는 문자열들은 모두 컨트롤의 ClientID가 아니라 UniqueID 라는 것을 알 수 있다.

신고
Posted by wafe

댓글을 달아 주세요

2008.12.04 07:58

Framework's Day, ASP.NET and ASP.NET MVC 분류없음2008.12.04 07:58

지난 주말 데브피아 Framework's Day에 갔었다. 첫 번째 발표였던 김용현님의 발표에 질문을 한 덕분에 Holubs on Patterns 번역서를 득템했다. 어제 기묘 창의력 세미나에서도 책을 받아서 기분 좋은 요며칠이다.

모든 주제들이 모두 흥미있고 고민해야할 주제였지만, ASP.NET MVC는 왠지 가장 피부에 와닿는 주제였다. 발표가 끝나고 장현희님께 한 질문은 'ASP.NET에 대한 경험이 많지 않은 팀이 새로운 프로젝트를 할 때 ASP.NET과 ASP.NET MVC 중 어느 쪽을 추천하시겠습니까?'였다.

  • 테스트 용이성
  • M, V, C를 분리해서 개발하기 용이하다
  • AJAX와의 자연스러운 연결

ASP.NET MVC가 상대적으로 이런 장점을 가지고 있으므로 아직 정식 버전이 나오지는 않은 상태이지만 추천한다고 하셨다.

RoR 짝퉁이라는 소리도 듣는다지만 어쩌면 그건 칭찬일지도 모르겠다. ^^; RoR의 높은 생산성은 이미 유명하니까 말이다. 준비 목록에 ASP.NET MVC도 넣어야겠다.

신고
TAG ASP.NET
Posted by wafe

댓글을 달아 주세요