반응형

*요구

- 회원가입 기능[완료]

- 회원 로그인 기능(중복체크 포함)[완료]

- 파일 생성 시 폴더를 만들고 그안에 담기 ( member/1.txt, member/2.txt )[완료]

- 가입 후 프로그램을 재시작해도, 로그인이 되어야 한다.

- Member(손님), MemberController(손님 접객), MemberService(실무), MemberDao(서비스 부하), DB(실질적으로 파일과 JSON으로 작업진행)으로 구현.

반응형
반응형

* 완료된 기능 목록

1. 게시물 저장

- 저장 시 global.txt 파일에 생성 된 텍스트 파일의 번호를 갖고있게 구현.(리스팅 시 파일이 몇번까지 존재하는 지 확인할 수 있도록 하기 위함)

2. 게시물 리스팅

- global에 있는 파일의 마지막 번호(lastIndex)를 별도로 생성한 변수 i와 비교 값이 동일 할 경우 while문을 탈출하도록 구현(lastIndex와 값이 동일하다는 건 마지막 파일 번호가 lastIndex라는 것)

3. 게시물 불러오기

4. 게시물 출력하기

5. 게시물 수정하기

- 게시물 저장과 비슷, 수정 시 해당 번호의 텍스트 파일이 새로 만들어지게 구현(재 생성).

6. 게시물 삭제

7. 종료

 

*진행중

1. 배열 미 이용, 배열에 읽은 정보들 담기, 게시물 저장 시 객체로 저장 후 배열에 추가하기, 삭제 시 배열에서 리모콘 빼고 파일 삭제하기

2. 초기 실행 시 기존에 global 파일에 저장된 lastIndex 에 따라 새로 파일 추가 시 이후 번호로 생성되도록 조건 설정하기.

 

* 내용

- 게시글 영속저장 기능이 있는 게시판 구현
- 저장 / 불러오기 / 출력 / 삭제 / 수정
- 최초 실행 시 global.txt하나 만들어 두고 안에 lastArticleId : 0 으로 설정
 (마지막 txt파일 번호 갖고 있게 하기)
 (삭제해도 불러오기, 1, 2 에서 2삭제 시 다음파일은 3번으로 생성)
 (수정은 파일만 수정 = 파일 삭제 후 다시 생성되게 하면 된다.)
- 프로그램 시작
- global.txt 에서 내용을 읽어서 Global 객체에 정보 넣기
- class Global {int lastArticleId;} > 반복문을 통해 불러올때 몇번파일까지 있는지 모르니까 필요함.
- 가장 마지막에 추가된 게시물 ID(3) 알아냄
- 반복문으로 1.txt, 2.txt, 3.txt 파일들 읽음(중간에 파일이 없어도 읽음)
- 읽은 정보들 배열에 담기
- 게시물 저장
- 객체로 저장하고 배열에 추가 후 파일 생성
- global 객체 갱신 후 파일 저장
- 게시물 삭제
- 배열에서 리모콘 빼고, 파일 삭제
- 게시물 수정
- 객체내요용 수정 후, 해당파일 삭제 후 재생성(혹은 덮어쓰기)

 

* 게시판 만들기를 진행하면서 부족했던 부분

- 함수 구현이 아직 익숙치 못한 것 같다.

 

* 게시판 만들기를 진행하면서 막혔던 부분

- 아직 JSON에 익숙하지 못하고 부족한 부분이 많음

- 짝 프로그래밍을 통해 공동작업 진행하면서 부족한 부분을 배우고 있고, 점점 완성도가 높은 게시판 구현을 진행하고있다.

반응형
반응형

문제 1, 회원정보를 파일로 관리.

