게시판 클래스다이어그램

그림을 클릭하면 원래 크기로 볼 수 있습니다.

게시판 테이블 물리설계

-- 게시판 테이블 생성
DROP TABLE IF EXISTS board_data;
CREATE TABLE board_data (
    no SERIAL,
    title VARCHAR(100) NOT NULL,
    article VARCHAR(800) NOT NULL,
    writer VARCHAR(50) NOT NULL DEFAULT '아무개',
    wdate TIMESTAMP,
    hitcnt SMALLINT UNSIGNED NOT NULL DEFAULT '0',
    PRIMARY KEY (no)
    ) ENGINE = MyISAM
    COLLATE utf8_general_ci;

-- list()
-- 페이징 계산 필요 offset = (pageNum - 1) * rows
SELECT no, title, article, writer, wdate, hitcnt
FROM board_data
ORDER BY no DESC
LIMIT 0, 10;

-- write()
INSERT INTO board_data (title, article, writer)
VALUES ('제목1', '안녕하세요.', '홍길동');

-- delete()
DELETE FROM board_data
WHERE no = ?;

-- edit()
UPDATE board_data
SET title = '제목1', article = '안녕하세요', writer = '홍길동', hitcnt = hitcnt + 1;

-- view()
SELECT no, title, article, writer, wdate, hitcnt
FROM board_data
WHERE no = ?;

-- search()
SELECT no, title, article, writer, wdate, hitcnt
FROM board_data
WHERE ? LIKE ?;

게시판 row를 담을 빈 설계

package net.jeongsam.board;

import java.sql.Timestamp;

/**
 * 게시판 row 데이터 저장 빈
 * 2009. 9. 18
 * @author 정승용
 *
 */
public class BoardData {
	private Long no;
	private String title;
	private String article;
	private String writer;
	private Timestamp wDate;
	private Integer hitCnt;
	
	public Long getNo() {
		return no;
	}
	public void setNo(Long no) {
		this.no = no;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getArticle() {
		return article;
	}
	public void setArticle(String article) {
		this.article = article;
	}
	public String getWriter() {
		return writer;
	}
	public void setWriter(String writer) {
		this.writer = writer;
	}
	public Timestamp getwDate() {
		return wDate;
	}
	public void setwDate(Timestamp wDate) {
		this.wDate = wDate;
	}
	public Integer getHitCnt() {
		return hitCnt;
	}
	public void setHitCnt(Integer hitCnt) {
		this.hitCnt = hitCnt;
	}
}

정렬 데이터를 담을 빈 설계

package net.jeongsam.board;

/**
 * 정렬 기준 필드 이름과 정렬 방법을 저장할 자바빈
 * @author 정승용
 *
 */
public class SortData {
	private String fieldName; // 컬럼 이름
	private String order; // 정렬 방식 "ASC"와 "DESC" 중 선택
	
	public String getFieldName() {
		return fieldName;
	}
	public void setFieldName(String fieldName) {
		this.fieldName = fieldName;
	}
	public String getOrder() {
		return order;
	}
	public void setOrder(String order) {
		this.order = order;
	}
}

게시판 관리 클래스

package net.jeongsam.board;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;

/**
 * 게시판 관리
 * 2009. 9. 18
 * @author 정승용
 *
 */
public class BoardMgr {
	/**
	 *  게시판 표시 기본 행 수
	 */
	public static int DEFAULT_ROW = 10;
	
	/**
	 * DB 연결 정보
	 */
	private String url = "jdbc:mysql://127.0.0.1/example";
	private String user = "root";
	private String password = "1234";
	
	private Connection conn = null;
	
	/**
	 *  목록 표시 원형
	 *  @param pageNum 표시할 페이지
	 *  @param rows 한 페이지 당 표시할 행 수
	 *  @param sort 정렬 기준 컬럼 이름과 정렬 순서 값을 저장할 자바빈
	 *  @return 결과 테이블 구조를 저장할 컬렉션 
	 * @throws SQLException 
	 * @throws ClassNotFoundException 
	 */
	public Collection<BoardData> list(int pageNum, int rows, SortData sort)
			throws ClassNotFoundException, SQLException {
		Statement stmt = null;
		ResultSet rs = null;
		ArrayList<BoardData> table = new ArrayList();
		// Limit offset, row_count
		// offset = (페이지 번호 - 1) * 페이지당 행 수
		int offset = (pageNum - 1) * rows;
		
		String sql = "SELECT no, title, article, writer, wdate, hitcnt ";
		sql += "FROM board_data ";
		sql += "ORDER BY " + sort.getFieldName() + " " + sort.getOrder() + " ";
		sql += "LIMIT " + offset + ", " + rows;
		
		conn = getConnection();
		stmt = conn.createStatement();
		rs = stmt.executeQuery(sql);
		
		if (rs == null) {
			System.out.println("글이 없습니다."); // 사용자 정의 예외 처리가 원칙
		} else {
			while (rs.next()) {
				BoardData rec = new BoardData();
				rec.setNo(rs.getLong(1));
				rec.setTitle(rs.getString(2));
				rec.setArticle(rs.getString(3));
				rec.setWriter(rs.getString(4));
				rec.setwDate(rs.getTimestamp(5));
				rec.setHitCnt(rs.getInt(6));
				
				table.add(rec);
			}
		}	
		return table;
	}
	
