JX405기_비트/Java

Day04-3 MVC 패턴을 활용하여 게시판 프로그램 만들기

_하루살이_ 2023. 1. 16. 16:22

BoardDTO 만들기

package model;

public class BoardDTO {
    private int id;
    private String title;
    private String writer;
    private String content;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

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

    public String getWriter() {
        return writer;
    }

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

    public String getContent() {
        return content;
    }

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

    public boolean equals(Object o){
        if (o instanceof BoardDTO){
            BoardDTO b =(BoardDTO) o;
            return id == b.id;
        }
        return false;
    }
    public BoardDTO(BoardDTO original){
        id = original.id;
        title = original.title;
        writer = original.writer;
        content = original.content;
    }

    public BoardDTO(){

    }

    public BoardDTO(int id){
        this.id = id;
    }

}

BoardController만들기

package View;

import Controller.BoardController;
import model.BoardDTO;
import util.ScannerUtil;

import java.util.ArrayList;
import java.util.Scanner;

public class BoardViewer {
    private final Scanner SCANNER;

    private BoardController boardController;


    private BoardDTO boardDTO = null;

    public BoardViewer(){
        SCANNER = new Scanner(System.in);
        boardController = new BoardController();
    }

    public void showMenu(){
        String message = "1. 새 글 작성하기 2. 글 목록 보기 3. 종료";
        while (true){
            int userChoice = ScannerUtil.nextInt(SCANNER, message);
            if (userChoice == 1){
                writeBoard();
            } else if (userChoice == 2){
                printList();
            } else if (userChoice == 3) {
                System.out.println("사용해주셔서 감사합니다.");
                break;
            }
        }
    }

    private void writeBoard(){
        BoardDTO boardDTO = new BoardDTO();
        String message;

        message = "글의 제목을 입력하시오.";
        boardDTO.setTitle(ScannerUtil.nextLine(SCANNER, message));

        message = "글의 작성자를 입력하시오.";
        boardDTO.setWriter(ScannerUtil.nextLine(SCANNER, message));

        message = "글의 내용을 입력하시오.";
        boardDTO.setContent(ScannerUtil.nextLine(SCANNER, message));

        boardController.add(boardDTO);

    }

    private void printList(){
        ArrayList<BoardDTO> list = boardController.selectAll();
        if (list.isEmpty()){
            System.out.println("아직 등록된 글이 없습니다.");
        } else {
            for (BoardDTO b : list){
                System.out.printf("%d. %s\n", b.getId(), b.getTitle());
            }

            String message = "상세보기할 글의 번호나 뒤로 가실려면 0을 입력해주세요.";
            int userChoice = ScannerUtil.nextInt(SCANNER, message);

            BoardDTO b = new BoardDTO();
            b.setId(userChoice);

            while (userChoice != 0 && !list.contains(new BoardDTO(userChoice))){
                System.out.println("잘못 입력하셨습니다.");
                userChoice = ScannerUtil.nextInt(SCANNER, message);
                b.setId(userChoice);
            }

            if (userChoice != 0){
                printOne(userChoice);
            }
        }
    }
    private void printOne(int id){
        BoardDTO boardDTO = boardController.selectOne(id);
        System.out.println("==========================================");
        System.out.println(boardDTO.getTitle());
        System.out.println("------------------------------------------");
        System.out.println("글번호: " + boardDTO.getId());
        System.out.println("글 작성자: " + boardDTO.getWriter());
        System.out.println("------------------------------------------");
        System.out.println(boardDTO.getContent());
        System.out.println("==========================================");

        String message = "1. 수정 2. 삭제 3. 뒤로가기";
        int userChoice = ScannerUtil.nextInt(SCANNER, message, 1, 3);

        if (userChoice == 1){
            update(id);
        } else if (userChoice == 2){
            delete(id);
        } else {
            printList();
        }
    }
    private void update(int id){
        BoardDTO b = boardController.selectOne(id);

        String message = "새로운 제목을 입력해주세요.";
        b.setTitle(ScannerUtil.nextLine(SCANNER, message));

        message = "새로운 내용을 입력해주세요.";
        b.setContent(ScannerUtil.nextLine(SCANNER, message));

        boardController.update(b);

    }

    private void delete(int id){
        String message = "정말로 삭제하시겠습니까? Y/N";
        String yesNo = ScannerUtil.nextLine(SCANNER, message);
        if (yesNo.equalsIgnoreCase("Y")){
            // equalsIgnoreCase() 대소문자 상관업이 특정문자가 같은지 확인할 때 사용하는 메소드
            boardController.delete(id);
            printList();
        } else {
            printOne(id);
        }
    }



}

 

BoardViewer 만들기

package Controller;

import model.BoardDTO;

import java.util.ArrayList;

public class BoardController {
    private ArrayList<BoardDTO> list;
    private int nextId;

    public BoardController(){
        list = new ArrayList<>();
        nextId = 1;

        for (int i = 1; i <= 4; i++) {
            BoardDTO b = new BoardDTO();
            b.setTitle("제목 " + i);
            b.setWriterNickname("작성자 " + i);
            b.setContent(i + "번째 게시글의 내용입니다.");

            add(b);
        }
    }

    public void add(BoardDTO boardDTO){
        boardDTO.setId(nextId++);
        list.add(boardDTO);
    }

    public BoardDTO selectOne(int id){
        BoardDTO temp = new BoardDTO(id);
        if (list.contains(temp)){
            return new BoardDTO(list.get(list.indexOf(temp))); // 깊은 복사
        }

        return null;
    }

    public ArrayList<BoardDTO> selectAll(){
        ArrayList<BoardDTO> temp = new ArrayList<>();
        for (BoardDTO b : list){
            temp.add(new BoardDTO(b)); // 깊은 복사
        }

        return temp;
    }

    public void update(BoardDTO boardDTO){
        list.set(list.indexOf(boardDTO), boardDTO);
    }

    public void delete(int id){
        list.remove(new BoardDTO(id));
    }




}

 

 

Board 클래스에서 실행하기

package day0112;

import View.BoardViewer;
import View.UserViewer;

import java.util.Scanner;

public class Ex03Board02 {
    public static void main(String[] args) {
        BoardViewer boardViewer = new BoardViewer();
        userViewer.showMenu();
    }


}