관리 메뉴

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

닷넷 게시판 만들기 Part 36 본문

ⓟrogramming/asp.net 게시판

닷넷 게시판 만들기 Part 36

가이브 2011.05.25 18:07

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

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


이번 Part 를 시작하기 전에, 지금까지 해본 것들을 정리해보자.

1. 홈페이지 전체 구도 잡기.
2. 회원가입, 게시판에 들어갈 자료 정리 및 테이블 설계
3. 윗부분, 아랫부분 전체에 들어가는 공통 컨덴츠 따로 분리 (사용자 컨트롤 - ascx)
4. DB 통신용 라이브러리 제작 (dll 형태)
5. 회원가입 기능
6. 회원로그인 및 로그아웃. 세션 변수를 이용해 상황별 레이아웃 변경 (Panel 웹폼 또는 div 서버컨트롤)
* 다른 건너뛴 기능 및 수정할 것들은 독자들이 알아서 기능 채워넣기 (^^)

우리는 지금 닷넷 개발 툴인 Visual Studio 을 사용하지 않고 문서 편집기로 개발중이다. 사실 Visual Studio 로 개발하면 매우 쉽다. 다시 말하면 필자가 여러분에게 설명하기가 아주 쉬워진다. (설명이 필요없는 그림 위주의 만화책이 될 정도로) 결론은 따라해봐야 남는게 없기 때문에 일부러 메모장으로 진행하는 것이다.

디자인과 프로그래밍 코드가 분리되면 차후 수정하거나 비슷한 프로그램을 만들기가 간단해진다. 겉모습이나 기능성이 중요한 디자인은 여러번 바뀔 가능성이 높기 때문이다. 그리고 프로그램 코드는 따로 그 부분만 수정하면 잘 작동하기 때문에 오류 발생이 줄어들기도 하다.


6장을 진행하는 지금 위의 그림에서 좌측부터 3개의 박스 중 1,2번인 디자인페이지와 프로그램코드를 함께 aspx 에서 작성하고 있다. 라이브러리는 현재 데이터베이스 처리 관련된 녀석 하나를 만들어 놓은 상태이다. 중간에 있는 프로그램코드(.cs) 파일들은 .aspx 파일(디자인페이지)에서 사용하는 PostBack 기능을 하는 버튼 또는 컨트롤들의 이벤트를 처리하는 녀석들이다. Visual Studio 에서는 이를 기본적으로 분리해두고 있으며 프로그램 수정시마다 해야하는 귀찮은 컴파일(Build, 빌드) 작업을 자동으로 해주며 어떤 오류가 있는지를 직관적으로 보여주고 수정이 쉽다. 대충 클래스만 알고 있으면 자동으로 문법을 완성시켜주는 인텔리센스 기능으로 메서드나 프로퍼티의 인자가 어떤게 들어가는지, 오버로드된 메서드가 몇개나 있는지 MSDN을 일부러 뒤져볼 필요도 없다. 그런데 문제는, 이렇게 툴로 개발한 프로그램은 메모장으로 수정이 용이하지 못하기 때문에 툴을 이용해서 대부분 툴을 이용해서 수정하고 컴파일(빌드)을 해야한다. 

위의 그림을 보면서 설명을 들어보자. 회원가입처리 같은 경우에 member_join.aspx 디자인 페이지에서 버튼 클릭 이벤트를 넣어서 처리했다. 즉 1,2 번이 함께 사용되고는 있지만 실제로는 개념상 분리되었다고도 볼 수 있다. 5장에서 설명한 것 처럼 .aspx.cs 를 만들거나 /app_code 에 넣고 .aspx 파일에는 상단에 페이지 처리 지시자를 명시하여 각각 이벤트를 처리하는 페이지를 따로 .cs 파일에서 할 수도 있다. 말 그대로 "개념"일 뿐, 그림처럼 세 개의 단계(3-tier 개발방식)를 실제로 구현하고 있는 것이다.

