관리 메뉴

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

닷넷 게시판 만들기 Part 39 - 글목록 (Repeater 사용) 본문

ⓟrogramming/asp.net 게시판

닷넷 게시판 만들기 Part 39 - 글목록 (Repeater 사용)

가이브 2011. 5. 30. 16:08


2011/05/13 - [ⓟrogramming/asp.net 게시판] - 닷넷 게시판 만들기 Part 31
2011/05/16 - [ⓟrogramming/asp.net 게시판] - 닷넷 게시판 만들기 Part 32
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
2011/05/25 - [ⓟrogramming/asp.net 게시판] - 닷넷 게시판 만들기 Part 36
2011/05/26 - [ⓟrogramming/asp.net 게시판] - 닷넷 게시판 만들기 Part 37
2011/05/27 - [ⓟrogramming/asp.net 게시판] - 닷넷 게시판 만들기 Part 38

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


이전에 만든 Board 라이브러리에 만들어놓은 List(string categroy) 메서드를 이용해서 리스트 페이지를 구현해보자.
예상되는 결과물은 이미 만들어놓았으니, 이제 실제 자료를 그대로 놓아주면 되겠다.

리스트에서 글 목록은 board_list.aspx 파일이 로드가 될 때 자동으로 불러와야한다.
그러므로 파일이 로드될 때 자동으로 실행하는 메서드인 Page_Load() 를 사용하자. 또 Board 라이브러리를 사용해야 하므로 Study 네임스페이스를 참조, DataTable 을 사용하기 위해 System.Data 를 참조하자. (아래의 소스에는 빠져있다)

그리고 우리가 하드코딩한 실제 리스트 내용(필자는 3개)을 하나만 남기고 삭제한다. 그리고 그것을 Repeater 웹폼으로 감싸주자. (이미 다 해봤으므로 Repeater 사용법에 대해서는 생략하도록 한다.)
리스트에 사용될 Repeater 의 ID는 "rptList" 로 정하자.

게시판 <tr> 첫 줄은 테이블의 제목이고, 그 다음의 <tr>들은 모두 내용일 것이다. 실행해보면 샘플용으로 하드코딩한 자료는 나타나지 않고 비어있다. 이유는 Repeater 의 <ItemTemplate>항목은 Repeater에 DataSource 가 있어야 출력되기 때문이다.

이제 상단의 Page_Load() 이벤트에서 자료를 가져와서 rptList 에 자료를 넣어주자. Part 29 에 나왔던 그대로이다.

라이브러리에서 모두 처리하므로 소스가 간단하다. 그리고 실행해보면 Board.List()의 쿼리문 결과대로 category 컬럼이 test 인 자료 수 만큼 나올것이다.

그림으로 보면 필자가 글쓰기 페이지에서 막~ 갈겨 쓴 내용은 총 7개가 존재한다.
이제 할 일은 실제 데이터가 보여지가 하는 것이다. Repeater 의 <ItemTemplate> 내에 있는 번호, 제목, 작성자, 작성일시, 조회, 추천의 실제 내용을 <%# Eval("[컬럼명]") %> 으로 바꿔준다.

DB의 board 테이블 컬럼명이 기억나지 않으시다면 다시 DB 구조를 보시기 바란다.


이렇게 컬럼 값을 그대로 붙여주면 판막이처럼 박히게 된다. 다음 결과를 보도록 하자.


결과를 한번 자세히 보자. 별 문제 없어보이지만 뭔가가 이상하지 않는가?
게시판은 편의상 최신에 올라온 게시글을 먼저 볼 수 있게 최근에 올라온 글이 맨 위로 향한다. 우리가 만든 Board 에 List()의 쿼리문의 SELECT 는 정렬 없이 조회했기 때문에 최근글이 아래로 내려가 있다.

/bin/Board.cs 파일을 열어서 List() 의 쿼리문을 수정하자.

음영처리된 부분이 ORDER BY [컬럼명] [ASC/DESC] 구문이다. (이제 보니 필자가 4장에서 이 ORDER BY 를 빼먹었다)

SELECT
컬럼1, 컬럼2, ... (혹은) *
FROM
테이블명
WHERE
조건문
ORDER BY
ASC/DESC

