관리 메뉴

거니의 velog

230919_MVC 2 본문

대덕인재개발원_자바기반 애플리케이션

230919_MVC 2

Unlimited00 2023. 9. 18. 19:06
게시판 테이블 구조 및 시퀀스

create table jdbc_board(
    board_no number not null,  -- 번호(자동증가)
    board_title varchar2(100) not null, -- 제목
    board_writer varchar2(50) not null, -- 작성자
    board_date date not null,   	-- 작성날짜
    board_cnt number default 0, -- 조회수
    board_content clob,     	-- 내용
    constraint pk_jdbc_board primary key (board_no)
);

create sequence board_seq
    start with 1   -- 시작번호
    increment by 1; -- 증가값
		
----------------------------------------------------------

// 시퀀스의 다음 값 구하기
//  시퀀스이름.nextVal


----------------------------------------------------------

위의 테이블을 작성하고 게시판을 관리하는
전체 목록 출력, 새글작성, 수정, 삭제, 검색 기능을
아래 예시와 같이 구현하시오.(MVC패턴과 SINGLE패턴 적용)
 
------------------------------------------------------------
실행 예)

-------------------------------------------------------------
 No	        제 목            작성자 	조회수   
-------------------------------------------------------------
  4         네번째 게시글        홍길동            0
  3         세번째 게시글        일지매            0
  2         두번째 게시글        홍길동            0
  1         첫번째 게시글        성춘향            0
-------------------------------------------------------------
메뉴 : 1. 새글작성     2. 게시글보기    3. 검색    0. 작업끝
작업선택 >> 1       <-- 입력

새글 작성하기
-----------------------------------
- 제  목 : 안녕하세요?      <-- 입력
- 작성자 : 변학도           <-- 입력
- 내  용 : 연습용 입니다.   <-- 입력

새글이 추가되었습니다.


-------------------------------------------------------------
 No	        제 목            작성자 	조회수   
-------------------------------------------------------------
  5         안녕하세요?          변학도            0
  4         네번째 게시글        홍길동            0
  3         세번째 게시글        일지매            0
  2         두번째 게시글        홍길동            0
  1         첫번째 게시글        성춘향            0
-------------------------------------------------------------
메뉴 : 1. 새글작성     2. 게시글보기    3. 검색    0. 작업끝
작업선택 >> 2       <-- 입력

보기를 원하는 게시물 번호 입력 >> 5        <-- 입력

 5번글 내용
------------------------------------------------------------
- 제  목 : 안녕하세요?      
- 작성자 : 변학도           
- 내  용 : 연습용 입니다.  
- 작성일 : 2018-12-12
- 조회수 : 1
-------------------------------------------------------------
메뉴 : 1. 수정    2. 삭제    3. 리스트로 가기
작업선택 >> 1       <-- 입력

수정 작업하기
-----------------------------------
- 제  목 : 수정작업 연습        	<-- 입력
- 내  용 : 수정 작업 연습 중입니다.  	<-- 입력

5번글이 수정되었습니다.

-------------------------------------------------------------
 No	        제 목            작성자 	조회수   
-------------------------------------------------------------
  5         수정작업 연습        변학도            1
  4         네번째 게시글        홍길동            0
  3         세번째 게시글        일지매            0
  2         두번째 게시글        홍길동            0
  1         첫번째 게시글        성춘향            0
-------------------------------------------------------------
메뉴 : 1. 새글작성     2. 게시글보기    3. 검색    0. 작업끝
작업선택 >> 2       <-- 입력

보기를 원하는 게시물 번호 입력 >> 5        <-- 입력

 5번글 내용
------------------------------------------------------------
- 제  목 : 수정작업 연습      
- 작성자 : 변학도           
- 내  용 : 수정 작업 연습 중입니다.  
- 작성일 : 2018-12-12
- 조회수 : 2
-------------------------------------------------------------
메뉴 : 1. 수정    2. 삭제    3. 리스트로 가기
작업선택 >> 2      <-- 입력

5번글이 삭제되었습니다.

