JavaBeans

If a Java beginner, it is enough to understand JavaBeans as the Java classes you create for your project.

User

  • SignUpFailException.java
  • User.java
  • UserDao.java
  • UserService.java
SignUpFailException.java
package net.java_school.exception;

public class SignUpFailException extends RuntimeException {

  public SignUpFailException() {
    super();
  }

  public SignUpFailException(String message, Throwable cause,
       boolean enableSuppression, boolean writableStackTrace) {
    super(message, cause, enableSuppression, writableStackTrace);
  }

  public SignUpFailException(String message, Throwable cause) {
    super(message, cause);
  }

  public SignUpFailException(String message) {
    super(message);
  }

  public SignUpFailException(Throwable cause) {
    super(cause);
  }
    
}

Let's use Apache's commons-logging and log4j 2 for logging. See: Log4j 2

Get log4j-api-2.x.x.x.jar and log4-core-2.x.x.x.jar from http://logging.apache.org/log4j/2.x/download.html.

Get commons-logging-1.2.jar from http://apache.mirror.cdnetworks.com/commons/logging/binaries/.

Put these files into WEB-INF/lib.

Create the following commons-logging.properties and log4j2.xml in the src folder.

commons-logging.properties
org.apache.commons.logging.Log = org.apache.commons.logging.impl.Log4JLogger
log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
  <Appenders>
    <File name="A1" fileName="A1.log" append="true">
      <PatternLayout pattern="%t %-5p %c{2} - %m%n" />
    </File>
    <Console name="STDOUT" target="SYSTEM_OUT">
      <PatternLayout pattern="%d %-5p [%t] %C{2} (%F:%L) - %m%n" />
    </Console>
  </Appenders>
  <Loggers>
    <Logger name="net.java_school" level="debug">
      <AppenderRef ref="A1" />
    </Logger>
    <Root level="debug">
      <AppenderRef ref="STDOUT" />
    </Root>
  </Loggers>
</Configuration>
UserDao.java
package net.java_school.user;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import net.java_school.exception.SignUpFailException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class UserDao {
  private Log log = LogFactory.getLog(UserDao.class);
  private static UserDao instance = new UserDao();
  private DataSource ds;
  public static String NEW_LINE = System.getProperty("line.separator");

  public static UserDao getInstance() {
    return instance;
  }
    
  private UserDao() {
    try {
      Context initCtx = new InitialContext();
      Context envCtx = (Context) initCtx.lookup("java:comp/env");
      ds = (DataSource) envCtx.lookup("jdbc/jsppjt");
    } catch (NamingException e) {
      if (log.isDebugEnabled()) {
        log.debug(e.getMessage());
      }
    }
  }
    
  private Connection getConnection() throws SQLException {
    return ds.getConnection();
  }
    
  private void close(ResultSet rs, PreparedStatement pstmt, Connection con) {
    if (rs != null) {
      try {
        rs.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if (pstmt != null) {
      try {
        pstmt.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if (con != null) {
      try {
        con.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }
    
  //Sign Up
  public void insert(User user) {
    Connection con = null;
    PreparedStatement pstmt = null;
        
    //email,passwd,name,mobile
    String sql = "insert into member values (?, ?, ?, ?)";
        
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, user.getEmail());
      pstmt.setString(2, user.getPasswd());
      pstmt.setString(3, user.getName());
      pstmt.setString(4, user.getMobile());
      pstmt.executeUpdate();
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
      throw new SignUpFailException("Sign Up Failed!");
    } finally {
      close(null, pstmt, con);
    }
  }
    
  //Login
  public User login(String email, String passwd) {
    User user = null;
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    String sql = "SELECT email, passwd, name, mobile FROM member "
        + "WHERE email = ? AND passwd = ?";
         
         
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, email);
      pstmt.setString(2, passwd);
      rs = pstmt.executeQuery();
             
      if (rs.next()) {
        user = new User();
        user.setEmail(rs.getString("email"));
        user.setPasswd(rs.getString("passwd"));
        user.setName(rs.getString("name"));
        user.setMobile(rs.getString("mobile"));
      }
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(rs, pstmt, con);
    }
         
    return user;
  }
    
  //Modify account
  public int update(User user) {
    Connection con = null;
    PreparedStatement pstmt = null;
    String sql = "UPDATE member SET name = ?, mobile = ? WHERE email = ? AND passwd = ?";
    int ret = 0;
        
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, user.getName());
      pstmt.setString(2, user.getMobile());
      pstmt.setString(3, user.getEmail());
      pstmt.setString(4, user.getPasswd());
      ret = pstmt.executeUpdate();
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
      throw new RuntimeException(e);
    } finally {
      close(null, pstmt, con);
    }
        
    return ret;
  }
    
  //Change password
  public int update(String currentPasswd, String newPasswd, String email) {
    Connection con = null;
    PreparedStatement pstmt = null;
    String sql = "UPDATE member SET passwd = ? WHERE passwd = ? AND email = ?";
    int ret = 0;
        
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, newPasswd);
      pstmt.setString(2, currentPasswd);
      pstmt.setString(3, email);
      ret = pstmt.executeUpdate();
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(null, pstmt, con);
    }
        
    return ret;
  }
    
  //Bye
  public int delete(String email, String passwd) {
    Connection con = null;
    PreparedStatement pstmt = null;
    String sql = "DELETE member WHERE email = ? AND passwd = ?";
    int ret = 0;
        
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, email);
      pstmt.setString(2, passwd);
      ret = pstmt.executeUpdate();
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
      throw new RuntimeException(e);
    } finally {
      close(null, pstmt, con);
    }
        
    return ret;
  }
    
  //Search User by email
  public User selectOne(String email) {
    User user = null;
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    String sql = "SELECT email, passwd, name, mobile "
            + "FROM member WHERE email = ?";
        
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, email);
      rs = pstmt.executeQuery();
            
      if (rs.next()) {
        user = new User();
        user.setEmail(rs.getString("email"));
        user.setPasswd(rs.getString("passwd"));
        user.setName(rs.getString("name"));
        user.setMobile(rs.getString("mobile"));
      }
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(rs, pstmt, con);
    }
         
    return user;
  }
        
}
UserService.java
package net.java_school.user;

