java 학습일기 day18 - 텍스트게시판 복습 (2)

이건구·2023년 9월 17일
0

텍스트게시판 클래스별로 나누기

1. 패키지분할

패키지를 mvc패턴으로 분할하여 model패키지에 Article, ArticleRepository클래스

view패키지에 ArticleView클래스를

controller패키지에는 ArticleController, BoardApp클래스를 만들어둔다

그리고 Main클래스에있는 모든 코드를 일단 BoardApp클래스에 옮겨주고 static이 붙어있던 것들을 지워준다.

2. BoardApp에는 아래처럼 ArticleController나 ArticleView에있는 메서드를 실행만하도록하고 코드들을 분류해준다.

package controller;

import view.ArticleView;

import java.util.Scanner;

public class BoardApp {
    ArticleController articleController = new ArticleController();
    ArticleView articleView = new ArticleView();
    public void start() {
        Scanner sc = new Scanner(System.in);
        while(true) {
            System.out.print("명령어 : ");
            String command = sc.nextLine();
            if (command.equals("exit")) {
                System.out.println("프로그램을 종료합니다");
                break;
            } else if (command.equals("add")) {
                articleController.add();
            } else if (command.equals("list")) {
               articleView.list(articleController.articleRepository.allArticle());
            } else if (command.equals("update")) {
                articleController.update();
            } else if (command.equals("delete")) {
                articleController.delete();
            } else if (command.equals("detail")) {
                articleController.detail();
            }
        }
    }
}

3. ArticleRepository에는 게시판에 저장되는 글들을 저장하는 메서드들을 모아둔다. (사실상 저장소)

package model;

import java.util.ArrayList;

public class ArticleRepository {
    int LastArticleNum = 0;
    private ArrayList<Article> articles = new ArrayList<>();
    public void insert(String title, String content) {
        LastArticleNum++;
        Article article = new Article(LastArticleNum, title, content);
        articles.add(article);
    }
    public void delete(Article article) {
        articles.remove(article);
    }
    public ArrayList<Article> allArticle() {
        return articles;
    }
    public Article findByNum(int num) {
        for (Article article : articles) {
            if (article.getId() == num) {
                return article;
            }
        }
        return null;
    }
}

4. ArticleController는 ArticleRepository에 저장해둔 정보들을 꺼내서 사용하는 메서드들을 모아둔다.

package controller;

import model.Article;
import model.ArticleRepository;

import java.util.Scanner;

public class ArticleController {
    int LastArticleNum = 0;
    Scanner sc = new Scanner(System.in);
    ArticleRepository articleRepository = new ArticleRepository();

    public void add() {
        LastArticleNum++;
        System.out.print("게시물 제목을 입력해주세요 : ");
        String title = sc.nextLine();
        System.out.print("게시물 내용을 입력해주세요 : ");
        String content = sc.nextLine();
        articleRepository.insert(title, content);
        System.out.println("게시물이 추가되었습니다.");
    }

    public void update() {
        while (true) {
            System.out.print("수정할 게시물 번호 또는 \"back\"를 입력해주세요 : ");
            String strNum = sc.nextLine();
            if (strNum.equals("back")) {
                break;
            }
            int num = convertInt(strNum);
            if (num == -1) {
                System.out.println("숫자를 입력해주세요");
                continue;
            }
            Article article = articleRepository.findByNum(num);
            if (article == null) {
                System.out.println("없는 게시물 번호입니다.");
            } else {
                System.out.print("새로운 제목 : ");
                String newTitle = sc.nextLine();
                System.out.print("새로운 내용 : ");
                String newContent = sc.nextLine();
                article.setTitle(newTitle);
                article.setContent(newContent);
                System.out.printf("%d번 게시물이 수정되었습니다.\n", num);
                break;
            }
        }
    }

    public void delete() {
        while (true) {
            System.out.print("삭제 게시물 번호 또는 \"back\"를 입력해주세요 : ");
            String strNum = sc.nextLine();
            if (strNum.equals("back")) {
                break;
            }
            int num = convertInt(strNum);
            if (num == -1) {
                System.out.println("숫자를 입력해주세요");
                continue;
            }
            Article article = articleRepository.findByNum(num);
            if (article == null) {
                System.out.println("없는 게시물 번호입니다.");
            } else {
                articleRepository.delete(article);
                System.out.printf("%d번 게시물이 삭제되었습니다\n", num);
                break;
            }
        }
    }

    public void detail() {
        while (true) {
            System.out.print("상세보기 할 게시물 번호 또는 \"back\"를 입력해주세요 : ");
            String strNum = sc.nextLine();
            if (strNum.equals("back")) {
                break;
            }
            int num = convertInt(strNum);
            if (num == -1) {
                System.out.println("숫자를 입력해주세요");
                continue;
            }
            Article article = articleRepository.findByNum(num);
            if (article == null) {
                System.out.println("없는 게시물 번호입니다.");
            } else {
                System.out.println("번호 : " + article.getId());
                System.out.println("제목 : " + article.getTitle());
                System.out.println("내용 : " + article.getContent());
                System.out.println("========================================");
                break;
            }
        }
    }

    public int convertInt(String strNum) {
        int num = -1;
        try {
            num = Integer.parseInt(strNum);
        } catch (NumberFormatException ignored) {
        }
        return num;
    }
}

5. ArticleView는 전체 리스트를 출력할때만 사용된다.

package view;

import model.Article;

import java.util.ArrayList;

public class ArticleView {
    public void list(ArrayList<Article> list) {
        for (Article article : list) {
            System.out.println("번호 : " + article.getId());
            System.out.println("제목 : " + article.getTitle());
            System.out.println("========================================");
        }
    }
}

위처럼 코드들을 분리하는 복습을했는데 아직 적응이안되서 많이 버벅이고 머릿속에서 헷갈린다. 더욱 연습해서 능숙하게 하도록 노력해야겠다.

정리

controller패키지 - ArticleContriller, BoardApp (모델패키지와 뷰패키지를 연결시켜주는 역할)

model패키지 - Article, ArticleRepository (정보를 저장하는 역할)

view패키지 - ArticleView (정보를 출력하는 역할)

밖에 Main클래스

0개의 댓글