static DbConnection CreateDbConnection(string providerName, string connectionString)
{
    DbConnection connection = null;

    if (connectionString != null)
    {
        try
        {
            DbProviderFactory factory = DbProviderFactories.GetFactory(providerName);

            connection = factory.CreateConnection();
            connection.ConnectionString = connectionString;
        }
        catch (Exception ex)
        {
            if (connection != null)
            {
                connection = null;
            }
        }
    }
    return connection;
}


http://msdn.microsoft.com/ko-kr/library/dd0w4a2z%28v=vs.110%29.aspx

'Language > ADO.NET' 카테고리의 다른 글

EntityFramework SaveChanges()  (0) 2012.03.27

MVC(Model-View-Controller) 패턴은 웹 응용 프로그램의 구성 요소를 모델, 뷰, 컨트롤러 3가지 구성요소로 분리하는 아키텍처 설계 원칙이다.

이미지
분리된 각 부분에 대해서 개발, 수정, 테스트를 보다 쉽게 할 수 있도록 하기 위함이라고 보면 되며
System.Web.Mvc 어셈블리에 정의되어 있다.

ASP.NET의 MVC는 ASP.NET 프레임워크의 일부로 제공이 되는데, ASP.NET MVC3를 설치하면(VisualStudio 2010을 설치하면 MVC2까지 밖에 없다.) ASP.NET의 Web Form 대신 ASP.NET MVC 응용 프로그램을 개발할 수 있다.
하지만 이 MVC라는것이 Razor등 View Engine의 종류가 많긴하지만 Web Form 자체를 대체하는 목적은 아닐것이다.
Routing Engine만 쓰고, Web Form을 쓰는것이 편하긴 하던데....입맛에 맞게 골랐쓰도록 하자.



Web Form과 MVC
Web FormMVC
Server-Based Form을 이용하기 때문에 MVC보다는 나름 적은 코딩양으로 구현Model, View, Controller로 나뉘어 있어, 비교적 관리 편함
HTTP State를 컨트롤 가능, 이벤트를 통해서 보다 세부적으로 컨트롤 가능View, State등을 몰라도 되므로, 나름 편함
Page에 컨트롤(Server-Based Form)을 추가하므로써 기능을 추가(페이지 컨트롤러 패턴)Controller와 함께 URL Routing 이용가능(프런트 컨트롤러 패턴)

MVC 프레임워크의 기능 - .NET Framework와 호환되는 모든 단위 테스트 프레임워크를 사용할 수 있습니다. - 기능 확장 또는 기능 추가 용이.(View 엔진을 바꾼다던지, 라우팅 정책을 바꾼다던지 하는 것이 용이, DI(Dependency Injection) 및 IOC(Inversion of Control) 컨테이너 모델의 사용가능) DI, IOC같은 패턴은 Enterprise Library를 보면 됨.
- 쉽게 URL Routing기능 지원( SEO(Search Engine Optimization) 및 REST(Representational State Transfer) 주소 지정 방식에 적합한 URL 이름 지정 가능)
- 기존 ASP.NET에서 제공하는 기능은 MVC에서도 사용가능




MVC 3 프로젝트를 생성하기 위해서는 Framework를 다운받아 설치해야 하는데, 설치하고 나면 아래와 같이 메뉴가 생성되어 있음을 볼 수 있다.

이미지

이렇게 생성된 구조는 아래와 같다.
이미지

기본적으로 생성된 폴더 구조를 살펴보면, ASP.NET과 같이, Script, Content와 같은 폴더도 있지만, MVC에서 말하는 Model, View, Controller라는 단어에 s가 붙어있는 폴더들이 있음을 볼수 있는데, 여기에 소스를 만들게 된다. 각 기능들에 수동으로 추가해 줄 수도 있겠지만, 추가하고 싶은 기능에 마우스 오른쪽 버튼을 누르면 쉽게 추가 가능하다.

