관리 메뉴

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

닷넷 게시판 만들기 Part 12 - 서버에서 받기 본문

ⓟrogramming/asp.net 게시판

닷넷 게시판 만들기 Part 12 - 서버에서 받기

가이브 2011.01.21 15:15

2011/01/19 - [ⓟrogramming/asp.net 게시판] - 닷넷 게시판 만들기 Part 10
2011/01/20 - [ⓟrogramming/asp.net 게시판] - 닷넷 게시판 만들기 Part 11

1. 닷넷 개발환경 준비, 테스트
2. 닷넷 알아보기 [7/7]
3. asp.net 컨트롤 [3/..]


이전 시간에 이어서 계속해보자.
이번 시간은 게시판 글쓰기라는 board_write.html 웹 페이지에 든 <form></form>의 핵심 부분을 알아보았다. 비록 한줄 텍스트쓰기, 여러줄 텍스트 쓰기처럼 한두개의 입력 폼을 해보았지만, 이들의 값을 넘기려면 <form action="" method="">에 어떤 방법으로 어디로 넘길건지 지정해야 하고, 각각의 태그에는 name 속성의 값을 주어야 된다는 것을 알아보았다.

이번에는 값을 넘겼으니, 받아보도록 하자.
일단, 어디에서 값을 받을 것인가 정해보자. 게시판의 글 쓰기는 내용이 길어질 수 있다. 그러므로 값은 POST로 넘기는 것이 현명하다. GET으로 넘기는 방식은 주소창에 값이 붙여 넘어가므로, 비밀번호가 "열어본 웹페이지"에 남을 수도, 사용자 등 뒤의 다른 사람의 눈에 노출될 수도 있다. 받아주는 파일명은 board_write_done.aspx 로 정하기로 한다.

잠시 asp.net 에서 우리도 모르게 가장 많이 사용하는 클래스 2개를 알아보고 넘어가자.

Request 객체, Response 객체라고 불리는 말 그대로 "요청, 응답"관련 클래스이다.
Request는 "읽어오기"라고 생각하면 쉽고, Response는 "출력하기"라고 생각하면 쉽겠다.

System 네임스페이스를 모든 닷넷 기반에서 기본으로 참조하듯이, asp.net 에서도 기본으로 참조하는 System.Web 네임스페이스가 있다. aspx파일에서는 기본적으로 System.Web과 System.Web.UI 의 네임스페이스를 모두 참조하고 있다.

또한 System.Web.UI 네임스페이스의 Page클래스가 있는데, 이 클래스가 aspx파일을 모두 관장한다고 보면 되겠다. 또한 이 클래스 덕분에, 다음에 소개하는 클래스를 쉽게 사용할 수 있게 된다.

1. System.Web.HttpRequest (Request)

http://msdn.microsoft.com/ko-kr/library/system.web.httprequest_members(v=VS.80).aspx (우리는 이제 MSDN 읽는 법을 알지 않는가? ^_^)

앞에서 말한것 처럼, 각종 정보들을 읽어오는 기능을 한다. 예를 들어, 웹서버에 접속한 사람의 고유 IP주소, GET/POST로 넘어온 값, 한번쯤은 들어보셨을 쿠키(Cookie) 등 웹서버에 관련한 대부분을 포함한다.
aspx 파일에서는 간단하게 Request.메서드(), Request.프로퍼티 형태로 사용가능하다.


2. System.Web.HttpResponse (Response)

http://msdn.microsoft.com/ko-kr/library/system.web.httpresponse_members(v=VS.80).aspx

Response는 출력(응답)관련 클래스라고 했다. Request 와 사용법이 동일하다고 보면된다. 예전 첫 실습때 Response.Write() 메서드를 기억하는가? Request는 쿠키를 읽어오는 반면에, Response는 쿠키를 쓰는 기능을 하며, Response.Write() 처럼 화면에 그대로 뿌려주는 기능도 한다. 그리고 일반적으로 웹 프로그래밍은 죽었다 깨어나도 HTML이라고 했었는데, 이것을 다른 형식으로 변경하여 뿌려주는 기능도 가지고 있다. (.aspx 파일을 열었지만, 이미지파일이 나온다고 보면 되겠다. 이 기능은 주로 파일 다운로드 때 실제 물리주소를 숨기기 위한 기능으로 많이 활용한다) 
aspx 파일에서는 Request와 동일하게 Response.메서드(), Response.프로퍼티 형태로 바로 사용하게 된다.

정리해보면, aspx 파일에서 Request, Response 를 인스턴스화 할 필요없이 그대로 사용하며, MSDN에 나와있는 메서드, 프로퍼티를 보며 원하는 기능을 찾아쓰면 된다.

위의 설명에 따라, 우리가 board_write.html 에서 넘긴 값들은 Request, Response 둘중에 어떤 것을 이용하면 될까?

aspx 페이지를 빈 녀석으로 하나 만들어보자.

board_write_done.aspx


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

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

 void Page_Load()
 {
 }

</script>