그러나 앞서 '회원가입용도의 라이브러리'는 따로 만들지 않았기 때문에 자세하게는 두 단계(2-tier)로 나누었다고 볼 수 있다. [디자인(표현)--로직--데이터처리] 를 분리하지 않았기 때문이다. 

 

위의 그림은 위키피디아의 3-tier 구조 방식에 대해 설명한 그림을 가져온 것이다.
우리가 만든 Database.cs 라이브러리가 DB를 통신하는 녀석이라고 보면 되고, 이는 Data Tier 부분이다. aspx 페이지는 화면에 보여주는 표현되는 녀석이기 때문에 기본적으로 Presentation Tier 이고, 버튼을 클릭해서 처리하는 프로그램 코드는 모두 aspx 에서 필요로하기 때문에 작성한 것이다. 그 안에서 처리하는 방식이 만약 그 프로그램에 해당하는 라이브러리를 사용한다면 그것이 중간에 있는 Logic Tier 라고 볼 수 있다. 현재 회원가입은 라이브러리화를 하지 않은 그때 그때 처리하는 방식으로, Database.cs 처럼 단독적으로 특정 목적성이 있는 것이 아니다.

이제 마지막으로 남은 게시판은 앞서 만든 회원가입과 다르게 라이브러리로 만들 계획이다. 우리가 미리 정해놓은 메뉴에서 "자유게시판", "포토게시판", "방명록" 이렇게 3개의 메뉴를 각각 앞서 만든 회원가입 프로그램 코드처럼 한다면 모두 따로 놀아야 할 것이다. 그러나 우리는 이들을 같은 모듈(Module)을 사용할 예정이다. 말 그대로 같은 자료저장소(데이터베이스 테이블)를 사용하고 같은 형식으로 저장을 하게 될 것이다. 그러므로 이 기능을 종합적으로 처리하는 로직티어로 두어 글쓰기, 리스트 등을 모두 명세해서 만들고 이를 각각의 게시판 종류에 맞게 땡겨쓰는 형태로 만들어야 한다.

Study.Database 라이브러리를 사용해봐서 아시겠지만 라이브러리는 어디서 호출이 되는지 알 필요가 없다. 알아서도 안되며(?), 자신이 처리를 해야하는 기능만 충실히 수행하면 된다. Database 라이브러리를 생각해보자. 이 라이브러리는 자신이 게시판 연동에 사용되는지, 쇼핑몰 개발에 사용되는지 알 필요가 없다. 그저 자신의 기능은 쿼리문 문자열을 DB에 던져주고 말거나, 결과가 있다면 알맞는 결과를 리턴하는 기능이 전부이다. 그렇기 때문에 프로그램을 완성하기 위해 필요한 기능을 조립하듯 라이브러리를 만들거나 구매, 다운로드 해서 구성할 수 있다. 객체지향 프로그래밍 방식의 기본 특징이다.

이번에 만들 게시판 라이브러리의 글쓰기를 한번 생각해보자.
aspx 페이지에는 글쓰는 폼을 만들 것이고, 버튼 클릭시 aspx에서 해당 이벤트 메서드를 실행할 것이다. 그리고 이벤트에서는 사용자가 제대로 입력하였는지, 잘못된 자료가 아닌지 체크를 하고 라이브러리에 밀어주면 라이브러리에서는 해당 값들을 예쁘게 쿼리문으로 만들어서 데이터베이스 라이브러리에 쿼리문을 또 밀어줄 것이다.
지금까지의 말이 좀 복잡할 수도 있지만, 어느 정도 이해는 하고 넘어가자.

필자는 게시판 테이블을 만들어본지 오래되어서 기억이 가물하다. 한번 살펴보자.


뭐든지 기능상으로는 데이터를 기록하는 "쓰기 기능"이 우선되어야 한다. 그래야 다른 기능을 구현하기가 편하다. 데이터가 없는데 글 리스트나 글 보기 기능이 잘 작동하는지 확인하면서 할 수 있겠는가? 

