고급JAVA 21강 - MVC패턴으로 게시판만들기 해설

Whatever·2021년 11월 25일
0

고급 JAVA

목록 보기
21/32

IJdbcBoardDao

package kr.or.ddit.board.dao;

import java.util.List;

import kr.or.ddit.board.vo.JdbcBoardVO;

public interface IJdbcBoardDao {
	
	/**
	 * JdbcBoardVO에 담겨진 자료를 DB에 insert하는 메서드
	 * 
	 * @param boardVo DB에 insert할 자료가 저장된 JdbcBoardVO객체
	 * @return 작업성공 : 1, 작업실패 : 0
	 */
	public int insertBoard(JdbcBoardVO boardVo);
	
	/**
	 * 게시글 번호를 인수값으로 받아서 해당 게시글을 삭제하는 메서드
	 * 
	 * @param boardNo 삭제할 게시글 번호
	 * @return	작업성공 : 1, 작업실패 : 0
	 */
	public int deleteBoard(int boardNo);
	
	/**
	 * 하나의 JdbcBoardVO자료를 이용하여 DB에 update하는 메서드
	 * 
	 * @param boardVo update할 게시글 정보가 저장된 JdbcBoardVO객체
	 * @return 작업성공 : 1, 작업실패 : 0
	 */
	public int updateBoard(JdbcBoardVO boardVo);
	
	/**
	 * DB에서 전체 게시글 목록을 가져오는 메서드
	 * @return JdbcBoardVO객체를 담고 있는 List객체 
	 */
	public List<JdbcBoardVO> getAllBoardList();
	
	/**
	 * 게시글 번호를 인수값으로 받아서 해당 게시글 정보를 가져오는 메서드
	 * 
	 * @param boardNo 가져올 게시글의 게시글 번호
	 * @return	게시글 번호에 맞는 자료가 있으면 해당 게시글 정보를
	 * 			담고 있는 JdbcBoardVO객체, 자료가 없으면 null 반환
	 */
	public JdbcBoardVO getBoard(int boardNo);
	
	/**
	 * 게시글의 제목을 인수값으로 받아서 게시글을 검색하는 메서드
	 *  
	 * @param title 검색할 게시글의 제목
	 * @return 검색한 결과가 저장된 List객체
	 */
	public List<JdbcBoardVO> getSearchBoardList(String title);
	
	/**
	 * 게시글 번호를 인수값으로 받아서 해당 게시글의 조회수를 증가시키는 메서드
	 * 
	 * @param boardNo 조회수를 증가할 게시글 번호
	 * @return 작업성공 : 1, 작업실패 : 0
	 */
	public int setCountIncrement(int boardNo);
	
}

JdbcBoardDaoImpl

package kr.or.ddit.board.dao;

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

import kr.or.ddit.board.vo.JdbcBoardVO;
import kr.or.ddit.util.DBUtil3;

public class JdbcBoardDaoImpl implements IJdbcBoardDao{
	private static JdbcBoardDaoImpl dao;
	
	private JdbcBoardDaoImpl(){ }
	
	public static JdbcBoardDaoImpl getInstance(){
		if(dao==null) dao = new JdbcBoardDaoImpl();
		
		return dao;
	}
	
	private Connection conn;
	private PreparedStatement pstmt;
	private Statement stmt;
	private ResultSet rs;
	
	// 사용한 자원을 반납하는 메서드
	private void disConnect(){
		if(rs!=null) try{ rs.close(); }catch(SQLException e){}
		if(stmt!=null) try{ stmt.close(); }catch(SQLException e){}
		if(pstmt!=null) try{ pstmt.close(); }catch(SQLException e){}
		if(conn!=null) try{ conn.close(); }catch(SQLException e){}
	}
	

	@Override
	public int insertBoard(JdbcBoardVO boardVo) {
		int cnt = 0;
		
		try {
			conn = DBUtil3.getConnection();
			
			String sql = "insert into jdbc_board "
					+ "(board_no, board_title, board_writer,"
					+ " board_date, board_cnt, board_content) "
					+ " values(board_seq.nextval, ?, ? , sysdate, 0, ? ) ";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, boardVo.getBoard_title());
			pstmt.setString(2, boardVo.getBoard_writer());
			pstmt.setString(3, boardVo.getBoard_content());
			
			cnt = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			cnt = 0;
			e.printStackTrace();
		} finally{
			disConnect();
		}
		
