관리 메뉴

새로운 시작, GuyV's lIfe sTyle.

닷넷 게시판 만들기 Part 29 - 웹서비스 전역 변수와 global.asax 본문

ⓟrogramming/asp.net 게시판

닷넷 게시판 만들기 Part 29 - 웹서비스 전역 변수와 global.asax

가이브 2011. 4. 15. 16:45

1. 닷넷 개발환경 준비, 테스트
2. 닷넷 알아보기 [7/7]
3. asp.net 컨트롤 [10/10]
4. 데이터베이스(DB) [7/7]
5. 닷넷 게시판을 만들어보기 전에.. [3/..]


이번 시간에는 asp.net 웹 사이트의 '전역 변수'에 대해 알아보도록 하자.

간단히 여기서는 전역 변수라고 부를건데, 이 전역 변수라는 것은 우리가 운영할 웹사이트 내의 전체에서 사용할 수 있는 변수이다. (aspx 파일 내에서의 전역변수와는 다르게 보도록 하자)

aspx(.cs) 페이지에서 선언하는 int, string .. 클래스 인스턴스 등의 모든 것들이 일반적으로 변수라고 할 수 있다. 이 변수들은 해당 페이지에서 벗어난다면 모두 사라지게 된다. 즉 사용하지 못하게 된다는 것이다.
a.aspx 파일에 int a = 50; 이라고 해봐야 b.aspx 에서는 GET 형식으로 a 변수를 넘겨주지 않는 이상은 b.aspx 에서는 사용할 수 없는 것이다. 물론, a.aspx 파일 내에서는 Class 단에 변수를 선언하면 모든 메서드에서 사용할 수 있는 전역변수 개념이 있지만, 지금 우리가 알아볼 전역 변수는 웹사이트 내의 모든 곳에서 사용할 수 있는 것이다.

먼저 이러한 웹사이트의 전역 변수를 사용할 수 있는 유용한 회원 로그인 기능의 예를 보자.

어디든지 웹사이트를 보면 회원 가입 후 로그인 한 사람에게만 접근 가능한 페이지가 존재한다. 예를 들어 웹 사이트 개설 목적상 게시판 글 읽기는 누구나 가능하지만 글 쓰기는 회원만 가능한 곳이 많다. 또한 글 수정은 해당 글을 쓴 사람만 수정할 수 있어야 하는 경우도 생각할 수 있다.

이렇듯 게시판, 쇼핑몰의 장바구니 등의 개개인 정보를 각각 관리하되, 페이지가 바뀌어도 회원인지 비회원인지 (로그인 했는지 그렇지 않았는지) 계속해서 체크할 필요가 있다.

asp.net, php, jsp를 떠나서 웹기술의 표준인 HTTP로 봐서는 쿠키(Cookie)라는 앞서 말한 전역 변수로 사용할 수 있는 기능이 존재한다.
이 Cookie의 정보는 서버에 접속하는 사용자가 가지고 있다. 서버 프로그램에서는 접속하는 사용자가 쿠키값을 가지고 있는지 없는지를 체크하여 전역 변수처럼 사용할 수 있으나, 이 쿠키는 치명적인 단점이 존재한다. 사용자 마음대로 쿠키를 만들고 삭제하여 조작이 가능하다는 것이다.

왜 그럴까? 로그인을 했을시에 서버에서 사용자에게 쿠키값 A를 '구워'주었다고 생각하자. 그러나 이 쿠키는 꼭 서버에서 구워주지 않아도 사용자가 직접 구워낼 수 있다는 것이다. 이 말은 의도하지 않은 경우가 생길 수 있다는 것이다. 이러한 이유로 쿠키는 일반적으로 사용자 정보라는 보안성에 관련이 전혀 없는 곳에 사용된다. 물론 장점도 있다. 오직 사용자가 가지고 있으므로 서버는 사용자의 값을 가지고 있을 필요가 없기 때문에 효율적이라는 것이다. 일반적으로 이런 쿠키는 "오늘(또는 x시간동안) 이 창을 띄우지 않음" 같은 곳에 사용한다. 다음에 방문하더라도 쿠키 값을 강제로 사용자가 삭제하지 않는 이상은 값을 가지고 있으므로 가능한 기술이다.
이러한 쿠키를 고급기술을 사용하여 로그인 등의 보안에 사용하는 경우도 있다. (페이스북 등)
그러나 보안성에 완벽해야 할 것이다. (서버의 인증을 거치지 않은 쿠키는 결코 안전할 수 없다) 

