관리 메뉴

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

닷넷 게시판 만들기 Part 34 - 로그인 전략 본문

ⓟrogramming/asp.net 게시판

닷넷 게시판 만들기 Part 34 - 로그인 전략

가이브 2011. 5. 19. 14:51

2011/05/13 - [ⓟrogramming/asp.net 게시판] - 닷넷 게시판 만들기 Part 31
2011/05/16 - [ⓟrogramming/asp.net 게시판] - 닷넷 게시판 만들기 Part 32
2011/05/18 - [ⓟrogramming/asp.net 게시판] - 닷넷 게시판 만들기 Part 33


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

[시작하기전에..] member_join.aspx 에 닉네임인 txtNick 서버컨트롤에 textmode 속성은 빠져야되는데 들어가있네요. 수정해주세요.

이전 시간에 이어서 회원가입 페이지인 member_join.aspx 파일을 열자.

먼저 회원ID 중복체크를 처리해보자. 회원 ID는 선행적으로 다음의 조건이 만족해야 사용 할 수 있게 정하자.

1. 회원 ID는 비어있을 수 없음.
2. 회원 ID는 영문자 또는 숫자로만 가능.
3. 회원 ID는 4자 이상, 12자 이하만 가능.


1번은 txtID 의 (TextBox.)Text 속성이 비었는지 확인하면 된다.
2번은 필자가 알기로는 기본적으로 닷넷에서 제공해주는 문자열 메서드는 존재하지 않는걸로 알고 있다. 그러므로 사용자가 입력한 문자열이 영문자와 숫자로만 이루어졌는지 체크를 해야한다. 어떻게 할 수 있을까? (직접 코드를 작성할 수 없더라도 방법을 생각해보자)
3번은 문자열의 바이트(byte)수를 리턴해주는 (String.)Length 속성을 이용해서 4보다 작거나 12보다 크다면 사용하지 못하게 한다.

이렇게 1,2,3 번을 체크해서 모두 패스하였으면 이제 DB에 사용자가 입력한 회원ID로 member 테이블을 검색을 한다. 자료가 없다면, 중복되지 않은 것이고 자료가 있다면 중복된 ID이므로 사용하지 못하게 하자.

그리고 마지막으로 사용할 수 있는 ID로 확인되면 lblCheckResult 컨트롤을 파란색으로 사용가능한 ID라고 메시지를 띄운다. 그리고 회원 가입처리에서 확인하기 위해 hdnCheckID 컨트롤의 값을 "1"로 지정한다. 사용할 수 없는 아이디라면 해당 스텝마다 지정한 오류메시지를 출력하고 hdnCheckID의 값도 빈 값("")으로 지정한다.

이 과정을 프로그램 코드로 작성해보자.

member_join.aspx 아이디 중복 체크 추가

<%@ Register TagPrefix="INCLUDE" TagName="TOP" src="top.ascx" %>
<%@ Register TagPrefix="INCLUDE" TagName="BOTTOM" src="bottom.ascx" %>
<%@ Import Namespace = "Study" %>

 void btnCheck_Click(object sender, EventArgs e)
 {
  string id = txtID.Text;


  // 일단 사용할 수 있는 ID라고 가정
  bool bCheck = true;
  // 출력할 오류메시지 문자열
  string check_message = "";

  
  // 1. 빈ID : 문자열의 앞,뒤 공백을제거한 byte가 0이면
  if (id.Trim().Length == 0)
  {
   bCheck = false;
   check_message = "아이디를 입력해주세요.";
  }
  // 2. 영문자,숫자만 가능
  else if ( !CheckStep2(id) )
  {
   bCheck = false;
   check_message = "공백없이 영문/숫자만 가능합니다.";

  }
  // 3. 4~12자리만
  else if ( id.Length < 4 || id.Length > 12  )
  {
   bCheck = false;
   check_message = "4~12자로 정해주세요.";
  }

  
  // 모두 통과하였으면
  if (bCheck)
  {
   // 최종 DB체크
   Database DB = new Database();

   // member 테이블에 user_id가 "id"변수인 자료가 총 몇개?
   string query = "SELECT COUNT(*) FROM member WHERE user_id='" + id + "'";

   // 쿼리의 결과는 1개 뿐이고, int 형이다.
   int result_count = (int)DB.ExecuteQueryResult(query);

   // 자료가 존재함 (존재한다면 1개밖에 있을 수 밖에 없다) - 사용불가
   if (result_count == 1)
   {
    lblCheckResult.ForeColor = System.Drawing.Color.Red;
    check_message = "이미 존재하는 ID입니다.";
    hdnCheckID.Value = "";
   }
   // 자료가 없음 - 사용가능
   else
   {
    lblCheckResult.ForeColor = System.Drawing.Color.Blue;
    check_message = "사용할 수 있는 ID입니다.";
    hdnCheckID.Value = "1";
   }
  }
  // 통과하지 못헀다면
  else
  {
   lblCheckResult.ForeColor = System.Drawing.Color.Red;
   hdnCheckID.Value = "";
  }
   
  // 메시지를 뿌려준다.
  lblCheckResult.Text = check_message;
 }

 bool CheckStep2(string text)
 {
  int k = 0;

  for(int i=0;i<text.Length;i++)
  {  
   char c = text[i];

   //영어체크
   if( ( 0x61 <= c && c <= 0x7A ) || ( 0x41 <= c && c <= 0x5A ) )
    k++;
   //숫자체크
   else if( 0x30 <= c && c <= 0x39 )
                k++;
  }
  if (k != text.Length)
   return false;
  else
   return true;  
 }