		return cnt;
	}

	@Override
	public int deleteBoard(int boardNo) {
		int cnt = 0;
		
		try {
			conn = DBUtil3.getConnection();
			
			String sql = "delete from jdbc_board where board_no = ? ";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, boardNo);
			
			cnt = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			cnt = 0;
			e.printStackTrace();
		} finally{
			disConnect();
		}
		
		return cnt;
	}

	@Override
	public int updateBoard(JdbcBoardVO boardVo) {
		int cnt = 0;
		
		try {
			conn = DBUtil3.getConnection();
			
			String sql = "update jdbc_board set "
					+ " board_title = ? ,"
					+ " board_content = ? ,"
					+ " board_date = sysdate "
					+ " where board_no = ? ";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, boardVo.getBoard_title());
			pstmt.setString(2, boardVo.getBoard_content());
			pstmt.setInt(3, boardVo.getBoard_no());
			
			cnt = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			cnt = 0;
			e.printStackTrace();
		} finally {
			disConnect();
		}
		
		return cnt;
	}

	@Override
	public List<JdbcBoardVO> getAllBoardList() {
		List<JdbcBoardVO> boardList = null;
		
		try {
			conn = DBUtil3.getConnection();
			
			String sql = "select board_no, board_title, board_writer,"
					+ " to_char(board_date, 'YYYY-MM-DD') board_date , board_cnt, board_content "
					+ " from jdbc_board "
					+ " order by board_no desc";
			stmt = conn.createStatement();
			
			rs = stmt.executeQuery(sql);
			
			boardList = new ArrayList<>();
			
			while(rs.next()){
				JdbcBoardVO boardVo = new JdbcBoardVO();
				boardVo.setBoard_no(rs.getInt("board_no"));
				boardVo.setBoard_title(rs.getString("board_title"));
				boardVo.setBoard_writer(rs.getString("board_writer"));
				boardVo.setBoard_date(rs.getString("board_date"));
				boardVo.setBoard_cnt(rs.getInt("board_cnt"));
				boardVo.setBoard_content(rs.getString("board_content"));
				
				boardList.add(boardVo);
			}
			
			
		} catch (SQLException e) {
			boardList = null;
			e.printStackTrace();
		} finally {
			disConnect();
		}
		return boardList;
	}

	@Override
	public JdbcBoardVO getBoard(int boardNo) {
		JdbcBoardVO boardVo = null;
		
		try {
			conn = DBUtil3.getConnection();
			
			String sql = "select board_no, board_title, board_writer,"
					+ " to_char(board_date, 'YYYY-MM-DD') board_date , board_cnt, board_content "
					+ " from jdbc_board "
					+ " where board_no = ? ";
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, boardNo);
			
			rs = pstmt.executeQuery();
			
			if(rs.next()){
				boardVo = new JdbcBoardVO();
				boardVo.setBoard_no(rs.getInt("board_no"));
				boardVo.setBoard_title(rs.getString("board_title"));
				boardVo.setBoard_writer(rs.getString("board_writer"));
				boardVo.setBoard_date(rs.getString("board_date"));
				boardVo.setBoard_cnt(rs.getInt("board_cnt"));
				boardVo.setBoard_content(rs.getString("board_content"));
			}
			
		} catch (SQLException e) {
			boardVo = null;
			e.printStackTrace();
		} finally{
			disConnect();
		}
		
		return boardVo;
	}

	@Override
	public List<JdbcBoardVO> getSearchBoardList(String title) {
		List<JdbcBoardVO> boardList = null;
		
		try {
			conn = DBUtil3.getConnection();
			
			String sql = "select board_no, board_title, board_writer,"
					+ " to_char(board_date, 'YYYY-MM-DD') board_date , board_cnt, board_content "
					+ " from jdbc_board "
					+ " where board_title like '%' || ? || '%'"
					+ " order by board_no desc";
					// where board_title like '%' || ? || '%'
					// where board_title like '%' || '가' || '%'
			
					// where board_title like '%?%'  ==> 사용 불가
					// where board_title like '%'가'%'
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, title);
			
			rs = pstmt.executeQuery();
			
			boardList = new ArrayList<>();
			
			while(rs.next()){
				JdbcBoardVO boardVo = new JdbcBoardVO();
				boardVo.setBoard_no(rs.getInt("board_no"));
				boardVo.setBoard_title(rs.getString("board_title"));
				boardVo.setBoard_writer(rs.getString("board_writer"));
				boardVo.setBoard_date(rs.getString("board_date"));
				boardVo.setBoard_cnt(rs.getInt("board_cnt"));
				boardVo.setBoard_content(rs.getString("board_content"));
				
				boardList.add(boardVo);
			}
			
			
		} catch (SQLException e) {
			boardList = null;
			e.printStackTrace();
		} finally {
			disConnect();
		}
		return boardList;
	}

	@Override
	public int setCountIncrement(int boardNo) {
		int cnt = 0;
		
		try {
			conn = DBUtil3.getConnection();
			
			String sql = "update jdbc_board "
					+ " set board_cnt = board_cnt + 1 "
					+ "	where board_no = ? ";
			
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, boardNo);
			
			cnt = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			cnt = 0;
			e.printStackTrace();
		} finally {
			disConnect();
		}
		
		
		return cnt;
	}

}

