반응형

 

게시판 만들기 프로젝트 진행

 

아래의 메뉴로 구성된 프로젝트를 구현한다.

 

더보기

------------ HOME ------------
1. 게시판 전체 조회
2. 게시판 등록
3. 홈

----------- 전체 조회 -----------
전체 리스트 출력

1. 게시판 상세 보기
2. 홈

---------- 게시판 등록 ----------
게시글 이름 : 
게시글 내용 :
작성자       : 


-------- 게시판 상세조회 --------
1. 게시판 수정
2. 게시판 삭제
3. 게시판 리스트
4. 홈

---------- 게시판 수정 ----------
1. 제목
2. 내용
3. 전체
4. 취소

 

 

아래와 같이 DB 테이블과 데이터를 생성해놓는다.

 

테이블 생성

 

데이터 삽입

 

 

최종적인 프로젝트 파일은 바로 하단에 접기로 기입해놓았다.

 

package controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import service.BoardService;
import util.ScanUtil;
import util.View;
import view.BoardPrint;

public class MainController extends BoardPrint {
	// sessionStorage은 하나 밖에 존재하지 않음
	static public Map<String, Object> sessionStorage = new HashMap<>();
	BoardService boardService = BoardService.getInstance();
	
	public static void main(String[] args) {
		new MainController().start();
	}
	
	private void start() {
		View view = View.MAIN;
		while (true) {
			switch (view) {
			case MAIN:
				view = home();
				break;
			case BOARD_LIST:
				view = boardList();
				break;
			case BOARD_INSERT:
				view = boardInsert();
				break;
			case BOARD_DETAIL:
				view = boardDetail();
				break;
			case BOARD_DELETE:
				view = boardDelete();
				break;
			case BOARD_UPDATE:
				view = boardUpdate();
				break;
			default:
				break;
			}
		}
	}
	
	private View boardUpdate() {
		System.out.println("1. 제목");
		System.out.println("2. 내용");
		System.out.println("3. 전체");
		System.out.println("4. 취소");
		
		int sel = ScanUtil.nextInt("수정할 항목을 고르시오.");
		
		if(sel == 4) return View.BOARD_DETAIL;
		
		String name = null;
		String content = null;
		List<Object> param = new ArrayList();
		
		if(sel == 1 || sel ==3) {
			name = ScanUtil.nextLine("제목 >> ");
			param.add(name);
		}
		if(sel == 2 || sel ==3) {
			content = ScanUtil.nextLine("내용 >> ");
			param.add(content);
		}
		int boardNo = (int) sessionStorage.get("boardNo");
		param.add(boardNo);
		
		boardService.boardUpdate(param, sel);
		
		return View.BOARD_DETAIL;
	}

	private View boardDelete() {
		String yn = ScanUtil.nextLine("삭제 하시겠습니까? (y/n) ");
		
		if(yn.equalsIgnoreCase("n")) {
			return View.BOARD_DETAIL;
		} 
		else if(yn.equalsIgnoreCase("y")) {
			int boardNo = (int) sessionStorage.get("boardNo");
			List<Object> param = new ArrayList();
			param.add(boardNo);
			boardService.boardUpdate(param, 0);
		} 
		else {
			return View.BOARD_DELETE;
		}
		
		return View.BOARD_LIST;
	}

	private View boardDetail() {
		int boardNo = (int) sessionStorage.get("boardNo");
		Map<String, Object> board = boardService.boardDetail(boardNo);
		printDetail(board);
		printDetailMenu();
		int sel = ScanUtil.nextInt("메뉴 선택 : ");
		switch (sel) {
		case 1:
			return View.BOARD_UPDATE;
		case 2:
			return View.BOARD_DELETE;
		case 3:
			return View.BOARD_LIST;
		case 4:
			return View.MAIN;
		default:
			return View.BOARD_LIST;
		}
	}

