관리 메뉴

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

닷넷 게시판 만들기 Part 33 - DB 라이브러리 제작 본문

ⓟrogramming/asp.net 게시판

닷넷 게시판 만들기 Part 33 - DB 라이브러리 제작

가이브 2011.05.18 14:03
2011/05/13 - [ⓟrogramming/asp.net 게시판] - 닷넷 게시판 만들기 Part 31
2011/05/16 - [ⓟrogramming/asp.net 게시판] - 닷넷 게시판 만들기 Part 32

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


회원 가입 폼이 잘 만들어졌는가?


대략 위의 그림처럼 3개의 TextBox (웹폼)컨트롤, 2개의 Button (웹폼)컨트롤로 처음에 계획한 대로 기능의 구현이 완료된 것 같다.

좀 더 고려해야 하는 사항으로 (1)아이디 중복체크를 클릭했을 때 나오는 메시지는 어떻게 처리해야 할 것인가를 생각해보자. 여러가지 방법이 있겠지만, 우리는 간단하게 중복체크 버튼 옆에 메시지를 뿌려주기로 하자. 중복되지 않는다면 "사용할 수 있습니다", 중복되는 아이디라면 "이미 사용중인 아이디입니다" 정도로 하도록 한다. 확인하는 과정은 클릭 이벤트에서 이루어질 것이다.

그리고 (2)회원가입하기를 클릭했을 때 확인해야 할 사항이 있다. "아이디 중복체크"를 하였는지. 비밀번호와 닉네임은 모두 입력되어 있는지 등이 있겠다. 빈 칸을 체크하는 방법은 예상대로 쉽게 TextBox의 속성인 Text 가 비었는지 확인하면 될 것 같은데, "아이디 중복체크"를 하였는지는 어떻게 체크할 수 있을까? 한번 곰곰이 생각해보자.
필자의 생각으로는 서버컨트롤로 <input type="hidden" ..> 을 하나 두었으면 될 것 같다. 이 값이 처음에는 없다가 중복체크를 수행하였다면 값을 바꿔주는 것이다. 예로 빈 값에 체크 후 "1"이 들어간다면 체크를 했다고 하면 문제가 없지 않을까? 
회원가입시 나타나는 오류 메시지들은 '회원가입하기'버튼 하단에 나타내기로 하자.

이제 (1),(2)번에 언급했던 기능상 필요한 컨트롤들을 배치하도록 해보자. 각종 메시지 출력용 웹폼은 <span>태그로 랜더링되는 Label 을 쓰면 무난할 것 같다. 그리고 아이디중복체크 확인용 값을 가지고 있을 컨트롤은 <input type="hidden"> 으로  렌더링되는 HiddenField 웹폼을 이용하자.

1. "중복체크" 버튼 우측에 Label 컨트롤 배치. id는 lblCheckResult
2. "회원가입체크" 다음줄에 Label 컨트롤 배치. id는 lblJoinResult
3. <form>태그 바로 밑에(위치는 상관없으나 일반적으로 hidden 값은 모아두자) 배치. id 는 hdnCheckID


위의 내용에 따라  member_join.aspx 파일을 수정하도록 하자.
이렇게 세 개의 컨트롤을 추가했을 때는 당연히 겉으로 볼 때는 변화가 없다. 버튼을 클릭할 때 나오는 메시지나 값이 변경될 것이다.

member_join.aspx 의 수정된 해당 부분

<form runat="server">
<ASP:HiddenField id="hdnCheckID" runat="server" />

 아이디
 <ASP:TextBox id="txtID" runat="server" />
 <ASP:Button id="btnCheck" runat="server" text="중복체크" OnClick="btnCheck_Click" />
 <ASP:Label id="lblCheckResult" runat="server" />
 
 <br> 
 비밀번호
 <ASP:TextBox id="txtPass" textmode="password" runat="server" />

 <br> 
 닉네임
 <ASP:TextBox id="txtNick" textmode="password" runat="server" />

 <br> 
 <ASP:Button id="btnJoin" runat="server" text="회원가입하기" OnClick="btnJoin_Click" />

 <br>
 <ASP:Label id="lblJoinResult" runat="server" />

 </form>

회원 가입에 필요한 것은 이제 모두 끝이 났는데, 여기서 회원 가입의 처리 과정을 머릿속으로 정리하고 넘어가보자. 혹시 지금까지 했던 이 과정을 이해하지 못하시는 분들은 소스 코딩하고 뭐 해봐야 별 의미 없으니 처음부터 다시 읽고 따라해보도록 한다. (내용에 대해 이해가 안되거나, 궁금한 사항이 있다면 언제든지 물어보시면 되겠다)