-------------------------------------------------------------
 No	        제 목            작성자 	조회수   
-------------------------------------------------------------
  4         네번째 게시글        홍길동            0
  3         세번째 게시글        일지매            0
  2         두번째 게시글        홍길동            0
  1         첫번째 게시글        성춘향            0
-------------------------------------------------------------
메뉴 : 1. 새글작성     2. 게시글보기    3. 검색    0. 작업끝
작업선택 >> 3       <-- 입력

검색 작업
--------------------------------------------
- 검색할 제목 입력 : 첫번째      <-- 입력

-------------------------------------------------------------
 No	        제 목            작성자 	조회수   
-------------------------------------------------------------
  1         첫번째 게시글        성춘향            0
-------------------------------------------------------------
메뉴 : 1. 새글작성     2. 게시글보기    3. 검색    0. 작업끝
작업선택 >> 3       <-- 입력

검색 작업
--------------------------------------------
- 검색할 제목 입력 :       <-- 입력(입력값이 없으면 전체 자료 출력)

-------------------------------------------------------------
 No	        제 목            작성자 	조회수   
-------------------------------------------------------------
  4         네번째 게시글        홍길동            0
  3         세번째 게시글        일지매            0
  2         두번째 게시글        홍길동            0
  1         첫번째 게시글        성춘향            0
-------------------------------------------------------------
메뉴 : 1. 새글작성     2. 게시글보기    3. 검색    0. 작업끝
작업선택 >> 0       <-- 입력

게시판 프로그램 종료....

[JdbcBoardVO.java]

package kr.or.ddit.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 JdbcBoardVO() {}
	public JdbcBoardVO(int board_no, String board_title, String board_writer, String board_date, int board_cnt, String board_content) {
		this.board_no = board_no;
		this.board_title = board_title;
		this.board_writer = board_writer;
		this.board_date = board_date;
		this.board_cnt = board_cnt;
		this.board_content = 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;
	}
	
	@Override
	public String toString() {
		return "BoardVO [board_no=" + board_no + ", board_title=" + board_title + ", board_writer=" + board_writer
				+ ", board_date=" + board_date + ", board_cnt=" + board_cnt + ", board_content=" + board_content + "]";
	}
	
}

[IJdbcBoardDao.java]

package kr.or.ddit.board.dao;

import java.util.List;

import kr.or.ddit.vo.JdbcBoardVO;

public interface IJdbcBoardDao {

	/**
	 * BoardVO에 담겨진 자료를 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);
	
	/**
	 * 하나의 BoardVO자료를 이용하여 DB에 update하는 메서드
	 * 
	 * @param boardVo update할 게시글 정보가 저장된 JdbcBoardVO객체
	 * @return 작업성공 : 1, 작업실패 : 0
	 */
	public int updateBoard(JdbcBoardVO boardVo);
	
	/**
	 * DB에서 전체 게시글 목록을 가져오는 메서드
	 * 
	 * @return BoardVO객체를 담고 있는 List객체
	 */
	public List<JdbcBoardVO> getAllBoardList();
	
	/**
	 * 게시글 번호를 인수값으로 받아서 해당 게시글 정보를 가져오는 메서드
	 * 
	 * @param boardNo 가져올 게시글의 게시글 번호
	 * @return 게시글 번호에 맞는 자료가 있으면 해당 게시글 정보를
	 * 			담고 있는 BoardVO객체, 자료가 없으면 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);
	
}

[IJdbcBoardService.java]

package kr.or.ddit.board.service;

import java.util.List;

import kr.or.ddit.vo.JdbcBoardVO;

public interface IJdbcBoardService {

	/**
	 * BoardVO에 담겨진 자료를 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);
	
	/**
	 * 하나의 BoardVO자료를 이용하여 DB에 update하는 메서드
	 * 
	 * @param boardVo update할 게시글 정보가 저장된 JdbcBoardVO객체
	 * @return 작업성공 : 1, 작업실패 : 0
	 */
	public int updateBoard(JdbcBoardVO boardVo);
	
