명언을 추가, 수정, 삭제하고 목록을 보는 등의 비지니스 로직이 컨트롤러에서 직접 처리되고 있다.
일반적으로 MVC 아키텍처에서는 비즈니스 로직은 서비스(Service) 계층에서 처리되어야 한다.
컨트롤러 -> 사용자의 입력을 처리
서비스 -> 해당 입력에 대한 비즈니스 로직을 수행
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();
}
}
}
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;
}
}