반응형

 

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

 

게시판 등록 또는 조회 시 로그인하는 식으로 프로젝트를 진행하였다.

 

더보기

---------------- 자유 게시판 ----------------
1. 게시판 등록
2. 전체 게시판 조회

---------------- 전체 게시판 조회 ----------------
# 게시판 출력
1. 검색
2. 게시판 상세 조회

---------------- 검색 ----------------
1. 제목 검색
2. 내용 검색
3. 날짜 검색

---------------- 게시판 상세 조회 ----------------
1. 게시판 수정
2. 게시판 삭제

 

 

임의로 SQL 테이블을 작성하여 프로젝트를 진행한다.

 

기존의 방식에 페이징 방식과 로그인, 세션 저장 방식을 추가하여 진행하였다.

 

package controller;

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

import service.FreeService;
import service.UserService;
import util.ScanUtil;
import util.View;
import view.BoardPrint;
import vo.BoardVo;
import vo.UserVo;

public class MainController extends BoardPrint {
	// sessionStorage은 하나 밖에 존재하지 않음
	static public Map<String, Object> sessionStorage = new HashMap<>();
	UserService userService = UserService.getInstance();
	FreeService freeService = FreeService.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_INSERT:
				view = boardInsert();
				break;
			case BOARD_LIST:
				view = boardList();
				break;
			case LOGIN:
				view = login();
				break;
			default:
				break;
			}
		}
	}
	
	private View boardList() {
		int page = 1;
		if(sessionStorage.containsKey("page")) page = (int)sessionStorage.get("page"); 
		int start = 1+(page-1)*3;
		int end = page*3;
		
		Map<String, Object> count_list = freeService.boardMax();
		BigDecimal count_temp = (BigDecimal)count_list.get("COUNT");
		int boardMax = count_temp.intValue();
		
		List<Object> param = new ArrayList();
		param.add(start);
		param.add(end);
		
		List<BoardVo> list = freeService.boardList(param);
		for (BoardVo boardVo : list) {
			System.out.println(boardVo);
		}
		System.out.println("1. 이전 페이지");
		System.out.println("2. 다음 페이지");
		int sel = ScanUtil.menu();
		if(sel == 1) {
			page = page-1;
			if(page < 1) page = 1;
			sessionStorage.put("page", page);
		}
		if(sel == 2) {
			if(end < boardMax) page = page + 1;
			sessionStorage.put("page", page);
		}
		return View.BOARD_LIST;
	}
	
	private View login() {
		String id = ScanUtil.nextLine("ID : ");
		String pass = ScanUtil.nextLine("PASS : ");
		
		List<Object> param = new ArrayList();
		param.add(id);
		param.add(pass);
		
		boolean loginPass = userService.login(param);
		if (loginPass) {
			UserVo user = (UserVo)sessionStorage.get("user");
			System.out.println(user.getName() + " 님 환영합니다.");
		} else {
			System.out.println("1. 다시 로그인 하시겠습니까?");
			System.out.println("2. 회원가입");
			System.out.println("3. 홈");
			
			int sel = ScanUtil.menu();
			if(sel == 1) return View.LOGIN;
			if(sel == 2) return View.LOGIN; // 회원가입 생략하여 프로그램 작성
			if(sel == 3) return View.MAIN;
		}
		
		View view = (View)sessionStorage.get("view"); // 로그인 전의 화면을 찾아 view 에 넣어줌
		if(view == null) return View.MAIN;
		return view;
	}

	private View boardInsert() {
		int mem_no;
		
		if(sessionStorage.containsKey("user")) {
			UserVo user = (UserVo) sessionStorage.get("user");
			mem_no = user.getNo();
		} else {
			// 로그인이 안 됐을 때 로그인 페이지로 이동
			sessionStorage.put("view", View.BOARD_INSERT);
			return View.LOGIN;
		}
		
		String name = ScanUtil.nextLine("제목 : ");
		String content = ScanUtil.nextLine("내용 : ");
		// 이후 삽입 insert 문 제외하여 진행함
		
		return View.BOARD_LIST;
	}

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

 

package dao;

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

import util.JDBCUtil;
import vo.BoardVo;

public class FreeDao {
	private static FreeDao instance = null;

	private FreeDao() {
	}

	public static FreeDao getInstance() {
		if (instance == null) {
			instance = new FreeDao();
		}
		return instance;
	}
	
	JDBCUtil jdbc = JDBCUtil.getInstance();
	
	public List<BoardVo> boardList(List<Object> param) {
		String sql = "select *\r\n" + 
					 "from (select rownum rn, a.* from \r\n" + 
					 "        (select no, name, content, \r\n" + 
					 "        mem_no, to_char(reg_date, 'YYYY/MM/DD') reg_date\r\n" + 
					 "        from java_freeboard\r\n" + 
					 "        order by no) a )\r\n" + 
					 "where rn between ? and ?";
		
		return jdbc.selectList(sql, param, BoardVo.class);
	}
	
