[java] 명언 앱 제작하기

0

1단계

종료

== 명언 앱 ==
명령) 종료

while (true) {
            System.out.print("명령) ");
            String command = br.readLine().trim(); // trim() : 혹시 있을지 모를 좌우공백제거된 버전으로 주세요.

            if (command.equals("종료")) {
                break;
            }
 }

2단계

등록

== 명언 앱 ==
명령) 등록
명언 : 현재를 사랑하라.
작가 : 작자미상
명령) 종료

else if (command.equals("등록")) {
                System.out.print("명언 : ");
                String content = br.readLine().trim();
                System.out.print("작가 : ");
                String authorName = br.readLine().trim();

3단계

등록시 생성된 명언번호 노출

== 명언 앱 ==
명령) 등록
명언 : 현재를 사랑하라.
작가 : 작자미상
1번 명언이 등록되었습니다.
명령) 종료

4단계

등록할때 마다 생성되는 명언번호가 증가

== 명언 앱 ==
명령) 등록
명언 : 현재를 사랑하라.
작가 : 작자미상
1번 명언이 등록되었습니다.
명령) 등록
명언 : 과거에 집착하지 마라.
작가 : 작자미상
2번 명언이 등록되었습니다.
명령) 종료

5단계

목록

== 명언 앱 ==
명령) 등록
명언 : 현재를 사랑하라.
작가 : 작자미상
1번 명언이 등록되었습니다.
명령) 등록
명언 : 과거에 집착하지 마라.
작가 : 작자미상
2번 명언이 등록되었습니다.
명령) 목록
번호 / 작가 / 명언
----------------------
2 / 작자미상 / 과거에 집착하지 마라.
1 / 작자미상 / 현재를 사랑하라.
명령) 종료

else if (command.equals("목록")) {
                System.out.println("번호 / 작가 / 명언");
                System.out.println("-".repeat(20)); //System.out.println("------------------------");

                for (int i = list.size() - 1; i >= 0; i--) {
                    System.out.println(list.get(i));
                }

💡 각 모듈로 패키지 도입, 기능 분리

6단계

삭제

== 명언 앱 ==
명령) 등록
명언 : 현재를 사랑하라.
작가 : 작자미상
1번 명언이 등록되었습니다.
명령) 등록
명언 : 과거에 집착하지 마라.
작가 : 작자미상
2번 명언이 등록되었습니다.
명령) 목록
번호 / 작가 / 명언
----------------------
2 / 작자미상 / 과거에 집착하지 마라.
1 / 작자미상 / 현재를 사랑하라.
명령) 삭제?id=1
1번 명언이 삭제되었습니다.
명령) 종료

 public void remove(Rq rq) {
        long id = rq.getIntParam("id", -1);
        if (id == -1) {
            System.out.println("id(정수)를 입력해주세요.");
            return;
        }
        WiseSaying wiseSaying = findById(id);
        list.remove(wiseSaying);
        System.out.printf(id + "번 명언이 삭제되었습니다.\n");
    }
    private WiseSaying findById(long id) {
        for (WiseSaying wiseSaying : list) {
            if (wiseSaying.getId() == id) {
                return wiseSaying;
            }
        }
        return null;
    }
  • https://github.com/heeyeon3050/Wise-Saying-App/commit/37306dcb09d1c605291a7556c653aa9db75ee768
  • 삭제할 때는 입력값을 삭제?id=1 형식으로 받으므로 위와 다르게 처리해줘야 한다.
  • 우선, 삭제일 경우를 확인하기 위해 command.startsWith("삭제")를 사용하였고
  • Rq클래스를 만들어 삭제할 대상을 넘겨주었다. lifeQuotesController.remove(new Rq(command));
  • Rq클래스split()을 사용하여 ?일 때를 나누고, &일 때를 나누고, =일 때를 나눠서 값을 받은 다음 HashMap에 저장한다.
  • getIntParam함수를 통해 id에 대한 값을 들고오고 id에 해당하는 명언이 있을 경우 삭제한다.


7단계

존재하지 않는 명언삭제에 대한 예외처리

== 명언 앱 ==
명령) 등록
명언 : 현재를 사랑하라.
작가 : 작자미상
1번 명언이 등록되었습니다.
명령) 등록
명언 : 과거에 집착하지 마라.
작가 : 작자미상
2번 명언이 등록되었습니다.
명령) 목록
번호 / 작가 / 명언
----------------------
2 / 작자미상 / 과거에 집착하지 마라.
1 / 작자미상 / 현재를 사랑하라.
명령) 삭제?id=1
1번 명언이 삭제되었습니다.
명령) 삭제?id=1
1번 명언은 존재하지 않습니다.
명령) 종료