	/**
	 * DB에서 전체 게시글 목록을 가져오는 메서드
	 * 
	 * @return BoardVO객체를 담고 있는 List객체
	 */
	public List<JdbcBoardVO> getAllBoardList();
	
	/**
	 * 게시글 번호를 인수값으로 받아서 해당 게시글 정보를 가져오는 메서드
	 * 
	 * @param boardNo 가져올 게시글의 게시글 번호
	 * @return 게시글 번호에 맞는 자료가 있으면 해당 게시글 정보를
	 * 			담고 있는 BoardVO객체, 자료가 없으면 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.java]

package kr.or.ddit.board.dao;

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 kr.or.ddit.util.DBUtil3;
import kr.or.ddit.vo.JdbcBoardVO;

public class JdbcBoardDaoImpl implements IJdbcBoardDao {
	
	@Override
	public int insertBoard(JdbcBoardVO boardVo) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		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) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
		return cnt;
	}

	@Override
	public int deleteBoard(int boardNo) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		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) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
		return cnt;
	}

	@Override
	public int updateBoard(JdbcBoardVO boardVo) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		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) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
		return cnt;
	}

	@Override
	public List<JdbcBoardVO> getAllBoardList() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		List<JdbcBoardVO> boardList = null;
		
		try {
			conn = DBUtil3.getConnection();
			String sql = " select board_no " + 
					"     , board_title " + 
					"     , board_writer " + 
					"     , to_char(board_date, 'YYYY-MM-DD') as board_date " + 
					"     , board_cnt " + 
					"     , board_content " + 
					"  from jdbc_board " + 
					" order by board_no desc ";
			pstmt = conn.prepareStatement(sql);
			
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				if(boardList == null) boardList = new ArrayList<JdbcBoardVO>();
				
				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) {
			e.printStackTrace();
		} finally {
			if(rs != null) try { rs.close(); } catch (SQLException e) {}
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
		return boardList;
	}

	@Override
	public JdbcBoardVO getBoard(int boardNo) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		JdbcBoardVO boardVo = null;
		
		try {
			conn = DBUtil3.getConnection();
			String sql = " select board_no " + 
					"     , board_title " + 
					"     , board_writer " + 
					"     , to_char(board_date, 'YYYY-MM-DD') as 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) {
			e.printStackTrace();
		} finally {
			if(rs != null) try { rs.close(); } catch (SQLException e) {}
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
		return boardVo;
	}

	@Override
	public List<JdbcBoardVO> getSearchBoardList(String title) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		List<JdbcBoardVO> boardList = null;
		
		try {
			conn = DBUtil3.getConnection();
			String sql = " select board_no " + 
					"     , board_title " + 
					"     , board_writer " + 
					"     , to_char(board_date, 'YYYY-MM-DD') as board_date " + 
					"     , board_cnt " + 
					"     , board_content " + 
					"  from jdbc_board " + 
					" where board_title like '%' || ? || '%' " + 
					" order by board_no desc ";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, title);
			
			rs = pstmt.executeQuery();
			
			while(rs.next()) {
				if(boardList == null) boardList = new ArrayList<JdbcBoardVO>();
				
				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) {
			e.printStackTrace();
		} finally {
			if(rs != null) try { rs.close(); } catch (SQLException e) {}
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
		return boardList;
	}

	@Override
	public int setCountIncrement(int boardNo) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		int cnt = 0; // 반환값이 저장될 변수
		
		try {
			conn = DBUtil3.getConnection();
			String sql = " update jdbc_board\r\n" + 
					"   set board_cnt = board_cnt + 1\r\n" + 
					" where board_no = ? ";
			pstmt = conn.prepareStatement(sql);
			pstmt.setInt(1, boardNo);
			
			cnt = pstmt.executeUpdate();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
		return cnt;
	}

}

[JdbcBoardServiceImpl.java]

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.vo.JdbcBoardVO;

public class JdbcBoardServiceImpl implements IJdbcBoardService {

	private IJdbcBoardDao dao; // DAO객체 변수 선언
	
	// 생성자
	public JdbcBoardServiceImpl() {
		dao = new JdbcBoardDaoImpl();
	}
	
	@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) {
		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);
	}
	
}

[JdbcBoardController.java]

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.JdbcBoardServiceImpl;
import kr.or.ddit.vo.JdbcBoardVO;

public class JdbcBoardController {

	private IJdbcBoardService service;
	private Scanner scan;
	
	public JdbcBoardController() {
		service = new JdbcBoardServiceImpl();
		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);
		int cnt = service.setCountIncrement(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() + 1));
			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;
	}

}


[싱글톤 패턴]

[MySingleton.java]

package kr.or.ddit.basic;

/*
 * - singleton패턴 ==> 객체가 1개만 만들어지게 하는 방법
 * 				(외부에서 new 명령을 사용하지 못하게 한다.)
 * 
 * - 사용 이유
 * 1) 메모리 낭비를 방지할 수 있다.
 * 2) 데이터의 공유가 쉽다.
 * 
 * - singleton 클래스 만드는 방법(3가지 필수 구성 요소)
 * 1. 자신 class의 참조값이 저장될 변수를 private static으로 선언한다.
 * 
 * 2. 모든 생성자의 접근 제한자를 private으로 한다.
 * 
 * 3. 자신 class의 인스턴스를 생성하고 반환하는 메서드를 
 * public static으로 작성한다.
 * (이 메서드의 이름은 보통 getInstance로 한다.)
 * 
 */
public class MySingleton {