1. 텍스트박스 3개는 자유롭게 입력할 수 있는 한 줄 입력칸이다.

2. 아이디에 중복체크가 필요한 이유는 의미상으로나 회원 ID는 중복되면 누가 해당 회원인지 알 수가 없기 때문에 당연히 중복시키지 않아야겠다.

3. '중복체크'를 클릭하면 회원 ID가 제대로 입력되었는지 확인하고, DB로부터 현재 가입된 회원 중에서 지금 입력한 ID를 가진 자료가 있는지 확인하고, 있으면 중복. 없으면 사용가능. 중복일 때는 hdnCheckID의 값(Value 속성)을 비우고, 사용가능할 때는 간단하게 "1"을 넣어서 체크된 것을 기록해둔다.

4. '회원가입하기'를 클릭하면 중복체크가 제대로 되었는지 확인하고, 비밀번호와 닉네임이 입력되어 있는지 확인한다.

여러분들이 생각했던 것들이 필자의 생각과 일치하길 바란다.



자, 이제 우리가 해야될 것이 실제 프로그램 코드를 작성하는 일이다.
DB를 연동해서 회원 가입때 해야되는 프로그램 코드와 로그인/로그아웃 등, 회원가입 이외에 게시판 처리도 모두 작성해야 한다. 이 과정에서는 거의 90% 이상이 DB에 자료를 넣거나 DB로부터 자료를 빼야되는 코드가 많이 차지할 것이다.

그래서, 일단은 DB를 따로 관리하는 라이브러리(Library) 형식으로 하나 만들려고 한다. 앞으로 작업해야할 DB관련 처리를 한 곳으로 밀어주자는 것이다. 물론 모두 그 때 그 때 만들어도 상관 없고, 작동하는데에 문제가 없다. 하지만 따로 만들어주는 이유는 다른건 몰라도 앞으로 빈번하게 사용할 예정이기 때문이다.

프로그래밍에서 작성되는 라이브러리는 라이브러리 그 자체의 기능에 충실해야한다는 것이다.
지금 우리가 공부하고 있는 게시판 뿐만 아니라 다른 어떤 DB연동 프로그래밍에서 사용할 수 있어야 한다는 말이다. Web으로든, 윈도우 어플리케이션용으로든, 닷넷을 사용하는 스마트폰 앱에서든.. 이것이 잘 만들어진 라이브러리이다. (물론 플랫폼 간에 한계가 있을 수 있다)

asp.net 에서는 /bin 폴더에 dll 형식으로 라이브러리를 넣어서 땡겨쓴다. 우리가 만들 DB라이브러리가 바로 이렇게 사용될 녀석이다. 이미 앞에서 다 해봤으므로 그 때 공부하신 분들은 이해가 빠르실 것이다.

우리가 만들 DB라이브러리는 다음의 기능을 구현할 것이다.

1. 결과가 없는 쿼리문 실행을 위한 메서드
2. 결과가 한개의 컬럼만 있는 쿼리문 실행을 위한 메서드
3. 결과가 두개 이상의 자료(컬럼or레코드)가 있는 쿼리문 실행을 위한 메서드

이 라이브러리는 어디서 어떻게 적용할 수 있을까?
회원가입 - 1번. 회원로그인 - 2번. 회원탈퇴 - 1번. 회원정보수정 - 1번. 게시판리스트 - 3번. 게시판글쓰기 - 1번. 게시판글읽기 - 3번. 게시판검색 - 3번. 게시판댓글쓰기 - 1번. 게시판댓글수정 - 3번. 추천하기 - 1번. 쇼핑몰물품리스트-3번. 쇼핑몰물품등록 - 1번. 쇼핑몰장바구니리스트 - 3번..

얼른 만들어보기로 하자.
빈 페이지를 열고 이것을 홈디렉터리에 bin 폴더를 하나 만들어서 여기에 Database.cs 파일명으로 저장하자. 컴파일 한 후에 바로 사용할 수 있을 것이다.

네임스페이스, 클래스, 메서드 모~두 만드는 사람 마음대로 지정을 하면 되겠다.
여기서는 필자는 네임스페이스를 Study 로 구성해보았다.

기본적으로 데이터베이스 관련 네임스페이스를 참조 (using System.ZZZ,YY) 하자.

Database.cs 구조

using System;
using System.Data;
using System.Data.SqlClient;