<form>값을 받는 방법은, Request 를 이용하며, 일반적으로 사용하기에는 총 3가지가 존재한다.

Request.Form["name명"];            // 1. POST받기
Request.QueryString["name명"];   // 2. GET받기
Request["name명"];                    // 3. GET/POST 구분없이 받기

<form method="GET/POST">에 따라 1,2번을 이용할 수 있거나, 구분없이 그냥 3번처럼 GET/POST 신경쓰지 않고도 받을 수 있다.

#참고
여기서, 처음보는 형식이 있다. Request는 클래스인 것을 알겠는데, 클래스에는 메서드,프로퍼티 2가지가 있다고 했다. 그리고 메서드는 ()괄호가 붙고, 프로퍼티는 아무것도 붙지 않는 형식이라고 했는데, []중괄호는 처음보는 형식이다. 

이게 바로 Collection 이라는 형식의 클래스인데, System.Collections 이다. 일반적으로 ArrayList 클래스라는 것으로 실제 사용하게 된다. 비슷한 형식으로 배열(System.Array)이 있다. MSDN에서 대략적으로 읽어보길 바란다.

컬렉션: http://msdn.microsoft.com/ko-kr/library/ybcx56wz(v=VS.80).aspx
배열: http://msdn.microsoft.com/ko-kr/library/system.array.aspx

배열은 "값"만 존재하는 반면,
컬렉션은, "키"와 "값"이 쌍으로 존재한다. 우리가 지금 구현하는 GET/POST 값을 받는데에 있어서, name이 "키"라고 할 수 있고, 그것의 "값"이 존재하는 것이다. 영어사전을 생각해보자. 영어사전에는 "키"라고 할 수 있는 단어가 있고, "값"이라고 할 수 있는 지문이 나와있을 것이다. 이처럼, 컬렉션에는 키/쌍이 하나가 되는 값을 하나의 Item이라고 부른다. 이 Item은 뒤에 s가 붙어, Items 라는 컬렉션으로 사용할 수 있다.

처음부터 끝까지 알아보기에는, 우리같은 초보에겐 머리아픈 일이다. (필자도 닷넷을 100%마스터 하지 못한 초보이다) 컬렉션 형식에서 가장 많이 쓰이는 프로퍼티가 Collection.Count 로, 컬렉션의 갯수를 int 로 리턴한다.

메서드로는 Add(), Remove(), RemoveAt() 등 MSDN에 나와있으니 살펴보길 바란다.


Request.Form["name명"];            // 1. POST받기
Request.QueryString["name명"];   // 2. GET받기
Request["name명"];                    // 3. GET/POST 구분없이 받기

즉, 값을 받기 위해서는 사실

Request.Form
Request.QueryString

이렇게 컬렉션이 존재하는데, 이 자체가 컬렉션을 리턴한다. 즉, 현재 페이지로 넘어온 POST의 키/값의 쌍인 것(.Form)들, 그리고 GET도 마찬가지(.QueryStrings)겠다.

내부적으로는, Request.Forms 와 Request.QueryStrings 는 컬렉션 형식인 NameValueCollection 클래스를 리턴한다. 

쉽게, 컬렉션은 이렇게 생각하자.
해당 컬렉션의 리턴형만 알고, 그렇게 받으면 되고. 해당 컬렉션을 이용하는 방법은 중괄호[] 로 가져오거나 할당하면 된다.

예로, POST 형식으로 2개의 값이 넘어왔다고 치자.

name=홍길동
age=50

NameValueCollection post = Request.Form;

이렇게 되면 post 는 nameValueCollection 형식이므로, NameValueCollection 클래스의 멤버에 나와있듯이 다음처럼 사용가능하겠다.

int a = post.Count;                   // 2개이므로 2
string name = post[0];             // 첫번째인 name
string name = post[1];             // 두번째인 age
string name = post["name"];    // name이므로, '홍길동'
string name = post["age"];       // age이므로, '50'

복잡하지 않은가? 그러므로, 간단하게 컬렉션을 바로 이용하면,

string name = Request.Form["name"];
int age = Int32.Parse(Request.Form["age"]);

이렇게 받아와서 원하는 형식으로도 얻을 수 있을 것이다.
GET방식의 값을 읽어오는 Request.Querystring 도 다를 것 없다.

#참고
int age = Int32.Parse(Request.Form["age"]);
이것을 분석해보자.

이 항목의 목적은 무엇인가? 
POST방식으로 넘어오는 age 값을 얻어, int 형으로 변환해 오는 것이다.
여러분들이 복잡한 구문을 해석할 때에는, 각 구문 하나하나를 "자료형"으로 해석하면 쉽다.

1) int age = Int32.Parse(Request.Form["age"]);   - 밑줄은 컬렉션
2) int age = Int32.Parse(Collection["age"]);      - 컬렉션["키"]의 리턴은 string형
3) int age = Int32.Parse(String);                      - Int32.Parse(string)의 리턴은 int 형
4) int age = Int32;                                          


