Board
package edu.kh.jdbc.board.model.dto;
import java.util.List;
// Data Transfer Object
public class Board {
private int boardNo; // 게시글 번호
private String boardTitle; // 게시글 제목
private String boardContent; // 게시글 내용
private String createDate; // 작성일
private int readCount; // 조회수
private int memberNo; // 회원 번호(작성자)
private String memberName; // 회원 이름
private int commentCount; // 댓글 수
private List<Comment> commentList; // 댓글 목록
public Board() {} // 기본 생성자
public int getBoardNo() {
return boardNo;
}
public void setBoardNo(int boardNo) {
this.boardNo = boardNo;
}
public String getBoardTitle() {
return boardTitle;
}
public void setBoardTitle(String boardTitle) {
this.boardTitle = boardTitle;
}
public String getBoardContent() {
return boardContent;
}
public void setBoardContent(String boardContent) {
this.boardContent = boardContent;
}
public String getCreateDate() {
return createDate;
}
public void setCreateDate(String createDate) {
this.createDate = createDate;
}
public int getReadCount() {
return readCount;
}
public void setReadCount(int readCount) {
this.readCount = readCount;
}
public int getMemberNo() {
return memberNo;
}
public void setMemberNo(int memberNo) {
this.memberNo = memberNo;
}
public String getMemberName() {
return memberName;
}
public void setMemberName(String memberName) {
this.memberName = memberName;
}
public int getCommentCount() {
return commentCount;
}
public void setCommentCount(int commentCount) {
this.commentCount = commentCount;
}
public List<Comment> getCommentList() {
return commentList;
}
public void setCommentList(List<Comment> commentList) {
this.commentList = commentList;
}
}
BoardView
package edu.kh.jdbc.board.view;
import java.util.InputMismatchException;
import java.util.List;
import java.util.Scanner;
import edu.kh.jdbc.board.model.dto.Board;
import edu.kh.jdbc.board.model.dto.Comment;
import edu.kh.jdbc.board.model.service.BoardService;
import edu.kh.jdbc.common.Session;
public class BoardView {
private Scanner sc = new Scanner(System.in);
private BoardService boardService = new BoardService();
// 댓글 화면 출력 객체
private CommentView commentView = new CommentView();
public void boardMenu() {
int input = 0;
do {
try {
System.out.println("\n===== 게시판 기능 =====\n");
System.out.println("1. 게시글 목록 조회");
System.out.println("2. 게시글 상세 조회(+ 댓글 기능)");
System.out.println("3. 게시글 작성");
// 제목, 내용(StringBuffer 이용) 입력
// -> 게시글 삽입 서비스(제목, 내용, 로그인 회원 번호) 호출
System.out.println("4. 게시글 검색");
System.out.println("9. 메인 메뉴로 돌아가기");
System.out.println("0. 프로그램 종료");
System.out.print("\n메뉴 선택 : ");
input = sc.nextInt();
sc.nextLine();
System.out.println();
switch(input) {
case 1: selectAllBoard(); break; // 게시글 목록 조회
case 2: selectBoard(); break; // 게시글 상세 조회
case 3: insertBoard(); break; // 게시글 등록(삽입)
case 4: searchBoard(); break; // 게시글 검색
case 9:
System.out.println("\n===== 메인 메뉴로 돌아갑니다 =====\n");
break;
case 0:
System.out.println("\n=== 프로그램 종료 ===\n");
System.exit(0);
default: System.out.println("\n*** 메뉴 번호만 입력 해주세요 ***\n");
}
System.out.println();
}catch (InputMismatchException e) {
System.out.println("\n*** 입력 형식이 올바르지 않습니다***\n");
sc.nextLine(); // 입력버퍼에 잘못된 문자열 제거
input = -1; // while문 종료 방지
}
}while(input != 9);
}
/**
* 게시글 검색
*/
private void searchBoard() {
try {
System.out.println("\n[게시글 검색]\n");
System.out.println("1) 제목");
System.out.println("2) 내용");
System.out.println("3) 제목 + 내용");
System.out.println("4) 작성자");
System.out.print("검색 조건 선택 : ");
int condition = sc.nextInt();
sc.nextLine();
if(condition >= 1 && condition <= 4) { // 정상 입력
System.out.print("검색어 입력 : ");
String query = sc.nextLine();
// 검색 서비스 호출 후 결과 반환 받기
List<Board> boardList = boardService.searchBoard(condition, query);
if(boardList.isEmpty()) { // 조회 결과가 없을 경우
System.out.println("\n[검색 결과가 없습니다.]\n");
}else {
for(Board b : boardList) {
// 3 | 샘플 제목3[4] | 유저삼 | 3시간 전 | 10
System.out.printf("%d | %s[%d] | %s | %s | %d\n",
b.getBoardNo(),
b.getBoardTitle(),
b.getCommentCount(),
b.getMemberName(),
b.getCreateDate(),
b.getReadCount());
}
}
} else { // 비정상 입력
System.out.println("\n[1~4번 사이의 숫자를 입력해주세요]\n");
}
}catch (Exception e) {
System.out.println("\n<<게시글 검색 중 예외 발생>>\n");
e.printStackTrace();
}
}
/**
* 게시글 목록 조회
*/
private void selectAllBoard() {
System.out.println("\n===== 게시글 목록 조회 ======\n");
try {
// 게시글 목록 조회 서비스 호출
List<Board> boardList = boardService.selectAllBoard();
// 게시글이 없는 경우
if(boardList.isEmpty()) {
System.out.println("\n*** 게시글이 존재하지 않습니다 ***\n");
return;
}
for(Board b : boardList) {
// 3 | 샘플 제목[2] | 유저일 | 2023-03-24 | 0
System.out.printf("%d | %s[%d] | %s | %s | %d \n",
b.getBoardNo(),
b.getBoardTitle(),
b.getCommentCount(),
b.getMemberName(),
b.getCreateDate(),
b.getReadCount()
);
}
}catch (Exception e) {
System.out.println("\n***** 게시글 목록 조회 중 예외 발생 *****\n");
e.printStackTrace();
}
}
/**
* 게시글 상세 조회
*/
private void selectBoard() {
System.out.println("\n===== 게시글 상세 조회 =====\n");
// 게시글 번호 입력
// 1) 번호가 일치하는 게시글이 있으면 조회
// -> 조회수 증가(단, 자신이 작성한 게시글일 경우 조회수 증가 X)
// -> 자신이 작성한 게시글일 경우
// 수정/삭제 기능 노출
// + 댓글 목록/댓글 기능 추가 예정
// 2) 번호가 일치하는 게시글이 없으면
// -> 해당 게시글이 존재하지 않습니다.
System.out.print("게시글 번호 입력 : ");
int input = sc.nextInt();
sc.nextLine();
// 게시글 상세 조회 서비스 호출
try {
Board board = boardService.selectBoard(input, Session.loginMember.getMemberNo());
// 입력 받은 번호, 로그인한 회원 번호(조회수 증가에 사용)
if(board == null) { // 게시글이 없는 경우
System.out.println("\n=== 해당 게시글이 존재하지 않습니다 ===\n");
return;
}
System.out.println("--------------------------------------------------------");
System.out.printf("글번호 : %d \n제목 : %s\n", board.getBoardNo(), board.getBoardTitle());
System.out.printf("작성자 : %s | 작성일 : %s \n조회수 : %d\n",
board.getMemberName(), board.getCreateDate(), board.getReadCount());
System.out.println("--------------------------------------------------------\n");
System.out.println(board.getBoardContent());
System.out.println("\n--------------------------------------------------------");
//******************************************************************************
/* 해당 게시글의 댓글 목록 조회*/
if(!board.getCommentList().isEmpty()) {
for(Comment c : board.getCommentList()) {
System.out.printf("[댓글번호: %d] 작성자: %s 작성일: %s\n%s\n",
c.getCommentNo(), c.getMemberName(), c.getCreateDate(), c.getCommentContent());
System.out.println("--------------------------------------------------------");
}
}
/* 댓글 메뉴 출력 */
//commentView.commentMenu(input);
// 게시글 번호
// 1)댓글 등록 - 누가 몇번 게시글에 작성하는가?
// 2)댓글 수정 - 누가 몇번 게시글에있는 몇번 댓글을 수정할 것인가?
// 3)댓글 삭제 - 누가 몇번 게시글에있는 몇번 댓글을 삭제할 것인가?
//******************************************************************************
// 로그인한 회원이 작성한 게시글일 경우
// 게시글 수정/삭제 기능 노출
if( Session.loginMember.getMemberNo() == board.getMemberNo()) {
while(true) {
System.out.println("1) 수정");
System.out.println("2) 삭제");
System.out.println("0) 게시판 메뉴로 돌아가기");
System.out.print("선택 >> ");
input = sc.nextInt();
sc.nextLine();
// 기능 수행 후 게시판 메뉴로 돌아가기
switch(input) {
case 1 : updateBoard(board.getBoardNo()); return;
// 게시글 번호를 매개변수로 전달
case 2 : deleteBoard(board.getBoardNo()); return;
// 게시글 번호를 매개변수로 전달
case 0 : return;
default : System.out.println("\n*** 잘못 입력 하셨습니다 ***\n");
}
}
}
} catch (Exception e) {
System.out.println("\n***** 게시글 상세 조회 중 예외 발생 *****\n");
e.printStackTrace();
}
}
/** 게시글 수정
* @param boardNo
*/
private void updateBoard(int boardNo) {
System.out.println("\n=== 게시글 수정 ===\n");
System.out.print("수정할 제목 : ");
String boardTitle = sc.nextLine();
// StringBuffer(가변성)
StringBuffer sb = new StringBuffer();
System.out.println("<!wq 입력 시 종료>");
// 특정 단어가 입력 될 때 까지 무한히 입력
while(true) {
String str = sc.nextLine();
if(str.equals("!wq")) break;
// append : 제일 뒤에 추가
sb.append(str);
sb.append("\n"); // 줄바꿈을 추가
}
try {
// 게시글 수정 서비스 호출
int result = boardService.updateBoard(boardTitle, sb.toString(), boardNo);
if(result > 0) {
System.out.println("\n=== 게시글이 수정 되었습니다 ===\n");
}else {
System.out.println("\n*** 수정 실패!! ***\n");
}
}catch(Exception e) {
System.out.println("\n***** 게시글 수정 중 예외 발생 *****\n");
e.printStackTrace();
}
}
/** 게시글 삭제
* @param boardNo
*/
private void deleteBoard(int boardNo) {
System.out.println("\n=== 게시글 삭제 ===\n");
while(true) {
System.out.print("정말 삭제 하시겠습니까? (Y/N) : ");
char check = sc.next().toUpperCase().charAt(0);
if(check == 'N') {
System.out.println("[삭제 취소]");
return;
}
if(check != 'Y') {
System.out.println("[잘못 입력하셨습니다]");
continue;
}
break; // check == 'Y' 인 경우
}
try {
// 게시글 삭제 서비스 호출
int result = boardService.deleteBoard(boardNo);
if(result > 0) {
System.out.println("\n=== 삭제 되었습니다 ===\n");
}else {
System.out.println("\n*** 삭제 실패!!! ***\n");
}
}catch (Exception e) {
System.out.println("\n***** 게시글 삭제 중 예외 발생 *****\n");
e.printStackTrace();
}
}
/**
* 게시글 등록(INSERT)
*/
private void insertBoard() {
System.out.println("\n===== 게시글 등록 =====\n");
// 제목 입력
System.out.print("제목 입력 : ");
String boardTitle = sc.nextLine();
// 내용 입력(StringBuffer)
StringBuffer sb = new StringBuffer();
System.out.println("<!wq 입력 시 종료>");
// 특정 단어가 입력 될 때 까지 무한히 입력
while(true) {
String str = sc.nextLine();
if(str.equals("!wq")) break;
// append : 제일 뒤에 추가
sb.append(str);
sb.append("\n"); // 줄바꿈을 추가
}
try {
// 게시글 삽입 서비스 호출
int result = boardService.insertBoard(boardTitle, sb.toString(),
Session.loginMember.getMemberNo());
if(result > 0) { // 성공
System.out.println("\n=== 등록 되었습니다 ===\n");
// 등록된 게시글 상세 조회 서비스 호출
// -> 게시글 번호, 로그인 회원 번호(Session)
Board board = boardService.selectBoard(result, Session.loginMember.getMemberNo());
// 등록된 게시글 번호, 회원 번호
System.out.println("--------------------------------------------------------");
System.out.printf("글번호 : %d \n제목 : %s\n", board.getBoardNo(), board.getBoardTitle());
System.out.printf("작성자 : %s | 작성일 : %s \n조회수 : %d\n",
board.getMemberName(), board.getCreateDate(), board.getReadCount());
System.out.println("--------------------------------------------------------\n");
System.out.println(board.getBoardContent());
System.out.println("\n--------------------------------------------------------");
}else { // 실패
System.out.println("\n*** 게시글 등록 실패!! ***\n");
}
}catch (Exception e) {
System.out.println("\n***** 게시글 등록 중 예외 발생 *****\n");
e.printStackTrace();
}
}
}
BoardService
package edu.kh.jdbc.board.model.service;
import static edu.kh.jdbc.common.JDBCTemplate.*;
import java.sql.Connection;
import java.util.List;
import edu.kh.jdbc.board.model.dao.BoardDAO;
import edu.kh.jdbc.board.model.dao.CommentDAO;
import edu.kh.jdbc.board.model.dto.Board;
import edu.kh.jdbc.board.model.dto.Comment;
// 데이터 가공 , 트랜잭션 처리
public class BoardService {
private BoardDAO dao = new BoardDAO();
private CommentDAO commentDao = new CommentDAO();
/** 게시글 목록 조회 서비스
* @return boardList
* @throws Exception
*/
public List<Board> selectAllBoard() throws Exception{
// 커넥션 생성
Connection conn = getConnection();
// DAO 메서드 호출
List<Board> boardList = dao.selectAllBoard(conn);
// 커넥션 반환
close(conn);
return boardList;
}
/** 게시글 상세 조회 서비스
* @param input
* @param memberNo
* @return board
* @throws Exception
*/
public Board selectBoard(int input, int memberNo) throws Exception{
// 1. 커넥션 생성
Connection conn = getConnection();
// 2. 게시글 상세 조회 DAO 메서드 호출
Board board = dao.selectBoard(conn, input);
// 3. 게시글이 조회된 경우
if(board != null) {
// ******************************************************
// ** 해당 게시글에 대한 댓글 목록 조회 DAO 호출 **
List<Comment> commentList = commentDao.selectCommentList(conn, input);
// board에 댓글 목록 세팅
board.setCommentList(commentList);
// ******************************************************
// 4. 조회수 증가
// 단, 게시글 작성자와 로그인한 회원이 다를 경우에만 증가
if( board.getMemberNo() != memberNo ) {
// 조회한 게시글 회원 번호 != 로그인한 회원 번호
// 5. 조회 수 증가 DAO 메서드 호출(UPDATE)
int result = dao.updateReadCount(conn, input);
// 6. 트랜잭션 제어 처리 + 데이터 동기화 처리
if(result > 0) {
commit(conn);
// 조회된 board의 조회수 0
// DB의 조회수는 1
// -> 조회 결과인 board의 조회수도 1 증가
board.setReadCount( board.getReadCount() + 1 );
}else {
rollback(conn);
}
}
}
// 7. 커넥션 반환
close(conn);
// 8. 결과 반환
return board;
}
/** 게시글 수정 서비스
* @param boardTitle
* @param boardContent
* @param boardNo
* @return result
* @throws Exception
*/
public int updateBoard(String boardTitle,
String boardContent, int boardNo) throws Exception{
Connection conn = getConnection();
// 게시글 수정 DAO 호출
int result = dao.updateBoard(conn, boardTitle, boardContent, boardNo);
// 트랜잭션 처리
if(result > 0) commit(conn);
else rollback(conn);
close(conn);
return result;
}
/** 게시글 삭제 서비스
* @param boardNo
* @return result
* @throws Exception
*/
public int deleteBoard(int boardNo) throws Exception{
Connection conn = getConnection();
int result = dao.deleteBoard(conn, boardNo);
if(result > 0) commit(conn);
else rollback(conn);
close(conn);
return result;
}
/** 게시글 삽입 서비스
* @param boardTitle
* @param string
* @param memberNo
* @return result
* @throws Exception
*/
public int insertBoard(String boardTitle, String boardCotent,
int memberNo) throws Exception {
Connection conn = getConnection();
// 다음 게시글 번호 생성 -> 4
int boardNo = dao.nextBoardNo(conn);
// 제목, 내용, 회원번호 + 다음 게시글번호(4)
int result = dao.insertBoard(conn, boardTitle,
boardCotent, memberNo, boardNo);
if(result > 0) {
commit(conn);
result = boardNo;
}else {
rollback(conn);
}
close(conn);
return result; // 삽입 성공 시 다음 게시글 번호
// 실패 시 0
}
/** 게시글 검색
* @param condition
* @param query
* @return boardList
* @throws Exception
*/
public List<Board> searchBoard(int condition, String query) throws Exception{
Connection conn = getConnection();
List<Board> boardList = dao.searchBoard(conn, condition, query);
close(conn);
return boardList;
}
}
BoardDAO
package edu.kh.jdbc.board.model.dao;
import static edu.kh.jdbc.common.JDBCTemplate.*;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import edu.kh.jdbc.board.model.dto.Board;
public class BoardDAO {
// JDBC 객체 참조 변수
private Statement stmt;
private PreparedStatement pstmt;
private ResultSet rs;
// XML에 작성되 SQL을 읽어와 저장할 객체를 참조하는 변수
private Properties prop;
public BoardDAO() {
try {
prop = new Properties();
prop.loadFromXML(new FileInputStream("board-sql.xml"));
}catch (Exception e) {
e.printStackTrace();
}
}
/** 게시글 목록 조회 SQL 수행
* @param conn
* @return boardList
* @throws Exception
*/
public List<Board> selectAllBoard(Connection conn) throws Exception{
// 결과 저장용 객체 생성
List<Board> boardList = new ArrayList<>();
try {
// SQL 작성 (Properties 이용)
String sql = prop.getProperty("selectAllBoard");
// SQL 수행 후 결과 반환 받기
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
// 1행씩 접근하여 컬럼 값을 얻어와 옮겨담기
while(rs.next()) {
int boardNo = rs.getInt("BOARD_NO");
String boardTitle = rs.getString("BOARD_TITLE");
String memberName = rs.getString("MEMBER_NM");
int readCount = rs.getInt("READ_COUNT");
String createDate = rs.getString("CREATE_DT");
int commentCount = rs.getInt("COMMENT_COUNT");
Board board = new Board();
board.setBoardNo(boardNo);
board.setBoardTitle(boardTitle);
board.setMemberName(memberName);
board.setReadCount(readCount);
board.setCreateDate(createDate);
board.setCommentCount(commentCount);
boardList.add(board); // list에 추가
}
}finally {
// JDBC 객체 자원 반환
close(rs);
close(stmt);
}
// 결과 반환
return boardList;
}
/** 게시글 상세 조회 SQL 수행
* @param conn
* @param input
* @return board
* @throws Exception
*/
public Board selectBoard(Connection conn, int input) throws Exception {
Board board = null;
try {
String sql = prop.getProperty("selectBoard");
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, input);
rs = pstmt.executeQuery();
if(rs.next()) {
int boardNo = rs.getInt("BOARD_NO");
String boardTitle = rs.getString("BOARD_TITLE");
String memberName = rs.getString("MEMBER_NM");
int readCount = rs.getInt("READ_COUNT");
String createDate = rs.getString("CREATE_DT");
String boardContent = rs.getString("BOARD_CONTENT");
int memberNo = rs.getInt("MEMBER_NO");
board = new Board();
board.setBoardNo(boardNo);
board.setBoardTitle(boardTitle);
board.setMemberName(memberName);
board.setReadCount(readCount);
board.setCreateDate(createDate);
board.setBoardContent(boardContent);
board.setMemberNo(memberNo);
}
}finally {
close(rs);
close(pstmt);
}
return board;
}
/** 조회수 증가 SQL 수행
* @param conn
* @param input
* @return result
* @throws Exception
*/
public int updateReadCount(Connection conn, int input) throws Exception{
int result = 0;
try {
String sql = prop.getProperty("updateReadCount");
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, input);
result = pstmt.executeUpdate();
}finally {
close(pstmt);
}
return result;
}
/** 게시글 수정 SQL 수행
* @param conn
* @param boardTitle
* @param boardContent
* @param boardNo
* @return result
* @throws Exception
*/
public int updateBoard(Connection conn, String boardTitle,
String boardContent, int boardNo) throws Exception{
int result = 0;
try {
String sql = prop.getProperty("updateBoard");
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, boardTitle);
pstmt.setString(2, boardContent);
pstmt.setInt(3, boardNo);
result = pstmt.executeUpdate();
}finally {
close(pstmt);
}
return result;
}
/** 게시글 삭제 SQL 수행
* @param conn
* @param boardNo
* @return result
* @throws Exception
*/
public int deleteBoard(Connection conn, int boardNo) throws Exception{
int result = 0; // 결과 저장용 변수 선언
try {
String sql = prop.getProperty("deleteBoard");
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, boardNo);
result = pstmt.executeUpdate();
// DDL(CREATE, ALTER, DROP) 수행도 가능
// 결과로 -1 반환
}finally {
close(pstmt);
}
return result;
}
/** 다음 게시글 번호 조회 SQL 수행
* @param conn
* @return boardNo
* @throws Exception
*/
public int nextBoardNo(Connection conn) throws Exception{
int boardNo = 0;
try {
String sql = prop.getProperty("nextBoardNo");
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
if(rs.next()) {
boardNo = rs.getInt(1); // 컬럼 순서
}
}finally {
close(rs);
close(stmt);
}
return boardNo;
}
/** 게시글 삽입
* @param conn
* @param boardTitle
* @param boardCotent
* @param memberNo
* @param boardNo
* @return result
* @throws Exception
*/
public int insertBoard(Connection conn, String boardTitle,
String boardCotent, int memberNo, int boardNo) throws Exception {
int result = 0;
try {
String sql = prop.getProperty("insertBoard");
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, boardNo);
pstmt.setString(2, boardTitle);
pstmt.setString(3, boardCotent);
pstmt.setInt(4, memberNo);
result = pstmt.executeUpdate();
}finally {
close(pstmt);
}
return result;
}
/** 게시글 검색 DAO
* @param conn
* @param condition
* @param query
* @return boardList
* @throws Exception
*/
public List<Board> searchBoard(Connection conn, int condition, String query) throws Exception{
List<Board> boardList = new ArrayList<>();
try {
String sql = prop.getProperty("searchBoard1")
+ prop.getProperty("searchBoard2_" + condition)
+ prop.getProperty("searchBoard3");
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, query);
// 3번(제목+내용)은 ?가 2개 존재하기 때문에 추가 세팅 구문 작성
if(condition == 3) pstmt.setString(2, query);
rs = pstmt.executeQuery();
// ResultSet에 저장된 값을 List 옮겨 담기
while(rs.next()) {
int boardNo = rs.getInt("BOARD_NO");
String boardTitle = rs.getString("BOARD_TITLE");
String memberName = rs.getString("MEMBER_NM");
int readCount = rs.getInt("READ_COUNT");
String createDate = rs.getString("CREATE_DT");
int commentCount = rs.getInt("COMMENT_COUNT");
Board board = new Board();
board.setBoardNo(boardNo);
board.setBoardTitle(boardTitle);
board.setMemberName(memberName);
board.setReadCount(readCount);
board.setCreateDate(createDate);
board.setCommentCount(commentCount);
boardList.add(board);
}
}finally {
close(rs);
close(pstmt);
}
return boardList;
}
}
board-sql
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>board-sql.xml file</comment>
<entry key="selectAllBoard">
SELECT BOARD_NO, BOARD_TITLE, MEMBER_NM, CREATE_DT, READ_COUNT,
(SELECT COUNT(*) FROM "COMMENT" SUB
WHERE SUB.BOARD_NO = MAIN.BOARD_NO
AND DELETE_FL = 'N') COMMENT_COUNT
FROM "BOARD" MAIN
JOIN "MEMBER" USING(MEMBER_NO)
WHERE DELETE_FL = 'N'
ORDER BY BOARD_NO DESC
</entry>
<entry key="selectBoard">
SELECT BOARD_NO, BOARD_TITLE, BOARD_CONTENT, MEMBER_NO, MEMBER_NM,
READ_COUNT, CREATE_DT
FROM BOARD
JOIN MEMBER USING(MEMBER_NO)
WHERE DELETE_FL = 'N'
AND BOARD_NO = ?
</entry>
<entry key="updateReadCount">
UPDATE BOARD SET
READ_COUNT = READ_COUNT + 1
WHERE BOARD_NO = ?
</entry>
<entry key="updateBoard">
UPDATE BOARD SET
BOARD_TITLE = ?,
BOARD_CONTENT = ?
WHERE BOARD_NO = ?
</entry>
<entry key="deleteBoard">
UPDATE BOARD
SET DELETE_FL = 'Y'
WHERE BOARD_NO = ?
</entry>
<entry key="nextBoardNo">
SELECT SEQ_BOARD_NO.NEXTVAL FROM DUAL
</entry>
<entry key="insertBoard">
INSERT INTO BOARD
VALUES(?, ?, ?, DEFAULT, DEFAULT, DEFAULT, ?)
</entry>
<entry key="searchBoard1">
SELECT BOARD_NO, BOARD_TITLE, MEMBER_NM, READ_COUNT,
CASE
WHEN SYSDATE - CREATE_DT < 1/24/60
THEN FLOOR( (SYSDATE - CREATE_DT) * 24 * 60 * 60 ) || '초 전'
WHEN SYSDATE - CREATE_DT < 1/24
THEN FLOOR( (SYSDATE - CREATE_DT) * 24 * 60) || '분 전'
WHEN SYSDATE - CREATE_DT < 1
THEN FLOOR( (SYSDATE - CREATE_DT) * 24) || '시간 전'
ELSE TO_CHAR(CREATE_DT, 'YYYY-MM-DD')
END CREATE_DT,
(SELECT COUNT(*)
FROM "COMMENT" C
WHERE C.BOARD_NO = B.BOARD_NO) COMMENT_COUNT
FROM "BOARD" B
JOIN "MEMBER" USING(MEMBER_NO)
WHERE DELETE_FL = 'N'
</entry>
<entry key="searchBoard2_1">
AND BOARD_TITLE LIKE '%' || ? || '%'
</entry>
<entry key="searchBoard2_2">
AND BOARD_CONTENT LIKE '%' || ? || '%'
</entry>
<entry key="searchBoard2_3">
AND (BOARD_TITLE LIKE '%' || ? || '%'
OR BOARD_CONTENT LIKE '%' || ? || '%')
</entry>
<entry key="searchBoard2_4">
AND MEMBER_NM LIKE '%' || ? || '%'
</entry>
<entry key="searchBoard3">
ORDER BY BOARD_NO DESC
</entry>
</properties>