태그 보관물: asp.net

선언적 코드를 사용한 ASP.NET Web API 데이터 검사

일반적으로 선언적(declarative) 코드는 명령형 코드에 비헤 가독성이 높고 테스트하기 쉬우며 코드의 양도 더 적습니다. System.ComponentModel.DataAnnotations 네임스페이스는 데이터를 검사하는 ValidationAttribute 하위 특성(attributes) 집합을 제공하며 이 특성들을 사용하면 데이터의 유효성을 검증하는 코드를 선언적으로 작성할 수 있습니다. ASP.NET Web API 액션 메서드에서도 이 특성들을 사용해 입력 데이터의 유효성을 검사할 수 있습니다.

계속 읽기

Microsoft.Owin.Testing 패키지를 이용한 인메모리 통합 테스트

단위 테스트 만큼이나 통합 테스트는 필요하며 통합 테스트에 있어서도 자동화는 중요합니다. 단위 테스트를 통과한 모듈도 서로 조합되면 운영 환경에서 오류를 발생시킬 가능성이 존재하며 다양한 이유로 인해 단위 테스트가 어려운 코드도 있죠. GUI를 가진 응용프로그램을 인력 자원을 동원해 하나하나 통합 테스트하거나 그것조차 제대로 하지 않는 것이 국내 사정이지만 CUIT(Code UI Tests)나 Jasmine 등의 E2E(End-to-End) 도구를 사용해 통합 테스트를 자동화하면 테스트 비용과 테스트 오류 가능성을 낮출 수 있습니다.

API 역시 통합 테스트 대상입니다. API는 GUI 기반 응용프로그램과 비교할 때 통합 테스트를 수동으로 진행하기에 귀찮고 어려운 반면 자동화하기는 더 쉽습니다. Jasmine을 이용한 API 통합 테스트 자동화를 고려해 볼 수도 있지만 Visual Studio에 의해 관리되고 있는 기존의 테스트가 있다면 동일한 테스트 도구를 통해 관리하는 것이 훨씬 좋겠죠.

Microsoft.Owin.Testing 패키지를 사용하면 OWIN(Open Web Interface for .NET) 기반 ASP.NET Web API에 대한 통합 테스트를 쉽게 작성할 수 있습니다. 테스트는 메모리를 통해 이루어지기 때문에 네트워크 트래픽이 발생하지 않아 매우 효율적이면서도 ASP.NET Web API의 전체 파이프라인을 관통합니다. 뿐만 아니라 IoC 컨테이너를 조작하면 컨트롤러 이후의 과정을 모의화하는 것도 가능합니다.

계속 읽기

Repository and Unit of Work 디자인 패턴을 이용한 TDD(Test-driven Development)

다중 계층 아키텍처는 관심사 분리(SoC, Separation of Concerns) 원칙 구현의 하나로, 각 계층은 전체 프로세스 흐름 중 담당하는 작업에만 집중하여 프로그램 코드의 복잡도를 낮출 수 있습니다. 하지만 계층간 결합도가 높다면 여전히 낮은 테스트성(testability)으로 인해 단위 테스트와 테스트 주도 개발(TDD, Test-driven Development), 행위 주도 개발(BDD, Behavior-driven Development) 등의 방법을 적용하기 어렵습니다. 이 포스트의 주 목적은 비즈니스 논리에 대한 데이터베이스에 독립적인 단위 테스트를 작성하고 TDD를 적용하는 방법을 설명하는 것입니다.

계속 읽기

ASP.NET Identity 사용자 모델 확장

5/15/2014 추가 Microsoft ASP.NET Identity EntityFramework 패키지가 2.0.1 버전으로 업데이트 되었습니다. IdentityUser 클래스에 이메일 주소가 포함되었고 UserValidator 클래스를 사용해 이메일 주소 중복 여부를 검사할 수 있습니다.

사용자 모델

Microsoft ASP.NET Identity EntityFramework 패키지는 응용프로그램 사용자를 나타내는 IdentityUser 모델 클래스를 제공합니다. 최근의 ASP.NET 프로젝트 템플릿은 이 클래스와 EntityFramework을 사용해 개별 계정 관리를 구현합니다. 다음은 IdentityUser 클래스 정의입니다.