그러므로 처음에는 게시판의 글 쓰기 디자인을 먼저 해야되겠다. 포토게시판, 방명록은 같은 형식이지만 약간 다른 겉모습을 취할 예정이다. 포토게시판에는 글 내용을 적는 란이 없고 제목만 존재한다거나, 방명록은 반대로 제목이 없고 내용만 존재한다거나 하는 기능상의 변화가 있겠다.

기준은 일반 게시판인 "자유게시판"으로 잡도록 하자. 이유는 당연히 우리가 테이블을 구성하면서 계획했던 모든 기능이 들어가기 때문이다. 구차한 설명은 생략한다. 이미 회원가입 페이지이나 이전에 4장에서나 모두 했던 내용과 별 다른바가 없기 때문이다. 정할 것만 정하고 가도록 하자.

글쓰기에 들어갈 사용자 입력내용은 다음과 같다.

1. 제목 (title)
2. 내용 (content)
3. 파일첨부 (file_attach)


실제 사용자 입력은 딱 세 개 밖에 없다. 회원제 게시판으로 기획하였으므로 쓰는 사람의 id와 닉네임(이름)을 이미 알고 있다. 그리고 게시판을 구분하는 카테고리(category)는 메뉴에서 게시판 링크에 GET으로 각각 넘겨주자. 게시판의 고유ID인 board_id 와 작성일시, 초기 조회수, 초기 추천수는 모두 테이블 단에서 기본값을 입력해놓았었기 때문에 따로 채워줄 필요는 없다.

앞에서 그랬듯이 편하게 index.aspx 파일을 다른이름으로 저장하자. 글쓰기 페이지의 파일명은 board_write.aspx 라고 하자. 그리고 내용에 해당하는 <div>..</div> 태그 안에 있는 내용을 싹 지우고 여기에 글쓰기 폼을 작성하기로 하자.

앞으로 이 페이지를 열 때는 카테고리 값을 가져가야한다. 카테고리는 c 값으로 넘기고, 값은 test 로 해서 개발하면서 테스트 용도로 사용하도록 하자. top.ascx 페이지를 열고 "주메뉴" 부분의 자유게시판의 링크 주소를 "board_write.aspx?c=test" 라고 해준다. 앞으로 이 링크를 통해 글쓰기 페이지를 쉽게 열게 하기 위해서이다. 이제 메뉴에 있는 자유게시판을 클릭하면 글쓰기 페이지가 열릴 것이다. 모든 게시판은 이 "c" 값을 계속해서 넘겨주어야 한다. 게시판 각각을 구분하는 기준이기 때문이다.

게시판 글쓰기는 일반적으로 줄과 열이 잘 맞으므로 테이블 태그로 구성하자. 그리고 서버컨트롤인 웹폼으로 모두 배치하도록 한다.

제목은 당연히 한줄이니 TextBox(id=txtTitle) 로 좀 길게 해주자. 내용은 여러줄이 들어가니 제목에 맞게 늘여주고 높이도 적당하게 크게 해준다. TextBox(id=txtContent)에 여러줄로 하기 위해(textarea 태그로 렌더링) TextMode 속성을 Multiline 으로 준다. 그리고 그 다음줄에 파일첨부 컨트롤인 FileUpload(id=upload) 웹폼을 배치한다. 그리고 그 아래에 중간에 "글쓰기" Button 웹폼 컨트롤을 둔다. id는 btnWrite 로 지정하자. OnClick 이벤트의 메서드는 btnWrite_Click 으로 지정하기로 한다.

대략 위와 같이 나올 수 있겠다. 버튼 이벤트 때문에 오류를 피하기 위해 이벤트 메서드도 넣어주기로 하자. 우리는 처음부터 글쓰기 기능은 회원만 가능하게 하기로 했는데, 만드는 과정에서는 생략하기로 하자. 모든 기능을 다 구현한 후에 기능을 넣어도 상관없기 때문이다.