public class UserService {
  private UserDao dao = UserDao.getInstance();
    
  public void addUser(User user) {
    dao.insert(user);
  }
    
  public User login(String email, String passwd) {
    return dao.login(email, passwd);
  }
    
  public int editAccount(User user) {
    return dao.update(user);
  }
    
  public int changePasswd(String currentPasswd, String newPasswd, String email) {
    return dao.update(currentPasswd, newPasswd, email);
  }
    
  public void bye(String email, String passwd) {
    dao.delete(email, passwd);
  }

  public User getUser(String email) {
    return dao.selectOne(email);
  }
        
}

Board

  • Board.java
  • Article.java
  • Comment.java
  • AttachFile.java
  • BoardDao.java
  • BoardService.java
  • NumbersForPaging.java
Board.java
package net.java_school.board;

public class Board {
  private String boardCd;
  private String boardNm;
  private String boardNm_ko;
    
  public String getBoardCd() {
    return boardCd;
  }
  public void setBoardCd(String boardCd) {
    this.boardCd = boardCd;
  }
  public String getBoardNm() {
    return boardNm;
  }
  public void setBoardNm(String boardNm) {
    this.boardNm = boardNm;
  }
  public String getBoardNm_ko() {
    return boardNm_ko;
  }
  public void setBoardNm_ko(String boardNm_ko) {
    this.boardNm_ko = boardNm_ko;
  }
    
}
Article.java
package net.java_school.board;

import java.util.Date;

public class Article {
  private int articleNo;
  private String boardCd;
  private String title;
  private String content;
  private String email;
  private String name;
  private int hit;
  private Date regdate;
  private int attachFileNum;
  private int commentNum;
    
