[텍스트 게시판] QuotationService 도입

이다혜·2023년 11월 13일
0

Java 텍스트 게시판

목록 보기
16/17

기존 코드의 문제점

명언을 추가, 수정, 삭제하고 목록을 보는 등의 비지니스 로직이 컨트롤러에서 직접 처리되고 있다.

일반적으로 MVC 아키텍처에서는 비즈니스 로직은 서비스(Service) 계층에서 처리되어야 한다.

Service 분리

컨트롤러 -> 사용자의 입력을 처리
서비스 -> 해당 입력에 대한 비즈니스 로직을 수행

QuotationController.java

package com.ll.domain.quotation.quotation.controller;

import com.ll.domain.quotation.quotation.entity.Quotation;
import com.ll.domain.quotation.quotation.service.QuotationService;
import com.ll.global.rq.Rq;

import java.util.Optional;
import java.util.Scanner;

public class QuotationController {
    private final Scanner scanner;
    private final QuotationService quotationService;
    public QuotationController (final Scanner scanner) {
        this.scanner = scanner;
        quotationService = new QuotationService();

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

        quotationService.findAll()
                .stream()
                .filter(quotation -> quotation.getId() == id)
                .findFirst()
                .ifPresentOrElse(
                        quotation -> {
                            quotationService.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);

        Optional<Quotation> quotationOpt = quotationService.findById(id);
        quotationOpt
                .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();

                            quotationService.modify(quotation, author, content);

                            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();

        Quotation quotation = quotationService.write(author, content);

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

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

        quotationService.findAll()
                .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();
        }
    }
}

ControllerService.java

package com.ll.domain.quotation.quotation.service;

import com.ll.domain.quotation.quotation.entity.Quotation;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

public class QuotationService {
    private final List<Quotation> quotations;
    private long lastQuotationId;
    public QuotationService() {
        quotations = new ArrayList<>();
        lastQuotationId = 0;
    }
    public List<Quotation> findAll() {
        return quotations;
    }

    public void remove(Quotation quotation) {
        quotations.remove(quotation);
    }

    public Optional<Quotation> findById(long id) {
        return quotations
                .stream()
                .filter(_quotation -> _quotation.getId() == id)
                .findFirst();
    }

    public void modify(Quotation quotation, String author, String content) {
        quotation.setContent(content);
        quotation.setAuthor(author);
    }

    public Quotation write(String author, String content) {
        final long id = ++lastQuotationId;

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

        return quotation;
    }
}

0개의 댓글