JAVA/수업

Board CRUD

lavender1122 2024. 1. 5. 20:32

오류 사항 있음 추후 수정

MainController

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

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

public class MainController extends BoardPrint {  //상속클래스라서 import 해야함!!
	//sessionStorage(Map 타입) 객체 생성
	static public Map<String, Object> sessionStorage = new HashMap<>();
    // BoardService에서 getInstance 메소드 호출
	BoardService boardService =BoardService.getInstance(); 
    
	
	public static void main(String[] args) {
		new MainController().start(); 
	}
private void start() { // private으로 접근 제한
		View view = View.MAIN; //처음시작 MAIN으로 함
		while (true) { // 무한 로딩이라서 View 호출 가능
			switch (view) {
			case MAIN: //홈
				view = home(); //home 메소드가 view 대입해서 메소드 호출
				break;
			case BOARD_LIST: // 전체 조회
				view = boardList();//boardList 메소드가 view 대입해서 메소드 호출
				break;
			case BOARD_INSERT://게시판 등록 
				view = boardInsert();//boardInsert 메소드가 view 대입해서 메소드 호출
				break;
			case BOARD_DEAIL://게시판상세보기
				view = boardDetail();//boardDetail 메소드가 view 대입해서 메소드 호출
				break;
			case BOARD_DELETE://게시판 삭제
				view = boardDelete();//boardDelete 메소드가 view 대입해서 메소드 호출
				break;
			case BOARD_UPDATE://게시판 수정 
				view = boardUpdate();//boardUpdate 메소드가 view 대입해서 메소드 호출
				break;
			}
			
		}
	}
private View home() { //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;
		
	}
}
	private View boardList() { //전체리스트 출력 
    	//boardService class 속한 boardList 메소드 호출해서 list 대입 
		List<Map<String, Object>> list = boardService.boardList();
		//출력문
        printBoardList(list);
		printListMenu();
        //출력문
		int sel =ScanUtil.nextInt(" 선택 :");
		switch (sel) {
		case 1:
            //입력한 숫자(1)가/ boardNO 대입함
			int boardNO =ScanUtil.nextInt("게시판 번호 입력 : ");
            //sessionStorage("boardNO", 입력한 숫자ex);
            
			sessionStorage.put("boardNO", boardNO); 
            
			return View.BOARD_DEAIL; //start()-> boardDetail() 이동
		case 2:
			return View.MAIN; // 
		default:
			return View.MAIN;
		}
	}
private View boardInsert() {
		System.out.println("-----게시판등록-----");
		// 제목변수 & 출력문 String
		String name = ScanUtil.nextLine("제목 변경>>");
		// 내용변수 & 출력문String
		String content = ScanUtil.nextLine("내용 변경>>");
		// 작성자변수 & 출력문String
		String writer = ScanUtil.nextLine("내용 변경>>");
		
		//제목 내용 param 내용 추가
		List<Object> param = new ArrayList(); //param에 관한 List 객체 타입 생성
		param.add(name); //param에 ScanUtil.nextLine("제목 변경>>")에 대한 출력문 넣음
		param.add(content); //param에 ScanUtil.nextLine("내용 변경>>")에 대한 출력문 넣음
		param.add(writer);//param에 ScanUtil.nextLine("내용 변경>>")에 대한 출력문 넣음
        
		// BoardService class에 boardInsert 메소드에 param 파라미터 넣어줌
		boardService.boardInsert(param); 
		
		//서비스 메소드 연결
		
		return View.BOARD_LIST; //
	}
private View boardDetail() { //
		int boardNO =(int)sessionStorage.get("boardNO"); //
        //BoardService class 에 boardDetail에서 boardNO 파라미터를 준 리턴값을
        //board 대입
		 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_DEAIL;
		}
	}
private View boardUpdate() {
		//출력문
		System.out.println("1. 제목");
		System.out.println("2.내용");
		System.out.println("3.전체");
		System.out.println("4.취소");
		int sel = ScanUtil.nextInt("수정할 항목을 고르시오.");
        // 4번 선택시 boardDetail 메소드 호출하고 boardUpdate 종료(return 있어서)
		if(sel ==4) return View.BOARD_DEAIL;
       
        //param(List타입 선언) 하고 객체 추가
		List<Object> param = new ArrayList();
        //3번 : name,content 둘다 if문 실행
        //1번, 3번 입력하면 param(List타입) 에 name(입력한 이름) 추가
		if(sel ==1 || sel ==3 ) { 
			String name = ScanUtil.nextLine("제목 : >");
			param.add(name); //이름 추가
		}
         //2번, 3번 입력하면 param(List타입) 에 content(입력한 내용) 추가
		if(sel ==2 || sel ==3) {
			String content = ScanUtil.nextLine("내용 : >");
			param.add(content); // 내용 추가
		}
        
		int boardNo =(int) sessionStorage.get("boardNO");
		param.add(boardNo);
		
		boardService.boardUpdate(param,sel);
		
		return View.BOARD_DEAIL;
	}