  public int getArticleNo() {
    return articleNo;
  }
  public void setArticleNo(int articleNo) {
    this.articleNo = articleNo;
  }
  public String getBoardCd() {
    return boardCd;
  }
  public void setBoardCd(String boardCd) {
    this.boardCd = boardCd;
  }
  public String getTitle() {
    return title;
  }
  public void setTitle(String title) {
    this.title = title;
  }
  public String getContent() {
    return content;
  }
  public void setContent(String content) {
    this.content = content;
  }
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public int getHit() {
    return hit;
  }
  public void setHit(int hit) {
    this.hit = hit;
  }
  public Date getRegdate() {
    return regdate;
  }
  public void setRegdate(Date regdate) {
    this.regdate = regdate;
  }
  public int getAttachFileNum() {
    return attachFileNum;
  }
  public void setAttachFileNum(int attachFileNum) {
    this.attachFileNum = attachFileNum;
  }
  public int getCommentNum() {
    return commentNum;
  }
  public void setCommentNum(int commentNum) {
    this.commentNum = commentNum;
  }
    
}
Comment.java
package net.java_school.board;

import java.util.Date;

public class Comment {
  private int commentNo;
  private int articleNo;
  private String email;
  private String name;
  private String memo;
  private Date regdate;
    
  public int getCommentNo() {
    return commentNo;
  }
  public void setCommentNo(int commentNo) {
    this.commentNo = commentNo;
  }
  public int getArticleNo() {
    return articleNo;
  }
  public void setArticleNo(int articleNo) {
    this.articleNo = articleNo;
  }
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }   
  public String getMemo() {
    return memo;
  }
  public void setMemo(String memo) {
    this.memo = memo;
  }
  public Date getRegdate() {
    return regdate;
  }
  public void setRegdate(Date regdate) {
    this.regdate = regdate;
  }
    
}
AttachFile.java
package net.java_school.board;

public class AttachFile {
  private int attachFileNo;
  private String filename;    
  private String filetype;    
  private long filesize;    
  private int articleNo;
  private String email;
    
  public int getAttachFileNo() {
    return attachFileNo;
  }
  public void setAttachFileNo(int attachFileNo) {
    this.attachFileNo = attachFileNo;
  }
  public String getFilename() {
    return filename;
  }
  public void setFilename(String filename) {
    this.filename = filename;
  }
  public String getFiletype() {
    return filetype;
  }
  public void setFiletype(String filetype) {
    this.filetype = filetype;
  }
  public long getFilesize() {
    return filesize;
  }
  public void setFilesize(long filesize) {
    this.filesize = filesize;
  }
  public int getArticleNo() {
    return articleNo;
  }
  public void setArticleNo(int articleNo) {
    this.articleNo = articleNo;
  }
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
    
}
BoardDao.java
package net.java_school.board;
package net.java_school.board;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Date;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

public class BoardDao {
  private Log log = LogFactory.getLog(BoardDao.class);
  private static BoardDao instance = new BoardDao();
  private DataSource ds;
  public static String NEW_LINE = System.getProperty("line.separator");
    
  public static BoardDao getInstance() {
    return instance;
  }
    
  private BoardDao() {
    try {
      Context initCtx = new InitialContext();
      Context envCtx = (Context) initCtx.lookup("java:comp/env");
      ds = (DataSource) envCtx.lookup("jdbc/jsppjt");
    } catch (NamingException e) {
      if (log.isDebugEnabled()) {
        log.debug(e.getMessage());
      }
    }
  }
    
  private Connection getConnection() throws SQLException {
    return ds.getConnection();
  }
    
