본문 바로가기
네이버클라우드/JAVA 웹 프로그래밍

JAVA 15일차 (2023-06-13) 자바 기초 DAY13_게시판 관리 기능 추가

by prometedor 2023. 6. 13.

현재 실습 프로젝트 구성

 

BoardHandler.java

ㄴ MemberHandler.java 를 복사하여 BoardHandler.java 라는 이름으로 변경 후 코드 수정

Board.java

ㄴ Member.java 를 복사하여 Board.java 라는 이름으로 변경 후 코드 수정

App.java

ㄴ menuNo를 6~10 번을 추가, 종료 번호를 6 -> 99 로 변경

 

 

Board.java

package bitcamp.myapp.vo;

public class Board {

  private static int boardNo = 1;

  private int no; // private 이라는 modifier 를 사용하여 접근 제어
  private String title;
  private String content;
  private String writer;
  private String password;
  private int viewCount;
  private long createdDate; // 밀리세컨

  public Board() { // 생성자
    this.no = boardNo++;
    this.createdDate = System.currentTimeMillis();
  }

  public int getNo() {
    return no;
  }

  public void setNo(int no) {
    this.no = no;
  }

  public String getTitle() {
    return title;
  }

  public void setTitle(String title) {
    this.title = title;
  }

  public String getContent() {
    return content;
  }

  public void setContent(String content) {
    this.content = content;
  }

  public String getWriter() {
    return writer;
  }

  public void setWriter(String writer) {
    this.writer = writer;
  }

  public int getViewCount() {
    return viewCount;
  }

  public void setViewCount(int viewCount) {
    this.viewCount = viewCount;
  }

  public long getCreatedDate() {
    return createdDate;
  }

  public void setCreatedDate(long createdDate) {
    this.createdDate = createdDate;
  }

  public String getPassword() {
    return password;
  }

  public void setPassword(String password) {
    this.password = password;
  }

}

ㄴ userId -> boardNo 으로 변경

ㄴ no, title, content, writer, password, viewCount, createDate 인스턴스 변수 선언

ㄴ getter/setter 추가 생성

 

App.java

package bitcamp.myapp;

import bitcamp.myapp.handler.BoardHandler;
import bitcamp.myapp.handler.MemberHandler;
import bitcamp.util.Prompt;

public class App {

  public static void main(String[] args) {

    printTitle();

    printMenu();

    while (true) {
      String menuNo = Prompt.inputString("메인> ");
      if (menuNo.equals("99")) {
        break;
      } else if (menuNo.equals("menu")) {
        printMenu();
      } else if (menuNo.equals("1")) {
        MemberHandler.inputMember();
      } else if (menuNo.equals("2")) {
        MemberHandler.printMemebers();
      } else if (menuNo.equals("3")) {
        MemberHandler.viewMember();
      } else if (menuNo.equals("4")) {
        MemberHandler.updateMember();
      } else if (menuNo.equals("5")) {
        MemberHandler.deleteMember();
      } else if (menuNo.equals("6")) {
        BoardHandler.inputBoard();
      } else if (menuNo.equals("7")) {
        BoardHandler.printBoards();
      } else if (menuNo.equals("8")) {
        BoardHandler.viewBoard();
      } else if (menuNo.equals("9")) {
        BoardHandler.updateBoard();
      } else if (menuNo.equals("10")) {
        BoardHandler.deleteBoard();
      } else {
        System.out.println(menuNo);
      }
    }

    Prompt.close();
  }

  static void printMenu() {
    System.out.println("1. 회원등록");
    System.out.println("2. 회원목록");
    System.out.println("3. 회원조회");
    System.out.println("4. 회원변경");
    System.out.println("5. 회원삭제");
    System.out.println("6. 게시글등록");
    System.out.println("7. 게시글목록");
    System.out.println("8. 게시글조회");
    System.out.println("9. 게시글변경");
    System.out.println("10. 게시글삭제");
    System.out.println("99. 종료");

  }

  static void printTitle() {
    System.out.println("나의 목록 관리 시스템");
    System.out.println("-------------------------------");
  }

}

