3.데이터 베이스 정의 및 레코드 파일

board_t.sql

USE testdb;

CREATE TABLE BOARD_T(

             NO INT UNSIGNED NOT NULL PRIMARY KEY auto_increment,

         NAME VARCHAR(16),

         EMAIL VARCHAR(50),        

             SUBJECT VARCHAR(80) NOT NULL,

             CONTENT TEXT NOT NULL,

             REGI_DATE DATE,

             CNT INT NOT NULL,

         GROUP_ID INT,

         DEPTH INT,

         GROUP_ORDER INT,

         PASSWD VARCHAR(8)

);

 

 

BoardRec.java

package board;

import java.io.*;

import java.util.*;

public class BoardRec implements Serializable{

    public int num;           // 목록에 표시될 글의 연번

    public int no;            // 글의 index

    public String name;      // 글작성자

    public String email;      // 글작성자 이메일

    public String subject;    // 글제목

    public String content;    // 글내용

    public String regi_date;   // 글작성일

    public int cnt;             // 글조회수

    public int group_id;       // 글의 그룹 번호

    public int depth;          // 답변글의 Depth

    public int group_order;    // 답변글의 순서

    public String passwd;     // 글작성시 패스워드

    // Getter  / Setter 메서드(생략)

public void setGroup_id(int group_id){this.group_id = group_id;}

    public int getDepth(){return depth;}

}

 

3.목록 보기 및 글 내용을 보기 위한 클래스 정의(Board.java)

실제 데이터베이스 연동이 필요한 부분은 앞서 언급했듯이 인터베이스를 구현하여 설계하도록 하겠습니다. DBenv.java 를 미리 컴파일하시기 바랍니다.

 

사용자가 목록리스트를 요청하면 빈즈에서는 필요한 데이터들을 데이터베이스에서 가져옵니다. 문제는 어떤 조건의 데이터를 얼마만큼 가져 오느냐 입니다. 게다가 가져온 데이터는 데이터레코드 타입의 자료형이 될것이고 이 자료들을 적당히 보관해줄 매체가 필요하게 됩니다.

일단 조건은 빈즈의 setProperty를 이용하면 될것이고 자료의 보관은 배열이나 벡터를 사용하면 됩니다. 배열과 벡터의 차이점이라면 크기의 제한이라고 할 수 있습니다.

, 배열은 크기를 미리정해야하는 반면에 벡터는 필요에 따라 그 크기를 늘릴수 있습니다.

여기서는 벡터를 이용하도록 하겠습니다.

, 일단 벡터로 가져온 데이터는 우리가 정의한 데이터 타입으로 형변환을 해야 합니다.

우리는 벡터에 저장되는 자료형이 이미 데이터레코드 타입이라는 전제하에 작업을 하므로

이 부분또한 쉽게 해결할 수 있을 것입니다.

 

- 조건의 설정

필요한 조건들을 생각해보도록 하겠습니다.

우선 페이지,검색어,검색필드 그리고 한 페이지에 출력될 목록의 수 정도 입니다.

이러한 변수들을 setProperty를 이용해 빈즈에 설정하면 되겠습니다.

 

public class Board implements DBenv{

private int page; // 페이지 설정

private int list_cnt; // 출력될 목록의 수

private int total; // 전체글의 개수(페이징 구현에 필요)

private String key; // 검색어

private String field; //              검색필드

}

 

각각의 멤버변수에 필요한 setter 메서드를 만들면 됩니다.

 

public int getTotalPage(){return (int)((total-1)/list_cnt) + 1;}

public void setPage(int page){this.page = page;}

public void setList_cnt(int list_cnt){this.list_cnt = list_cnt;}

public void setField(String field){this.field = field;}

public void setKey(String key){this.key = key;}

 

나머지 부분은 자료실에 있는 소스를 참고하시기 바랍니다.

 

- 목록가져오기

public Vector getList() throws SQLException{

    Connection con = null;

    Statement stmt = null;

    ResultSet rs = null;

    Vector v = new Vector();

    String query ;

    int recNum;             // 레코드의 순번

    recNum = total;

    try{

      con = getDBConnection();

      stmt = con.createStatement();

query=”SELECT “ +

      “NO,NAME,EMAIL,SUBJECT,CONTENT,REGI_DATE,CNT,” +

“GROUP_ID,GROUP_ORDER,DEPTH,PASSWD " +

               "FROM BOARD_T " + getWhere()+ " ORDER BY GROUP_ID DESC,GROUP_ORDER ASC";

rs = stmt.executeQuery(query);

for(int i=0;i<(page-1)*list_cnt;i++){

             recNum--;

             rs.next();

      }

      for(int i=0;i<list_cnt;i++){                         

             BoardRec br = new BoardRec();

             if(!rs.next()){break;}

             System.out.println("fecthing~~");

             br.num = recNum;

             br.no = rs.getInt("NO");

             br.name = rs.getString("NAME");

             br.email = rs.getString("EMAIL");

             br.subject = rs.getString("SUBJECT");

             br.content = rs.getString("CONTENT");

             br.regi_date = rs.getString("REGI_DATE");

             br.cnt = rs.getInt("CNT");

             br.group_id = rs.getInt("GROUP_ID");

             br.group_order = rs.getInt("GROUP_ORDER");

             br.depth = rs.getInt("DEPTH");

             br.passwd = rs.getString("PASSWD");

             v.addElement(br);

             recNum--;

      }

     }catch(SQLException e){

       throw new SQLException(e.getMessage());

     }finally{

if (rs != null) rs.close();

             if (stmt != null) stmt.close();

             if (con != null) con.close();

     }

     return v;

}

 

페이징구현을 위해 정해진 페이지(page)에서 정해진 목록의 개수(list_cnt)만큼 벡터에 저장을 한후 이를 리턴하는 메서드 입니다.

getWhere() 메서드는 setProperty에 의해 설정된 검색조건(검색어,검색필드)을 토대로 where 절 이하의 쿼리문을 작성하여 리턴합니다.

이정도의 메서드 정도면 리스트를 출력하는데는 무리가 없을 것 같습니다.

소스를 보시면 아시겠지만 getWhere() 메서드는 유틸리티 빈즈인 repString 클래스의 클래스 메서드인 filter() 메서드를 이용합니다. 클래스 메서드 이므로 이 클래스의 인스턴스를 만들지 않아도 바로 이용가능합니다.