[asp.net 에서는 Response, Request 클래스를 이용하여 다루게 되는데, 여기서는 직접 다루지는 않겠다]

앞서 말한 쿠키와 다르게 asp.net 에서는 서버에 값을 저장하여 유지하는 전역 변수가 있다. 두가지 형식인데, 하나는 웹사이트의 사용자가 모~두 공유할 수 있는 변수인 Application 변수, 그리고 다른 하나는 개개인이 가지고 있는 Session 변수가 그것이다. 이 변수들은 대부분의 모든 웹사이트에서 사용하기 때문에 사용하는 방법을 꼭 익혀두기 바란다.

1. Application 변수

Application 변수는 Application["변수명"] 형식(컬렉션)으로 값을 할당한다. 
이 Application 변수는 object 형이다. 그러므로 해당하는 변수를 형 변환해줘야 한다.

aspx(.cs) 에서는

[할당]
Application["login"] = "abcd"; 
[읽기]
string tmp = (string)Application["login"];

이렇게 할당이 가능하며,

/bin 에 저장되는 dll 에서는 앞에 HttpContext.Current 를 붙여준다.

[할당]
HttpContext.Current.Application["login"] = "abcd";
[읽기]
string tmp = (string)HttpContext.Current.Application["login"];


이렇게 login 이라는 Application 변수는 웹사이트에 접속한 모든 사람들이 값을 읽어올 수 있게 된다.

이 Application 변수의 사용 예로는 대표적으로 여러분들이 한번씩 본 적이 있을 법한 "현재 방문자수" 또는 "현재 접속중인 회원 수"에서 사용할 수 있겠다. 모든 사용자에 의해 공통적으로 사용하는 사이트 전역변수가 이 Application 변수이다.


2. Session 변수

Session 변수는 Application 변수와 사용하는 방법이 완벽하게 동일하다. 
(그러므로 예제는 생략하겠다)

앞서 말했지만 다른 점이 Application은 모든 사용자가 공통적으로 사용하는 반면, 이 Session은 그저 개인 용도이다. 주로 로그인, 로그아웃에 많이 사용된다. 내가 로그인 했다고 다른 사람이 로그인이 되어서는 안되기 때문이다.


간단한 예제를 해보도록 하자. 기억할 것은, Application, Session 변수 모두 object 형이기 때문에 어떤 녀석이라도 담을 수 있다. 그리고 너무 남용할 경우 아무래도 서버에 그 값들이 서버(서버메모리)에 저장되니 만큼 성능에 문제가 될 수 있으니 필요한 곳에 사용하는 것이 일반적이다.

val.aspx 파일이름으로, Application 변수와 Session 변수를 하나씩 만들어 사용자가 접속할 때 마다 +1씩 해주는 기능을 넣어보자.

val.aspx


<%@ Page Language="C#" runat="server" %>

<script language="C#" runat="server">

 void Page_Load()
 {

  if (Application["count"] == null)
   Application["count"] = 0;
 
  if (Session["count"] == null)
   Session["count"] = 0;


  Application["count"] = (int)Application["count"]+1;
  Session["count"] = (int)Session["count"]+1;

  Response.Write("app: " +  Application["count"] + "<br>");
  Response.Write("session: " +  Session["count"]);
  
 }


</script>


처음 접속하면 다음과 같이 각각 1이 출력될 것이다. 리프레쉬를 계속 해보자. 해당 값들은 이제 null 이 아니므로 둘 다 모두 잘 올라갈 것이다.