자, 이제 데이터베이스 처리용 라이브러리인 Database.cs 처럼 게시판 용도의 라이브러리도 만들어야 한다. /bin 폴더에 있는 Database.cs 파일을 다른 이름으로 저장하여 Board.cs 로 저장하자. 네임스페이스는 Study 로 동일하게 사용하자.

Board.cs 초기형태

using System;
using System.Data;

namespace
Study
{
 public class Board
 {
 }
 
}


Editplus 에서 설정한 Ctrl+1 을 눌러 컴파일이 잘 되는지 확인하자.

Board.cs 에서는 글쓰기, 읽기, 리스트 등의 기능을 구현하기 위해 데이터베이스와 연동해야한다. 즉 Database.cs 를 사용한다. 이 말은 앞으로 게시판에서 직접 Database.cs 는 사용하지 않는다는 말이다. board_write.aspx 에서는 Board 라이브러리만을 이용해서 글쓰기를 구현할 것이고, (다른 기능의 aspx 들도 마찬가지) Board 에서는 데이터베이스에 자신이 직접 연결하지 않고 Database 라이브러리를 통해서 구현한다는 말이다.



이 그림에서, 게시판의 겉모습을 담당하는 aspx 파일은 사용자가 직접 보는 프리젠테이션 티어에 해당되고, Board 라이브러리가 로직 티어, Database 라이브러리가 데이터 티어라고 볼 수 있다.

Board 에서는 늘상 데이터를 처리해야 하기 때문에 생성자에 DB라이브러리를 인스턴스화 시키도록 하자. 다음처럼 Board 에서 Database 라이브러리를 사용해보자.

Database.dll 을 사용하기 위한 Board.cs 소스 수정

using System;
using System.Data;

// Database 라이브러리를 이용하기 위한 참조
using Study;

namespace Study
{
 public class Board
 {
  Database DB;

  public Board()
  {
   DB = new Database();
  }

  // 여기서부터 필요한 기능의 메서드들.. 


 }
 
}



진하게 표시된 부분이 추가된 소스이다.
aspx 에서 Database 라이브러리를 사용했던 것과 다르지 않다.
이제 다시 컴파일을 해보자.

Board.cs 를 컴파일 하면 위의 그림처럼 오류가 발생한다.

Board.cs(11,3): [ 메시지 ]
 

11번째 줄 3번째에 error CS0246 에러가 발생한 것이다. CS0246 은 오류코드로, 구글이나 MSDN에서 찾아보면 어떤 문제점이고 어떻게 해결할 수 있는지 알아볼 수 있다. 설명문을 보면,

'Database' 형식 또는 네임스페이스 이름을 찾을 수 없습니다. using 지시문 또는 어셈블리 참조가 있는지 확인하십시오.

이렇게 나와 있는데, 우리는 Database 를 사용하기 위해 상단에 using Study; 를 선언했으므로, using 문제는 아니다. 지금의 오류는 "어셈블리 참조"가 안되어서 발생하는 오류이다.

11번째 줄의 코드는 Database DB; 이 부분인데, Database 클래스가 없기 때문에 발생하는 오류이다.

만약 Board.cs 파일에 Database.cs 의 소스에 있는 클래스를 그대로 복사해서 붙여넣고 컴파일을 한다면 오류가 발생하지 않는다. 당연한 말이다. 그런데.. 소스가 없고 컴파일된 dll 파일만 있다면 어떻게 할 것인가? 그렇기 때문에 라이브러리를 사용하려면 "어셈블리 참조"라는 것을 해서 컴파일을 해야한다.

예전에 한번 말했지만, aspx 파일에서는 기본적으로 /bin 폴더에 있는 DLL 라이브러리를 기본적으로 참조해서 컴파일 과정을 수행한다. 그러므로 앞서 Database 라이브러리를 사용했던 회원가입 페이지들은 문제가 발생하지 않는다.