	// 1번
	private static MySingleton instance;
	
	// 2번 ==> 생성자가 없으면 기본 생성자를 작성해야 한다.
	public MySingleton() {
		System.out.println("싱글톤 클래스의 생성자 호출입니다...");
	}
	
	// 3번
	public static MySingleton getInstance() {
		// 1) 만약 1번의 변수값이 null이면 현재 객체를 생성하여 변수에 저장한다.
		// 2) 1번의 변수값을 반환한다.
		if(instance == null) instance = new MySingleton();
		return instance;
	}
	
	// 기타... ==> 이 클래스의 용도에 맞는 내용들을 작성한다.
	public void displayTest() {
		System.out.println("싱글톤 클래스의 메서드 호출입니다...");
	}
	
}

[SingletonTest.java]

package kr.or.ddit.basic;

public class SingletonTest {

	public static void main(String[] args) {
		
		// 생성자가 private으로 감춰져 있기 때문에 객체 생성이 불가능하다.
		// 즉, 외부에서 new 명령으로 생성 불가.
//		MySingleton test1 = new MySingleton(); 
		
		MySingleton test2 = MySingleton.getInstance(); // 싱글톤 클래스의 생성자 호출입니다...
		MySingleton test3 = MySingleton.getInstance(); // 메시지 출력이 1번만 됨. 즉, 객체는 1개만 만들어진 것.
		// test2와 test3는 결국 같은 객체라는 말...
		
		System.out.println("test2 => " + test2.toString()); // test2 => kr.or.ddit.basic.MySingleton@15db9742
		System.out.println("test3 => " + test3.toString()); // test3 => kr.or.ddit.basic.MySingleton@15db9742
		
		System.out.println(test2 == test3); // true
		System.out.println(test2.equals(test3)); // true
		
		test3.displayTest(); // 싱글톤 클래스의 메서드 호출입니다...
		
	}

}


[MemberDaoImpl.java]

package kr.or.ddit.member.dao;

...

public class MemberDaoImpl implements IMemberDao {
	
	// 1번
	private static MemberDaoImpl dao;
	
	// 2번
	private MemberDaoImpl() {}
	
	// 3번
	public static MemberDaoImpl getInstance() {
		if(dao == null) dao = new MemberDaoImpl();
		return dao;
	}
...

[MemberServiceImpl.java]

package kr.or.ddit.member.service;

...

public class MemberServiceImpl implements IMemberService {
	