일단 데이터베이스 연동이 필요하므로, 이전시간에 우리가 만든 Study.Database 라이브러리를 이용하자. 상단 빨간색처럼 참조를 하기 위해 (using과 같은 의미로) <%@ Import Namesace = ".." %> 문구를 써준다.

처음으로 해야할 코딩은 제일 하단에 파란색 메서드인 bool CheckStep2(string text) 를 먼저 작성하자. 앞서 정했던 확인 사항 중 두번째에 해당하는데, 이 메서드는 문자열을 받아서 그 문자열이 영문/숫자로만 이루어져있는지 확인해준다. 내용이 복잡해 보이지만 대충 분석해보면 넘어온 문자열 text 를 좌측문부터 한자한자 영어인지, 숫자인지 아스키(ASCII)코드로 체크하는 기능이다. 프로그래밍 고수들이 초보를 위해 작성한 것이므로 지금은 구현하는데만 주력하자. ^^

이제 우리들이 만들어 놓은 중복확인 버튼 이벤트인 void btnCheck_Click(object sender, EventArgs e) 메서드에 하나하나 체크하도록 한다. 주석으로 과정을 설명해놓았으니 웹폼 컨트롤의 ID를 확인하는 동시에 직접 타이핑 하면서 이해해보도록 하자. 꽤 길어보이지만 if() { .. } else if { .. } else { .. } 로 마음대로 가져노는 것일 뿐이다. 

모두 작성이 완료되었다면 실행해보자. btnCheck 를 클릭할 때는 포스트백(PostBack)이 당연히 발생하는 것을 알 수 있다. ID를 일부러 사용불가능하게 해서 수행한 후 소스보기를 해보고, 사용가능하게 한 후 소스보기를 해서 비교해보자. lblCheckResult 서버 컨트롤과 hdnCheckID 서버컨트롤의 값이 어떻게 렌더링되는지 확인해보는 것이다.

필자는 이렇게 떡하니 수행 프로그램 코드를 뿌려드렸으나, 여러분들은 직접 해보면서 처음보는 속성이 있다면 MSDN에서 꼭 찾아보자. 이미 앞서 다뤘던 "서버컨트롤" Part 에서 여러번 해봤으리라 생각든다. 

추가적으로 설명이 필요한 것은 DB에서 체크하는 부분인데, DB라이브러리의 3개 메서드 중 "결과가 1개인 것을 리턴"하는 기능의 메서드를 이용했다. 쿼리문은 우리가 알고 있기 때문에 당연히 리턴형도 알고 있기 때문에,

string query = "SELECT COUNT(*) FROM member WHERE user_id='" + id + "'";
int result_count = (int)DB.ExecuteQueryResult(query);

이렇게 object 타입인 DB.ExecuteQueryResult(query) 메서드 결과를 int로 변환이 가능하다. 그리고 실제 사용자 입력값을 함께 연동한 쿼리문은 "문자열일 뿐"임을 누차 강조해왔으며, 문자열 결합으로 원하는 쿼리문을 만들 수 있다.

이제 회원가입버튼을 처리할 차례이다. 

1. 회원ID중복 체크 확인
2. 비밀번호/닉네임이 빈 값인지 확인

이 정도면 별 문제가 없어보인다.