ㄴ menuNo를 6~10 번을 추가, 종료 번호를 6 -> 99 로 변경

ㄴ "6. 게시글등록 / 7. 게시글목록 / 8. 게시글조회 / 9.게시글변경 / 10. 게시글 삭제" 로 추가

 

BoardHandler.java

package bitcamp.myapp.handler;

import bitcamp.myapp.vo.Board;
import bitcamp.util.Prompt;

public class BoardHandler {

  static final int MAX_SIZE = 100; // 대문자로 해주는 이유 : 강조하기 위함
  static Board[] boards = new Board[MAX_SIZE];
  static int length = 0; // 한 사람 입력 할 때마다 증가시킬 값

  public static void inputBoard() {
    if (!available()) {
      System.out.println("더이상 입력할 수 없습니다!");
      return; // 함수 종료시키고 싶을 때
    }

    Board board = new Board();
    board.setTitle(Prompt.inputString("제목? "));
    board.setContent(Prompt.inputString("내용? "));
    board.setWriter(Prompt.inputString("작성자? "));
    board.setPassword(Prompt.inputString("비밀번호? "));

    // 위에서 만든 Board 인스턴스의 주소를 잃어버리지 않게 레퍼런스 배열에 담는다.
    boards[length++] = board;
  }

  public static void printBoards() {
    System.out.println("--------------------------------------------");
    System.out.println("번호, 제목, 작성자, 조회수, 등록일");
    System.out.println("--------------------------------------------");


    for (int i = 0; i < length; i++) {
      Board board = boards[i];

      System.out.printf("%d, %s, %s, %d, %tY-%5$tm-%5$td\n", board.getNo(), board.getTitle(),
          board.getWriter(), board.getViewCount(), board.getCreatedDate());
    }
  }

  public static void viewBoard() {
    String boardNo = Prompt.inputString("번호? ");
    // 입력 받은 번호를 가지고 배열에서 해당 게시글을 찾아야 한다.
    for (int i = 0; i < length; i++) {
      Board board = boards[i]; // board:레퍼런스 배열에 있는 인스턴스 주소값을 가져옴
      if (board.getNo() == Integer.parseInt(boardNo)) {
        // i 번째 항목에 저장된 게시글 정보 출력
        System.out.printf("제목: %s\n", board.getTitle());
        System.out.printf("내용: %s\n", board.getContent());
        System.out.printf("작성자: %s\n", board.getWriter());
        System.out.printf("조회수: %d\n", board.getViewCount());
        System.out.printf("등록일: %tY-%1$tm-%1$td\n", board.getCreatedDate());
        return;
      }
    }
    System.out.println("해당 번호의 게시글이 없습니다!");
  }

  public static void updateBoard() {
    String boardNo = Prompt.inputString("번호? ");
    // 입력 받은 번호를 가지고 배열에서 해당 게시글을 찾아야 한다.

    for (int i = 0; i < length; i++) {
      Board board = boards[i];
      if (board.getNo() == Integer.parseInt(boardNo)) {
        // i 번째 항목에 저장된 회원 정보 출력
        System.out.printf("암호? ");
        String password = Prompt.inputString("");
        if (!password.equals(board.getPassword())) {
          System.out.println("암호가 일치하지 않습니다!");
          return;
        }
        System.out.printf("제목(%s)? ", board.getTitle());
        board.setTitle(Prompt.inputString(""));
        System.out.printf("내용(%s)? ", board.getContent());
        board.setContent(Prompt.inputString(""));
        return;
      }
    }
    System.out.println("해당 번호의 게시글이 없습니다!");
  }


  public static void deleteBoard() {
    // 삭제하려는 게시글의 정보가 들어 있는 인덱스를 알아낸다.

    int boardNo = Integer.parseInt(Prompt.inputString("번호? "));

    int deletedIndex = indexOf(boardNo);

    if (deletedIndex == -1) {
      System.out.println("해당 번호의 게시글이 없습니다!");
      return;
    }

    for (int i = deletedIndex; i < length - 1; i++) {
      boards[i] = boards[i + 1];
    }

    boards[--length] = null;

    System.out.println("삭제했습니다.");
    return;
  }