  private void close(ResultSet rs, PreparedStatement pstmt, Connection con) {
    if (rs != null) {
      try {
        rs.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if (pstmt != null) {
      try {
        pstmt.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    if (con != null) {
      try {
        con.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
  }
    
  //List
  public List<Article> selectListOfArticles(
      String boardCd, 
      String searchWord, 
      int startRownum, 
      int endRownum) {
        
    List<Article> articleList = new ArrayList<Article>();
        
    StringBuilder sb = new StringBuilder();
    sb.append("SELECT articleno, title, regdate, hit, attachfileNum, commentNum FROM ");
    sb.append("( ");
    sb.append("     SELECT rownum R, A.* FROM ");
    sb.append("     ( ");
    sb.append("     SELECT ");
    sb.append("         a.articleno,"); 
    sb.append("         a.title,");
    sb.append("         a.regdate,");
    sb.append("         a.hit,");
    sb.append("         COUNT(DISTINCT(f.attachfileno)) attachfileNum,");
    sb.append("         COUNT(DISTINCT(c.commentno)) commentNum ");
    sb.append("     FROM article a LEFT JOIN attachfile f ON a.articleno = f.articleno ");
    sb.append("          LEFT JOIN comments c ON a.articleno = c.articleno ");
    sb.append("     WHERE ");
    sb.append("         a.boardcd = ? ");
    if (searchWord != null && !searchWord.equals("")) { 
      sb.append("         AND (title LIKE '%" + searchWord + "%' OR DBMS_LOB.INSTR(content, '" + searchWord + "') > 0) ");
    }
    sb.append("     GROUP BY a.articleno, a.title, a.regdate, a.hit ORDER BY articleno DESC ");
    sb.append("     ) A ");
    sb.append(") ");
    sb.append("WHERE R BETWEEN ? AND ?");
        
    final String sql = sb.toString();
      
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
        
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, boardCd);
      pstmt.setInt(2, startRownum);
      pstmt.setInt(3, endRownum);
      rs = pstmt.executeQuery();
            
      while(rs.next()) {
        Article article = new Article();
        int articleNo = rs.getInt("articleno");
        String title = rs.getString("title");
        Date regdate = rs.getDate("regdate");
        int hit = rs.getInt("hit");
        int attachfileNum = rs.getInt("attachfileNum");
        int commentNum = rs.getInt("commentNum");
        article.setArticleNo(articleNo);
        article.setTitle(title);
        article.setRegdate(regdate);
        article.setHit(hit);
        article.setAttachFileNum(attachfileNum);
        article.setCommentNum(commentNum);
        articleList.add(article);
      }
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(rs, pstmt, con);
    }

    return articleList;
  }
    
  //Total count
  public int selectCountOfArticles(String boardCd, String searchWord) {
    int totalRecord = 0;
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
        
    String sql = "SELECT count(*) FROM article WHERE boardcd=? ";
    if (searchWord != null && !searchWord.equals("")) {
      sql = sql + "AND (title LIKE '%" + searchWord + "%' OR DBMS_LOB.INSTR(content, '" + searchWord + "') > 0) ";
    } 
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, boardCd);
      rs = pstmt.executeQuery();
      rs.next();
      totalRecord = rs.getInt(1);
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(rs, pstmt, con);
    }
        
    return totalRecord;
  }

  //Insert new board article
  public void insert(Article article, AttachFile attachFile) {
    Connection con = null;
    PreparedStatement pstmt = null;
        
    String sql = "INSERT INTO article " +
    "(articleno, boardcd, title, content, email, hit, regdate) " +
    "VALUES " +
    "(SEQ_ARTICLE.nextval, ?, ?, ?, ?, 0, sysdate)";
        
    int chk = 0;
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, article.getBoardCd());
      pstmt.setString(2, article.getTitle());
      pstmt.setString(3, article.getContent());
      pstmt.setString(4, article.getEmail());
      chk = pstmt.executeUpdate();
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      try {
        pstmt.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
        
    try {
      if (chk > 0 && attachFile != null) {
        sql = "INSERT INTO attachfile " +
        "(attachfileno, filename, filetype, filesize, articleno, email) " +
        "VALUES " +
        "(SEQ_ATTACHFILE.nextval, ?, ?, ?, SEQ_ARTICLE.currval, ?)";
        pstmt = con.prepareStatement(sql);
        pstmt.setString(1, attachFile.getFilename());
        pstmt.setString(2, attachFile.getFiletype());
        pstmt.setLong(3, attachFile.getFilesize());
        pstmt.setString(4, attachFile.getEmail());
        pstmt.executeUpdate();
      }
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(null, pstmt, con);
    }
        
  }
    
  //Edit a board article
  public void update(Article article, AttachFile attachFile) {
    String sql = "UPDATE article SET title=?, content=? WHERE articleno=?";
        
    Connection con = null;
    PreparedStatement pstmt = null;
        
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, article.getTitle());
      pstmt.setString(2, article.getContent());
      pstmt.setInt(3, article.getArticleNo());
      pstmt.executeUpdate();
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      try {
        pstmt.close();
      } catch (SQLException e) {
        e.printStackTrace();
      }
    }
    
    try {
      if (attachFile != null) {
        sql = "INSERT INTO attachfile "
                + "(attachfileno, filename, filetype, filesize, articleno, email) "
                + "VALUES (SEQ_ATTACHFILE.nextval, ?, ?, ?, ?, ?)";
        pstmt = con.prepareStatement(sql);
        pstmt.setString(1, attachFile.getFilename());
        pstmt.setString(2, attachFile.getFiletype());
        pstmt.setLong(3, attachFile.getFilesize());
        pstmt.setInt(4, attachFile.getArticleNo());
        pstmt.setString(5, attachFile.getEmail());
        pstmt.executeUpdate();
      }
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(null, pstmt, con);
    }

  }
    