ASC는 오름차순(낮은것부터 높은것으로) 정렬이고, DESC는 그 반대이다.
WHERE 절 다음에 나오는 정렬 방법 구문인 ORDER BY 는 위와 같이 사용가능하다. 기본값은 'ASC'이다. 그리고 ORDER BY는 WHERE 처럼 생략이 가능하다.

board 테이블의 모든 컬럼들을 board_id 컬럼을 기준으로 오름차순 조회
- SELECT * FROM board ORDER BY board_id

board 테이블의 title, content 컬럼만 user_id 값이 test 인 자료를 최근(내림차순) 날짜순으로 조회
- SELECT title, content FROM board WHERE user_id='test' ORDER BY regdate DESC

대략 이렇게 사용할 수 있다.

Board.cs 를 수정 후 컴파일하자. 그리고 다시 리스트페이지(board_list.aspx?c=test)를 열어보자.
이제 우리가 원하는대로 자료가 잘 가져왔음을 알 수 있다.


다시 디자인 페이지 소스로 넘어와서, 현재 글의 제목을 눌러도 아무 반응이 없게 링크되어 있다. 다음에 만들 글읽기 페이지는 board_view.aspx 파일명으로 정하기로 하자. 

그렇다면 글읽기 페이지인 board_view.aspx 페이지에서 필요한 변수가 어떤 것이 있을까?
생각해보면, 어떤 글을 읽을 것인지 알려줘야 하므로 게시판 테이블의 고유값인 board_id 컬럼값을 보내줘야 할 것이다. 그리고 현재글의 카테고리 값인 "c" 변수도 계속해서 넘겨줘야 한다. 당장 글 읽기를 구현하기 위해 필요한 값은 이렇게 2개만 있으면 될 것 같다. (카테고리 변수도 필요가 없을듯 하지 않은가?) board_view.aspx 에서는 글목록에서 변수가 하나 추가(고유번호)된 SELECT 문을 실행해서 가져오면 단 1개의 레코드 자료만 가져오게 될 것이고, 이것은 클릭한 그 글이 맞을 것이다. 글번호 변수는 "n"으로 정하자.



(제목 <td>..</td> 태그의 줄이 길어져 여러줄로 개행함)

CATEGORY_ID 는 제일 상단에 전역변수로 지정한 녀석이다. Page_Load() 에서 Request["c"] 값을 넣어주었으므로 원하는 값은 잘 뿌려질 것이다. <%# Eval("category") %>를 넣어도 되고, <%# Request["C"] %> 를 넣어도 똑같은 의미이다.
하나 더 수정해보자. 처음에 하드코딩한 예제값과 다르게 regdate 컬럼은 년월일 시간까지 모두 표시된다. 필자가 생각한 소스에서는 "2011-05-30" 처럼 "년-월-일"만 나와야겠다.

#참고
Repeater 안에서 <%# Eval("컬럼명") %> 으로 DataSource 로 지정된 값을 하나씩 찍어주듯이, <%# .. %> 는 디자인페이지 어디에서든지 사용할 수 있다. 예를 들어 CATEGORY_ID 변수처럼 사용할 수 있는 것이다. CATEGORY_ID 이 변수는 <script language="C#" runat="server">..</script> 수준에서 지정했기 때문에 현재의 페이지에서는 전역 변수와 동일하다. (현재 파일의 어느 메서드에서나 사용가능)

<% Response.Write ("a"); %>

이러한 것은 인라인(In-line) 코딩이라고 한다. <% .. %> 사이에 넣어주는 코드는 프로그램 코드라고 지정하는 것이다.
이 부분은 닷넷이 컴파일하게 된다. 그러나 인라인 코딩은 지양하기 바란다. (당연히 이렇게 해도 상관 없다.) 이유는 본인이 고민하도록 하자. 수단과 방법은 여러가지가 있고, 사용은 여러분들이 알아서 하시면 된다.

날짜를 원하는 형식으로 고치기 위한 방법은 두 가지가 있다. 먼저, Eval("..")는 object 형이다. 그러므로 수정하려는 값은 먼저 원래의 자료형으로 변환을 해야한다. 같이 수정해보자.

 <td width="80"><%# (DateTime)Eval("regdate") %></td>


1. 컬럼값 조작하기 - 변수를 바로 변경(간단하게 변경 가능시)