	private IMemberDao dao; // DAO객체 변수 선언
	
	// 1번
	private static MemberServiceImpl service;
	
	// 2번
	private MemberServiceImpl() {
		dao = MemberDaoImpl.getInstance();
	}
	
	// 3번
	public static MemberServiceImpl getInstance() {
		if(service == null) service = new MemberServiceImpl();
		return service;
	}

...

[MemberController.java]

package kr.or.ddit.member.controller;

...

public class MemberController {
	
	private IMemberService service; // Service객체 변수 선언
	private Scanner scan;
	
	// 생성자
	public MemberController() {
//		service = new MemberServiceImpl();
		service = MemberServiceImpl.getInstance();
		scan = new Scanner(System.in);
	}
...

[선생님 풀이]

 -------------------------------------------
 -- VO 객체의 멤버변수를 자동으로 만들기(DB연동용)
 -- private 자료형이름 컬럼명;
select 'private ' || 
        decode(lower(data_type), 'number', 'int ', 'String ') || 
        lower(column_name) || ';'
  from cols
 where lower(table_name) = 'jdbc_board';

[JdbcBoardVO.java]

package kr.or.ddit.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;
	}
	
}

[IJdbcBoardDao.java]

package kr.or.ddit.board.dao;

import java.util.List;

import kr.or.ddit.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에 저장된 자료를 이용하여 update 작업을 수행하는 메서드
	 * 
	 * @param boardVo 수정할 자료가 저장된 JdbcBoardVO객체
	 * @return 작업성공 : 1, 작업실패 : 0
	 */
	public int updateBoard(JdbcBoardVO boardVo);
	
	/**
	 * DB의 jdbc_board 테이블의 전체 데이터를 가져와 List에 담아서 반환하는 메서드
	 * 
	 * @return JdbcBoardVO 객체를 저장하고 있는 List객체
	 */
	public List<JdbcBoardVO> getAllBoard();
	
	/**
	 * 게시글 번호를 매개변수로 받아서 해당 게시글 정보를 가져와 반환하는 메서드
	 * 
	 * @param boardNo 검색할 게시글 번호
	 * @return 게시글 번호에 맞는 자료가 있으면 해당 게시글 정보를 갖는 JdbcBoardVO 객체,
	 * 			자료가 없으면 null 반환
	 */
	public JdbcBoardVO getBoard(int boardNo);
	
	/**
	 * 게시글의 제목을 이용하여 게시글을 검색하는 메서드
	 *  
	 * @param title 검색할 게시글의 제목
	 * @return 검색된 결과를 담은 List객체
	 */
	public List<JdbcBoardVO> getSearchBoard(String title);
	
	/**
	 * 게시글 번호를 매개변수로 받아서 해당 게시글의 조회수를 증가시키는 메서드
	 * 
	 * @param boardNo 조회수를 증가할 게시글 번호
	 * @return 작업성공 : 1, 작업실패 : 0
	 */
	public int setCountIncrement(int boardNo);
	
}

[IJdbcBoardService.java]

package kr.or.ddit.board.service;

import java.util.List;

import kr.or.ddit.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에 저장된 자료를 이용하여 update 작업을 수행하는 메서드
	 * 
	 * @param boardVo 수정할 자료가 저장된 JdbcBoardVO객체
	 * @return 작업성공 : 1, 작업실패 : 0
	 */
	public int updateBoard(JdbcBoardVO boardVo);
	
	/**
	 * DB의 jdbc_board 테이블의 전체 데이터를 가져와 List에 담아서 반환하는 메서드
	 * 
	 * @return JdbcBoardVO 객체를 저장하고 있는 List객체
	 */
	public List<JdbcBoardVO> getAllBoard();
	
	/**
	 * 게시글 번호를 매개변수로 받아서 해당 게시글 정보를 가져와 반환하는 메서드
	 * 
	 * @param boardNo 검색할 게시글 번호
	 * @return 게시글 번호에 맞는 자료가 있으면 해당 게시글 정보를 갖는 JdbcBoardVO 객체,
	 * 			자료가 없으면 null 반환
	 */
	public JdbcBoardVO getBoard(int boardNo);
	