1. 초기

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		
		Scanner scanner = new Scanner(System.in);
		
		Article article = new Article();
		
		System.out.println("== 회원 프로그램 시작 ==");
		System.out.println("1) 저장하기");
		System.out.println("2) 불러오기");
		System.out.println("3) 출력하기");
		
		
		while(true) {
			System.out.printf("명령) ");
			String command = scanner.next();
			
			if (command.equals("1")) {
				scanner.nextLine();
				try {
					OutputStream output = new FileOutputStream("D:/a.txt", true); // txt문서내에 입력값 연달아 저장가능
					System.out.println("== 저장하기 시작 ==");
					
					System.out.printf("로그인 아이디 : ");
					String loginId = scanner.next();
					scanner.nextLine();
					System.out.printf("로그인 비번 : ");
					String loginPw = scanner.next();
					scanner.nextLine();
					String str = "아이디 : " + loginId + " 비밀번호 : " + loginPw;
					byte[] by = str.getBytes();
					output.write(by);
					
					System.out.printf("%d.txt 파일이 생성되었습니다.\n", 1);
					System.out.println("== 저장하기 끝 ==");
				} catch (Exception e) {
					e.getStackTrace();
				}
			}
			
		}		
	}	
}
class Article {
	int id;
	String loginId;
	String loginPw;
}

 

2. 개선

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {

		Scanner scanner = new Scanner(System.in);

		Article article = new Article();

		showHelp();

		int num = 1;

		while (true) {
			System.out.printf("명령) ");
			String command = scanner.next();

			if (command.equals("1")) {
				scanner.nextLine();
				try {
					OutputStream output = new FileOutputStream("D:/" + num + ".txt");
					System.out.println("== 저장하기 시작 ==");

					String id = command;
					String regDate = getNowdate();
					System.out.printf("로그인 아이디 : ");
					String loginId = scanner.next();
					scanner.nextLine();
					System.out.printf("로그인 비번 : ");
					String loginPw = scanner.next();
					scanner.nextLine();
					String str = "{\"id\": " + id + ", \"regDate\": \"" + regDate + "\", \"loginId\":\"" + loginId
							+ "\", \"loginPw\":\"" + loginPw + "\"}";
					byte[] by = str.getBytes();
					output.write(by);

					System.out.printf("%d.txt 파일이 생성되었습니다.\n", num);
					System.out.println("== 저장하기 끝 ==");
				} catch (Exception e) {
					e.getStackTrace();
				}
				num++;
			} else if (command.equals("2")) {
				System.out.println("== 불러오기 시작 ==");
				System.out.printf("번호) ");
				String temp = scanner.next();
				scanner.nextLine();

				try {
					/*
					// 이 경우엔 한 글자씩 불러온다.
					// 파일 객체 생성
					String file = new File("D:/" + temp + ".txt");
					// 입력 스트림 생성
					FileReader file_reader = new FileReader(file);
					int cur = 0;
					while ((cur = file_reader.read()) != -1) {
						System.out.print((char) cur);
					}
					file_reader.close();
					*/
					
					// 이 경우엔 한 줄로 불러온다.
					// 파일 객체 생성
					String path = "D:/" + temp + ".txt";
					
					BufferedReader br = new BufferedReader(new FileReader(path));
					String abc = br.readLine();
					
					System.out.println(abc);			
					
					br.close();					
				} catch (FileNotFoundException e) {
					e.getStackTrace();
				} catch (IOException e) {
					e.getStackTrace();
				}

				System.out.println("- 불러오기 완료");
				System.out.println("== 불러오기 끝 ==");
			} else if (command.equals("3")) {
				System.out.println("== 출력하기 시작 ==");
				System.out.printf("번호 : %s\n", article.id);
				System.out.printf("날짜 : %s\n", article.regDate);
				System.out.printf("로그인 아이디 : %s\n", article.loginId);
				System.out.printf("로그인 비번 : %s\n", article.loginPw);
				System.out.println("== 출력하기 끝 ==");
			}

		}
	}

	static void showHelp() {
		System.out.println("== 회원 프로그램 시작 ==");
		System.out.println("1) 저장하기");
		System.out.println("2) 불러오기");
		System.out.println("3) 출력하기");
	}

	static String getNowdate() {
		Calendar cal = Calendar.getInstance();
		SimpleDateFormat Date = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss");
		String regDate = Date.format(cal.getTime());
		return regDate;
	}
}