	public Map<String, Object> boardMax() {
		String sql = "select count(*) count \r\n" + 
					 "from java_freeboard";
		return jdbc.selectOne(sql);
	}
}

 

package dao;

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

import util.JDBCUtil;
import vo.UserVo;

public class UserDao {
	private static UserDao instance = null;

	private UserDao() {
	}

	public static UserDao getInstance() {
		if (instance == null) {
			instance = new UserDao();
		}
		return instance;
	}
	
	JDBCUtil jdbc = JDBCUtil.getInstance();
	
	public UserVo login(List<Object> param) {
		String sql = "select * from java_user\r\n" + 
					 "where id = ?\r\n" + 
					 "and pass = ?";
		return jdbc.selectOne(sql, param, UserVo.class);
	}
}

 

package service;

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

import dao.FreeDao;
import vo.BoardVo;

public class FreeService {
	private static FreeService instance = null;

	private FreeService() {
	}

	public static FreeService getInstance() {
		if (instance == null) {
			instance = new FreeService();
		}
		return instance;
	}
	
	FreeDao dao = FreeDao.getInstance();
	
	public List<BoardVo> boardList(List<Object> param) {
		return dao.boardList(param);
	}
	
	public Map<String, Object> boardMax() {
		return dao.boardMax();
	}
	
}

 

package service;

import java.util.List;

import controller.MainController;
import dao.UserDao;
import vo.UserVo;

public class UserService {
	private static UserService instance = null;

	private UserService() {
	}

	public static UserService getInstance() {
		if (instance == null) {
			instance = new UserService();
		}
		return instance;
	}
	
	UserDao dao = UserDao.getInstance();
	
	public boolean login(List<Object> param) {
		UserVo user = dao.login(param);
		if(user != null) {
			MainController.sessionStorage.put("user", user);
			return true;
		}
		return false;
	}
}

 

package util;

import java.util.Scanner;

public class ScanUtil   {
	// 스캐너를 손쉽게 사용할 수 있는 static 메서드를 가지고있음
	static Scanner sc = new Scanner(System.in);
	
	public static int menu() {
		return nextInt("메뉴 : ");
	}
	
	public static String nextLine(String print) {
		System.out.print(print);
		return nextLine();
	}
	
	private static String nextLine() {
		return sc.nextLine();
	}
	
	public static int nextInt(String print) {
		System.out.print(print);
		return nextInt();
	}
	
	private static int nextInt() {
		while(true) {
			try {
				int result = Integer.parseInt(sc.nextLine());
				return result;
			}catch (NumberFormatException e) {
				System.out.println("잘못 입력!!");
			}
		}
	}
}

 

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

import java.util.Date;

public class BoardVo {
	 private int no;
	 private String name;
	 private String content;
	 private int mem_no;
	 private String reg_date;
//	 private Date reg_date2;
	 private String delyn;
//	 private String writer; // sql에서 writer로 같은 이름을 부여하여 가져온다면 이곳에서도 사용할 수 있음
	 
	 
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public int getMem_no() {
		return mem_no;
	}
	public void setMem_no(int mem_no) {
		this.mem_no = mem_no;
	}
	public String getReg_date() {
		return reg_date;
	}
	public void setReg_date(String reg_date) {
		this.reg_date = reg_date;
	}
//	public Date getReg_date2() {
//		return reg_date2;
//	}
//	public void setReg_date2(Date reg_date2) {
//		this.reg_date2 = reg_date2;
//	}
	public String getDelyn() {
		return delyn;
	}
	public void setDelyn(String delyn) {
		this.delyn = delyn;
	}
	
	@Override
	public String toString() {
		return "BoardVo [no=" + no + ", name=" + name + ", content=" + content + ", mem_no=" + mem_no + ", reg_date="
				+ reg_date + "]";
	}
}

 

package vo;

public class UserVo {
	 private String id;
	 private String pass;
	 private String name;
	 private String delyn;
	 private int no;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPass() {
		return pass;
	}
	public void setPass(String pass) {
		this.pass = pass;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getDelyn() {
		return delyn;
	}
	public void setDelyn(String delyn) {
		this.delyn = delyn;
	}
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	
	@Override
	public String toString() {
		return "UserVo [id=" + id + ", pass=" + pass + ", name=" + name + ", delyn=" + delyn + ", no=" + no + "]";
	}
}

 

 

 

 

TIP

 

N:M 테이블의 내용을 처리하기 위해 따로 테이블을 생성하는 것이 편하다.

 

ex) 커피 판매 시 여러개를 구매 시

 

 

반응형