폴더설명
ContentCSS, image등 컨텐츠 파일 폴더
ScriptsScript 파일 폴더. ASP.NET AJAX Foundation 및 jQuery 라이브러리가 포함되어 있다.
ModelsDB등과 같은 데이터 모델을 나타내는 클래스관련 폴더, Entity및 DB와 관계된 코드를 포함함.
Views뷰 에서 사용하는 ViewPage(.aspx), ViewUserControl(.ascx), ViewMasterPage(.master) 파일등과 같이 뷰 렌더링에 관련된 파일 폴더. 컨트롤러에서 View를 통하지 않고 직접 리턴하는 경우가 아니라면 여기에는 각 컨트롤러에 대응하는 폴더가 하나씩 있고 해당 컨트롤러 이름은 각 폴더 이름에서 접두사로 사용된다.
HomeController라는 컨트롤러가 있으면 Views 폴더에 Home이라는 폴더가 포함된다.
ControllersMVC 프레임워크에서 모든 컨트롤러의 이름은 HomeController, LoginController 등과 같이 "Controller"로 끝나야 한다.
App_Data생성되어 있지는 않지만 Web Form 페이지를 사용하는 ASP.NET 웹 사이트에서와 동일(웹폼을 이용할때 필요할 때가 있다.)
기타- Global.asax 파일 : URL Route기본 코드 구성
- Web.config 파일 : 프로그램 환경설정 관련 코드 구성





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
 
        // MapRoute를 사용하지 않고, MapPageRoute()함수를 이용해 직접 aspx를 요청할 수 도 있음.(난 이게 제일 편하던데~)
        routes.MapRoute(
            "Default",                                              // Route명, 겹치면 안됨.
            "{controller}/{action}/{id}",                           // 제공할 URL 형식과 Parameter 표현
            new { controller = "Home", action = "Index", id = "" // Parameter 디폴트값
        );
    }
 
    protected void Application_Start()
    {
        RegisterRoutes(RouteTable.Routes);
    }
}
  • 라우트 등록을 RegisterRoutes라는 함수로 왜 뺏느냐 하면..
  • IIS에서 웹사이트를 만들때, Application Pool이 겹치는 경우가 있더라..->.NET4를 설치한다던지 해서, aspnet_regiis를 통해 iis에 등록해버렸더니 이미 꼬여있었음. 이럴경우 내사이트가 뻑난다고, 내가 잘못만들었나?라고 생각하기 전에, 내 사이트 말고, 다른 사이트의 Application Pool이 우리사이트의 Application pool로 바뀌어있나 함 물어볼것..



ASP.NET MVC 기반에서 Request시 UrlRoutingModule(HTTP Module, Route Class참조:RouteBase Class구현) 개체를 통해서, 시작하게 되는데 Request를 분석하고 그에 따른 Path를 선택한다. - 일치하는 Path가 있을경우 Path 개체를 리턴해 주지만, 없을경우 아무런 작업도 수행하지 않음.

UrlRoutingModule object는 선택한 Route object(IRouteHandler)를 리턴하는데, MvcRouteHandler class의 인스턴스이다. MvcRouteHandler(IHttpHandler 인터페이스를 구현) 인스턴스는 MvcHandler 개체를 만든다. 마지막으로 MvcHandler 개체는 요청을 최종적으로 처리할 컨트롤러를 선택한다.
  • Request 처리 순서

    1단계. 라우팅
    UrlRoutingModule은 RouteTable에서 일치하는 Route object를 사용해 RouteData object를 만든다.
    - RouteData는 RequestContext object를 만드는데 사용됨
    2단계. MVC Request Hanlder 생성
    MvcRouteHandler는 MvcHandler 클래스의 인스턴스를 만들고 RequestContext 인스턴스를 처리기에 전달.
    3단계. 컨트롤러 생성
    MvcHandler는 컨트롤러 인스턴스를 만드는 데 사용할 IControllerFactory object를 식별하는 데 RequestContext 인스턴스를 사용.
    4단계. 컨트롤러 실행
    MvcHandler 인스턴스는 해당 컨트롤러의 Execute 메서드를 호출.
    5단계. 작업 호출
    ControllerBase 클래스에서 상속한 컨트롤러의 경우 해당 컨트롤러에 연결된 ControllerActionInvoker 개체가 컨트롤러 클래스의 작업 메서드 중 호출할 메서드를 결정하고 해당 메서드를 호출.
    6. 결과 실행
    작업 메서드는 사용자 입력을 받아 적절한 응답 데이터를 준비한 후 결과 형식을 반환하여 결과를 실행.
    ViewResult, RedirectToRouteResult, RedirectResult, ContentResult, JsonResult, FileResult, EmptyResult중 하나를 사용하여 결과 표현.
  • 당근! 반드시! 꼭! Global.asax 파일에 Route object가 RouteTable object에 추가되어 있어야 한다.
  • 난 뷰는 필요없고, 그냥 처리만 하고 바로 끝낼래요 라고 한다면, ViewResult대신 JsonResult와 같은 결과형식으로 리턴해버려도 됨.