  //Delete a board article
  public void delete(int articleNo) {
    Connection con = null;
    PreparedStatement pstmt1 = null;
    PreparedStatement pstmt2 = null;
    PreparedStatement pstmt3 = null;
        
    String sql = "DELETE FROM comments WHERE articleno = ?";
        
    try {
      con = getConnection();
      con.setAutoCommit(false);
      pstmt1 = con.prepareStatement(sql);
      pstmt1.setInt(1, articleNo);
      pstmt1.executeUpdate();
            
      sql = "DELETE FROM attachfile WHERE articleno = ?";
      pstmt2 = con.prepareStatement(sql);
      pstmt2.setInt(1, articleNo);
      pstmt2.executeUpdate();
            
      sql = "DELETE FROM article WHERE articleno = ?";
      pstmt3 = con.prepareStatement(sql);
      pstmt3.setInt(1, articleNo);
      pstmt3.executeUpdate();
      con.commit();
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
            
      try {
        con.rollback();
      } catch (SQLException e1) {
        e1.printStackTrace();
      }
    } finally {
      if (pstmt1 != null) {
        try {
          pstmt1.close();
        } catch (SQLException e) {
          e.printStackTrace();
        }
      }
      if (pstmt2 != null) {
        try {
          pstmt2.close();
        } catch (SQLException e) {
          e.printStackTrace();
        }
      }
      close(null, pstmt3, con);
    }   
        
  }
    
  //Increase the read count
  public void updateHitPlusOne(int articleNo) {
    Connection con = null;
    PreparedStatement pstmt = null;
    String sql = "UPDATE article SET hit = hit + 1 WHERE articleno = ?";
        
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setInt(1, articleNo);
      pstmt.executeUpdate();
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState");
        msg.append(" : ");
        msg.append(e.getSQLState());
        msg.append(NEW_LINE);
        msg.append("Message");
        msg.append(" : ");
        msg.append(e.getMessage());
        msg.append(NEW_LINE);
        msg.append("Oracle Error Code");
        msg.append(" : ");
        msg.append(e.getErrorCode());
        msg.append(NEW_LINE);
        msg.append("sql");
        msg.append(" : ");
        msg.append(sql);
        msg.append(NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(null, pstmt, con);
    }
  }
    