IJdbcBoardService

package kr.or.ddit.board.service;

import java.util.List;

import kr.or.ddit.board.vo.JdbcBoardVO;

public interface IJdbcBoardService {
	/**
	 * JdbcBoardVO에 담겨진 자료를 DB에 insert하는 메서드
	 * 
	 * @param boardVo DB에 insert할 자료가 저장된 JdbcBoardVO객체
	 * @return 작업성공 : 1, 작업실패 : 0
	 */
	public int insertBoard(JdbcBoardVO boardVo);
	
	/**
	 * 게시글 번호를 인수값으로 받아서 해당 게시글을 삭제하는 메서드
	 * 
	 * @param boardNo 삭제할 게시글 번호
	 * @return	작업성공 : 1, 작업실패 : 0
	 */
	public int deleteBoard(int boardNo);
	
	/**
	 * 하나의 JdbcBoardVO자료를 이용하여 DB에 update하는 메서드
	 * 
	 * @param boardVo update할 게시글 정보가 저장된 JdbcBoardVO객체
	 * @return 작업성공 : 1, 작업실패 : 0
	 */
	public int updateBoard(JdbcBoardVO boardVo);
	
	/**
	 * DB에서 전체 게시글 목록을 가져오는 메서드
	 * @return JdbcBoardVO객체를 담고 있는 List객체 
	 */
	public List<JdbcBoardVO> getAllBoardList();
	
	/**
	 * 게시글 번호를 인수값으로 받아서 해당 게시글 정보를 가져오는 메서드
	 * 
	 * @param boardNo 가져올 게시글의 게시글 번호
	 * @return	게시글 번호에 맞는 자료가 있으면 해당 게시글 정보를
	 * 			담고 있는 JdbcBoardVO객체, 자료가 없으면 null 반환
	 */
	public JdbcBoardVO getBoard(int boardNo);
	
	/**
	 * 게시글의 제목을 인수값으로 받아서 게시글을 검색하는 메서드
	 *  
	 * @param title 검색할 게시글의 제목
	 * @return 검색한 결과가 저장된 List객체
	 */
	public List<JdbcBoardVO> getSearchBoardList(String title);
	
	/**
	 * 게시글 번호를 인수값으로 받아서 해당 게시글의 조회수를 증가시키는 메서드
	 * 
	 * @param boardNo 조회수를 증가할 게시글 번호
	 * @return 작업성공 : 1, 작업실패 : 0
	 */
//	public int setCountIncrement(int boardNo);
}

JdbcBoardServiceImple

package kr.or.ddit.board.service;

import java.util.List;

import kr.or.ddit.board.dao.IJdbcBoardDao;
import kr.or.ddit.board.dao.JdbcBoardDaoImpl;
import kr.or.ddit.board.vo.JdbcBoardVO;

public class JdbcBoardServiceImple implements IJdbcBoardService {
	private IJdbcBoardDao dao;
	
	private static JdbcBoardServiceImple service;
	
	private JdbcBoardServiceImple(){
		dao = JdbcBoardDaoImpl.getInstance();
	}
	
	public static JdbcBoardServiceImple getInstance(){
		if(service==null) service = new JdbcBoardServiceImple();
		
		return service;
	}
	
	

	@Override
	public int insertBoard(JdbcBoardVO boardVo) {
		return dao.insertBoard(boardVo);
	}