private View boardDelete() {
		//y 또는 n 선택
		String yn = ScanUtil.nextLine("삭제 하시겠습니까?(y/n)");
		//대소문자 무시하고 같은지 비교
		if(yn.equalsIgnoreCase("n")) {
			return View.BOARD_DEAIL;
		}
		if(yn.equalsIgnoreCase("y")) {
        	//sessionStorage(Map타입) 값 꺼내서 boardNO명 대입
			int boardNO =(int)sessionStorage.get("boardNO");
			List<Object> param =new ArrayList(); //param 에 대한 List 타입
			param.add(boardNO); //boardNO 값을 param에 추가함
            // BoardService class 속한 boardUpdate메소드에 (param, 0) 파라미터 보냄
			boardService.boardUpdate(param, 0);
		}
		return View.BOARD_LIST;
	}

BoardService

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(); // dao 연결(불러옴)
		
		public List<Map<String, Object>> boardList(){
			List<Map<String, Object>> list = dao.boardList(); //dao 클래스에 있는  boardList메소드 호출 해서 list 넣기
			for (Map<String, Object> map : list) {
				String content = (String) map.get("CONTENT");
				if (content.length() > 10) {
					content = content.substring(0, 10)+"....";
				}
				//줄바꿈 세가지 case
				content = content.replace("\n", ""); 
				content = content.replace("\r", "");
				content = content.replace("\r\n", "");
				map.put("CONTENT",content);
						
			}
			return list;
//			return dao.boardList();
		}
		
		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);
		}

}

BoardDao

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(); //JDBCUil 가져옴
		
		public List<Map<String, Object>> boardList(){
			String sql= "SELECT NO,NAME, SUBSTR(CONTENT,0,20) CONTENT, writer,\r\n" + 
					"     TO_char(reg_date,'YYYY/MM/DD') reg_date\r\n" + 
					" FROM java_freeboared\r\n" ;
			return jdbc.selectList(sql);
		}
		
		public Map<String, Object> boardDetail(int no){
			String sql = "SELECT NO,NAME, CONTENT, writer,\r\n" + 
					"    TO_char(reg_date,'YYYY/MM/DD') reg_date\r\n" + 
					" FROM java_freeboared\r\n" + 
					" WHERE delyn = 'N'\r\n" + 
					" AND NO = "+ no;
			return jdbc.selectOne(sql); //하나행만 가져옴
		}
		public void boardUpdate(List<Object>list, int sel) {
//			UPDATE JAVA_FREEBOARED
//			SET
//			    NAME = '수정1'
//			    ,CONTENT = '수정1'
//			    WHERE NO = 1
			//문법 분리
			String sql_front = "UPDATE JAVA_FREEBOARED"
								+" SET";
			String format = " %s = ?"; //printf 유형
			String sql =sql_front;
			if(sel == 0) { // 0번을 입력하면 DELYN Y 가 들어가게 함
				sql += "DELYN = 'Y'";
			}
			if(sel == 1 || sel == 3) {
				//sql = sql + String.format(format, "Name");
				sql += String.format(format, " Name");
			}
			if(sel ==2 || sel == 3) {
//				if(sel==)
				sql += String.format(format, " CONTENT");
			}
//			if(sel==3) {
//				sql += String.format(format, "Name") + ", ";
//				sql += String.format(format, "CONTENT") + ", ";
//				
//			}
			sql+= " WHERE NO = ?";
			jdbc.update(sql,list);
		}

		public void boardInsert(List<Object> param) {
//			INSERT INTO JAVA_FREEBOARED(NO,NAME,CONTENT,WRITER,DELYN)
//		    VALUES(4,'등록1','등록내용1','등록자1','N')
			String sql_front ="INSERT INTO JAVA_FREEBOARED(NO,NAME,CONTENT,WRITER,DELYN)\r\n" + 
					"		    VALUES(";
			String format = " %s ,%s"; //printf 유형
			String sql = "";
			jdbc.update(sql, param);
		}
}

View

public enum View { // 화면이동 페이지
	MAIN,					// 기본화면
	BOARD_LIST,
	BOARD_INSERT,
	BOARD_DEAIL,
	BOARD_DELETE,
	BOARD_UPDATE
}

BoardPrint

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작성자");
		for (Map<String, Object> map : list) {
			//오라클에서 NUMBER 타입 / 이클립스는 BigDecimal 클래스 사용해서  print할때 변수명.intValue()
			BigDecimal no 	= (BigDecimal)map.get("NO"); 
			String name 	= (String)map.get("NAME");
			String content  = (String)map.get("CONTENT");
			String regDate  = (String)map.get("reg_date"); //오라클에서 날짜를 문자로 변환해서 여기서 String사용
			String writer   = (String)map.get("writer");
			
			System.out.println(no.intValue()+"\t"+name+"\t"+content+"\t"+regDate+"\t"+writer); //BigDecimal 사용 방법 : 변수명.intValue() BigDecimal 클래스에서 int 타입만 꺼내옴
		}
		
	}
	public void printListMenu() {
		printVar();
		System.out.println("1.게시판 상세보기 ");
		System.out.println("2.홈 ");
		printLn(5);
		printVar();
	}
	
	public void printDetailMenu() {
		printVar();
		System.out.println("1.게시판 수정");
		System.out.println("2.게시판 삭제");
		System.out.println("3.게시판 리스트");
		System.out.println("4.홈");
		printLn(3);
		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사용
		String writer   = (String)board.get("writer");
		System.out.println("제목 :"+ name);
		System.out.println("번호 : " + no.intValue()+"\t"+"작성일: "+regDate+"\t"+"작성자 : "+writer);
		System.out.println("╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯╰(*°▽°*)╯");
		System.out.println(content);
		printVar();
	}

}