  private static int indexOf(int boardNo) {
    for (int i = 0; i < length; i++) {
      Board board = boards[i];
      if (board.getNo() == boardNo) {
        return i;
      }
    }
    return -1;
  }

  private static boolean available() { // 같은 클래스 안에서만 사용 가능
    return length < MAX_SIZE;
  }
}

ㄴ member -> board 로 변경

ㄴ 등록일 출력 시 날짜 출력 형식 %tY-%5$tm-%5$td 이용

    ㄴ 5$ => 5번째 출력 (1번째 : 제목 / 2번째 : 내용 / 3번째 : 작성자 / 4번째 : 조회수 / 5번째 : 등록일)

ㄴ 날짜 출력 방식 다르게

 

코드 실행

 

날짜 출력 형식

//# 콘솔로 출력하기 III - 형식을 갖춰서 날짜 값 출력하기 

public class Exam0130 {
  public static void main(String[] args) {
    // 현재 날짜 및 시각 정보를 생성한다.
    // java.lang 패키지의 멤버를 사용할 때는 그냥 이름을 지정하면 된다.
    // 그 외 다른 패키지의 멤버를 사용할 때는 반드시 패키지 이름을 함께 지정해야 한다.
    java.util.Date today = new java.util.Date();

    // %t[날짜 및 시각 옵션]
    // 날짜 및 시간 옵션
    // Y : 날짜 및 시각 데이터에서 년도를 추출하여 4자리로 표현한다.
    // y : 날짜 및 시각 데이터에서 년도를 추출하여 뒤의 2자리로 표현한다.
    System.out.printf("%1$tY, %1$ty\n", today);

    // B : 날짜 및 시각 데이터에서 월을 추출하여 전체 이름으로 표현한다. ex) January
    // b : 날짜 및 시각 데이터에서 월을 추출하여 단축 이름으로 표현한다. ex) Jan
    System.out.printf("%1$tB, %1$tb\n", today);

    // m : 날짜 및 시각 데이터에서 월을 추출하여 2자리 숫자로 표현한다. ex) 12, 01
    System.out.printf("%1$tm\n", today);

    // d : 날짜 및 시각 데이터에서 일을 추출하여 2자리 숫자로 표현한다. ex) 01, 22
    // e : 날짜 및 시각 데이터에서 일을 추출하여 1자리 숫자로 표현한다. ex) 1, 22
    System.out.printf("%1$td %1$te\n", today);

    // A : 날짜 및 시각 데이터에서 요일을 추출하여 긴 이름으로 표현한다. ex) Sunday
    // a : 날짜 및 시각 데이터에서 요일을 추출하여 짧은 이름으로 표현한다. ex) Sun
    System.out.printf("%1$tA %1$ta\n", today);

    // H : 날짜 및 시각 데이터에서 시각을 추출하여 24시로 표현한다.
    // I : 날짜 및 시각 데이터에서 시각을 추출하여 12시로 표현한다.
    System.out.printf("%1$tH %1$tI\n", today);

    // M : 날짜 및 시각 데이터에서 시각을 추출하여 분을 표현한다.
    System.out.printf("%1$tM\n", today);

    // S : 날짜 및 시각 데이터에서 시각을 추출하여 초를 표현한다.
    // L : 날짜 및 시각 데이터에서 시각을 추출하여 밀리초를 표현한다.
    // N : 날짜 및 시각 데이터에서 시각을 추출하여 나노초를 표현한다.
    System.out.printf("%1$tS %1$tL %1$tN\n", today);

    // p : 오전 오후 출력하기
    //     소문자 p를 사용하면 am 또는 pm으로 출력하고, 
    //     대문자 P를 사용하면 AM 또는 PM으로 출력한다.
    //     한글은 대소문자가 없기 때문에 의미없다.
    System.out.printf("%1$tp\n", today);

    // 년-월-일 시:분:초를 출력하라! 예) 2019-01-04 12:04:30
    System.out.printf("%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS\n", today);
  }
}