등록된 라우트를 통하지 않고, Virtual Directory로 설정된 경우, 직접 파일을 요청받았다면? 어떻게 될까 했더니,,
일단 파일을 아무 이상없이 잘 받아지지만, Application_Error() 핸들러에서, Exception을 처리를 해두었더니,
파일을 요청받아 처리한 족족 에러를 내뱉고 있었다. 모든 액션마다 꼼꼼하게 에러처리를 하고 있지만서도 혹시 모르니
Application_Error()는 살려두는게 좋을 것이기 때문에, 나는 파일요청에 따른 액션을 추가해주고 처리하고 있다.



'Language > ASP.NET' 카테고리의 다른 글

OWIN  (0) 2016.08.06

일반 Value Type은 null 값을 가질 수 없지만 Type뒤에 '?'를 추가하면 null을 허용하는 Value Type을 만들 수 있다.

CTS에서 null을 허용하는 Type은 제네릭 구조체 형식 System.Nullable(T)의 인스턴스이다.

nullable 형식은 자신이 표현가능한 MIN ~ MAX값 이외에 null 값도 나타낼 수 있다.

예를 들어 Nullable 타입에는 이미 우리가 알고 있는 것처럼 -2147483648에서 2147483647까지의 값은 물론 null 값을 할당할 수 있다는 말이다.



또한 여기서 Nullable에는 true, false 이외에도 null 값을 할당할 수 있는데, DB에서처럼 값을 읽어올때, null일경우를 표현할때 매우매우 유용하다.

그런데 클래스와 같은 참조타입에는 이미 null값을 지원하므로 int?와 같은 문법은 필요없다.(사용할 수 도 없다.) int? 이런 문법을 사용하기 싫다면 Nullable라고 해도 되겠다.



아무튼 우리가 평소에 알고있던 값 데이터타입에 Nullable이라는 것을 명시해주기 위해서 '?'을 붙여주는 것이라고만 알고 있으면 된다.


int? x = 18;
double? y = 0.18

그런데 여기서 값이 있는지를 알기위해서, HasValue 메서드를 통해서 알수 있는데, null타입인지 체크하려고 다른 방법을 사용한다면 큰 낭패를 볼것이다.


int? num = null;
if( num.HasValue == false )
    System.Console.WriteLine("null");
 
int? i = 18;
Type t = i.GetType();
Console.WriteLine(t.FullName); //"System.Int32"이라는 내부 타입 형식을 리턴해버림.
 
// 정 얻어오고 싶다면 아래처럼 해서, Nullable Type인지 얻어오기.
Type tT = typeof(Nullable<int>);
if (tT.IsGenericType && tT.GetGenericTypeDefinition() == typeof(Nullable<>))
    System.Console.WriteLine("nullable type");

HasValue 를 가지고 비교를 했는데, 왜냐면 특히 bool타입의 경우, 아래처럼 코딩하면 컴파일 에러를 낼 것이다.


bool? bCast = null;
if (bCast) // Error CS0266.
{
}


bool type을 사용할때는 아래처럼 사용하도록 한다.


bool? bVar = null;
if (!bVar.HasValue)
{
    bVar = true;
}
if ((bool)bVar)
{
    System.Console.WriteLine("Do something");
}



* GetValueOrDefault 메서드를 사용하여 할당된 값을 가져올 수 있다.

  • HasValue 프로퍼티를 사용하여 null에 대해 테스트할 수 있다.
    값이 있을경우 ture, null 이면 false 리턴.
    기본값은 false이다.
  • Value 프로퍼티는 할당된 값이 있다면 가지고 있는 값을 리턴.
    Value는 기본값이 없다.
    아니라면 System.InvalidOperationException이 throw됨.
  • 참조타입에는 사용할 수 없다. 또한 Nullable> num; 처럼 중첩된 nullable 형식은 허용되지 않는다.
  • GetType() 또는 is 연산자를 사용하여 Nullable인지 체크할 수 없음.




위에 특징들을 바탕으로 아래처럼 사용하자.

int? num = null;
if (num.HasValue == true)
{
    // Do
}
else
{
    System.Console.WriteLine("Null");
 
    int num2 = num ?? 18; // numm이 null이면 기본값 18할당
    System.Console.WriteLine("num2 = {0}", num2);
}