  //Fetch board article by articleNo
  public Article selectOne(int articleNo) {
    Article article = null;
    final String sql = "SELECT "
              + "articleno, title, content, a.email, NVL(name,'Anonymous') name, hit, regdate "
              + "FROM "
              + "article a LEFT JOIN member m ON a.email = m.email "
              + "WHERE "
              + "articleno = ?";
             
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
         
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setInt(1, articleNo);
      rs = pstmt.executeQuery();
             
      if (rs.next()) {
        article = new Article();
        article.setArticleNo(rs.getInt("articleno"));
        article.setTitle(rs.getString("title"));
        article.setContent(rs.getString("content"));
        article.setEmail(rs.getString("email"));
        article.setName(rs.getString("name"));
        article.setHit(rs.getInt("hit"));
        article.setRegdate(rs.getDate("regdate"));
      }
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(rs, pstmt, con);
    }
    return article;
    
  }
    
  //Next Article
  public Article selectNextOne(int articleNo, String boardCd, String searchWord) {
    Article article = null;
    String sql = "SELECT articleno, title " +
        "FROM " +
            "(SELECT rownum r,a.* " +
            "FROM " +
            "(SELECT articleno, title "
            + "FROM article "
            + "WHERE boardCd = ? AND articleno > ? ";
             
    if (searchWord != null && !searchWord.equals("")) {
      sql = sql + "AND (title LIKE '%" + searchWord + "%' OR DBMS_LOB.INSTR(content, '" + searchWord + "') > 0) ";
    } 
             
    sql = sql + "ORDER BY articleno) a) WHERE r = 1";
         
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
             
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, boardCd);
      pstmt.setInt(2, articleNo);
      rs = pstmt.executeQuery();

      if (rs.next()) {
        article = new Article();
        article.setArticleNo(rs.getInt("articleno"));
        article.setTitle(rs.getString("title"));
      }
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(rs, pstmt, con);
    }
         
    return article;

  }
    
  //Prev Article
  public Article selectPrevOne(int articleNo, String boardCd, String searchWord) {
    Article article = null;
    String sql = "SELECT articleno, title " +
        "FROM " +
        "(SELECT rownum r,a.* " +
            "FROM " +
            "(SELECT articleno, title "
            + "FROM article "
            + "WHERE boardCd = ? AND articleno < ? ";
         
    if (searchWord != null && !searchWord.equals("")) {
      sql = sql + "AND (title LIKE '%" + searchWord + "%' OR DBMS_LOB.INSTR(content, '" + searchWord + "') > 0) ";
    } 
         
    sql = sql + "ORDER BY articleno DESC) a) WHERE r = 1";
         
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
             
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, boardCd);
      pstmt.setInt(2, articleNo);
      rs = pstmt.executeQuery();
             
      if (rs.next()) {
        article = new Article();
        article.setArticleNo(rs.getInt("articleno"));
        article.setTitle(rs.getString("title"));
      }
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(rs, pstmt, con);
    }
         
    return article;

  }
    
  //List of AttachFiles
  public List<AttachFile> selectListOfAttachFiles(int articleNo) {
    List<AttachFile> attachFileList = new ArrayList<AttachFile>();
    String sql = "SELECT attachfileno, filename, filetype, filesize, articleno, email " +
      "FROM attachfile WHERE articleno=? ORDER BY attachfileno ASC";
     
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
         
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setInt(1, articleNo);
      rs = pstmt.executeQuery();
             
      while(rs.next()) {
        AttachFile attachFile = new AttachFile();
        int attachFileNo = rs.getInt("attachfileno");
        String filename = rs.getString("filename");
        String filetype = rs.getString("filetype");
        long filesize = rs.getLong("filesize");
        String email = rs.getString("email");
        attachFile.setAttachFileNo(attachFileNo);
        attachFile.setFilename(filename);
        attachFile.setFiletype(filetype);
        attachFile.setFilesize(filesize);
        attachFile.setEmail(email);
        attachFileList.add(attachFile);
      }
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(rs, pstmt, con);  
    }
         
    return attachFileList;

  }
    
  //Delete the attach file.
  public void deleteFile(int attachFileNo) {
    String sql = "DELETE FROM attachfile WHERE attachfileno=?";
         
    Connection con = null;
    PreparedStatement pstmt = null;
        
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setInt(1, attachFileNo);
      pstmt.executeQuery();
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(null, pstmt, con);    
    }

  }
    
  //Fetch board name by boardcode
  public String selectOneBoardName(String boardCd) {
    String boardNm_ko = null;
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    String sql = "SELECT boardnm_ko FROM board WHERE boardcd = ?";
        
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, boardCd);
      rs = pstmt.executeQuery();
      if (rs.next()) {
        boardNm_ko = rs.getString("boardnm_ko");
      }
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(rs, pstmt, con);
    }
            
    return boardNm_ko;
    
  }
    
  //Add comment
  public void insertComment(Comment comment) {
    String sql = "INSERT INTO comments (commentno, articleno, email, memo, regdate) "
      + "VALUES (SEQ_COMMENTS.nextval, ?, ?, ?, sysdate)";
                 
    Connection con = null;
    PreparedStatement pstmt = null;
             
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setInt(1, comment.getArticleNo());
      pstmt.setString(2, comment.getEmail());
      pstmt.setString(3, comment.getMemo());
      pstmt.executeUpdate();
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(null, pstmt, con);
    }
        
  }
    
  //Edit the comment
  public void updateComment(Comment comment) {
    String sql = "UPDATE comments SET memo = ? WHERE commentno = ?";
    Connection con = null;
    PreparedStatement pstmt = null;
         
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setString(1, comment.getMemo());
      pstmt.setInt(2, comment.getCommentNo());
      pstmt.executeUpdate();
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(null, pstmt, con);
    }
  }
    
  //Delete the comment
  public void deleteComment(int commentNo) {
    String sql = "DELETE FROM comments WHERE commentno = ?";
         
    Connection con = null;
    PreparedStatement pstmt = null;
         
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setInt(1, commentNo);
      pstmt.executeUpdate();
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(null, pstmt, con);
    }
    
  }
    
  //List of comments
  public List<Comment> selectListOfComments(int articleNo) {
    List<Comment> commentList = new ArrayList<Comment>();

    String sql = "SELECT "
                  + "commentno, articleno, c.email, NVL(name,'Anonymous') name, memo, regdate "
              + "FROM "
                  + "comments c LEFT JOIN member m ON c.email = m.email "
              + "WHERE "
                  + "articleno = ? "
              + "ORDER BY commentno DESC"; 
     
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
         
    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setInt(1, articleNo);
      rs = pstmt.executeQuery();

      while (rs.next()) {
        Comment comment = new Comment();
                 
        comment.setCommentNo(rs.getInt("commentno"));
        comment.setArticleNo(rs.getInt("articleno"));
        comment.setEmail(rs.getString("email"));
        comment.setName(rs.getString("name"));
        comment.setMemo(rs.getString("memo"));
        comment.setRegdate(rs.getTimestamp("regdate"));
                
        commentList.add(comment);
      }
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(null, pstmt, con);
    }
        
    return commentList;
  }

  //Fetch the attach file by attachFileNo  
  public AttachFile selectOneAttachFile(int attachFileNo) {
    AttachFile attachFile = null;
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    //attachfileno,filename,filetype,filesize,articleno,email
    String sql = "SELECT attachfileno, filename, filetype, filesize, articleno, email "
          + "FROM attachFile WHERE attachfileno = ?";

    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setInt(1, attachFileNo);
      rs = pstmt.executeQuery();
      if (rs.next()) {
        attachFile = new AttachFile();
        attachFile.setAttachFileNo(rs.getInt("attachfileno"));
        attachFile.setFilename(rs.getString("filename"));
        attachFile.setFiletype(rs.getString("filetype"));
        attachFile.setFilesize(rs.getLong("filesize"));
        attachFile.setArticleNo(rs.getInt("articleno"));
        attachFile.setEmail(rs.getString("email"));
      }
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(rs, pstmt, con);
    }
        
    return attachFile;
  }

  //Fetch the comment by commentNo
  public Comment selectOneComment(int commentNo) {
    Comment comment = null;
        
    Connection con = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
        
    //commentno,articleno,email,memo,regdate
    String sql = "SELECT commentno, articleno, email, memo, regdate "
          + "FROM comments WHERE commentno = ?";

    try {
      con = getConnection();
      pstmt = con.prepareStatement(sql);
      pstmt.setInt(1, commentNo);
      rs = pstmt.executeQuery();
            
      if (rs.next()) {
        comment = new Comment();
        comment.setCommentNo(rs.getInt("commentno"));
        comment.setArticleNo(rs.getInt("articleno"));
        comment.setEmail(rs.getString("email"));
        comment.setMemo(rs.getString("memo"));
        comment.setRegdate(rs.getDate("regdate"));
      }
    } catch (SQLException e) {
      if (log.isDebugEnabled()) {
        StringBuilder msg = new StringBuilder();
        msg.append("SQLState : " + e.getSQLState() + NEW_LINE);
        msg.append("Message : " + e.getMessage() + NEW_LINE);
        msg.append("Oracle Error Code : " + e.getErrorCode() + NEW_LINE);
        msg.append("sql : " + sql + NEW_LINE);
        log.debug(msg);
      }
    } finally {
      close(rs, pstmt, con);
    }
        
    return comment;
  }

}
NumbersForPaging.java
package net.java_school.commons;