namespace Study
{
 public class Database
 {

  public Database()
  {
  }

  private void DBOpen()
  {
  }


  private void DBClose()
  {
  }

  public void ExecuteQuery(string query)
  {
  }

  public object ExecuteQueryResult(string query)
  {
   return null;
  }

  public DataTable ExecuteQueryDataTable(string query)
  {
   return null;
  }


 }
 
}




빨갛게 표시한 것들이 실제 사용할 메서드이다. DBOpen() 메서드와 DBClose() 메서드는 라이브러리에서 내부적으로 DB를 오픈 - 수행 - 닫기를 할 것이므로 외부에 노출될 필요가 없다. 그러므로 접근한정자를 private 으로 설정한다.

ExecuteQuery(string query) 메서드는 결과가 없는 void 이다. 인수로 1개의 string 형을 받고, 그것은 실행할 쿼리문이다. 어떤 쿼리가 올지 모르겠지만 이 녀석은 넘어온 쿼리문을 실행만 하면 그만이다.

ExecuteQueryResult(string query) 메서드도 쿼리문을 실행하는데, 단 1개의 결과를 리턴하게 된다. 보다시피 object 형이다. object 형은 닷넷의 모든 자료형의 형태이다. 쿼리문을 실행시키는 우리들은 리턴의 자료형을 잘 알고 있다. DB 테이블 구조를 알고 있고, 각각의 쿼리문을 실행하는 목적을 이미 알고 있기 때문이다. 그 결과가 int(int 컬럼) 이든, string(varchar 컬럼) 이든, DataTime(datetime 컬럼)이든 결국 object 하나로 통일시켜서 호출한 곳에 다시 결과를 넘겨주면 되는 것이다.

ExecuteQueryDataTable(string query) 메서드는 2개 이상, 그러니까 1개의 레코드이든 2개이상의 레코드에 1개의 컬럼이든 단 1개의 단일 값을 제외한 모든 결과를 받기 위한 용도로 사용하기 위한 메서드이다. 마찬가지로 쿼리문의 결과를 DataTable 이라는 4장 Database 에서 해봤던 DataTable 객체로 넘겨주게 된다. DataTable 의 장점이 실제 DB의 테이블과 유사하므로 직관적으로 사용하기에 좋다.

먼저 DB를 열고 닫는 메서드부터 완성시켜보자.
DB를 열게 되면 서버와 통신이 가능한 상태이며, 이 상태에서는 아무래도 Resource(자원)을 소모하게 된다. 그러므로 쿼리를 실행시킬 순간에 잠깐 열었다가 쿼리를 실행 후에 닫아서 자원을 반환받는 것이 좋다. 홈페이지가 소문나서 만명이 매 평균 5초당 1개씩 쿼리를 실행시킨다고 생각해보자. 서버가 힘들어하지 않을까? 

앞 소스에서 보듯이 DBOpen() DBClose() 두개를 다음을 참고하여 완성시켜보자.

[작성중인 Database.cs 파일]

(타이핑 해보시라고 일부러 화면캡처로 올립니다. 클릭하면 크게 보입니다)


반전된 부분이 추가된 소스이다. 두 개의 메서드에서 같은 DB 연결 객체인 SqlConnection 을 사용해야 하므로 클래스변수(클래스 내에서 어디든 접근할 수 있게)로 지정한다. 이름은 dbcon 이다.

생성자인 public Database() { .. } 에서는 무조건 객체를 인스턴스화 시킨다. 이 라이브러리가 인스턴스화 될 때 수행될 것이다. 그리고, 연결문자열을 입력한다. (4장에서 다루었기 때문에 부가설명은 생략하겠다) 사실 이렇게 라이브러리에 연결문자열을 두는 것은 좋지 않은 방법이다. web.config 설정 파일 등에 넣어주고 참조하는게 일반적이다

DBOpen() 메서드는 단순하게 SqlConnection 객체의 Open() 메서드를 호출한다. 그런데 if () 가 하나 감싸져 있는데, State 열거형은 현재 dbcon 객체의 상태를 가지고 있다.

대충 읽어봐도 알 수 있듯이, 현재 상태가 Open 중이 아니라면 Open() 해라~ 라는 말이다.

DBClose() 메서드 역시 닫힌 상태가 아니라면 Close() 해라~ 라는 말이겠다.