class Article {
	String id;
	String regDate;
	String loginId;
	String loginPw;
}
반응형
반응형

* 완료된 기능 목록

1. 명령 리스트 (help)

2. 게시물 리스팅 (list)

- 로그인 유무에 관계없이 게시물 리스트 보기 가능.

3. 게시물 추가 (add)

- 로그인 한 회원만 작성 : 로그인 한 회원만 작성 가능하도록 설정

- 작성자 기록 : 게시물 생성 시 로그인한 대상자의 닉네임이 기록되도록 구현(닉네임 중복 방지)

4. 게시판 종료 (exit)

5. 게시판 상세보기 (detail)

- 상세보기 진행 시 조회수(views) 증가 되도록 설정.

- 로그인 한 회원만 상세보기 가능하도록 구현

6. 게시물 수정 (modify)

- 로그인 한 회원만 수정 : 로그인 한 회원만 수정 가능하도록 설정

- 작성자 본인만 수정 : 로그인 한 회원과 작성자 닉네임 동일여부 체크하여 작성자만 수정 가능하도록 구현

7. 게시물 삭제 (delete)

- 로그인 한 회원만 삭제: 로그인 한 회원만 삭제가능하도록 설정

- 삭제된 배열은 공란으로 놔둠, 번호 재정렬하지 않음(2번 삭제 시 2번 없는 상태로 유지

- 작성자 본인만 삭제: 로그인 한 회원과 작성자 닉네임 동일여부 체크하여 작성자만 삭제가능하도록 구현

8. 게시물 추천 (recd)

- 로그인 한 회원만 추천: 로그인 한 회원만 추천 가능하도록 설정

- 단순히 조회수 상승처럼 구현, 로그인 회원은 게시물 1나에 추천1번만 가능하도록 구현예정

9. 회원가입 (signup )

- 아이디 중복 확인 : 아이디 중복체크 함수 사용하여 구현

- 닉네임 중복 확인 : 닉네임 중복체크 함수 사용하여 구현

10. 로그인 / 로그아웃 (login / logout)

- 로그인 시 아이디 존재 유무 확인 : 함수를 통해 아이디-비밀번호 일치하는 확인하는 기능 구현

- 로그인 유무 확인 : Member loginedMember 선언, 초기엔 null값을 가지며, 로그인 시 로그인 된 객체의 정보를 갖고 있도록 설정, 로그아웃 시 null값이 되도록 설정

- 중복 로그인 방지 : loginedMember 사용하여 로그인 유무 확인, 로그인 한 회원이 있는 경우 중복 로그인 못하도록 구현

11. 게시물, 맴버 가득 찰 경우 배열 늘리기

- 함수 사용하여 게시물, 맴버가 정해진 배열만큼 가득 찰 경우 자동으로 늘어나도록 구현

12. 관리자 admin

- admin 계정 생성 시 관리자 코드 1 부여, 관리자 코드 1(일반 계정은 0)에 작성자 상관없이 생성, 수정, 삭제 가능하도록 설정

 

*진행중

1. 추천(보류) - 로그인 한 회원 1명은 글 1개당 1번만 추천가능(중복 불가)

 

*추가 요구사항 (진행 예정)

1. 게시물 페이징(10개 단위로 게시물 리스트 출력 되도록)

2. 댓글 기능

 

* 게시판 만들기를 진행하면서 부족했던 부분

- 함수 구현 및 함수 사용관련 혼동/미흡

 

* 게시판 만들기를 진행하면서 막혔던 부분

- 과정 반복 수행 중 삭제 과정에서 잘못된 삭제가 진행되는것을 확인, 삭제 관련 수정 진행

- 로그인/로그아웃까지 막힘없이는 아니지만 수월하게 진행가능.

- 공동작업 진행 한 내용을 조금 더 학습 한 후 추가기능까지 완벽히 수행해 낼 수 있도록 진행 예정

반응형

+ Recent posts