public class NumbersForPaging {
  private int totalPage;
  private int firstPage;
  private int lastPage;
  private int prevBlock;
  private int nextBlock;
  private int listItemNo;
    
  public int getTotalPage() {
    return totalPage;
  }
  public void setTotalPage(int totalPage) {
    this.totalPage = totalPage;
  }
  public int getFirstPage() {
    return firstPage;
  }
  public void setFirstPage(int firstPage) {
    this.firstPage = firstPage;
  }
  public int getLastPage() {
    return lastPage;
  }
  public void setLastPage(int lastPage) {
    this.lastPage = lastPage;
  }
  public int getPrevBlock() {
    return prevBlock;
  }
  public void setPrevBlock(int prevBlock) {
    this.prevBlock = prevBlock;
  }
  public int getNextBlock() {
    return nextBlock;
  }
  public void setNextBlock(int nextBlock) {
    this.nextBlock = nextBlock;
  }
  public int getListItemNo() {
    return listItemNo;
  }
  public void setListItemNo(int listItemNo) {
    this.listItemNo = listItemNo;
  }
    
}
BoardService.java
package net.java_school.board;

import java.util.List;

import net.java_school.commons.NumbersForPaging;

public class BoardService {
  private BoardDao dao = BoardDao.getInstance();
    