	private View boardInsert() {
		System.out.println("----게시판 등록----");
		String name = null;
		String content = null;
		String writer = null;
		List<Object> param = new ArrayList();
		
		name = ScanUtil.nextLine("게시글 이름  : ");
		param.add(name);
		content = ScanUtil.nextLine("게시글 내용 : ");
		param.add(content);
		writer = ScanUtil.nextLine("작성자 : ");
		param.add(writer);
		
		boardService.boardInsert(param);
		return View.BOARD_LIST;
	}

	private View boardList() {
		List<Map<String, Object>> list = boardService.boardList();
		printBoardList(list);
		printListMenu();
		int sel = ScanUtil.nextInt("메뉴 선택 : ");
		switch (sel) {
		case 1:
			int boardNo = ScanUtil.nextInt("게시판 번호 입력 : ");
			sessionStorage.put("boardNo", boardNo);
			return View.BOARD_DETAIL;
		case 2:
			return View.MAIN;
		default:
			return View.BOARD_LIST;
		}
	}

	private View home() {
		// 출력
		printHome();
		int sel = ScanUtil.nextInt("메뉴 선택 : ");
		switch (sel) {
		case 1:
			return View.BOARD_LIST;
		case 2:
			return View.BOARD_INSERT;
		case 3:
			return View.MAIN;
		default:
			return View.MAIN;
		}
	}
}

 

package service;

import java.util.List;
import java.util.Map;

import dao.BoardDao;

public class BoardService {
	private static BoardService instance = null;

	private BoardService() {
	}

	public static BoardService getInstance() {
		if (instance == null) {
			instance = new BoardService();
		}
		return instance;
	}
	
	BoardDao dao = BoardDao.getInstance();
	
	public List<Map<String, Object>> boardList() {
		// db에서 자르지 않을 시 아래와 같은 방식으로 잘라줘야 함.
		List<Map<String, Object>> list = dao.boardList();
		for(Map<String, Object> map : list) {
			String content = (String) map.get("CONTENT");
			if(content.length() > 10) {
				content = content.substring(0, 10) + ".....";
			}
			content = content.replace("\n", ""); // 세 종류를 다 넣어줘야 함.
			content = content.replace("\r", "");
			content = content.replace("\r\n", "");
			map.put("CONTENT", content);
		}
		return list;
		
//		return dao.boardList(); // 윗줄 전부 주석 후 이 줄만 사용해도 됨 >> db에서 자르지 않았을 경우 위와 같이 사용해야 함.
	}
	
	public Map<String, Object> boardDetail(int no) {
		return dao.boardDetail(no);
	}
	
	public void boardUpdate(List<Object> param, int sel) {
		dao.boardUpdate(param, sel);
	}
	
	public void boardInsert(List<Object> param) {
		dao.boardInsert(param);
	}
}

 

package dao;

import java.util.List;
import java.util.Map;

import util.JDBCUtil;

public class BoardDao {
	private static BoardDao instance = null;

	private BoardDao() {
	}

	public static BoardDao getInstance() {
		if (instance == null) {
			instance = new BoardDao();
		}
		return instance;
	}
	
	JDBCUtil jdbc = JDBCUtil.getInstance();
	
	public List<Map <String, Object>> boardList() {
		String sql = "select no, name, substr(content, 0, 20) content, \r\n" + 
					"writer, to_char(reg_date, 'YYYY/MM/DD') reg_date\r\n" + 
					"from java_freeboard\r\n" + 
					"where delyn = 'N'";
		
		return jdbc.selectList(sql);
	}
	
	public Map<String, Object> boardDetail(int no) {
		String sql = "select no, name, content, \r\n" + 
					 "writer, to_char(reg_date, 'YYYY/MM/DD') reg_date\r\n" + 
					 "from java_freeboard\r\n" + 
					 "where delyn = 'N'\r\n" + 
					 "and no = " + no;
		
		return jdbc.selectOne(sql);
	}
	