	/**
	 * 필드별 정렬하여 목록 표시
	 * @param pageNum 표시할 페이지
	 * @param sort 정렬 기준 컬럼 이름과 정렬 순서 값을 저장할 자바빈
	 * @return 결과 테이블 구조를 저장할 컬렉션 
	 * @throws SQLException 
	 * @throws ClassNotFoundException 
	 */
	public Collection<BoardData> list(int pageNum, SortData sort)
			throws ClassNotFoundException, SQLException {
		return list(pageNum, DEFAULT_ROW, sort);
	}
	
	/**
	 *  기본 목록 표시
	 * @param pageNum 표시할 페이지
	 * @return 결과 테이블 구조를 저장할 컬렉션
	 * @throws SQLException 
	 * @throws ClassNotFoundException 
	 */
	public Collection<BoardData> list(int pageNum)
			throws ClassNotFoundException, SQLException {
		SortData sort = new SortData();
		
		sort.setFieldName("no");
		sort.setOrder("DESC");
		
		return list(pageNum, DEFAULT_ROW, sort);
	}
	
	/**
	 *  글 올리기
	 * @param article 게시물을 저장할 자바빈
	 * @throws SQLException JDBC 드라이버 로딩 오류
	 * @throws ClassNotFoundException MySQL DBMS 연결 오류
	 */
	public void write(BoardData article) throws ClassNotFoundException, SQLException {
		Statement stmt = null;
		String sql = "INSERT INTO board_data (title, article, writer) ";
		sql += "VALUES ('" + article.getTitle() + "', '" 
				+ article.getArticle() + "', '" + article.getWriter() + "')";
		// Debug 코드
		System.out.println("write() : " + sql);
		try {
			conn = getConnection();
			stmt = conn.createStatement();
			stmt.executeUpdate(sql);
		} finally {
			if (stmt != null) {
				stmt.close();
				stmt = null;
			}
			if (conn != null) {
				conn.close();
				conn = null;
			}
		}
	}
	
	/**
	 * 글 삭제
	 * @param articleNo 삭제할 글 번호
	 * @throws ClassNotFoundException JDBC 드라이버 로딩 오류
	 * @throws SQLException MySQL DBMS 연결 오류
	 */
	public void delete(long articleNo) throws ClassNotFoundException, SQLException {
		Statement stmt = null;
		String sql = "DELETE FROM board_data WHERE no = " + articleNo;
		// Debug 코드
		System.out.println("delete() : " + sql);
		try {
			conn = getConnection();
			stmt = conn.createStatement();
			stmt.executeUpdate(sql);
		} finally {
			if (stmt != null) {
				stmt.close();
				stmt = null;
			}
			if (conn != null) {
				conn.close();
				conn = null;
			}
		}
	}
	
	/**
	 * 글 편집
	 * @param article 편집 내용을 담은 자바빈
	 * @throws SQLException JDBC 드라이버 로딩 오류
	 * @throws ClassNotFoundException MySQL DBMS 연결 오류
	 */
	public void edit(BoardData article) throws ClassNotFoundException, SQLException {
		Statement stmt = null;
		String sql = "UPDATE board_data ";
		sql += "SET title = '" + article.getTitle() + "', article = '";
		sql += article.getArticle() + "', writer = '" + article.getWriter() + "', hitcnt = hitcnt + 1";
		// Debug 코드
		System.out.println("edit() : " + sql);
		try {
			conn = getConnection();
			stmt = conn.createStatement();
			stmt.executeUpdate(sql);
		} finally {
			if (stmt != null) {
				stmt.close();
				stmt = null;
			}
			if (conn != null) {
				conn.close();
				conn = null;
			}
		}
	}
	
	/**
	 * 글 보기
	 * @param articleNo 화면에 표시할 글 번호
	 * @return 화면에 표시될 내용을 담은 자바빈
	 */
	public BoardData view(long articleNo) {
		return null;
	}
	
	/**
	 * 찾기
	 * @param fieldName 검색할 컬럼 이름
	 * @param value 검색할 데이터
	 * @return 검색 결과로 표시된 테이블을 담을 컬렉션
	 */
	public Collection<BoardData> search(String fieldName, String value) {
		return null;
	}
	
	/**
	 * MySQL DBMS에 연결하여 Connection 객체 생성
	 * @return Connection 인스턴스
	 * @throws ClassNotFoundException JDBC 드라이버 로딩 오류
	 * @throws SQLException MySQL DBMS 연결 오류
	 */
	private Connection getConnection() throws ClassNotFoundException, SQLException {
		Class.forName("com.mysql.jdbc.Driver");
		return DriverManager.getConnection(url, user, password);
	}
}

+ Recent posts