  public List<Article> getArticleList(String boardCd, String searchWord, int startRecord, int endRecord) {
    return dao.selectListOfArticles(boardCd, searchWord, startRecord, endRecord);
  }
    
  public int getTotalRecord(String boardCd, String searchWord) {
    return dao.selectCountOfArticles(boardCd, searchWord);
  }

  public void addArticle(Article article, AttachFile attachFile) {
    dao.insert(article, attachFile);
  }

  public void modifyArticle(Article article, AttachFile attachFile) {
    dao.update(article, attachFile);
  }

  public void removeArticle(int articleNo) {
    dao.delete(articleNo);
  }
    
  public void increaseHit(int articleNo) {
    dao.updateHitPlusOne(articleNo);
  }
    
  public Article getArticle(int articleNo) {
    return dao.selectOne(articleNo);
  }
    
  public Article getNextArticle(int articleNo, String boardCd, String searchWord) {
    return dao.selectNextOne(articleNo, boardCd, searchWord);
  }

  public Article getPrevArticle(int articleNo, String boardCd, String searchWord) {
    return dao.selectPrevOne(articleNo, boardCd, searchWord);
  }

  public List<AttachFile> getAttachFileList(int articleNo) {
    return dao.selectListOfAttachFiles(articleNo);
  }

  public AttachFile getAttachFile(int attachFileNo) {
    return dao.selectOneAttachFile(attachFileNo);
  }
    
  public void removeAttachFile(int attachFileNo) {
    dao.deleteFile(attachFileNo);
  }
    
  public String getBoardName(String boardCd) {
    return dao.selectOneBoardName(boardCd);
  }

  public List<Comment> getCommentList(int articleNo) {
    return dao.selectListOfComments(articleNo);
  }

  public Comment getComment(int commentNo) {
    return dao.selectOneComment(commentNo);
  }

  public void addComment(Comment comment) {
    dao.insertComment(comment);
  }

  public void modifyComment(Comment comment) {
    dao.updateComment(comment);
  }
    
  public void removeComment(int commentNo) {
    dao.deleteComment(commentNo);
  }
    
  public NumbersForPaging getNumbersForPaging(int totalRecord, int page, int numPerPage, int pagePerBlock) {
    int totalPage = totalRecord / numPerPage;
    if (totalRecord % numPerPage != 0) totalPage++;
    int totalBlock = totalPage / pagePerBlock;
    if (totalPage % pagePerBlock != 0) totalBlock++;
    int block = page / pagePerBlock;
    if (page % pagePerBlock != 0) block++;
    int firstPage = (block - 1) * pagePerBlock + 1;
    int lastPage = block * pagePerBlock;
    int prevPage = 0;
    if (block > 1) {
      prevPage = firstPage - 1;
    }
    int nextPage = 0;
    if (block < totalBlock) {
      nextPage = lastPage + 1;
    }
    if (block >= totalBlock) {
      lastPage = totalPage;
    }
    int listItemNo = totalRecord - (page - 1) * numPerPage;
        
    NumbersForPaging numbers = new NumbersForPaging();
       
    numbers.setTotalPage(totalPage);
    numbers.setFirstPage(firstPage);
    numbers.setLastPage(lastPage);
    numbers.setPrevBlock(prevPage);
    numbers.setNextBlock(nextPage);
    numbers.setListItemNo(listItemNo);
        
    return numbers;
  }    
}