이제 이 파일을 5장의 일부분인 Part 27 에서 이미 해봤듯이 Database.cs 를 라이브러리로 컴파일 해보자. Editplus 에 자동으로 컴파일이 되게 만들어 놓으셨다면 매우 쉽게 할 수 있을 것이다. (여기서는 따로 설명하지 않으니 Part 27 을 참고하시기 바란다)

소스에서 public Database() { .. } 에 있는 연결문자열 상수('server=어쩌고 저쩌고 ..') 값이 틀려도 닷넷은 당연히 인식하지 못한다. 틀리든 말든 컴파일은 잘 수행될 것이다. 프로그램의 컴파일이 잘 되는 조건은? 문법만 맞으면 그만이다. 

무소식으로 컴파일이 잘 되었으면 /bin 폴더에 Database.cs 파일과 컴파일 된 라이브러리 결과물인 .dll 파일이 있을 것이다. 이제 member_join.aspx 등 우리의 웹사이트에서는 Study.Database 클래스를 이용할 수 있게 되는 것이다.

그럼, 여러분들이 지금 해봐야 될 것은??  당/연/히!
member_join.aspx 에 (1)Study 네임스페이스를 참조하고 (2)Page_Load() 메서드를 만들어 그 안에다가 (3)Database 를 인스턴스화 시켜보는 것이다.

사실 만들다 만 것이기 때문에 의미는 없지만, 이렇게 해본 후 오류가 발생하지 않았다면 dll 라이브러리가 잘 만들어졌고, 호출되어졌다는 의미가 되겠다.

이제 다시 Database.cs 파일로 돌아와서, 실제 우리가 사용할 남은 메서드들을 구현해보자.


앞서 말씀드린 그대로이다. 열고, 실행하고, 닫아준다. 리턴이 있는 두 개의 메서드는 각각 리턴할 값을 그대로 마지막에 넘기면 된다. 다 해본 것들이다. 그러므로 별 설명이 필요가 없으리라 생각한다.

여러분들이 주목해야 할 점은, 이런 형식의 라이브러리를 만들기 위해서는 여러분들이 많이 생각해보셔야 한다는 것이다. 무작정 무언가를 만들어보려고 해도 필요성을 느끼지 못하면 만들기가 힘든게 사실이다. 그리고 앞으로 수없이 만나게될 문제점은 어떻게 할 것인가?
왜 어떻게 이런 것들이 만들어져야 되며 더 쉽게 하는 방법은 없을까 고민해보자. 뭐든지 고민하자.

마지막으로 컴파일을 한번 더 하고 이 녀석들을 호출해서 사용해보자.
그리고 aspx 파일 아무거나 만들어서 여러분들이 신나게 가지고 놀아보자.

DB에 테이블을 따로 하나 만들고, 이 라이브러리를 이용해서 INSERT, DELETE, UPDATE 쿼리문을 날려보며 DB관리툴에서 잘 되고 있는지 확인도 해보자. SELECT를 하여 DataTable 로 자료를 받아서 DataTable.Rows[행번호]["컬럼명"] 으로 읽어도 보자. (object 형이며, 행번호는 0이 처음이다)

이제 여러분들은 asp.net 에서 DB를 마음대로 가지고 놀 수 있으실 것이다.

Database.dll

혹시나 바쁘신 분들을 위해 컴파일된 라이브러리를 첨부한다. Database.cs 파일은 제공해드리지 않는다. 직접 타이핑 해보시라는 의미다.

다음 파일은 이번 Part 에서 수정된 파일이다.

member_join.aspx




다음시간에..










3 Comments
  • 프로필사진 유치준 2011.06.22 09:15 음...버전이 틀려서 인지
    파서 오류가 나오는군요
    가이브님이 올려주신 dll파일로 페이지 로딩하면 잘 뜨는데
    제가 database.cs 컴파일 해서 로딩하면 오류가 나오네요. 아직 해결방법은 못찾고 있는...후
  • 프로필사진 가이브 2011.06.22 13:15 신고 파서 오류라면 문자열에서 잘못되었을 수 있어요. SqlConnection 생성자 상수 (server=...;user id=..) 를 다시 확인해보세요.

    cafe.naver.com/guyv

    카페에 자세히 스샷하고 올려주시면 더 문제점을 확실히 알려드릴 수 있겠네요. ^^

    그리고 버전문제는 절대 아니예요~
  • 프로필사진 Shock Z 2011.06.24 16:16 신고 여기에는 파일을 올릴수가 없군요

    http://shockz.tistory.com 가시면 제가 스샷 해놧습니다.

    무슨 문제인지 잘 모르겟군요
댓글쓰기 폼