if (wiseSaying == null) {
            System.out.printf("%d번 명언은 존재하지 않습니다.\n", id);
            return;
        }

8단계

== 명언 앱 ==
명령) 등록
명언 : 현재를 사랑하라.
작가 : 작자미상
1번 명언이 등록되었습니다.
명령) 등록
명언 : 과거에 집착하지 마라.
작가 : 작자미상
2번 명언이 등록되었습니다.
명령) 목록
번호 / 작가 / 명언
----------------------
2 / 작자미상 / 과거에 집착하지 마라.
1 / 작자미상 / 현재를 사랑하라.
명령) 삭제?id=1
1번 명언이 삭제되었습니다.
명령) 삭제?id=1
1번 명언은 존재하지 않습니다.
명령) 수정?id=2
명언(기존) : 과거에 집착하지 마라.
명언 : 현재와 자신을 사랑하라.
작가(기존) : 작자미상
작가 : 홍길동
명령) 목록
번호 / 작가 / 명언
----------------------
2 / 홍길동 / 현재와 자신을 사랑하라.
명령) 종료

public void modify(Rq rq) throws IOException {
        long id = rq.getIntParam("id", -1);
        if (id == -1) {
            System.out.println("id(정수)를 입력해주세요.");
            return;
        }
        // 입력된 id와 일치하는 명언객체 찾기
        WiseSaying wiseSaying = findById(id);
        if (wiseSaying == null) {
            System.out.printf(id + "번 명언은 존재하지 않습니다.\n");
            return;
        }
        System.out.println("명언(기존) : " + wiseSaying.getContent());
        System.out.print("명언 : ");
        String content = br.readLine().trim();

        System.out.println("작가(기존) : " + wiseSaying.getAuthor());
        System.out.print("작가 : ");
        String authorName = br.readLine().trim();

        wiseSaying.setContent(content);
        wiseSaying.setAuthor(authorName);

        System.out.printf("%d번 명언이 수정되었습니다.\n", id);
    }

💡 리팩토링

리팩토링 : 결과의 변경 없이 코드의 구조를 재조정함

service, repository 도입

💡 Util 도입, 그리고 테스트

9단계

파일을 통한 영속성

== 명언 앱 ==
명령) 등록
명언 : 현재를 사랑하라.
작가 : 작자미상
1번 명언이 등록되었습니다.
명령) 등록
명언 : 과거에 집착하지 마라.
작가 : 작자미상
2번 명언이 등록되었습니다.
명령) 목록
번호 / 작가 / 명언
----------------------
2 / 작자미상 / 과거에 집착하지 마라.
1 / 작자미상 / 현재를 사랑하라.
명령) 종료

프로그램 다시 시작...

== 명언 앱 ==
명령) 목록
번호 / 작가 / 명언
----------------------
2 / 작자미상 / 과거에 집착하지 마라.
1 / 작자미상 / 현재를 사랑하라.

  • https://github.com/heeyeon3050/Wise-Saying-App/commit/ee2f100e010861edc5ac874471eede50b12a8124
  • 영속저장을 위해서는 파일이나 DB를 사용해야한다. 여기서는 파일을 사용했다.
  • 데이터들을 관리하는 table 패키지를 만들어서 repository 에서 더 세분화한다. controller -> service -> repository -> table
  • .gitignore에 prodData를 추가하여 깃에 올라가는 것을 방지한다.
    - 만일, .gitignore에 추가하지 않아 prodData가 깃에 올라갔을 경우
    • git rm -r --cached .gitignore
      git add .gitignore
      git commit -m "수정"
      git push origin main


10단계

data.json 빌드

== 명언 앱 ==
명령) 등록
명언 : 현재를 사랑하라.
작가 : 작자미상
1번 명언이 등록되었습니다.
명령) 등록
명언 : 현재를 사랑하라.
작가 : 작자미상
2번 명언이 등록되었습니다.
명령) 목록
번호 / 작가 / 명언
----------------------
2 / 작자미상 / 과거에 집착하지 마라.
1 / 작자미상 / 현재를 사랑하라.
명령) 삭제?id=1
1번 명언이 삭제되었습니다.
명령) 삭제?id=1
1번 명언은 존재하지 않습니다.
명령) 수정?id=2
명언(기존) : 과거에 집착하지 마라.
명언 : 현재와 자신을 사랑하라.
작가(기존) : 작자미상
작가 : 홍길동
명령) 목록
번호 / 작가 / 명언
----------------------
2 / 홍길동 / 현재와 자신을 사랑하라.
명령) 빌드
data.json 파일의 내용이 갱신되었습니다.
명령) 종료

profile
초심 잃지 않기

0개의 댓글