[텍스트 게시판] - QuotationController 도입

이다혜·2023년 10월 29일
0

Java 텍스트 게시판

목록 보기
14/17

파일 구조 변경

기존 코드의 문제점

  1. App의 run() 메서드에 기능들이 몰려있어서 코드를 읽기 불편하다.
  2. App에서 action이 무엇인지에 따라 어떤 함수를 사용할 것인지 직접 꽂아준다.

QuotationController 도입

App.java에 몰려있는 기능들 중 Quotation과 관련된 기능들을 컨트롤러로 분리

dispath() 메소드로 라우팅

action에 따라 어떤 메서드를 실행 할 것인지에 대한 권한을 App이 아닌 Controller에게 넘겨준다.

QuotationController.java

public class QuotationController {
    private final Scanner scanner;
    final List<Quotation> quotations;
    long lastQuotationId;
    
    public QuotationController (final Scanner scanner) {
        this.scanner = scanner;
        quotations = new ArrayList<>();
        lastQuotationId = 0;
    }
    
    public void actionRemove(Rq rq) {
        final long id = rq.getParameterAsLong("id", 0);

        quotations
                .stream()
                .filter(quotation -> quotation.getId() == id)
                .findFirst()
                .ifPresentOrElse(
                        quotation -> {
                            quotations.remove(quotation);
                            System.out.println("%d번 명언이 삭제되었습니다.".formatted(id));
                        },
                        () -> System.out.println("%d번 명언은 존재하지 않습니다.".formatted(id))
                );
}

    public void actionModify(Rq rq) {
        final long id = rq.getParameterAsLong("id", 0);

        quotations
                .stream()
                .filter(_quotation -> _quotation.getId() == id)
                .findFirst()
                .ifPresentOrElse(
                        quotation -> {
                            System.out.println("명언(기존) : %s".formatted(quotation.getContent()));
                            System.out.print("명언 : ");
                            final String content = scanner.nextLine().trim();
                            System.out.println("작가(기존) : %s".formatted(quotation.getAuthor()));
                            System.out.print("작가 : ");
                            final String author = scanner.nextLine().trim();

                            quotation.setContent(content);
                            quotation.setAuthor(author);

                            System.out.println("%d번 명언이 수정되었습니다.".formatted(id));
                        },
                        () -> System.out.println("%d번 명언은 존재하지 않습니다.".formatted(id))
                );
    }

    public void actionWrite() {
        System.out.print("명언 : ");
        final String content = scanner.nextLine().trim();
        System.out.print("작가 : ");
        final String author= scanner.nextLine().trim();

        final long id = ++lastQuotationId;

        Quotation quotation = new Quotation(id, content, author);
        quotations.add(quotation);

        System.out.println("%d번 명언이 등록되었습니다.".formatted(id));
    }

    public void actionShowList() {
        System.out.println("번호 / 작가 / 명언");
        System.out.println("----------------------");

        quotations
                .reversed()
                .forEach(
                        quotation -> System.out.println(
                                "%d / %s / %s".formatted(
                                        quotation.getId(),
                                        quotation.getAuthor(),
                                        quotation.getContent()
                                )
                        )
                );
    }

    public void dispatch(Rq rq) {
        switch(rq.getAction()) {
            case "삭제" -> actionRemove(rq);
            case "수정" -> actionModify(rq);
            case "목록" -> actionShowList();
            case "등록" -> actionWrite();
        }
    }
}

App.java

public class App {
    private final Scanner scanner;

    public App(final Scanner scanner) {
        this.scanner = scanner;

    }

    public void run() {
        System.out.println("== 명언 앱 ==");
        
        final QuotationController quotationController = new QuotationController(scanner);

        while (true) {
            final String cmd = scanner.nextLine().trim();

            final Rq rq = new Rq(cmd);

            switch (rq.getAction()) {
                case "삭제", "수정",  "등록", "목록" -> quotationController.dispatch(rq);
                case "종료" -> {
                    return;
                }
            }
        }
    }


}

0개의 댓글