TIL - 29. 게시판 Board [230822]

송원철·2023년 8월 22일
0

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>
	
	<!-- 게시글 검색1(WHERE절 시작 까지)
		&lt; == "<" 
	 -->
	<entry key="searchBoard1">
		SELECT BOARD_NO, BOARD_TITLE, MEMBER_NM, READ_COUNT, 
			CASE  
				WHEN SYSDATE - CREATE_DT &lt; 1/24/60
				THEN FLOOR( (SYSDATE - CREATE_DT) * 24 * 60 * 60 ) || '초 전'
				WHEN SYSDATE - CREATE_DT &lt; 1/24
				THEN FLOOR( (SYSDATE - CREATE_DT) * 24 * 60) || '분 전'
				WHEN SYSDATE - CREATE_DT &lt; 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>
	
	<!-- 게시글 검색2(검색 조건) -->
	<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>
	
	
	<!-- 게시글 검색3(ORDER BY) -->
	<entry key="searchBoard3">
		ORDER BY BOARD_NO DESC
	</entry>
	
	
</properties>
profile
초보자

0개의 댓글