실제 자료가 담기는 DB의 현재 board 테이블, regdate 컬럼형은 datetime 이다. smalldatetime, datetime 등은 닷넷에서 가져올 때 System.DateTime 형(구조체)으로 사용가능하다. DateTime 에는 ToString() 이라는 오버로드된 메서드가 있다. 그중에 ToString(string 형식) 을 이용하면 매우 쉽게 자신이 원하는 형태로 날짜와 시간을 출력할 수 있다. 

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

꽤 많은데, 절대 외우지말라.. 이런게 있고 이렇게 사용할 수 있구나 하자.
우리가 원하는 형식은 '4자리년도-2자리월-2자리일' 이므로, 위의 링크를 참조해서 그대로 해보면,

<td width="80"><%# ((DateTime)Eval("regdate")).ToString("yyyy-MM-dd") %></td>

이렇게 표현하면 되겠다. 


2. 컬럼값 조작하기 - 메서드를 호출(여러줄의 코드가 필요시)

1번 같은 경우는 DateTime.ToString() 으로, 단 한줄만으로 해결이 가능하지만, 좀 더 많은 코드가 필요할 때를 생각해보자. 보신적이 있는지 모르겠지만 게시판 작성일시에 "1시간 전" 혹은 "1일 전", "일주일 전" 같이 약간 다른 형식으로 나타낼 수도 있다. 그냥 날짜만 표시하는 것 보다 직관적으로 "ㅇㅇ 전" 이라고 표기해주는 것도 좋을 수 있겠다. 이런 기능을 위한 메서드는 아마 없을 것 같으니, 직접 만들어서 써야되는데 이 때 필요한게 메서드 호출이다. 

메서드를 하나 정의해보자. 리턴형은 결과를 가공할 필요가 더 이상 없으니(재사용되지 않으니) 단순하게 string 으로 넘기도록 하고, 이름은 ToCustomTime() 으로 하고, 받아야할 인수는 당연히 DateTime 이겠으나...!
우리 게시판에는 그럴리 없다만(무조건 기본값이 들어가므로) 혹시나 regdate 값이 비어있는 null 이라면 

(DateTime)Eval("regdate") 

이 문법 자체가 오류를 발생시킨다. 그러므로 자료형은 object 로 받기로 하자. 
메서드 정의는 Page_Load() 이벤트와 동급으로 해줘야 하는 것은 이미 알고 있을것이다.


앞서 정한대로 메서드 정의를 하고,



먼저 object 형으로 받은 regdate 를 혹시나 모를 null 값에 대비를 하자. 다시 말하지만 우리 게시판에서는 DB오류가 났으면 나더라도 절대 null 은 나올 수 없을 것이다. 

이제 datetime 을 지금 시간을 기준으로 빼주면 넘어온 datetime 날짜가 얼마나 지났는지 알 수 있다. 
TimeSpan DateTime.Subtract(DateTime 빼줄 값) 를 이용하자. 
TimeSpan 은 따로 MSDN 을 찾아보시면 될 것 같고, 여차여차 해서 만든 메서드는 다음과 같다.

TimeSpan 을 처음보시더라도 MSDN 검색 능력이 있으시므로 별 상관할 바가 아니시리라 생각든다.
여튼, 이 메서드의 기능은 하루이내면 "n시간 전" 이라 출력하는데, 혹시 한시간 이내면 "m분 전" 으로 출력하게 했다. 하루가 넘어갔다면 그냥 원래 날짜로 출력하는 기능이다.

확인하기 위해 날짜출력부분을 다음과 같이 수정하자.


이렇듯, 어떤 데이터처리 웹폼인 Repeater 에서 뿌려주는 값을 조작하는 방법은 두 가지가 있다. 1번처럼 단일 코드로 해결하지 못한다면 메서드를 따로 만들어서 사용하자. 게시판 등을 만들면서 이렇게 사용해야 할 일이 빈번할 것이다. 조회수가 1000 넘어가면 진하게(또는 색을) 표시한다거나, 추천 30 이 넘으면 제목에 <b></b>효과를 준다거나 등등..

리스트는 꽤나 손을 봐야될 것들이 많다. 다~ 이유가 있고 필요하니 손을 보는게 아니겠는가. 나중에 좀 더 필요한 기능이 있다면 추가하기로 하자. 


다음 Part 에서 게시판 글읽기 페이지를 완성시켜보자. (사실 이제 알아서 잘 만드시리라 생각든다)

board_write.aspx


반응형
Comments