1번은 hdnCheckID 의 값이 "1"이 되어 있다면 패스. 2번은 역시 String.Trim() 로 공백을 제거한 String의 (String).Length 속성의 값(int)이 0 이 아니라면 패스. 모두 패스되었다면 최종적으로 member 테이블에 INSERT 쿼리를 이용해 쿼리문을 잘 만들어서 Database 라이브러리를 통해 실행하도록 하자. 그러면 회원가입이 완료된 것이다.

member_join.aspx 회원가입처리 이벤트 처리


 void btnJoin_Click(object sender, EventArgs e)
 {
  string passwd = txtPass.Text.Trim();
  string nickname = txtNick.Text.Trim();

  // 역시 통과했다고 미리 가정.
  bool bChecked = true;
  string check_message = "";

  // 메서드를 이용한 값비교. '==' 연산자와 동일한 기능이다.
  // ID중복체크 확인값이 없다면
  if (!hdnCheckID.Value.Equals("1"))
  {
   bChecked = false;
   check_message = "아이디 중복확인을 해주세요.";
  }
  // 비밀번호 공백체크
  else if (passwd.Length == 0)
  {
   bChecked = false;
   check_message = "비밀번호를 입력하세요.";
  }
  // 닉네임 공백체크
  else if (nickname.Length == 0)
  {
   bChecked = false;
   check_message = "닉네임을 입력하세요.";
  }

  // 모두 통과됨
  if (bChecked)
  {

   // DB에 INSERT로 저장
   Database DB = new Database();
   string query = "INSERT INTO member(user_id, user_password, nickname) VALUES('" + txtID.Text + "', '" + passwd  + "', '" + nickname  + "')";
   DB.ExecuteQuery(query);

   // 로그인 완료 페이지로 이동
   Response.Redirect("member_join_finish.aspx");

  }
  // 오류발생
  else
  {
   lblJoinResult.ForeColor = System.Drawing.Color.Red;
   lblJoinResult.Text = check_message;
  }
  

 }



이처럼 회원 테이블에 넣는 순수 쿼리문 문자열은 다음과 같다.

query = "INSERT INTO member(user_id, user_password, nickname) VALUES('','','')";

여기에 사용자 입력값을 넣어야 되니 1차적으로 변수를 넣을 수 있게 한다.

query = "INSERT INTO member(user_id, user_password, nickname) VALUES('" + + "','" +  + "','" +  + "')";

단순 문자열 결합으로 쿼리문을 만드는 과정이니 헷갈리지 말자. 큰 다옴표를 닫고, 문자열 변수와 결합해준다.

query = "INSERT INTO member(user_id, user_password, nickname) VALUES('" + txtID.Text + "','" + passwd + "','" + nickname + "')";

문자열 변수(query)를 Response.Write 로 찍어서 눈으로 직접 확인을 해보는 버릇을 들이면 매우 도움이 될 것이다.

위의 코드는 모두 테스트를 해보았으므로 당연히 잘 작동한다. 별 설명이 필요없어도 될 듯하다. 처음보는 코드는 Response 클래스의 Redirect("") 메서드인데, 이 메서드는 강제로 해당 페이지로 이동시키는 기능을 한다. 즉, DB에 저장한 후 "member_join_finish.aspx" 페이지를 열어라는 말이 되겠다.

member_join_finish.aspx 파일은 index.aspx 파일을 다른 이름으로 저장한 후에 회원가입 후 환영 메시지 등을 자기 마음대로 이쁘게 꾸며주면 될 것 같다.

여기까지가 회원가입처리의 마지막이다. 내용에는 말씀드리지 않은 "발생할 수 있는 큰 문제점"들이 여러가지가 있는데 일단은 기능 구현에 집중하도록 하자. 원래 프로그램이라는게 만들어진 후 다듬고 또 다듬어야 좋은 프로그램이 될 수가 있다.

소스의 내용 자체는 여러분들이 이미 다 알고 있는 것들이라 생각한다. 즉 게시판이든 뭐든 만들 준비가 되어있다는 말이다. 어떻게 시작하는지 모를 뿐이다.

home_part4.zip

위의 소스파일은 필자가 여기까지 진행한 모든 내용이다. 소스 등 참고하는 용도로 사용하고, 여러분들은 나름대로 각자가 개성있게 만들어보시길 바란다.


다음시간에 로그인기능 등을 계속해서 이어가도록 하자.


반응형
Comments