	@Override
	public int deleteBoard(int boardNo) {
		return dao.deleteBoard(boardNo);
	}

	@Override
	public int updateBoard(JdbcBoardVO boardVo) {
		return dao.updateBoard(boardVo);
	}

	@Override
	public List<JdbcBoardVO> getAllBoardList() {
		return dao.getAllBoardList();
	}

	@Override
	public JdbcBoardVO getBoard(int boardNo) {
		
		int cnt = dao.setCountIncrement(boardNo);  // 조회수 증가하기
		
		if(cnt==0){  // 조회수 증가하기 실패
			return null;
		}
		
		return dao.getBoard(boardNo);
	}

	@Override
	public List<JdbcBoardVO> getSearchBoardList(String title) {
		return dao.getSearchBoardList(title);
	}

//	@Override
//	public int setCountIncrement(int boardNo) {
//		return dao.setCountIncrement(boardNo);
//	}

}

JdbcBoardVO

package kr.or.ddit.board.vo;

public class JdbcBoardVO {
	private int board_no;
	private String board_title;
	private String board_writer;
	private String board_date;
	private int board_cnt;
	private String board_content;
	
	public int getBoard_no() {
		return board_no;
	}
	public void setBoard_no(int board_no) {
		this.board_no = board_no;
	}
	public String getBoard_title() {
		return board_title;
	}
	public void setBoard_title(String board_title) {
		this.board_title = board_title;
	}
	public String getBoard_writer() {
		return board_writer;
	}
	public void setBoard_writer(String board_writer) {
		this.board_writer = board_writer;
	}
	public String getBoard_date() {
		return board_date;
	}
	public void setBoard_date(String board_date) {
		this.board_date = board_date;
	}
	public int getBoard_cnt() {
		return board_cnt;
	}
	public void setBoard_cnt(int board_cnt) {
		this.board_cnt = board_cnt;
	}
	public String getBoard_content() {
		return board_content;
	}
	public void setBoard_content(String board_content) {
		this.board_content = board_content;
	}
	
}

JdbcBoardController

package kr.or.ddit.board.controller;

import java.util.List;
import java.util.Scanner;

import kr.or.ddit.board.service.IJdbcBoardService;
import kr.or.ddit.board.service.JdbcBoardServiceImple;
import kr.or.ddit.board.vo.JdbcBoardVO;

public class JdbcBoardController {
	private IJdbcBoardService service;
	private Scanner scan;
	
	public JdbcBoardController() {
		service = JdbcBoardServiceImple.getInstance();
		scan = new Scanner(System.in);
	}
	
	public static void main(String[] args) {
		new JdbcBoardController().boardStart();
	}

	public void boardStart(){
		String title = null;
		while(true){
			int choice = displayMenu(title);
			title = null;
			switch(choice){
				case 1 :	// 새글 작성 
					insertBoard(); break;
				case 2 : 	// 게시글 보기
					viewBoard(); break;
				case 3 : 	// 검색
					title = searchBoard(); break;
				case 0 :  	// 작업 끝...
					System.out.println();
					System.out.println("게시판 프로그램을 종료합니다.");
					return;
				default : 
					System.out.println("작업 번호를 잘못 입력했습니다. 다시 입력하세요.");
			}
		}
		
	}
	
	// 게시글의 검색 작업  ==> 검색할 단어를 입력 받아서 반환하는 메서드
	private String searchBoard(){
		scan.nextLine();  // 입력 버퍼 비우기
		System.out.println();
		System.out.println("검색 작업");
		System.out.println("--------------------------------------------");
		System.out.print("- 검색할 제목 입력 : ");
		String title = scan.nextLine();
		return title;
	}
	
	
	// 게시글의 내용을 보여주는 메서드
	private void viewBoard(){
		System.out.println();
		System.out.print("보기를 원하는 게시물 번호 입력 >> ");
		int boardNo = scan.nextInt();
		
		JdbcBoardVO boardVo = service.getBoard(boardNo);
		
		if(boardVo == null){
			System.out.println(boardNo + "번의 게시글이 존재하지 않습니다.");
			return;
		}
		
		int num;
		do{
			System.out.println();
			System.out.println("------------------------------------------------------------");
			System.out.println("- 제  목 : " + boardVo.getBoard_title());      
			System.out.println("- 작성자 : " + boardVo.getBoard_writer());           
			System.out.println("- 내  용 : " + boardVo.getBoard_content());  
			System.out.println("- 작성일 : " + boardVo.getBoard_date());
			System.out.println("- 조회수 : " + boardVo.getBoard_cnt());
			System.out.println("-------------------------------------------------------------");
			System.out.println("메뉴 : 1. 수정    2. 삭제    3. 리스트로 가기");
			System.out.print("작업선택 >> ");
			num = scan.nextInt();
			
			switch(num){
				case 1 : // 수정
					updateBoard(boardNo); break;
				case 2 : // 삭제
					deleteBoard(boardNo); break;
				case 3 : // 리스트로 가기
					return;
				default : 
					System.out.println("작업 번호는 1번~3번 사이만 입력하세요.");
					System.out.println("다시 입력하세요.");
			}
		
		}while(num<1 || num>3);
	}
	