	public void boardUpdate(List<Object> list, int sel) {
//		update java_freeboard
//		set
//		    name = '수정1
//		    , content = '수정1'
//		where no = 1;
		
//		System.out.println("1. 제목");
//		System.out.println("2. 내용");
//		System.out.println("3. 전체");
		
		String sql_front = "update java_freeboard"
						 + " set ";
		String format = "%s = ?"; 
		String sql = sql_front;
		
		if(sel == 0) {
			sql += "DELYN = 'Y'";
		}
		if(sel == 1 || sel ==3) {
			sql += String.format(format, "NAME"); // %s에 name이 들어감
		}
		if(sel ==2 || sel ==3) {
			if(sel == 3 )	sql += ", ";
			sql += String.format(format, "CONTENT");
		}
		sql += "WHERE NO = ?";
		jdbc.update(sql, list);
	}
	
	public void boardInsert(List<Object> param) {
		String sql = "insert into java_freeboard\r\n" + 
					 "values (board_seq.nextval, ?, ?, ?, sysdate, 'N')";
		
		jdbc.update(sql, param);
	}
}

 

package view;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.List;
import java.util.Map;

public class BoardPrint {
	
	public void printVar() {
		System.out.println("========================");
	}
	
	public void printLn(int num) {
		for(int i=0; i<num; i++) System.out.println();
	}
	
	public void printHome() {
		printVar();
		System.out.println("1. 게시판 전체 조회");
		System.out.println("2. 게시판 등록");
		System.out.println("3. 홈");
		printLn(3);
		printVar();
	}
	
	public void printBoardList(List<Map<String, Object>> list) {
		System.out.println("번호\t제목\t내용\t\t\t작성일\t\t작성자");
		for (Map<String, Object> map : list) {
			BigDecimal no = (BigDecimal) map.get("NO"); // 오라클에서는 number 타입
			String name = (String) map.get("NAME"); // 오라클에서는 varchar2 타입
			String content = (String) map.get("CONTENT");
//			Timestamp regDate = (Timestamp) map.get("REG_DATE"); // 오라클에서는 date 타입
			String regDate = (String) map.get("REG_DATE"); // 오라클에서 char로 바꿔왔기에 string 타입으로 작성 가능
			String writer = (String) map.get("WRITER");
			
//			System.out.println(no.intValue()); // number에서 int 값만 꺼냄
			System.out.println(no.intValue() + "\t" + name + "\t" + content + "\t" + regDate + "\t" + writer);
		}
	}
	
	public void printListMenu() {
		printVar();
		System.out.println("1. 게시판 상세 보기");
		System.out.println("2. 홈");
		printLn(4);
		printVar();
	}
	
	public void printDetailMenu() {
		printVar();
		System.out.println("1. 게시판 수정");
		System.out.println("2. 게시판 삭제");
		System.out.println("3. 게시판 리스트");
		System.out.println("4. 홈");
		printLn(2);
		printVar();
	}
	
	public void printDetail(Map<String, Object> board) {
		printVar();
		
		BigDecimal no = (BigDecimal) board.get("NO");
		String name = (String) board.get("NAME");
		String content = (String) board.get("CONTENT");
		String regDate = (String) board.get("REG_DATE");
		String writer = (String) board.get("WRITER");
		
		System.out.println("제목 : " + name);
		System.out.println("번호 : " + no + "\t 작성일 : " + regDate + "\t 작성자 : " + writer);
		System.out.println(content);
		printVar();
	}
}

 

package util;

public enum View {
	MAIN,					// 기본화면
	BOARD_INSERT,			// 게시판 등록
	BOARD_LIST,				// 게시판 전체 조회
	BOARD_DETAIL,			// 게시판 상세 보기
	BOARD_UPDATE,			// 게시판 수정
	BOARD_DELETE			// 게시판 삭제
}

 

 

 

 

 

 

 

 

 

 

반응형