이 상태에서, 모든 웹 브라우저를 종료하고(다른 사람이 접속한 듯한 효과를 위해 Session을 종료) 새로 열어서 val.aspx 페이지에 접속해보자. 결과를 봐서 알겠지만 Application 변수 값은 계속 유지를 하는 반면, (상황상) 다른 사용자는 Session 값이 처음부터 시작하는 것을 알 수 있다.



이렇게 앞에서 설명한 이론적인 내용을 실제로 알아볼 수 있겠다.

이러한 기능을 이용해서 회원 로그인 기능을 만들 수 있겠다.
회원 가입이 이루어졌으면 개발자 마음에 드는 세션 변수명에 로그인 되었다는 값을 하나 저장해두고, 이 값으로 if () 로 값이 null 인지 확인해보면 된다.

디자인 단인 aspx 파일에 로그인 한 화면과 로그인하지 않은 화면을 모두 만들고 각각 PlaceHolder 서버컨트롤로 감싼 뒤, Visible 속성으로 2개의 토글(toggle)하면 그만이다.
[Part 28] 에서 사용자 컨트롤을 이용해 top, bottom 을 구현해봤듯 이것을 top.ascx 와 같이  include 할 수 있는 사용자 컨트롤에 기능을 구현해주면 웹사이트 전체 페이지 또는 다수의 페이지에 일괄적으로 적용할 수 있는 것이다.

일단은 여기까지가 웹사이트 전역에서 사용할 수 있는 전역변수인 Application/Session 의 설명이다. 이제 여러분들이 직접 이 기능을 이용해서 직접 회원가입페이지와 로그인페이지, 로그아웃까지 할 수 있는 페이지를 만들어보자


asp.net 에서는 모든 사람들이 웹사이트에 접속/종료(세션종료)하거나 될 강제로 실행되게 하는 페이지가 존재한다. (엄밀하게 말하면 사용자 접속시에 발생하는 이벤트를 실행시킨다고 말할 수 있다)

응용 프로그램 파일이라고도 하는 global.asax 이다. 이 페이지가 있으면 실행되고, 없으면 실행되지 않는다. 주로 여기에는 이벤트가 들어가게 된다. 이 페이지는 웹사이트의 최상의 폴더에 존재해야 한다. 그리고 aspx와 동일하게 작동한다고 생각하자. 

다음은 global.asax 파일의 예제이다.

global.asax


<%@ Import Namespace = "System.Data" %>

<script runat="server" language="C#" >

protected void Application_Start(Object sender, EventArgs e)
{
}

protected void Session_Start(Object sender, EventArgs e)
{
}

protected void Application_BeginRequest(Object sender, EventArgs e)
{
}

protected void Application_EndRequest(Object sender, EventArgs e)
{
}

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
}

protected void Application_Error(Object sender, EventArgs e)
{
}

protected void Session_End(Object sender, EventArgs e)
{
}

protected void Application_End(Object sender, EventArgs e)
{
}

</script>


보다시피 여러 이벤트가 있는데, Application_Start 메서드가 웹사이트의 최초 방문자가 일어날 때 일어나는 이벤트라고 보자. 맨 밑에 있는 Application_End 메서드는 웹사이트의 최종 방문자의 접속이 끊어졌을 때를 생각하면 된다.

Session_Start 는 현재 웹사이트에 세션이 없는, 그러니까 새 방문객이라고 생각하자. 이 방문객이 신나게 놀다가 다른 사이트로 넘어가거나 웹브라우저를 종료하면 Session_End 가 일어나게 된다. 단, Session_End 의 시점은 기본 값으로 서버에 마지막으로 페이지를 요청한 후 20분이다. 물론 변경 가능하다. (프로퍼티 정도는 직접 찾아보도록 하자)

이 이벤트들은 가끔 유용하게 사용할 때가 많을 것이다.
자세한 정보는 다음에 필요시에 google 등에서 찾아보며 목적에 맞게 사용하시길 바란다.


오늘은 여기까지..



반응형
Comments