Coding History

국비 지원 IT(웹앱개발) 취업반 강의 19일차 (ArticleManager)

BlackBirdIT 2024. 7. 2. 17:42

ArticleManager 구현을 들어갔다. 직역하면 게시판 관리인인데 바로 전에 했던 motivation 앱과 거의 동일하다.

package com.koreait;


import java.util.Scanner;

public class App {

    private final Scanner sc;

    public App(Scanner sc) {
        this.sc = sc;
    }

    public void run() {
        System.out.println("== 프로그램 시작 ==");

        while (true) {
            System.out.print("명령어) ");
            String cmd = sc.nextLine().trim();

            if (cmd.equals("exit")) {
                System.out.println("== 프로그램 종료==");
                break;
            } else if (cmd.isEmpty()){
                System.out.println("명령어를 입력해주세요");
            }

            if (cmd.equals("article write")) {
                System.out.print("제목 : ");
                String title = sc.nextLine().trim();
                System.out.print("내용 : ");
                String body = sc.nextLine().trim();

                System.out.println("1번 글이 생성되었습니다.");
            }
        }
    }


}

우선 순차적으로 기능들을 구현중이다.

package com.koreait;


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


public class App {

    int id;
    int lastArticleId;
    private final Scanner sc;
    List<Article> articles;
    private Article foundArticle;
    private Article article;

    public App(Scanner sc) {
        this.sc = sc;
        this.articles = new ArrayList<>();
        this.lastArticleId = 0;
    }

    public void run() {

        id = lastArticleId;
        //List<Article> articles = new ArrayList<>();

        System.out.println("== 프로그램 시작 ==");

        makeTestData();

        //printArticles();

        while (true) {
            System.out.print("명령어) ");
            String cmd = sc.nextLine().trim();

            if (cmd.equals("exit")) {
                System.out.println("== 프로그램 종료==");
                break;
            } else if (cmd.isEmpty()) {
                System.out.println("명령어를 입력해주세요");
            }


            if (cmd.equals("article write")) {
                System.out.println("==게시글 작성==");

                int id = lastArticleId + 1;

                String regDate = Util.getNow();
                String updateDate = regDate;

                System.out.print("제목 : ");
                String title = sc.nextLine();
                System.out.print("내용 : ");
                String body = sc.nextLine();

                Article article = new Article(id, regDate, updateDate, title, body);
                articles.add(article);

                System.out.println(id + "번 글이 생성되었습니다");
                lastArticleId++;

            } else if (cmd.startsWith("article list")) {
                System.out.println("==게시글 목록==");

                String[] cmdParts = cmd.split(" ");
                String keyword = cmdParts.length == 3 ? cmdParts[2] : "";

                List<Article> filteredArticles;
                if (keyword.isEmpty()) {
                    filteredArticles = articles;
                } else {
                    filteredArticles = new ArrayList<>();
                    for (Article article : articles) {
                        if (article.getTitle().contains(keyword)) {
                            filteredArticles.add(article);
                        }
                    }
                }

                if (filteredArticles.isEmpty()) {
                    System.out.println("아무것도 없어");
                } else {
                    System.out.println("  번호   /    날짜   /   제목   /   내용   ");
                    for (int i = filteredArticles.size() - 1; i >= 0; i--) {
                        Article article = filteredArticles.get(i);
                        if (Util.getNow().split(" ")[0].equals(article.getRegDate().split(" ")[0])) {
                            System.out.printf("  %d   /   %s      /   %s   /   %s  \n", article.getId(), article.getRegDate().split(" ")[1], article.getTitle(), article.getBody());
                        } else {
                            System.out.printf("  %d   /   %s      /   %s   /   %s  \n", article.getId(), article.getRegDate().split(" ")[0], article.getTitle(), article.getBody());
                        }
                    }
                }
            } else if (cmd.startsWith("article detail")) {
                System.out.println("==게시글 상세보기==");

                doSplit(cmd);

                System.out.println("번호 : " + foundArticle.getId());
                System.out.println("작성날짜 : " + foundArticle.getRegDate());
                System.out.println("수정날짜 : " + foundArticle.getUpdateDate());
                System.out.println("제목 : " + foundArticle.getTitle());
                System.out.println("내용 : " + foundArticle.getBody());

            } else if (cmd.startsWith("article delete")) {
                System.out.println("==게시글 삭제==");

                doSplit(cmd);

                articles.remove(foundArticle);

                System.out.println(id + "번 게시글이 삭제되었습니다");
            } else if (cmd.startsWith("article modify")) {
                System.out.println("==게시글 수정==");

                doSplit(cmd);

                System.out.println("기존 제목 : " + foundArticle.getTitle());
                System.out.println("기존 내용 : " + foundArticle.getBody());
                System.out.print("새 제목 : ");
                String newTitle = sc.nextLine();
                System.out.print("새 내용 : ");
                String newBody = sc.nextLine();

                foundArticle.setTitle(newTitle);
                foundArticle.setBody(newBody);
                foundArticle.setUpdateDate(Util.getNow());

                System.out.println(id + "번 게시글이 수정되었습니다");
            } else {
                System.out.println("사용할 수 없는 명령어입니다");
            }

        }
        System.out.println("==프로그램 종료==");
        sc.close();

    }
    private void makeTestData() {
        System.out.println("==테스트데이터==");
        for (int i = 1; i < 4; i++) {
            articles.add(new Article (++lastArticleId, Util.getNow(), Util.getNow(),"제목 " + i, "내용 " + i));
        }

    }