	/**
	 * 게시글의 제목을 이용하여 게시글을 검색하는 메서드
	 *  
	 * @param title 검색할 게시글의 제목
	 * @return 검색된 결과를 담은 List객체
	 */
	public List<JdbcBoardVO> getSearchBoard(String title);
	
	/**
	 * 게시글 번호를 매개변수로 받아서 해당 게시글의 조회수를 증가시키는 메서드
	 * 
	 * @param boardNo 조회수를 증가할 게시글 번호
	 * @return 작업성공 : 1, 작업실패 : 0
	 */
	public int setCountIncrement(int boardNo);
	
}

[JdbcBoardDaoImpl.java]

package kr.or.ddit.board.dao;

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 kr.or.ddit.util.DBUtil3;
import kr.or.ddit.vo.JdbcBoardVO;

public class JdbcBoardDaoImpl implements IJdbcBoardDao {
	
	// 싱글톤 패턴
	private static JdbcBoardDaoImpl dao;
	private JdbcBoardDaoImpl() {}
	public static JdbcBoardDaoImpl getInstance() {
		if(dao == null) dao = new JdbcBoardDaoImpl();
		return dao;
	}

	@Override
	public int insertBoard(JdbcBoardVO boardVo) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		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) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
		return cnt;
	}

	@Override
	public int deleteBoard(int boardNo) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		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) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
		return cnt;
	}

	@Override
	public int updateBoard(JdbcBoardVO boardVo) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		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) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
		return cnt;
	}

	@Override
	public List<JdbcBoardVO> getAllBoard() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		List<JdbcBoardVO> boardList = null; // 반환값이 저장될 변수
		
		try {
			conn = DBUtil3.getConnection();
			String sql = " select * from jdbc_board order by board_no desc ";
			pstmt = conn.prepareStatement(sql);
			
			rs = pstmt.executeQuery();
			while(rs.next()) {
				if(boardList == null) boardList = new ArrayList<JdbcBoardVO>();
				
				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) {
			e.printStackTrace();
		} finally {
			if(rs != null) try { rs.close(); } catch (SQLException e) {}
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
		return boardList;
	}

	@Override
	public JdbcBoardVO getBoard(int boardNo) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		JdbcBoardVO boardVo = null; // 반환값이 저장될 변수
		
		try {
			conn = DBUtil3.getConnection();
			String sql = " select board_no, board_title, board_writer, "
					+ " to_char(board_date, 'YYYY-MM-DD') as 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) {
			e.printStackTrace();
		} finally {
			if(rs != null) try { rs.close(); } catch (SQLException e) {}
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
		return boardVo;
	}

	@Override
	public List<JdbcBoardVO> getSearchBoard(String title) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		List<JdbcBoardVO> boardList = null; // 반환값이 저장될 변수
		
		try {
			conn = DBUtil3.getConnection();
			String sql = " select * from jdbc_board " + 
					" where board_title like '%' || ? || '%' " + 
					" order by board_no desc ";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, title);
			
			rs = pstmt.executeQuery();
			while(rs.next()) {
				if(boardList == null) boardList = new ArrayList<JdbcBoardVO>();
				
				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) {
			e.printStackTrace();
		} finally {
			if(rs != null) try { rs.close(); } catch (SQLException e) {}
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
		return boardList;
	}

	@Override
	public int setCountIncrement(int boardNo) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		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) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
		return cnt;
	}

}

[JdbcBoardServiceImpl.java]

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.vo.JdbcBoardVO;

public class JdbcBoardServiceImpl implements IJdbcBoardService {

	private IJdbcBoardDao dao;
	