어쩔 수 없이 설명이 길어져야 하는 파트이므로, 설명을 늘여놨는데 그냥 읽고 넘어가길 바란다.
이제 실제 값을 받아보자.


 
이전시간의 board_write.html 샘플이다. 4개 필드는 차례대로, name, title, content, password 4개이다. 이 값을 board_write.done.aspx 파일에서 받아서 한번 출력해보자.

1. board_write.html 에서 POST방식으로 board_write_done.aspx 파일로 넘기도록 한다.
2. 단순한 방법으로, Request[""] 를 이용해 4개의 항목을 받는다.
3. Response.Write() 로 단순하게 뿌려주자.

방법은 이미 다 나왔지 않는가? 꼭 직접 해보도록 하자.

1번은 board_write.html 파일을 열어, <form>태그를 수정한다.
<form method="post" action="board_write_done.aspx">

2,3 번은 board_write_done.aspx 파일에서 해결해야 하므로,

board_write_done.aspx


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

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

 void Page_Load()
 {
  string name = Request["name"]; 
  string title = Request["title"]; 
  string content = Request["content"]; 
  string password = Request["password"]; 

  Response.Write("이름 : " + name + "<hr>");
  Response.Write("제목 : " + title + "<hr>");
  Response.Write("내용 : " + content + "<hr>");
  Response.Write("비번 : " + password + "<hr>");

 }

</script>


이렇게 받고, 출력하면 되겠다.
다음은 그에 대한 결과이다.



혹시, 필자처럼 한글이 깨진다면 다음 파일(web.config)을 다운로드 받아서 홈디렉터리 폴더(c:\home)에 넣도록 하자. asp.net 이 실행될 때 가장 먼저 읽어오는 각종 설정 등을 지정하는 파일로, 해석하는 언어(Localization) 또는 인코딩(Encoding)을 제대로 못하는 경우이다.

Web.config




GET방식도 별 문제 없이 같은 방법으로 이용할 수 있다.

이렇듯, 값을 받기 위해서는 Request["name명"] 을 이용하면 되고, 그것을 string 형으로 받으면 된다. 이 자료가 계산되어야 한다면 해당 자료형으로 바꾸어서 사용할 수 있을 것이다.


이번시간의 마지막으로, Request 클래스의 ServerVariables 라는 컬렉션을 사용해보겠다. 컬렉션 이름을 봐도 "서버의 변수"정도로 해석하면 될 것 같다.

컬렉션이므로, 어떤 값이 있을지는 모르겠지만, 중괄호[] 를 이용하여 값을 읽어올 수 있을 것 같다. 또한 서버 변수이므로 조작은 불가능할 것 같은 느낌이 온다. (서버 변수는 서버의 상태에 대한 값이기 때문에 조작할 필요가 없지 않을까?)

string Request.ServerVariables["읽어올키"];

그렇다면, Request.ServerVariables 컬렉션은 어떤 키를 가지고 있을까?
모든 키를 출력해보기 위해, 다음을 수행해보자.

server_val.aspx


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

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

 void Page_Load()
 {

  foreach(string vals in Request.ServerVariables)
  {
   Response.Write( "[키이름] <font color=red>" + vals + "</font> ==> [키값] <b>" + Request.ServerVariables[vals] + "</b><hr>" );
  }

 }

</script>


빨간색을 유의 깊게 보자.
컬렉션의 모든 키를 가져오기 위해 foreach 라는 키워드를 이용했다.

foreach (컬렉션 값의 자료형 변수명 in 컬렉션명);
{
        ..       
}

이런 형식으로 사용가능하다.
이는 차례때로 변수명은 해당 컬렉션명의 키 값을 가져오게 된다. 그리고 HTML을 넣어서 이쁘게(?) 출력해보면 각 키/값을 하나씩 구분하며 볼 수 있을 것이다.


이번 강의는 여기까지이다.
<form> 값을 받아보았으며, 값을 받기 위해 사용하는 자료형인 컬렉션(Collection)에 대해 설명하였다. 여러가지를 생각해보고, 직접 꼭 복습하기 바란다.


3 Comments
  • 프로필사진 유치준 2011.06.18 20:58 405 에러가 나오는데
    뭐가 문제인지 잘 모르겟네요
    그대로 따라했는데, board_write_done.aspx 실행 부분에서

    HTTP 오류 405.0 - Method Not Allowed

    잘못된 메서드(HTTP 동사)가 사용되고 있으므로 지금 찾고 있는 페이지를 표시할 수 없습니다.

    라고 나오는데
    아무래도 권한 문제인거 같습니다만, 해결법을 찾을수가 없군요.. 혹시 아시는 내용 잇으면 알려주시면 감사하겠습니다.
  • 프로필사진 유치준 2011.06.18 20:59 아 참
    윈 7 (64) 이고 IIS 7.5 버전이라
    여기 강좌환경과는 같지 않습니다.
  • 프로필사진 유치준 2011.06.18 21:08 권한 설정을 좀 바꿔봤더니 동작은 되는데
    하도 여러개를 바꿔서 뭘 바꿨는지 까먹는...ㅡㅡ;...후
댓글쓰기 폼