System.Int32(int)와 같은 기본 타입을 비롯한 모든 타입은 궁극적으로 System.Object(object)라는 기본 타입에서 파생된다.

.NET Framework에서 제공하는 이 타입 계층 구조를 CTS라고 하는데, CTS의 각 타입은 Value 또는 Reference 타입으로 정의되어 있다.

기본적으로 struct 키워드를 사용해서 정의한 타입은 Value타입이고, class 키워드를 사용하여 정의한 형식은 Reference타입이라고 생각하면 된다.
이미지


InitMenuScence이 가장먼저 들어옴. 다음 Opend 따라서, PlatformInterface클래스들은 Static으로 구현되어있고, 델리게이트를 등록해야 하므로, InitMenuScene에서 구현하면, Scene이 열릴때는 제대로 동작하지만, Closed에서 델리게이트 해제를 하다보면, 다시 InitMenuscene이 동작하면서, 크래시가 발생하게됨.

Opend에서 객체를 얻어오고, 델리게이트를 등록, Closed에서 델리게이트 해제해서 사용하면 됨.

델리게이트 함수로 하나의 결과가 들어올때, 다른 델리게이트에서도 값이 들어온다면, 이전의 실행중이던 델리게이트는 멈추던데.. 스레드와 비슷한 개념은 아닌듯....



크래시가 날경우, 포럼에서 답변달아둔것인데 아래처럼 고쳐 사용하면 됨.

In ScriptPlatformInterface.cpp, in the IMPLEMENT_PLATFORM_INTERFACE_SINGLETON macro, add the AddToRoot line:
   
/* make the singleton object */ \
Singleton = ConstructObject<Class>(SingletonClass); \
check(Singleton); \
Singleton->AddToRoot(); \ // <-- 여기

'Language > UnrealScript' 카테고리의 다른 글

UObject  (0) 2012.03.27

.SaveChanges() 메서드는 EntityFramework내에서 데이터 컨텍스트 개체를 사용할 때 데이터 변경사항을 저장해 주는 것인데,
저장하기 위해 언제 호출하는 것이 가장 좋은것인가에 대해 적어본다.

Linq를 쓰던 뭘하던, foreach 루프를 통하여, 데이터를 채우고 난 후, 데이터를 저장하기 마련인데, 몇가지 시나리오가 있다.

1. .SaveChanges() foreach 루프 (예: 외부 루프) 끝에 한 번
- OutOfMemory 오류 약 1/3 방식 (30,000 정도씩 90,000개 저장)

2. .SaveChanges() 루프 한 번씩 매개 변수 없이
- 잘 작동하지만 영원히~ (90,000 저장, 8시간 걸림)

3. .SaveChanges(SaveChangesOption.Batch) foreach 루프 끝에 한 번 호출
-
1번 케이스와 동일하게 OutOfMemory

4. .SaveChanges(SaveChangesOption.Batch) 루프 한 번씩 호출
- 404 오류

5. .SaveChanges(SaveChangesOption.Batch) 10 루프마다 한 번씩 호출
- 400 잘못된 요청 오류(때때로) 이후 iterations OutOfMemory

'Language > ADO.NET' 카테고리의 다른 글

DbProviderFactory  (0) 2016.08.20

앞에서, 변수를 선언했듯이, 변수가 무엇을 의미하는지 까먹을 수도 있는데,


// 주석

또는 

/* 주석 */

형태로 제공을 한다.


특정블럭을 모두 주석처리 했다가, 풀고자 할때 팁이 하나 있다.

Visual Studio라면 블럭주석처리를 하기위해 Ctrl + k + c를 누르면 해당 블럭을 주석처리할 수 있다.

그리고 해제 할때는 Ctrl + k + u를 해주면 다시 해제 가능하다.

그런데 언제 블럭잡고 처리하고 있으리..

아주 간단한데, 노트패드와 같은 일반 텍스트 에디터로 작업할일이 많을경우 아주 유용하다.

눈 크게 뜨고 아래 주석처리 된 부분을 함 보자!!


//*//
char a = 40;
char* p;
p = &a;
*p = 50;
//*/

맨앞의 /*// -> //*//로 바꾸면 된다.

'Language > C, C++' 카테고리의 다른 글

1. Constant variable  (0) 2012.03.27

+ Recent posts