Project day 1 - 게시판 서비스 만들기 미니 프로젝트
// 로그인, 로그아웃, 게시글 쓰기, 자기가 쓴 글 삭제 또는 수정, 댓글 달기, 글 목록 보기 등의 기능 구현

package data;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class BoardData {
public Integer num;
public String writer; // = id
public String content;
public String title;
public Integer status;
public Integer view;
public Date reg_date;
public Date mod_date;
public Integer getNum() {
return this.num;
}
public void setNum(Integer num) {
this.num = num;
}
public String getWriter() {
return this.writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getContent() {
return this.content;
}
public void setContent(String content) {
this.content = content;
}
public String getTitle() {
return this.title;
}
public void setTitle(String title) {
this.title = title;
}
public Integer getStatus() {
return this.status;
}
public void setStatus(Integer status) {
this.status = status;
}
public Integer getView() {
return this.view;
}
public void setView(Integer view) {
this.view = view;
}
public Date getReg_date() {
return this.reg_date;
}
public void setReg_date(Date reg_date) {
this.reg_date = reg_date;
}
public Date getMod_date() {
return this.mod_date;
}
public void setMod_date(Date mod_date) {
this.mod_date = mod_date;
}
public BoardData(Integer num, String writer, String content, String title, Date reg_date, Date mod_date, Integer view) {
this.num = num;
this.writer = writer;
this.title = title;
this.content = content;
this.reg_date = new Date();
this.mod_date = new Date();
this.view = view;
}
public String makeDataString(){
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
return num + "," + writer + "," + title + "," + content + "," + ","+ f.format(reg_date) + "," + f.format(mod_date) ;
}
public String toString(){
String str = "";
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); // status 활용하는 문장만들기
str += num + ". 제목 : " + title + " / 글쓴이 : " + writer + " / 등록일자 : " + f.format(reg_date) + " / 조회수 : " + view + "\n";
return str;
}
}
package data;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class CommentData {
public Integer numOfNotice;
public String content;
public String writer; // (=id)
public Date reg_date;
public Integer status;
public Integer getNumOfNotice() {
return this.numOfNotice;
}
public void setNumOfNotice(Integer numOfNotice) {
this.numOfNotice = numOfNotice;
}
public String getContent() {
return this.content;
}
public void setContent(String content) {
this.content = content;
}
public String getWriter() {
return this.writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public Date getReg_date() {
return this.reg_date;
}
public void setReg_date(Date reg_date) {
this.reg_date = reg_date;
}
public Integer getStatus() {
return this.status;
}
public void setStatus(Integer status) {
this.status = status;
}
public CommentData ( Integer numOfNotice, String content, String writer, Date reg_date, Integer status){
this.numOfNotice = numOfNotice;
this.content = content;
this.writer = writer;
this.status = status;
this.reg_date = new Date();
}
public String makeDataString(){
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
return numOfNotice + "," + writer + "," + content + "," + f.format(reg_date) + "," + status;
}
@Override
public String toString(){
String str = "";
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); // status 활용하는 문장만들기
str += numOfNotice + "\t" + writer + " / " + content + " / " + f.format(reg_date) + "\n";
return str;
}
}
package data;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MemberData {
public String id;
public String pwd;
public String name;
public Date birth;
public Integer status;
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return this.pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirth() {
return this.birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public Integer getStatus() {
return this.status;
}
public void setStatus(Integer status) {
this.status = status;
}
public MemberData(String id, String pwd, String name, Date birth, Integer status) {
this.id = id;
this.pwd = pwd;
this.name = name;
this.birth = birth;
this.status = status;
}
public String makeDataString(){
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
return id + "," + pwd + "," + name + "," + f.format(birth) + "," + status;
}
public String toString(){
String str = "";
str += "아이디 : " + id + " / 이름 : " + name + " / 생년월일 : " + birth + " / 비밀번호 : " + pwd + "\n"; //status 문장만들기
return str;
}
}
package service;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import data.BoardData;
public class BoardService {
public static final String BOARD_PATH = "files/board.dat";
public static List<BoardData> boardList = new ArrayList<BoardData>();
public static Scanner s = new Scanner(System.in);
public static BoardData selectedpost = null;
public static void addBoard () throws Exception {
System.out.println("========== 게시글 작성 =========");
System.out.println("작성자 : " + MemberService.getloginData().id);
String writer = MemberService.getloginData().id;
System.out.print("제목 : ");
String title = s.nextLine();
System.out.print("내용 : ");
String content = s.nextLine();
Integer num = 1;
Date reg_date = new Date();
Date mod_date = new Date();
Integer view = 0;
// boardList에 새로운 게시글 작성
BoardData b = new BoardData(num, writer, content, title, reg_date, mod_date, view);
boardList.add(b);
num++;
List<BoardData> blist = new ArrayList<BoardData>();
for (BoardData bdData : boardList) {
blist.add(bdData);
}
// blist에 정보를 저장
BoardService.BoardDataSave(BoardService.BOARD_PATH, blist);
}
public static void showBoardList () {
System.out.println("==================게시판===================");
if (boardList.size() == 0) {
System.out.println("등록된 게시물이 없습니다.");
}
else {
boardList.toString();
}
}
public static void BoardInfoInitialize(){
BufferedReader reader = null;
try{
reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(
new File("board.dat")
), "UTF-8"
)
);
while (true) {
String line = reader.readLine();
if(line == null) {break;}
String[] split = line.split(",");
Integer num = Integer.parseInt(split[0]);
String writer = split[1];
String content = split[2];
String title = split[3];
Integer view = Integer.parseInt(split[4]);
DateFormat f= new SimpleDateFormat("yyyy-MM-dd");
Date reg_date = (Date)f.parse(split[5]);
Date mod_date = (Date)f.parse(split[6]);
BoardData b = new BoardData (num,writer, content, title, reg_date, mod_date, view);
boardList.add(b);
num++;
}
}
catch (Exception e) {}
}
public static void BoardDataSave(String filepath, List<BoardData> BoardList) throws Exception{
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(
new File(filepath)
),"UTF-8"
)
);
for (BoardData b :boardList) {
writer.write(b.makeDataString());
}
writer.close();
}
public static List<String> BoardDataLoad (String filepath) throws Exception {
BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(
new File(filepath)
) , "UTF-8"
)
);
List<String> BoardDataList = new LinkedList<String>();
while(true) {
String line = reader.readLine();
if(line == null)break;
BoardDataList.add(line);
}
reader.close();
return BoardDataList;
}
public static void updateBoard () throws Exception {
System.out.print("변경할 게시글 번호 : ");
int update_num = s.nextInt();
s.nextLine();
System.out.print("변경할 내용 : ");
String update_content = s.nextLine();
String writer = boardList.get(update_num).writer;
String title = boardList.get(update_num).title;
Date reg_date = boardList.get(update_num).reg_date;
Date mod_date = new Date();
Integer view = boardList.get(update_num).view;
Integer num = boardList.get(update_num).num;
BoardData b = new BoardData(num, writer, update_content, title, reg_date, mod_date, view);
boardList.set(update_num,b);
BufferedWriter writer2 = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(
new File("board.dat"), true
),"UTF-8"
)
);
// BoardData의 makeDataString 형식의 글을 작성함
writer2.write(b.makeDataString() + "\r\n");
writer2.close();
}
public static void searchBoard () {
String id = MemberService.loginMember.getId();
for(BoardData b : boardList ) {
if(b.writer.equals(id)) {
System.out.println(b);
}
}
}
public static void selectPost() {
System.out.print("선택할 게시글 번호 : ");
Integer post= s.nextInt();
s.nextLine();
for(BoardData b : boardList) {
if (b.getNum() == post){
selectedpost = b;
System.out.println(b.getTitle() + "게시물이 선택되었습니다.");
}
}
if(selectedpost == null) {
System.out.println("선택하신 게시글은 존재하지 않습니다.");
return;
}
}
public static BoardData getSelectedPost() {
return selectedpost;
}
public static String detailBoardInfo () {
String str = "";
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd"); // status 활용하는 문장만들기
getSelectedPost().view++;
str += getSelectedPost().num + ". 제목 : " + getSelectedPost().title + " / 글쓴이 : " + getSelectedPost().writer +
" / 등록일자 : " + getSelectedPost().reg_date + " / 조회수 : " + getSelectedPost().view + "\n";
str += " 내용 \n" + getSelectedPost().content + "\n";
return str;
}
}
package service;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Date;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import data.CommentData;
public class CommentService {
public static List<CommentData> commentList = new ArrayList<CommentData>();
public static Scanner s = new Scanner(System.in);
// -addComment(댓글등록)-login
// -modComment(댓글 수정) -login, id=mod_id
// -deleteComment(글 삭제) -login, id= del_id (change status)
public static void addComment () throws Exception{
System.out.println("========== 댓글 =========");
Integer num = 0;
System.out.print("작성자 :");
String writer = s.nextLine();
System.out.print("내용 :");
String content = s.nextLine();
Date reg_date = new Date();
Integer status = 0;
CommentData c = new CommentData(num, content, writer, reg_date, status);
commentList.add(c);
num++;
BufferedWriter writer3 = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(
new File("comment.dat"), true
),"UTF-8"
)
);
writer3.write(c.makeDataString() + "\r\n");
writer3.close();
}
public static void commentDataInitialize(){
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(
new File("member.dat")
), "UTF-8"
)
);
while (true) {
String line = reader.readLine();
if(line == null) {
break;
}
String[] split = line.split(",");
Integer numOfNotice = Integer.parseInt(split[0]);
String writer = split[1];
String content = split[2];
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
Date reg_date = (Date)f.parse(split[3]);
Integer status = Integer.parseInt(split[4]);
System.out.println(line);
CommentData c = new CommentData(numOfNotice, writer, content,reg_date, status);
commentList.add(c);
}
}
catch (Exception e){
}
finally {
try { reader.close();}
catch(Exception e) {}
}
}
}
package service;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;
import data.MemberData;
public class MemberService {
public static Scanner s = new Scanner(System.in);
public static List<MemberData> memberList = new ArrayList<MemberData>();
public static MemberData loginMember = null; // 로그인 하기위해 초기화.
public static final String MEMBER_PATH = "files/member.dat";
public static void memberJoin() throws Exception {
System.out.println("========== 회원 가입 =========");
System.out.print("아이디 : ");
String id = s.nextLine();
if (id.length() < 6) {
System.out.println("아이디는 6자 이상 입력하세요.");
return;
}
if(isDuplicatedId(id)) { // isDuplicatedId = true 이면, 중복된 아이디가 있음.
System.out.println(id + "은(는) 이미 가입된 아이디 입니다.");
return;
}
// isDuplicatedId = false 이면, 중복된 아이디가 없고, 다음과정으로 진행.
System.out.print("비밀번호 : ");
String pwd = s.nextLine();
if (pwd.length() < 6) {
System.out.println("비밀번호는 6자 이상 입력하세요.");
return;
}
System.out.print("가입자 명 : ");
String name = s.nextLine();
if (name.length() == 0 ) {
System.out.println("이름을 다시 입력해주세요.");
return;
}
System.out.print("생년월일(yyyy-MM-dd) : ");
String date = s.nextLine();
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
Date birth = (Date)f.parse(date);
if(isDuplicatedPerson(name, birth)) { // isDuplicatedPerson = true 이면, 이미 가입된 사람임.
System.out.println(name + "은(는) 이미 회원가입 되어 있습니다.");
return;
}
Integer status = 0;
// isDuplicatedPerson = false 이면, 가입한 이력이 없고, 다음과정으로 진행.
MemberData m = new MemberData (id, pwd, name, birth, status);
memberList.add(m);
System.out.println("회원 등록이 완료되었습니다.");
// memberdata를 파일에 생성함.
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(
new File("member.dat"), true
),"UTF-8"
)
);
// MemberData의 makeDataString 형식의 글을 작성함
writer.write(m.makeDataString() + "\r\n");
writer.close();
}
public static void memberDataInitialize(){
BufferedReader reader = null;
try {
reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(
new File("member.dat")
), "UTF-8"
)
);
while (true) {
String line = reader.readLine();
if(line == null) {
break;
}
String[] split = line.split(",");
String id = split[0];
String pwd = split[1];
String name = split[2];
DateFormat f = new SimpleDateFormat("yyyy-MM-dd");
Date birth = (Date)f.parse(split[3]);
Integer status = Integer.parseInt(split[4]);
MemberData m = new MemberData(id, pwd, name, birth, status);
memberList.add(m);
}
}
catch (Exception e){
}
finally {
try { reader.close();}
catch(Exception e) {}
}
}
public static MemberData getloginData () {
return loginMember;
}
public static void login(){
System.out.println("========== 로그인 =========");
System.out.print("아이디 : ");
String id = s.nextLine();
System.out.print("비밀번호 : ");
String pwd = s.nextLine();
for(MemberData m : memberList) {
if (m.getId().equals(id) && m.getPwd().equals(pwd)){
loginMember = m;
System.out.println(m.getId() + "님 로그인 되었습니다.");
}
}
if(loginMember == null) {
System.out.println("아이디 또는 비밀번호가 잘못되거나 없는 회원입니다.");
return;
}
}
public static void logout(){
loginMember = null;
System.out.println("로그아웃 되었습니다.");
}
public static void changeMemberStatus () throws IOException {
// System.out.println("========== 로그인 =========");
System.out.print("아이디 : ");
String id = s.nextLine();
System.out.print("비밀번호 : ");
String pwd = s.nextLine();
for(MemberData m : memberList) {
if (m.id.equals(id) && m.pwd.equals(pwd)) {
loginMember = m;
memberList.remove(m);
System.out.println("탈퇴 완료 했습니다.");
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(
new File("member.dat"), true
),"UTF-8"
)
);
// MemberData의 makeDataString 형식의 글을 작성함
writer.write(m.makeDataString() + "\r\n");
writer.close();
}
}
if(loginMember == null) {
System.out.println("아이디 또는 비밀번호가 잘못되거나 없는 회원입니다.");
}
return;
}
public static void showLoginInfo(){
System.out.println("아이디 :" + getloginData().id);
System.out.println("비밀번호 :" + getloginData().pwd);
System.out.println("이름 :" + getloginData().name);
System.out.println("생년월일 :" + getloginData().birth);
}
public static void changeMemberInfo () throws Exception{
if (getloginData() != null) {
System.out.println("========== 회원정보 수정 =========");
String mod_id = getloginData().id;
String mod_name = getloginData().name;
Date mod_birth = getloginData().birth;
Integer mod_status = getloginData().status;
System.out.print("변경할 비밀번호 : ");
String mod_pwd = s.nextLine();
if (mod_pwd.length() < 6) {
System.out.println("비밀번호는 6자 이상 입력하세요.");
return;
}
MemberData m =new MemberData(mod_id, mod_pwd, mod_name, mod_birth, mod_status);
loginMember.setPwd(mod_pwd);
List<MemberData> mlist = new ArrayList<MemberData>();
for (MemberData mbData : memberList) {
mlist.add(mbData);
}
MemberService.MemberDataSave(MemberService.MEMBER_PATH, mlist);
}
}
public static void MemberDataSave(String filepath, List<MemberData> MemberList) throws Exception{
BufferedWriter writer = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream(
new File(filepath)
),"UTF-8"
)
);
for (MemberData b :memberList) {
writer.write(b.makeDataString());
}
writer.close();
}
public static List<String> MemberDataLoad (String filepath) throws Exception {
BufferedReader reader = new BufferedReader(
new InputStreamReader(
new FileInputStream(
new File(filepath)
) , "UTF-8"
)
);
List<String> memberDataList = new LinkedList<String>();
while(true) {
String line = reader.readLine();
if(line == null)break;
memberDataList.add(line);
}
reader.close();
return memberDataList;
}
public static void showMemberList (){
if(memberList.size() == 0) {
System.out.println("등록된 회원이 없습니다.");
return;
}
else {
for(MemberData m :memberList) {
System.out.println(m);
}
}
}
public static Boolean isDuplicatedId (String id){
for (MemberData m : memberList) {
if(id.equals(m.id)) {
return true;
}
}
return false; // 중복아이디가 없으면 false
}
public static Boolean isDuplicatedPerson (String name, Date birth){
for (int i=0; i<memberList.size(); i++) {
if((name.equals(memberList.get(i).name)) && (birth.equals(memberList.get(i).birth))) {
return true; //이름과 생일이 동시에 같다면 true
}
}
return false; // 이름과 생일이 동시에 같지 않아서 false
}
}
// 해야하는 기능
// -addmember (회원가입) - IsDuplicate, id.pwd.length check, 동인인물 check (name, birth = name, birth)
// -loadMemeberData(파일로 저장)
// -login(로그인)
// -logout(로그아웃)
// -changeMemberInfo(정보수정)-login
// -changeMemberStatus(상태수정) - login
// -MemberDataInitialize (파일 가져오기)
// -noteOfMember (회원이 쓴 글) - login (writer = id)
import java.util.Scanner;
import service.BoardService;
import service.CommentService;
import service.MemberService;
public class Main {
public static Scanner s = new Scanner(System.in);
public static void main(String[] args) {
MemberService.memberDataInitialize();
BoardService.BoardInfoInitialize();
CommentService.commentDataInitialize();
while (true) {
System.out.print(" 1.게시판 / 2.로그인 / 3.회원가입 / 0.종료 : ");
int sel = s.nextInt();
s.nextLine();
if(sel == 0) {
break;
}
else if(sel ==1){
BoardService.showBoardList();
}
else if(sel == 2){
MemberService.login();
if (MemberService.getloginData() != null) {
LoginMode();
}
}
else if (sel == 3) {
try {MemberService.memberJoin();}
catch (Exception e) {}
}
else {
System.out.println("잘못된 메뉴번호입니다.");
}
}
}
public static void LoginMode() {
while (true) {
BoardService.searchBoard();
System.out.println("1.게시글 2. 회원정보 관련 3.로그아웃 0.종료 : ");
int sel2 = s.nextInt();
s.nextLine();
// 종료
if (sel2 == 0) {
return;
}
// 게시글 관련
else if (sel2 == 1) {
while (true) {
System.out.println("1.글 쓰기 2.글 수정 3.글 삭제 4.글 상세보기 0.종료");
int sel_note = s.nextInt();
s.nextLine();
// 종료
if(sel_note == 0) {
break;
}
else if (sel_note == 1) {
// 글쓰기
try {BoardService.addBoard(); }
catch(Exception e) {}
break;
}
else if (sel_note == 2) {
// 글 수정
try {BoardService.updateBoard();}
catch (Exception e) {}
break;
}
// else if (sel_note == 3) {
// // 글 삭제
// BoardService.deleteBoard();
// break;
// }
else if (sel_note == 4) {
// 글 상세보기
BoardService.searchBoard();
BoardService.selectPost();
BoardService.detailBoardInfo();
break;
}
else {
System.out.println("잘못된 메뉴 번호입니다.");
break;
}
}
}
// 회원정보관련
else if(sel2 ==2){
while (true) {
System.out.println("1.회원 정보 수정 0.종료");
int sel_mem = s.nextInt();
s.nextLine();
// 종료
if(sel_mem== 0) {
break;
}
else if (sel_mem == 1) {
if (MemberService.getloginData() != null) {
// 회원정보수정
MemberService.showLoginInfo();
try { MemberService.changeMemberInfo();}
catch(Exception e) {}
}
}
else {
System.out.println("잘못된 메뉴 번호입니다.");
}
}
}
else if (sel2 ==3) {
MemberService.logout();
}
else {
System.out.println("잘못된 메뉴번호입니다.");
}
}
}
}
// 수정해야 할 부분
// 게시판
// 목록 보여주기 (카테고리, 글제목, 닉네임, 날짜, 조회수 )
// 글을 자세히 볼지, 글을 등록할지 묻기
// 글 자세히 보기 누르면 (제목, 닉네임, 조회수 \n 내용 출력)
// +댓글 출력 (아이디 \n 내용)
// 댓글 쓰기
// 글 등록하기
// 로그인 창 나옴
// 로그인 시 (글 제목, 글내용 나옴)