그러나 지금 /bin 폴더에 있는 Board.cs 라이브러리는 이를 수동으로 참조하여 컴파일해야 한다. 일반적으로 닷넷에서나 다른 객체지향 언어인 자바(java) 등에서도 별반 다를게 없는 당연한 말이기도 하다. 만약 우리가 Visual Studio 개발툴을 이용한다면, 개발툴에서는 이런 것들을 모두 자동화해줘서 버튼 하나로 해결된다. 그러나 지금은 클러치가 있는 수동 1종 면허증용 차량을 우리는 운전하고 있지 않은가? (.. 라고 자위하자) 

그러니까, 다시 정리해보면.. asp.net 에서 /bin 폴더에 있는 우리가 dll 을 만들어서 놓은 (또는 다운받거나 업어온 고수들의..) 라이브러리를 우리가 만든 라이브러리에서 사용하려면 using 네임스페이스명 뿐만 아니라 "어셈블리 참조"를 해서 컴파일도 해야 한다.
어셈블리 참조를 해보도록 하자.

예전에 Part 27 에 나와있는  컴파일 명령어는 기억나시리라 생각한다.

prompt> csc_/t:library_c:\home\test.cs
#참고: 밑줄은 공백

이런 형태에서, Board.cs 에서 Database.dll (소스파일을 참조하는게 아니다. 컴파일 된 DLL만 참조 가능하다) 파일을 참조(Reference)해서 컴파일하는 명령은 다음과 같다.

prompt> csc_/t:library_/r:c:\home\bin\Database.dll_c:\home\bin\board.cs

파란색이 추가된 참조방법이다. /r: 인수에 참조할 dll 파일을 1개이상 지정한다. 콤마(',')를 이용하면 다음처럼 2개 이상 DLL 파일도 참조할 수 있다. 

prompt> csc_/t:library_/r:c:\home\bin\Database.dll,c:\home\bin\Test.dll_
c:\home\bin\board.cs


우리는 다음처럼 컴파일 할 수 있다. 필자의 지금 홈디렉터리 폴더는 d:\home2 이다. 상황에 맞게 컴파일을 수행하면 되겠다.


앞으로 자주 해야하기 때문에, Part 26 처럼 역시 Editplus 에서 Database.dll 을 참조하면서 컴파일 하는 것글 만들어보자..

Ctrl+1 로 사용중인, 라이브러리로 만드는건 하나 있을 것이다. Part 26을 참고하면서 Database.dll 을 참조하면서 컴파일 하는 Ctrl+2 를 하나 추가해보자.

필자는 다음처럼 추가하였다. (영문판 Editplus 이다.)


현재 열린 파일의 폴더에서 csc.exe 실행파일을 실행할 때 /r:Database.dll /t:library ${현재파일명} 으로 인수를 줘서 실행해라는 말이다.

이제 Board.cs 에 Ctrl+2 로 컴파일해보자. 문제없이 컴파일이 잘 수행되어야 한다.
앞으로 Board.cs 파일을 수정할 때마다 이렇게 해 줘야한다.


이번 시간에는 앞으로 우리가 만들어갈 형식에 대해 설명을 했고, 게시판 라이브러리(Board.DLL)를 만들어 파일을 작성할 준비도 되었고, Board.cs 에서 Database.DLL 파일을 사용하기 위한 "어셈블리 참조"를 하는 방법도 알아보았다. 앞으로 프로그램 개발시 지금까지 말씀드린 규칙을 지켜서 참조 컴파일하면 문제없이 여러개의 라이브러리를 자유자제로 asp.net 등에서 사용할 수 있을 것이다. 그저 하는 방법만 습득하지말고 어떻게 사용되는지가 중요하다. 그리고 더 나아가서는 내부적으로 무슨 일이 일어나는지도 알아보면 더 재미있을 것이다.


다음시간에 계속..
0 Comments
댓글쓰기 폼