    private void doSplit(String cmd) {
        int id = Integer.parseInt(cmd.split(" ")[2]);

        for (Article article : articles) {
            if (article.getId() == id) {
                foundArticle = article;
                break;
            }
        }
        if (foundArticle == null) {
            System.out.println("해당 게시글은 없습니다");
        }
    }

}

쓰는 과정에 중복코드를 제거하는 작업을 거쳐봤는데 나는 doSplit메서드를 만들어서 해결했다. 근데 아마 이게 올바른 해결법은 아닐 것이다.

private static Article findArticleById(int id) {
        for(int i = 0; i < articles.size(); i++){
            if(articles.get(i).getId() == id){
                return article;
            }
        }
        return null;
    }

근데 강사님이 하시는거 보니까 나랑 비슷하긴 한데 나는 저렇게 쓰니까 뭔가 조금씩 이상한 부분이 있었다. 근데 이렇게 쓰니까 그런 부분이 없었다. 무슨 차이인지.. 솔직히 잘 못찾겠다 ㅠ

아무튼 하루종일 뭔가 시키시는걸 구현하는데 시간을 다 썼다.

시간들 들여서 천천히 하다보면 조악하지만 어떻게든 완성이 되는데 도대체 내가 어떻게 완성 시켰는지 정확히 이해가 되지 않는다. 할 때는 뭔가 알고 하는데 나중에 시간이 지나서 코드를 확인하면 내가 어떤 의도로 썼는지 좀 가물가물하고 다시 찬찬히 들여다 봐야지 조금씩 기억이 난다. 원래 이런게 맞는건지 불안하다.

import java.util.List;
import java.util.Scanner;

public class Member {
    private final Scanner sc;

    private int id;
    private String loginId;
    private String loginPw;
    private String name;
    static List<Member> memberList;

    public Member(Scanner sc) {
        this.sc = sc;
    }

    public void signUp() {

        System.out.println("회원가입 ");
        System.out.print("id 입력) ");
        loginId = sc.nextLine().trim();
        System.out.print("pw 입력) ");
        loginPw = sc.nextLine().trim();



    }
    public void setLoginId(String loginId) {
        this.loginId = loginId;
    }
    public void setLoginPw(String loginPw) {
        this.loginPw = loginPw;
    }
    public boolean logIn(String loginId, String loginPw) {
        if (this.loginId != null && this.loginPw != null) {
            if (this.loginId.equals(loginId) && this.loginPw.equals(loginPw)) {
                System.out.println("로그인 성공!");
                return true;
            } else {
                System.out.println("로그인 실패. ID 또는 비밀번호가 틀렸습니다.");
                return false;
            }
        } else {
            System.out.println("회원 정보가 없습니다. 먼저 회원가입을 해주세요.");
            return false;
        }
    }
}

아무튼 지금은 이렇게 회원가입 기능을 만들어 보고 있는데 어떻게 하다 보니까 회원 가입은 된다. 이제 중복 회원을 잡아내면 되는데 이걸 잘 모르겠다.

오늘 하루는 배운 것을 반복하는 것이 주된 목표였던 것 같다. 그래서 뭔가 단계별로 쓰면 굉장히 많은데 집중하느라 git에는 기록을 남겼는데 여기에는 하나하나 쓰지 못한 점 양해 바란다..