	// 게시글을 삭제하는 메서드
	private void deleteBoard(int boardNo){
		int cnt = service.deleteBoard(boardNo);
		if(cnt>0){
			System.out.println(boardNo + "번글이 삭제되었습니다.");
		}else{
			System.out.println(boardNo + "번글 삭제 작업 실패!!!");
		}
	}
	
		
	// 게시글의 제목과 내용을 수정하는 메서드
	private void updateBoard(int boardNo){
		scan.nextLine(); // 입력 버퍼 비우기
		System.out.println();
		System.out.println("수정 작업하기");
		System.out.println("-----------------------------------");
		System.out.print("- 제 목 : ");
		String title = scan.nextLine();
		
		System.out.print("- 내 용 : ");
		String content = scan.nextLine();
		
		JdbcBoardVO boardVo = new JdbcBoardVO();
		boardVo.setBoard_no(boardNo);
		boardVo.setBoard_title(title);
		boardVo.setBoard_content(content);
		
		int cnt = service.updateBoard(boardVo);
		
		if(cnt>0){
			System.out.println(boardNo + "번글이 수정되었습니다. ");
		}else{
			System.out.println(boardNo + "번글 수정 작업 실패!!!");
		}

	}
	
	
	
	// 새글을 작성하는 메서드
	private void insertBoard(){
		scan.nextLine();  // 입력 버퍼 비우기
		System.out.println();
		System.out.println("새글 작성하기");
		System.out.println("--------------------------------------------");
		System.out.print("- 제    목 : ");
		String title = scan.nextLine();
		System.out.print("- 작 성 자 : ");
		String writer = scan.nextLine();
		System.out.print("- 내    용 : ");
		String content = scan.nextLine();
		
		JdbcBoardVO boardVo = new JdbcBoardVO();
		boardVo.setBoard_title(title);
		boardVo.setBoard_writer(writer);
		boardVo.setBoard_content(content);
		
		int cnt = service.insertBoard(boardVo);
		
		if(cnt>0){
			System.out.println("새글이 추가되었습니다...");
		}else{
			System.out.println("새글 추가 실패!!!");
		}
		
		
	}
	
	
	
	// 게시판 목록을 보여주고 메뉴를 나타내며 
	// 사용자가 입력한 작업번호를 반환하는 메서드
	private int displayMenu(String title){
		
		List<JdbcBoardVO> boardList = null;
		if(title==null){
			boardList = service.getAllBoardList();
		}else{
			boardList = service.getSearchBoardList(title);
		}
				
		
		System.out.println();
		System.out.println("-------------------------------------------------------------");
		System.out.println(" No         제 목            작성자          조회수");   
		System.out.println("-------------------------------------------------------------");
		
		if(boardList==null || boardList.size()==0){
			System.out.println("     출력할 게시글이 하나도 없습니다...");
		}else{
			for(JdbcBoardVO boardVo : boardList){
				System.out.println(
					boardVo.getBoard_no() + "\t" + 	
					boardVo.getBoard_title() + "\t" + 	
					boardVo.getBoard_writer() + "\t" +
					boardVo.getBoard_cnt() 	
				);
			}
		}
		System.out.println("-------------------------------------------------------------");
		System.out.println("메뉴 : 1. 새글작성     2. 게시글보기    3. 검색    0. 작업끝");
		System.out.print("작업 선택 >> ");
		int num = scan.nextInt();
		
		return num;
	}
	
}

0개의 댓글