Coding History

국비 지원 IT(웹앱개발) 취업반 강의 17일차 (motivation 앱 만들기)

BlackBirdIT 2024. 6. 30. 21:39

이제 웹의 기본적인 기능인 CRUD(Create,Read,Update,Delete)를 사용해서 motivation 앱을 만드는 수업을 받았다.

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

public class App {

    private Scanner sc;

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

    public void run() {
        System.out.println("== motivation execution ==");

        int lastId = 0;

//        Motivation motivation0 = null;
//        Motivation motivation1 = null;
//        Motivation motivation2 = null;

//        Motivation[] motivations = new Motivation[3];

        List<Motivation> motivations = new ArrayList<>();

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

            if (cmd.equals("exit")) {
                System.out.println("== motivation end ==");
                break;
            } else if (cmd.length() == 0) {
                System.out.println("명령어를 입력해주세요.");
                continue;
            }


            if (cmd.equals("add")) {
                int id = lastId + 1;

                System.out.print("motivation :");
                String body = sc.nextLine();
                System.out.print("source :");
                String source = sc.nextLine();

                Motivation motivation = new Motivation(id,body,source);

                motivations.add(motivation);

//                motivations[id - 1] = motivation;

//                if (motivation.id == 1) {
//                    motivation0 = motivation;
//                }else if (motivation.id == 2) {
//                    motivation0 = motivation;
//                }else if (motivation.id == 3) {
//                    motivation1 = motivation;
//                }

                System.out.printf("%d번 motivation 이 등록 되었습니다.\n", id);
                lastId++;
            } else if(cmd.equals("list")) {
                System.out.println("== motivation list ==");
                System.out.printf("  id   //    motivation      //      source       \n");
                System.out.println("=".repeat(40));
//            for(Motivation motivation : motivations) {
//                System.out.println(motivation.toString());
//            }
            if (motivations.size() == 0) {
                System.out.println("등록된 motivation 없음.");
            } else {
                System.out.println("있음.");
                System.out.println("등록된 motivation 개수 : " + motivations.size());
            }
            }
        }

    }
}

class Motivation {
    int id;
    String body;
    String source;

    public Motivation(int id, String body, String source) {
        this.id = id;
        this.body = body;
        this.source = source;
    }

    public int getId() {
        return id;
    }

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

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

    @Override
    public String toString() {
        return "Motivation{" +
                "id=" + id +
                ", body='" + body + '\'' +
                ", source='" + source + '\'' +
                '}';
    }
}

이렇게 구현중이고 list로 데이터를 불러오는 것을 구현하고 있다.

public class App {

    private Scanner sc;

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

    public void run() {
        System.out.println("== motivation execution ==");

        int lastId = 0;

        List<Motivation> motivations = new ArrayList<>();

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

            if (cmd.equals("exit")) {
                System.out.println("== motivation end ==");
                break;
            } else if (cmd.length() == 0) {
                System.out.println("명령어를 입력해주세요.");
                continue;
            }


            if (cmd.equals("add")) {
                int id = lastId + 1;

                System.out.print("motivation :");
                String body = sc.nextLine();
                System.out.print("source :");
                String source = sc.nextLine();

                Motivation motivation = new Motivation(id, body, source);

                motivations.add(motivation);

                System.out.printf("%d번 motivation 이 등록 되었습니다.\n", id);
                lastId++; //마지막 번호 증가
            } else if (cmd.equals("list")) {
                System.out.println("== motivation list ==");
                System.out.printf("  id   //    motivation      //      source       \n");
                System.out.println("=".repeat(40));

                if (motivations.size() == 0) {
                    System.out.println("등록된 motivation 없음.");
                } else {
                    System.out.println("있음.");
                    System.out.println("등록된 motivation 개수 : " + motivations.size());
                }
            }
        }

    }
}

리팩토링과정을 거쳐서, Motivation 클래스도 보면,

class Motivation {
    int id;
    String body;
    String source;

    public Motivation(int id, String body, String source) {
        this.id = id;
        this.body = body;
        this.source = source;
    }

    public int getId() {
        return id;
    }

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

    public String getBody() {
        return body;
    }

    public void setBody(String body) {
        this.body = body;
    }

    public String getSource() {
        return source;
    }

    public void setSource(String source) {
        this.source = source;
    }

    @Override
    public String toString() {
        return "Motivation{" +
                "id=" + id +
                ", body='" + body + '\'' +
                ", source='" + source + '\'' +
                '}';
    }
}

이렇게 데이터를 저장하고 불러오기 위해 생성자와 getter setter까지 준비해서 데이터를 불러올 수 있게 되었다.

이제는 입력한 정보가 제대로 나오도록 만들어야한다.

if (motivations.size() == 0) {
                    System.out.println("등록된 motivation 없음.");
                    continue;
                }
                System.out.println("== motivation list ==");
                System.out.printf("  id   //    source      //      body       \n");
                System.out.println("=".repeat(40));

//                System.out.println("있음.");
//                System.out.println("등록된 motivation 개수 : " + motivations.size());
                for (int i = motivations.size() - 1; i >= 0; i--) {
                    Motivation motivation = motivations.get(i);

                    if (motivation.getSource().length() > 7) {
                        System.out.printf("    %d    //        %s       //      %s     \n", motivation.getId(), motivation.getSource().substring(0, 5) + "...", motivation.getBody());
                        continue;
                    }

                    System.out.printf("    %d    //        %s       //      %s     \n", motivation.getId(), motivation.getSource(), motivation.getBody());
                }
            }
        }

    }
}

이렇게 해결 한 다음에 유지보수에 관련한 내용을 듣게 되었다. 유지보수를 쉽게 다른 사람도 할 수 있게끔 (또는 협업을 위한) 모듈 분리와 패키지 이동리팩토링에 대해서 배웠다. 항상 개발을 할 때는 유지 보수를 하기 쉬운 형태로 만들어야한다. 그래서 우리는 클래스를 일단 5개로 나누게 되었다.

public class Main
public class App
public class SystemController
public class MotivationController
public class Motivation

이렇게 5개로 나눈 후 지금까지 구현했던 것들을 하나하나 옮기면서 확인하는 작업을 거치게 되었다.
그리고 컨테이너 클래스를 만들어서 구조를 더 개선 시켰다.

public class Container {
    private static Scanner sc;

    // 공유자원을 모아두는 공간 초기화
    public static void init() {
        sc = new Scanner(System.in);
    }

    // 공유 자원을 모아두는 공간 해제
    public static void close() {
        sc.close();
    }

    public static Scanner getScanner() {
        return sc;
    }
}

main 클래스의 스캐너를 지우고 컨테이너를 만들어 스캐너를 여기서 다 담당하도록 만들었다.

이후 각 기능이 정상작동하게끔하기 위해 코드 수정을 거치고 삭제기능을 만들기 시작했다.

삭제기능을 구현하면서 파싱(parsing)의 개념도 함께 배우면서 구현했다.

else if (cmd.startsWith("delete")) {
                //parsing
                String[] cmdBits = cmd.split("\\?", 2);
                String actionMethod = cmdBits[0]; //delete
                Map<String, String> params = new HashMap<>();
                String[] paramBits = cmdBits[1].split("&");

                for (String paramStr : paramBits) {
                    String[] paramStrBits = cmdBits[1].split("=", 2);
                    String key = paramStrBits[0];
                    String value = paramStrBits[1];

                    params.put(key, value);
                }


                motivationController.delete(cmd);
            }

그렇게 수업이 끝났다.