using Microsoft.AspNet.Identity;
using System;
using System.Collections.Generic;

namespace Microsoft.AspNet.Identity.EntityFramework
{
    public class IdentityUser : IUser
    {
        public IdentityUser();
        public IdentityUser(string userName);

        public virtual ICollection<IdentityUserClaim> Claims { get; }
        public virtual string Id { get; set; }
        public virtual ICollection<IdentityUserLogin> Logins { get; }
        public virtual string PasswordHash { get; set; }
        public virtual ICollection<IdentityUserRole> Roles { get; }
        public virtual string SecurityStamp { get; set; }
        public virtual string UserName { get; set; }
    }
}

제가 아쉬운 것은 모델에 이메일 주소가 포함되어 있지 않다는 점입니다. 사용자 계정 정보에 이메일 주소 속성을 추가하려면 조금 귀찮은 작업을 해줘야합니다. 이 포스트에서는 SPA(Single-Page Application) 프로젝트를 기준으로 사용자 모델을 확장하는 방법을 설명합니다. 계속 읽기

ASP.NET에서 JSON 정적 컨텐트 노출

현재 ASP.NET 웹 응용프로그램은 기본적으로 확장자가 json인 파일에 대한 MIME 맵이 설정되어있지 않습니다. 그래서 브라우저에서 JSON 정적 컨텐트에 접근하려하면 404.3 상태가 반환됩니다.

HTTP Error 404.3 - Not Found

The page you are requesting cannot be served because of the extension configuration. If the page is a script, add a handler. If the file should be downloaded, add a MIME map.

이 문제는 웹 응용프로그램의 web.config 파일에 아래처럼 JSON 정적 컨텐트에 대한 설정을 추가하면 해결됩니다.

<system.webServer>
  <staticContent>
    <mimeMap fileExtension=".json" mimeType="application/json"/>
  </staticContent>
</system.webServer>

웹 서버 개발 플랫폼의 역할과 위치

w3techs.com은 웹 기술에 대한 조사 결과를 공유하는 사이트입니다. 이곳에서 웹 서버 개발 플랫폼의 시장 위치에 대한 보고서를 읽고 ASP.NET 개발자 입장에서 느낀점을 정리합니다.

저의 웹 개발 환경 경험은 ASP.NET 75%, Java 15%, 기타 10% 정도 될 것 같습니다.

2014년 1월 26일 기준 상위 5개 웹 서버 개발 플랫폼에 대한 차트를 보면 눈에 띄는 3가지가 있습니다.

  1. PHP의 넘사벽 점유율
  2. 그 뒤를 따르는 ASP.NET의 높은 점유율
  3. Java로 개발된 사이트의 높은 트래픽

계속 읽기

Internet Explorer 11에서의 ASP.NET 응용프로그램 쿠키 문제

Internet Explorer 11에서 ASP.NET 응용프로그램의 쿠키를 사용하지 못하는 현상이 많이 발생한다고 합니다. 저희 팀에서 관리하는 사내 관리 프로그램에서도 동일한 문제가 발생했습니다. 사이트에 로그인을 하면 세션키가 쿠키가 아닌 URL에 포함되어 리다이렉트되었습니다. 이것은 ASP.NET이 클라이언트가 쿠키를 사용할 수 있는 환경이 아니라고 판단했을 때의 현상이죠. 원인은 ASP.NET이 Internet Explorer 11의 User-Agent를 웹 브라우저로 인식하지 못하기 때문입니다. ASP.NET이 Internet Explorer 11과 몇몇 모바일 브라우저의 User-Agent를 인식하지 못하는(못했던) 것은 알려져 있는 문제입니다.

http://blogs.msdn.com/b/cjacks/archive/2013/07/02/troubleshooting-and-fixing-session-cookie-problems-in-ie11.aspx

제가 조사한 해결책은 아래 두 가지입니다.

1. .NET Framework 업데이트 설치 – http://support.microsoft.com/kb/2836939
2. 명시적으로 쿠키를 지원하지 않는 환경에서도 쿠키 사용을 강제하도록 설정 – http://botsikas.blogspot.kr/2013/09/ie11-and-aspnet-session-cookies.html

회사에서의 문제는 내부에서만 사용되는 사이트라 2번 방법을 사용해 간단히 해결했습니다.