	// 싱글톤 패턴
	private static JdbcBoardServiceImpl service;
	private JdbcBoardServiceImpl() {
		dao = JdbcBoardDaoImpl.getInstance();
	}
	public static JdbcBoardServiceImpl getInstance() {
		if(service == null) service = new JdbcBoardServiceImpl();
		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> getAllBoard() {
		return dao.getAllBoard();
	}

	@Override
	public JdbcBoardVO getBoard(int boardNo) {
		int cnt = dao.setCountIncrement(boardNo);
		if(cnt == 0) return null;
		return dao.getBoard(boardNo);
	}

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

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

}

[JdbcBoardController.java]

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.JdbcBoardServiceImpl;
import kr.or.ddit.vo.JdbcBoardVO;

public class JdbcBoardController {

	private IJdbcBoardService service;
	private Scanner scan;
	
	// 생성자
	public JdbcBoardController() {
		service = JdbcBoardServiceImpl.getInstance();
		scan = new Scanner(System.in);
	}
	
	public static void main(String[] args) {
		
		new JdbcBoardController().boardStart();
		
	}
	
	// 시작 메서드
	public void boardStart() {
		String searchTitle = null;
		int choice = 0;
		while(true){
			
			// 이전의 작업 번호 확인
			if(choice != 3) searchTitle = null;
			
			choice = displayMenu(searchTitle);
			switch(choice){
				case 1 :	// 새글 작성 
					insertBoard(); break;
				case 2 : 	// 게시글 보기
					viewBoard(); break;
				case 3 : 	// 검색
					searchTitle = searchBoard(); break;
				case 0 :  	// 작업 끝.
					System.out.println();
					System.out.println("게시판 프로그램 종료...");
					return;
				default : 
					System.out.println();
					System.out.println("작업 번호를 잘못 입력했습니다. 다시 입력하세요...");
					System.out.println();
			}
		}
	}
	
	// 검색할 제목을 입력 받아서 반환하는 메서드
	private String searchBoard() {
		
		scan.nextLine();  // 입력 버퍼 비우기
		System.out.println();
		System.out.println("검색 작업");
		System.out.println("--------------------------------------------");
		System.out.print("- 검색할 제목 입력 : ");
		return scan.nextLine();
		
	}
	
	// 게시글 내용을 보여주는 메서드
	private void viewBoard(){
		
		System.out.println();
		System.out.print("보기를 원하는 게시물 번호 입력 >> ");
		int num = scan.nextInt();
		
		JdbcBoardVO boardVo = service.getBoard(num);
		if(boardVo == null){
			System.out.println(num + "번의 게시글이 존재하지 않습니다.");
			return;
		}
		
		System.out.println(num + "번의 게시글 내용");
		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("작업선택 >> ");
		int choice = scan.nextInt();
		switch(choice){
			case 1 : // 수정
				updateBoard(num); break;
			case 2 : // 삭제
				deleteBoard(num); break;
			case 3 : // 리스트 가기
				return;
		}
		
	}
	
	// 게시글을 삭제하는 메서드
	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 newTitle = scan.nextLine();
		
		System.out.print("- 내   용 >> ");
		String newContent = scan.nextLine();
		
		JdbcBoardVO boardVo = new JdbcBoardVO();
		boardVo.setBoard_title(newTitle);
		boardVo.setBoard_content(newContent);
		boardVo.setBoard_no(boardNo);
		
		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();
		
		// 입력 받은 데이터를 VO에 저장한다.
		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.getAllBoard();
		}else {
			boardList = service.getSearchBoard(title);
		}
		
		System.out.println("-------------------------------------------------------------");
		System.out.println(" No         제 목            작성자          조회수");   
		System.out.println("-------------------------------------------------------------");
		
		if(boardList == null || boardList.size() == 0) {
			System.out.println("\t출력할 게시글이 하나도 없습니다...");
		}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("작업 선택 >> ");
		
		return scan.nextInt();
		
	}

}

'대덕인재개발원_자바기반 애플리케이션' 카테고리의 다른 글

230921_MyBatis 2  (0) 2023.09.21
230920_MyBatis 1  (0) 2023.09.20
230918_MVC 1  (0) 2023.09.15
230915_JDBC 2  (0) 2023.09.15
230914_JDBC 2  (0) 2023.09.14