From 61ad3c64a756e35e9f70a2c2cfbac02e293cddfe Mon Sep 17 00:00:00 2001 From: parksey Date: Mon, 3 Jul 2023 01:05:46 +0900 Subject: [PATCH 01/26] =?UTF-8?q?refactor:=20VoucherController=EC=9D=98=20?= =?UTF-8?q?=EB=8F=99=EC=9E=91=20=EC=97=AD=ED=95=A0=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/VoucherManageApplication.java | 5 +- .../weekly/VoucherManagementController.java | 63 +++++++++++++++++++ .../weekly/ui/CommandLineApplication.java | 37 ++++++----- .../weekly/ui/exception/InputException.java | 9 +++ ...ReadException.java => InputValidator.java} | 12 ++-- .../weekly/ui/reader/BufferedReaderWrap.java | 10 ++- .../weekly/ui/reader/CommandReader.java | 2 +- .../weekly/weekly/ui/reader/ScannerWrap.java | 4 +- .../weekly/ui/writer/CommandWriter.java | 21 ++++--- .../org/weekly/weekly/util/DiscountType.java | 30 +++++---- .../java/org/weekly/weekly/util/PrintMsg.java | 14 ++--- .../voucher/controller/VoucherController.java | 43 +++---------- .../weekly/voucher/dto/ListResponse.java | 2 +- .../weekly/weekly/voucher/dto/VoucherDto.java | 5 +- .../voucher/dto/VoucherInfoRequest.java | 8 +-- .../dto/request/VoucherCreationRequest.java | 14 +++++ .../voucher/service/VoucherService.java | 3 +- src/main/resources/logback.xml | 2 +- .../weekly/weekly/ui/ReadExceptionTest.java | 4 +- 19 files changed, 179 insertions(+), 109 deletions(-) create mode 100644 src/main/java/org/weekly/weekly/VoucherManagementController.java create mode 100644 src/main/java/org/weekly/weekly/ui/exception/InputException.java rename src/main/java/org/weekly/weekly/ui/exception/{ReadException.java => InputValidator.java} (65%) create mode 100644 src/main/java/org/weekly/weekly/voucher/dto/request/VoucherCreationRequest.java diff --git a/src/main/java/org/weekly/weekly/VoucherManageApplication.java b/src/main/java/org/weekly/weekly/VoucherManageApplication.java index fad07c1435..4c5478301d 100644 --- a/src/main/java/org/weekly/weekly/VoucherManageApplication.java +++ b/src/main/java/org/weekly/weekly/VoucherManageApplication.java @@ -3,14 +3,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; -import org.weekly.weekly.voucher.controller.VoucherController; @SpringBootApplication public class VoucherManageApplication { - public static void main(String[] args) { ApplicationContext context = SpringApplication.run(VoucherManageApplication.class, args); - context.getBean(VoucherController.class).start(); + context.getBean(VoucherManagementController.class).start(); } - } \ No newline at end of file diff --git a/src/main/java/org/weekly/weekly/VoucherManagementController.java b/src/main/java/org/weekly/weekly/VoucherManagementController.java new file mode 100644 index 0000000000..20420d9bbe --- /dev/null +++ b/src/main/java/org/weekly/weekly/VoucherManagementController.java @@ -0,0 +1,63 @@ +package org.weekly.weekly; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.weekly.weekly.ui.CommandLineApplication; +import org.weekly.weekly.util.PrintMsg; +import org.weekly.weekly.util.VoucherMenu; +import org.weekly.weekly.voucher.controller.VoucherController; +import org.weekly.weekly.voucher.dto.Response; +import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; + +@Component +public class VoucherManagementController { + private final Logger logger = LoggerFactory.getLogger(VoucherManagementController.class); + private final CommandLineApplication commandLineApplication; + private final VoucherController voucherController; + + public VoucherManagementController(CommandLineApplication commandLineApplication, VoucherController voucherController) { + this.commandLineApplication = commandLineApplication; + this.voucherController = voucherController; + } + + public void start() { + boolean isExit = false; + + while(!isExit) { + try { + VoucherMenu voucherMenu = this.commandLineApplication.readMenu(); + isExit = processMenuSelection(voucherMenu); + } catch (RuntimeException runtimeException) { + this.commandLineApplication.printErrorMsg(runtimeException.getMessage()); + } + } + } + + private boolean processMenuSelection(VoucherMenu selectMenu) { + if (VoucherMenu.CREATE.equals(selectMenu)) { + handleVoucherCreation(); + return false; + } + + if (VoucherMenu.LIST.equals(selectMenu)) { + handleVoucherSearch(); + return false; + } + + return false; + } + + private void handleVoucherCreation() { + VoucherCreationRequest voucherCreationRequest = this.commandLineApplication.createVoucherFromInput(); + Response response = voucherController.createVoucher(voucherCreationRequest); + logger.info("{}{}", PrintMsg.CREATE_VOUCHER_SUCCESS.getMessage(),response.getResult()); + this.commandLineApplication.printResult(response); + } + + private void handleVoucherSearch() { + Response response = voucherController.getVouchers(); + logger.info("{}{}",PrintMsg.FIND_ALL_VOUCHER_SUCCESS.getMessage(), response.getResult()); + this.commandLineApplication.printResult(response); + } +} diff --git a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java index 9ec07581dd..4cac10b269 100644 --- a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java +++ b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java @@ -2,17 +2,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.weekly.weekly.ui.exception.InputValidator; import org.weekly.weekly.ui.reader.CommandReader; import org.weekly.weekly.ui.writer.CommandWriter; import org.weekly.weekly.util.DiscountType; import org.weekly.weekly.util.VoucherMenu; -import org.weekly.weekly.voucher.domain.Discount; -import org.weekly.weekly.voucher.dto.VoucherDto; import org.weekly.weekly.voucher.dto.Response; import org.weekly.weekly.voucher.dto.VoucherInfoRequest; - -import java.time.LocalDate; -import java.util.UUID; +import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; @Component public class CommandLineApplication { @@ -29,19 +26,19 @@ public VoucherMenu readMenu() { while(true) { try { this.commandWriter.printVoucherProgram(); - return VoucherMenu.getMenu(this.commandReader.readLine()); + return VoucherMenu.getMenu(readUserInput()); } catch (Exception exception) { printErrorMsg(exception.getMessage()); } } } - public VoucherDto readVoucher() { + public VoucherCreationRequest createVoucherFromInput() { while(true) { try { - Discount discount = readDiscount(); - VoucherInfoRequest voucherInfoRequest = readVoucherInfo(); - return VoucherDto.parseDto(UUID.randomUUID(), voucherInfoRequest, discount, LocalDate.now()); + DiscountType discountType = readDiscountType(); + VoucherInfoRequest voucherInfoRequest = readVoucherInfo(discountType); + return new VoucherCreationRequest(voucherInfoRequest, discountType); } catch (Exception exception) { printErrorMsg(exception.getMessage()); } @@ -56,14 +53,24 @@ public void printResult(Response response) { this.commandWriter.printReuslt(response.getResult()); } - private Discount readDiscount() throws Exception { + + private String readUserInput() { + String userInput = this.commandReader.readLine(); + InputValidator.isEmpty(userInput); + return userInput; + } + + + private DiscountType readDiscountType() { this.commandWriter.printSelectDiscount(); - return DiscountType.getDiscountMap(this.commandReader.readLine()).getNewInstance(); + String no = readUserInput(); + return DiscountType.getDiscountTypeByNumber(no); } - private VoucherInfoRequest readVoucherInfo() throws Exception { - this.commandWriter.printCreateVoucher(); - return VoucherInfoRequest.of(this.commandReader.readLine()); + private VoucherInfoRequest readVoucherInfo(DiscountType discountType){ + this.commandWriter.printCreateVoucher(discountType); + String voucherInfo = readUserInput(); + return VoucherInfoRequest.of(voucherInfo); } diff --git a/src/main/java/org/weekly/weekly/ui/exception/InputException.java b/src/main/java/org/weekly/weekly/ui/exception/InputException.java new file mode 100644 index 0000000000..cecfae6f61 --- /dev/null +++ b/src/main/java/org/weekly/weekly/ui/exception/InputException.java @@ -0,0 +1,9 @@ +package org.weekly.weekly.ui.exception; + +import org.weekly.weekly.util.ExceptionMsg; + +public class InputException extends RuntimeException{ + public InputException(ExceptionMsg exception) { + super(exception.getMsg()); + } +} diff --git a/src/main/java/org/weekly/weekly/ui/exception/ReadException.java b/src/main/java/org/weekly/weekly/ui/exception/InputValidator.java similarity index 65% rename from src/main/java/org/weekly/weekly/ui/exception/ReadException.java rename to src/main/java/org/weekly/weekly/ui/exception/InputValidator.java index 9ea5e87e53..56c467bcd1 100644 --- a/src/main/java/org/weekly/weekly/ui/exception/ReadException.java +++ b/src/main/java/org/weekly/weekly/ui/exception/InputValidator.java @@ -4,8 +4,8 @@ import java.util.Arrays; -public class ReadException { - +public class InputValidator { + private static final int VOUCHER_INPUT_SIZE = 2; public static void isEmpty(String userInput) { if (userInput == null || userInput.isBlank()) { throw new RuntimeException(ExceptionMsg.EMPTY.getMsg()); @@ -13,15 +13,15 @@ public static void isEmpty(String userInput) { } public static void notVoucherInputSize(String[] userInputs) { - if (userInputs.length != 2) { - throw new RuntimeException(ExceptionMsg.NOT_SAME_PARAM_SIZE.getMsg()); + if (userInputs.length != VOUCHER_INPUT_SIZE) { + throw new InputException(ExceptionMsg.NOT_SAME_PARAM_SIZE); } } - public static void notVoucherInputFormat(String[] userInputs) { + public static void notVoucherInfoFormat(String[] userInputs) { if (Arrays.stream(userInputs) .anyMatch(input -> isDigit(input.trim()))) { - throw new RuntimeException(ExceptionMsg.NOT_INPUT_FORMAT.getMsg()); + throw new InputException(ExceptionMsg.NOT_INPUT_FORMAT); } } diff --git a/src/main/java/org/weekly/weekly/ui/reader/BufferedReaderWrap.java b/src/main/java/org/weekly/weekly/ui/reader/BufferedReaderWrap.java index a904e8262b..09de91e959 100644 --- a/src/main/java/org/weekly/weekly/ui/reader/BufferedReaderWrap.java +++ b/src/main/java/org/weekly/weekly/ui/reader/BufferedReaderWrap.java @@ -1,6 +1,8 @@ package org.weekly.weekly.ui.reader; import org.springframework.stereotype.Component; +import org.weekly.weekly.ui.exception.InputException; +import org.weekly.weekly.util.ExceptionMsg; import java.io.BufferedReader; import java.io.IOException; @@ -15,7 +17,11 @@ public BufferedReaderWrap() { } @Override - public String readLine() throws IOException { - return this.bufferedReader.readLine(); + public String readLine(){ + try { + return this.bufferedReader.readLine(); + } catch (IOException exception) { + throw new InputException(ExceptionMsg.NOT_INPUT_FORMAT); + } } } diff --git a/src/main/java/org/weekly/weekly/ui/reader/CommandReader.java b/src/main/java/org/weekly/weekly/ui/reader/CommandReader.java index d9954851d3..9ba5cf6055 100644 --- a/src/main/java/org/weekly/weekly/ui/reader/CommandReader.java +++ b/src/main/java/org/weekly/weekly/ui/reader/CommandReader.java @@ -3,5 +3,5 @@ import java.io.IOException; public interface CommandReader { - String readLine() throws IOException; + String readLine(); } diff --git a/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java b/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java index a3629575ac..17c350ba08 100644 --- a/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java +++ b/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java @@ -2,7 +2,7 @@ import org.springframework.context.annotation.Primary; import org.springframework.stereotype.Component; -import org.weekly.weekly.ui.exception.ReadException; +import org.weekly.weekly.ui.exception.InputValidator; import java.util.Scanner; @@ -23,6 +23,6 @@ public String readLine() { } private void checkException(String userInput) { - ReadException.isEmpty(userInput); + InputValidator.isEmpty(userInput); } } diff --git a/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java b/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java index a31d25cfce..40191e5df4 100644 --- a/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java +++ b/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java @@ -18,32 +18,33 @@ private void println(String msg) { private void print(String msg) {System.out.print(msg);} public void printVoucherProgram() { - println(PrintMsg.EMPTY.getMsg()); - println(PrintMsg.PROGRAM.getMsg()); + println(PrintMsg.EMPTY.getMessage()); + println(PrintMsg.PROGRAM.getMessage()); Arrays.stream(VoucherMenu.values()) .forEach(voucherMenu -> System.out.println(voucherMenu.getPrintMsg())); } public void printErrorMsg(String errorMsg) { logger.warn(errorMsg); - println(PrintMsg.EMPTY.getMsg()); + println(PrintMsg.EMPTY.getMessage()); println(errorMsg); } - public void printCreateVoucher() { - println(PrintMsg.EMPTY.getMsg()); - print(PrintMsg.CREATE_VOUCHER.getMsg()); + public void printCreateVoucher(DiscountType discountType) { + println(PrintMsg.EMPTY.getMessage()); + println(PrintMsg.CREATE_VOUCHER.getMessage() + discountType.getInputExampleMessage()); + print(PrintMsg.INPUT_MESSAGE.getMessage()); } public void printSelectDiscount() { - println(PrintMsg.EMPTY.getMsg()); - println(PrintMsg.DISCOUNT_SELECT.getMsg()); + println(PrintMsg.EMPTY.getMessage()); + println(PrintMsg.DISCOUNT_SELECT.getMessage()); Arrays.stream(DiscountType.values()) - .forEach(discountMap -> System.out.println(discountMap.getMsg())); + .forEach(discountMap -> System.out.println(discountMap.getSelectMessage())); } public void printReuslt(String result) { - println(PrintMsg.EMPTY.getMsg()); + println(PrintMsg.EMPTY.getMessage()); println(result); } } diff --git a/src/main/java/org/weekly/weekly/util/DiscountType.java b/src/main/java/org/weekly/weekly/util/DiscountType.java index 367a4aa851..eb5b8f1396 100644 --- a/src/main/java/org/weekly/weekly/util/DiscountType.java +++ b/src/main/java/org/weekly/weekly/util/DiscountType.java @@ -9,32 +9,34 @@ import java.util.Map; public enum DiscountType { - FIXED("1", FixedDiscount.class, "1. Fixed Discount"), - PERCENT("2", PercentDiscount.class, "2. Percent Discount"); + FIXED("1", FixedDiscount.class, "1. Fixed Discount", "바우처 할인 금액, 바우처 유효 개월 수"), + PERCENT("2", PercentDiscount.class, "2. Percent Discount", "0~100사이의 바우처 할인율, 바우처 유효 개월 수"); private String no; private Class cls; - private String msg; + private String selectMessage; + private String inputExampleMessage; - private static final Map discuontMap; + private static final Map discuontTypeMap; static { Map map = new HashMap<>(); for (DiscountType discount : DiscountType.values()) { map.put(discount.no, discount); } - discuontMap = Collections.unmodifiableMap(map); + discuontTypeMap = Collections.unmodifiableMap(map); } - DiscountType(String no, Class cls, String msg) { + DiscountType(String no, Class cls, String msg, String exMessage) { this.no = no; this.cls = cls; - this.msg = msg; + this.selectMessage = msg; + this.inputExampleMessage = exMessage; } - public static DiscountType getDiscountMap(String no) { - if (discuontMap.containsKey(no)) { - return discuontMap.get(no); + public static DiscountType getDiscountTypeByNumber(String no) { + if (discuontTypeMap.containsKey(no)) { + return discuontTypeMap.get(no); } throw new RuntimeException(ExceptionMsg.NOT_DISCOUNT.getMsg()); } @@ -47,7 +49,11 @@ public Class getCls() { return cls; } - public String getMsg() { - return msg; + public String getSelectMessage() { + return selectMessage; + } + + public String getInputExampleMessage() { + return inputExampleMessage; } } diff --git a/src/main/java/org/weekly/weekly/util/PrintMsg.java b/src/main/java/org/weekly/weekly/util/PrintMsg.java index a89c6bbbae..18579049f0 100644 --- a/src/main/java/org/weekly/weekly/util/PrintMsg.java +++ b/src/main/java/org/weekly/weekly/util/PrintMsg.java @@ -3,23 +3,21 @@ public enum PrintMsg { PROGRAM("=== Voucher Program ==="), CREATE_VOUCHER("바우처를 생성합니다.\n" + - "입력 예시\n" + - " 1. 고정: 바우처 할인 금액,바우처 유효 개월 수\n" + - " 2. 퍼센트: 바우처 퍼센트(0~100으로만), 바우처 유효 개월 수\n" + - "(,)콤마를 기준으로 입력하세요 :"), + "입력예시 => "), + INPUT_MESSAGE("입력하세요: "), DISCOUNT_SELECT("할인 종류중 하나를 선택하세요"), NO_VOUCHER_DATAS("저장소에 데이터가 없습니다."), EMPTY(""), CREATE_VOUCHER_SUCCESS("[바우처 생성에 성공]: "), FIND_ALL_VOUCHER_SUCCESS("[모든 바우처 조회 성공]: "); - private String msg; + private String message; PrintMsg(String msg) { - this.msg = msg; + this.message = msg; } - public String getMsg() { - return msg; + public String getMessage() { + return message; } } diff --git a/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java b/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java index f1c148a667..87208ad449 100644 --- a/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java +++ b/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java @@ -3,60 +3,31 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; -import org.weekly.weekly.ui.CommandLineApplication; import org.weekly.weekly.util.PrintMsg; -import org.weekly.weekly.util.VoucherMenu; import org.weekly.weekly.voucher.dto.VoucherDto; import org.weekly.weekly.voucher.dto.Response; +import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; import org.weekly.weekly.voucher.service.VoucherService; @Controller public class VoucherController { private final Logger logger = LoggerFactory.getLogger(VoucherController.class); private final VoucherService voucherService; - private final CommandLineApplication commandLineApplication; - public VoucherController(VoucherService voucherService, CommandLineApplication commandLineApplication) { - this.voucherService = voucherService; - this.commandLineApplication = commandLineApplication; - } - public void start() { - boolean isStop = false; - - while(!isStop) { - try { - isStop = selectMenu(this.commandLineApplication.readMenu()); - } catch (RuntimeException runtimeException) { - this.commandLineApplication.printErrorMsg(runtimeException.getMessage()); - } - } + public VoucherController(VoucherService voucherService) { + this.voucherService = voucherService; } - private boolean selectMenu(VoucherMenu voucherMenu) { - if (VoucherMenu.CREATE.equals(voucherMenu)) { - createVoucher(); - return false; - } - - if (VoucherMenu.LIST.equals(voucherMenu)) { - getList(); - return false; - } - - return true; - } - private void createVoucher() { - VoucherDto voucherDto = this.commandLineApplication.readVoucher(); - Response response = this.voucherService.insertVoucher(voucherDto); - logger.info("{}{}",PrintMsg.CREATE_VOUCHER_SUCCESS.getMsg(),response.getResult()); + public Response createVoucher(VoucherCreationRequest voucherCreationRequest) { + Response response = this.voucherService.insertVoucher(voucherCreationRequest); this.commandLineApplication.printResult(response); } - private void getList() { + public Response getVouchers() { Response response = this.voucherService.getVouchers(); - logger.info("{}{}",PrintMsg.FIND_ALL_VOUCHER_SUCCESS.getMsg()); + logger.info("{}{}",PrintMsg.FIND_ALL_VOUCHER_SUCCESS.getMessage()); this.commandLineApplication.printResult(response); } } diff --git a/src/main/java/org/weekly/weekly/voucher/dto/ListResponse.java b/src/main/java/org/weekly/weekly/voucher/dto/ListResponse.java index b2a5f08aff..1fad95ccbf 100644 --- a/src/main/java/org/weekly/weekly/voucher/dto/ListResponse.java +++ b/src/main/java/org/weekly/weekly/voucher/dto/ListResponse.java @@ -17,7 +17,7 @@ public ListResponse(List vouchers) { public String getResult() { if (result.isEmpty()) { - return PrintMsg.NO_VOUCHER_DATAS.getMsg(); + return PrintMsg.NO_VOUCHER_DATAS.getMessage(); } StringBuilder sb = new StringBuilder(); diff --git a/src/main/java/org/weekly/weekly/voucher/dto/VoucherDto.java b/src/main/java/org/weekly/weekly/voucher/dto/VoucherDto.java index 1b12a70f30..9ca0922252 100644 --- a/src/main/java/org/weekly/weekly/voucher/dto/VoucherDto.java +++ b/src/main/java/org/weekly/weekly/voucher/dto/VoucherDto.java @@ -26,8 +26,8 @@ private VoucherDto(UUID voucherId, long amount, LocalDate registrationDate, Loca this.discount = discount; } - public static VoucherDto parseDto(UUID voucherId, VoucherInfoRequest voucherInfoRequest, Discount discount, LocalDate registrationDate) { - checkException(voucherInfoRequest, registrationDate, discount); + public static VoucherDto parseDto(VoucherInfoRequest voucherInfoRequest, Discount discount) { + checkException(voucherInfoRequest, discount); return new VoucherDto(voucherId , Long.parseLong(voucherInfoRequest.getAmount()) , registrationDate @@ -44,7 +44,6 @@ private static void checkException(VoucherInfoRequest voucherInfoRequest, LocalD return; } VoucherException.notNumberFormat(voucherInfoRequest.getAmount(), input -> Long.parseLong(input) < RANGE_START); - } public Voucher parseToVoucher() { diff --git a/src/main/java/org/weekly/weekly/voucher/dto/VoucherInfoRequest.java b/src/main/java/org/weekly/weekly/voucher/dto/VoucherInfoRequest.java index b4401d7a97..a2b1cfb649 100644 --- a/src/main/java/org/weekly/weekly/voucher/dto/VoucherInfoRequest.java +++ b/src/main/java/org/weekly/weekly/voucher/dto/VoucherInfoRequest.java @@ -1,6 +1,6 @@ package org.weekly.weekly.voucher.dto; -import org.weekly.weekly.ui.exception.ReadException; +import org.weekly.weekly.ui.exception.InputValidator; public class VoucherInfoRequest { private static final String SPLIT_FORMAT = ","; @@ -32,9 +32,7 @@ public String getExpiration() { } private static void checkReadVoucherException(String[] inputs) { - ReadException.notVoucherInputSize(inputs); - ReadException.notVoucherInputFormat(inputs); + InputValidator.notVoucherInputSize(inputs); + InputValidator.notVoucherInfoFormat(inputs); } - - } diff --git a/src/main/java/org/weekly/weekly/voucher/dto/request/VoucherCreationRequest.java b/src/main/java/org/weekly/weekly/voucher/dto/request/VoucherCreationRequest.java new file mode 100644 index 0000000000..1492912b38 --- /dev/null +++ b/src/main/java/org/weekly/weekly/voucher/dto/request/VoucherCreationRequest.java @@ -0,0 +1,14 @@ +package org.weekly.weekly.voucher.dto.request; + +import org.weekly.weekly.util.DiscountType; +import org.weekly.weekly.voucher.dto.VoucherInfoRequest; + +public class VoucherCreationRequest { + private final VoucherInfoRequest voucherInfoRequest; + private final DiscountType discountType; + + public VoucherCreationRequest(VoucherInfoRequest voucherInfoRequest, DiscountType discountType) { + this.voucherInfoRequest = voucherInfoRequest; + this.discountType = discountType; + } +} diff --git a/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java b/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java index e1893b22a1..e2c443da80 100644 --- a/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java +++ b/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java @@ -6,6 +6,7 @@ import org.weekly.weekly.voucher.dto.VoucherDto; import org.weekly.weekly.voucher.dto.CreateResponse; import org.weekly.weekly.voucher.dto.ListResponse; +import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; import org.weekly.weekly.voucher.repository.VoucherRepository; import java.util.List; @@ -19,7 +20,7 @@ public VoucherService(VoucherRepository voucherRepository) { this.voucherRepository = voucherRepository; } - public CreateResponse insertVoucher(VoucherDto voucherDto) { + public CreateResponse insertVoucher(VoucherCreationRequest voucherCreationRequest) { validateVoucher(voucherDto); Voucher voucher = voucherDto.parseToVoucher(); this.voucherRepository.insert(voucher); diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index c28bb18107..41b5312d80 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -18,4 +18,4 @@ - \ No newline at end of file + diff --git a/src/test/java/org/weekly/weekly/ui/ReadExceptionTest.java b/src/test/java/org/weekly/weekly/ui/ReadExceptionTest.java index 27020b2670..ec1ee12655 100644 --- a/src/test/java/org/weekly/weekly/ui/ReadExceptionTest.java +++ b/src/test/java/org/weekly/weekly/ui/ReadExceptionTest.java @@ -2,7 +2,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; -import org.weekly.weekly.ui.exception.ReadException; +import org.weekly.weekly.ui.exception.InputValidator; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -10,7 +10,7 @@ public class ReadExceptionTest { @ParameterizedTest @ValueSource(strings = {"", " "}) void 사용자가_빈값이나_입력오류났을때_예외발생(String userInput) { - assertThatThrownBy(()-> ReadException.isEmpty(userInput)) + assertThatThrownBy(()-> InputValidator.isEmpty(userInput)) .isInstanceOf(RuntimeException.class); } } From 21a8a67bbff484ab73d66c30e99404b0f6fbe047 Mon Sep 17 00:00:00 2001 From: parksey Date: Mon, 3 Jul 2023 04:33:38 +0900 Subject: [PATCH 02/26] =?UTF-8?q?refactor:=20voucher=20=EC=83=9D=EC=84=B1?= =?UTF-8?q?=20=EB=B0=8F=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC=20=EC=B1=85?= =?UTF-8?q?=EC=9E=84=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/ui/CommandLineApplication.java | 4 +- .../weekly/ui/exception/InputValidator.java | 2 +- .../weekly/ui/writer/CommandWriter.java | 2 +- .../org/weekly/weekly/util/ExceptionMsg.java | 1 + .../voucher/controller/VoucherController.java | 3 +- .../weekly/voucher/domain/Discount.java | 2 - .../domain}/DiscountType.java | 6 +- .../weekly/voucher/domain/FixedDiscount.java | 2 - .../voucher/domain/PercentDiscount.java | 2 - .../weekly/weekly/voucher/domain/Voucher.java | 21 +++++++ .../weekly/weekly/voucher/dto/VoucherDto.java | 56 ------------------- .../dto/request/VoucherCreationRequest.java | 16 +++++- .../dto/{ => request}/VoucherInfoRequest.java | 18 +++--- .../voucher/exception/VoucherException.java | 36 ++---------- .../voucher/exception/VoucherValidator.java | 38 +++++++++++++ .../voucher/service/VoucherService.java | 11 ++-- .../weekly/weekly/util/DiscountMapTest.java | 1 + .../weekly/weekly/voucher/VoucherTest.java | 5 +- 18 files changed, 105 insertions(+), 121 deletions(-) rename src/main/java/org/weekly/weekly/{util => voucher/domain}/DiscountType.java (89%) delete mode 100644 src/main/java/org/weekly/weekly/voucher/dto/VoucherDto.java rename src/main/java/org/weekly/weekly/voucher/dto/{ => request}/VoucherInfoRequest.java (60%) create mode 100644 src/main/java/org/weekly/weekly/voucher/exception/VoucherValidator.java diff --git a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java index 4cac10b269..983f28ac94 100644 --- a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java +++ b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java @@ -5,10 +5,10 @@ import org.weekly.weekly.ui.exception.InputValidator; import org.weekly.weekly.ui.reader.CommandReader; import org.weekly.weekly.ui.writer.CommandWriter; -import org.weekly.weekly.util.DiscountType; +import org.weekly.weekly.voucher.domain.DiscountType; import org.weekly.weekly.util.VoucherMenu; import org.weekly.weekly.voucher.dto.Response; -import org.weekly.weekly.voucher.dto.VoucherInfoRequest; +import org.weekly.weekly.voucher.dto.request.VoucherInfoRequest; import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; @Component diff --git a/src/main/java/org/weekly/weekly/ui/exception/InputValidator.java b/src/main/java/org/weekly/weekly/ui/exception/InputValidator.java index 56c467bcd1..696639f7d5 100644 --- a/src/main/java/org/weekly/weekly/ui/exception/InputValidator.java +++ b/src/main/java/org/weekly/weekly/ui/exception/InputValidator.java @@ -18,7 +18,7 @@ public static void notVoucherInputSize(String[] userInputs) { } } - public static void notVoucherInfoFormat(String[] userInputs) { + public static void notNumber(String[] userInputs) { if (Arrays.stream(userInputs) .anyMatch(input -> isDigit(input.trim()))) { throw new InputException(ExceptionMsg.NOT_INPUT_FORMAT); diff --git a/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java b/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java index 40191e5df4..07225bfc5a 100644 --- a/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java +++ b/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java @@ -3,7 +3,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; -import org.weekly.weekly.util.DiscountType; +import org.weekly.weekly.voucher.domain.DiscountType; import org.weekly.weekly.util.PrintMsg; import org.weekly.weekly.util.VoucherMenu; diff --git a/src/main/java/org/weekly/weekly/util/ExceptionMsg.java b/src/main/java/org/weekly/weekly/util/ExceptionMsg.java index 0bbbb47ea6..c8a4b7da7d 100644 --- a/src/main/java/org/weekly/weekly/util/ExceptionMsg.java +++ b/src/main/java/org/weekly/weekly/util/ExceptionMsg.java @@ -2,6 +2,7 @@ public enum ExceptionMsg { ERROR("[ERROR]: "), + UTIL_CLASS("유틸 클래스입니다."), EMPTY("사용자가 아무 값도 입력하지 않았습니다."), NOT_INPUT_FORMAT("입력 형식에 맞지 않습니다."), NOT_MENU("해당 메뉴는 존재하지 않습니다."), diff --git a/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java b/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java index 87208ad449..732fa2a15a 100644 --- a/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java +++ b/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java @@ -4,7 +4,6 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; import org.weekly.weekly.util.PrintMsg; -import org.weekly.weekly.voucher.dto.VoucherDto; import org.weekly.weekly.voucher.dto.Response; import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; import org.weekly.weekly.voucher.service.VoucherService; @@ -21,7 +20,7 @@ public VoucherController(VoucherService voucherService) { public Response createVoucher(VoucherCreationRequest voucherCreationRequest) { - Response response = this.voucherService.insertVoucher(voucherCreationRequest); + this.voucherService.insertVoucher(voucherCreationRequest); this.commandLineApplication.printResult(response); } diff --git a/src/main/java/org/weekly/weekly/voucher/domain/Discount.java b/src/main/java/org/weekly/weekly/voucher/domain/Discount.java index d823a44342..c7dc3708a2 100644 --- a/src/main/java/org/weekly/weekly/voucher/domain/Discount.java +++ b/src/main/java/org/weekly/weekly/voucher/domain/Discount.java @@ -1,7 +1,5 @@ package org.weekly.weekly.voucher.domain; -import org.weekly.weekly.util.DiscountType; - public interface Discount { long applyDiscount(long beforeAmount, long discountAmount); DiscountType discountType(); diff --git a/src/main/java/org/weekly/weekly/util/DiscountType.java b/src/main/java/org/weekly/weekly/voucher/domain/DiscountType.java similarity index 89% rename from src/main/java/org/weekly/weekly/util/DiscountType.java rename to src/main/java/org/weekly/weekly/voucher/domain/DiscountType.java index eb5b8f1396..f4d59f6d74 100644 --- a/src/main/java/org/weekly/weekly/util/DiscountType.java +++ b/src/main/java/org/weekly/weekly/voucher/domain/DiscountType.java @@ -1,8 +1,6 @@ -package org.weekly.weekly.util; +package org.weekly.weekly.voucher.domain; -import org.weekly.weekly.voucher.domain.Discount; -import org.weekly.weekly.voucher.domain.FixedDiscount; -import org.weekly.weekly.voucher.domain.PercentDiscount; +import org.weekly.weekly.util.ExceptionMsg; import java.util.Collections; import java.util.HashMap; diff --git a/src/main/java/org/weekly/weekly/voucher/domain/FixedDiscount.java b/src/main/java/org/weekly/weekly/voucher/domain/FixedDiscount.java index 9dcf21e072..b8621eb46f 100644 --- a/src/main/java/org/weekly/weekly/voucher/domain/FixedDiscount.java +++ b/src/main/java/org/weekly/weekly/voucher/domain/FixedDiscount.java @@ -1,7 +1,5 @@ package org.weekly.weekly.voucher.domain; -import org.weekly.weekly.util.DiscountType; - public class FixedDiscount implements Discount{ @Override public long applyDiscount(long beforeAmount, long discountAmount) { diff --git a/src/main/java/org/weekly/weekly/voucher/domain/PercentDiscount.java b/src/main/java/org/weekly/weekly/voucher/domain/PercentDiscount.java index d368157df3..8670ab08ca 100644 --- a/src/main/java/org/weekly/weekly/voucher/domain/PercentDiscount.java +++ b/src/main/java/org/weekly/weekly/voucher/domain/PercentDiscount.java @@ -1,7 +1,5 @@ package org.weekly.weekly.voucher.domain; -import org.weekly.weekly.util.DiscountType; - public class PercentDiscount implements Discount{ private final int PERCENT = 100; @Override diff --git a/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java b/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java index 22be047c67..b2f1c0829b 100644 --- a/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java +++ b/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java @@ -1,5 +1,9 @@ package org.weekly.weekly.voucher.domain; +import org.weekly.weekly.util.ExceptionMsg; +import org.weekly.weekly.voucher.exception.VoucherException; +import org.weekly.weekly.voucher.exception.VoucherValidator; + import java.text.MessageFormat; import java.time.LocalDate; import java.util.UUID; @@ -23,6 +27,21 @@ public Voucher(UUID voucherId, long amount, LocalDate registrationDate, LocalDat this.discount = discount; } + public static Voucher of(UUID id, long amount, LocalDate now, long expiration, DiscountType discountType) { + validation(now, expiration, discountType, amount); + + try { + return new Voucher(id, amount, now, now.plusMonths(expiration), discountType.getNewInstance()); + } catch (Exception exception) { + throw new VoucherException(ExceptionMsg.NOT_FOUND); + } + } + + private static void validation(LocalDate registrationDate, long expiration, DiscountType discountType, long amount) { + VoucherValidator.validateExpiration(registrationDate, expiration); + VoucherValidator.validateAmount(discountType, amount); + } + public UUID getVoucherId() { return voucherId; } @@ -42,4 +61,6 @@ public long applyDiscount(long beforeAmount) { public String toString() { return MessageFormat.format("[ID: {0}, 금액: {1}, 등록일자: {2}, 유효기간: {3}]", voucherId,amount, registrationDate, expirationDate); } + + } diff --git a/src/main/java/org/weekly/weekly/voucher/dto/VoucherDto.java b/src/main/java/org/weekly/weekly/voucher/dto/VoucherDto.java deleted file mode 100644 index 9ca0922252..0000000000 --- a/src/main/java/org/weekly/weekly/voucher/dto/VoucherDto.java +++ /dev/null @@ -1,56 +0,0 @@ -package org.weekly.weekly.voucher.dto; - -import org.weekly.weekly.util.DiscountType; -import org.weekly.weekly.voucher.domain.Discount; -import org.weekly.weekly.voucher.domain.Voucher; -import org.weekly.weekly.voucher.exception.VoucherException; - -import java.time.LocalDate; -import java.util.UUID; - -public class VoucherDto { - private static final int RANGE_START = 0; - private static final int RANGE_END = 100; - - private final UUID voucherId; - private final long amount; - private final LocalDate registrationDate; - private final LocalDate expirationDate; - private final Discount discount; - - private VoucherDto(UUID voucherId, long amount, LocalDate registrationDate, LocalDate expirationDate, Discount discount) { - this.voucherId = voucherId; - this.amount = amount; - this.registrationDate = registrationDate; - this.expirationDate = expirationDate; - this.discount = discount; - } - - public static VoucherDto parseDto(VoucherInfoRequest voucherInfoRequest, Discount discount) { - checkException(voucherInfoRequest, discount); - return new VoucherDto(voucherId - , Long.parseLong(voucherInfoRequest.getAmount()) - , registrationDate - , registrationDate.plusMonths(Long.parseLong(voucherInfoRequest.getExpiration())) - , discount); - } - - private static void checkException(VoucherInfoRequest voucherInfoRequest, LocalDate registrationDate, Discount discount) { - VoucherException.expirationError(registrationDate, voucherInfoRequest.getExpiration()); - VoucherException.notNumberFormat(voucherInfoRequest.getExpiration(), input -> Long.parseLong(input) <= RANGE_START); - - if (discount.getClass().equals(DiscountType.PERCENT.getCls())) { - VoucherException.notNumberFormat(voucherInfoRequest.getAmount(), input -> Long.parseLong(input) < RANGE_START || Long.parseLong(input) > RANGE_END); - return; - } - VoucherException.notNumberFormat(voucherInfoRequest.getAmount(), input -> Long.parseLong(input) < RANGE_START); - } - - public Voucher parseToVoucher() { - return new Voucher(this.voucherId, this.amount, this.registrationDate, this.expirationDate, this.discount); - } - - public UUID getVoucherId() { - return voucherId; - } -} \ No newline at end of file diff --git a/src/main/java/org/weekly/weekly/voucher/dto/request/VoucherCreationRequest.java b/src/main/java/org/weekly/weekly/voucher/dto/request/VoucherCreationRequest.java index 1492912b38..6f09ff3440 100644 --- a/src/main/java/org/weekly/weekly/voucher/dto/request/VoucherCreationRequest.java +++ b/src/main/java/org/weekly/weekly/voucher/dto/request/VoucherCreationRequest.java @@ -1,7 +1,11 @@ package org.weekly.weekly.voucher.dto.request; -import org.weekly.weekly.util.DiscountType; -import org.weekly.weekly.voucher.dto.VoucherInfoRequest; +import org.weekly.weekly.voucher.domain.DiscountType; +import org.weekly.weekly.voucher.domain.Voucher; +import org.weekly.weekly.voucher.exception.VoucherException; + +import java.time.LocalDate; +import java.util.UUID; public class VoucherCreationRequest { private final VoucherInfoRequest voucherInfoRequest; @@ -11,4 +15,12 @@ public VoucherCreationRequest(VoucherInfoRequest voucherInfoRequest, DiscountTyp this.voucherInfoRequest = voucherInfoRequest; this.discountType = discountType; } + + public Voucher toVoucher() { + UUID id = UUID.randomUUID(); + long amount = voucherInfoRequest.getAmount(); + LocalDate now = LocalDate.now(); + return Voucher.of(id, amount, now, voucherInfoRequest.getExpiration(), discountType); + } + } diff --git a/src/main/java/org/weekly/weekly/voucher/dto/VoucherInfoRequest.java b/src/main/java/org/weekly/weekly/voucher/dto/request/VoucherInfoRequest.java similarity index 60% rename from src/main/java/org/weekly/weekly/voucher/dto/VoucherInfoRequest.java rename to src/main/java/org/weekly/weekly/voucher/dto/request/VoucherInfoRequest.java index a2b1cfb649..3aecb596c7 100644 --- a/src/main/java/org/weekly/weekly/voucher/dto/VoucherInfoRequest.java +++ b/src/main/java/org/weekly/weekly/voucher/dto/request/VoucherInfoRequest.java @@ -1,4 +1,4 @@ -package org.weekly.weekly.voucher.dto; +package org.weekly.weekly.voucher.dto.request; import org.weekly.weekly.ui.exception.InputValidator; @@ -7,11 +7,11 @@ public class VoucherInfoRequest { private static final int AMOUNT_NO = 0; private static final int EXPIRATION = 1; - private final String amount; - private final String expiration; + private final long amount; + private final long expiration; - private VoucherInfoRequest(String amount, String expiration) { + private VoucherInfoRequest(long amount, long expiration) { this.amount = amount; this.expiration = expiration; } @@ -20,19 +20,21 @@ public static VoucherInfoRequest of(String userInput) { String[] inputs = userInput.split(SPLIT_FORMAT); checkReadVoucherException(inputs); - return new VoucherInfoRequest(inputs[AMOUNT_NO].trim(), inputs[EXPIRATION].trim()); + return new VoucherInfoRequest( + Long.parseLong(inputs[AMOUNT_NO].trim()), + Long.parseLong(inputs[EXPIRATION].trim())); } - public String getAmount() { + public long getAmount() { return amount; } - public String getExpiration() { + public long getExpiration() { return expiration; } private static void checkReadVoucherException(String[] inputs) { InputValidator.notVoucherInputSize(inputs); - InputValidator.notVoucherInfoFormat(inputs); + InputValidator.notNumber(inputs); } } diff --git a/src/main/java/org/weekly/weekly/voucher/exception/VoucherException.java b/src/main/java/org/weekly/weekly/voucher/exception/VoucherException.java index 7d895df2b2..a9743019c0 100644 --- a/src/main/java/org/weekly/weekly/voucher/exception/VoucherException.java +++ b/src/main/java/org/weekly/weekly/voucher/exception/VoucherException.java @@ -2,36 +2,8 @@ import org.weekly.weekly.util.ExceptionMsg; -import java.time.LocalDate; -import java.util.function.Predicate; - -public class VoucherException { - private static boolean isNumber(String userInput) { - return userInput.chars().allMatch(value -> Character.isDigit(value)); - } - - private static void notNumber(String userInput) { - if (!isNumber(userInput)) { - throw new RuntimeException(ExceptionMsg.NOT_NUMBER_FORMAT.getMsg()); - } - } - - private static void notRange(String userInput, Predicate ifCase) { - if (ifCase.test(userInput)) { - throw new RuntimeException(ExceptionMsg.NOT_NUMBER_FORMAT.getMsg()); - } - } - - public static void notNumberFormat(String userInput, Predicate ifCase) { - notNumber(userInput); - notRange(userInput, ifCase); - } - - public static void expirationError(LocalDate registrationDate, String expirationMonth) { - LocalDate expirationDate = registrationDate.plusMonths(Long.parseLong(expirationMonth)); - - if (registrationDate.isEqual(expirationDate) || registrationDate.isAfter(expirationDate)) { - throw new RuntimeException(ExceptionMsg.EXPIRATION_ERROR.getMsg()); - } +public class VoucherException extends RuntimeException{ + public VoucherException(ExceptionMsg exceptionMsg) { + super(exceptionMsg.getMsg()); } -} \ No newline at end of file +} diff --git a/src/main/java/org/weekly/weekly/voucher/exception/VoucherValidator.java b/src/main/java/org/weekly/weekly/voucher/exception/VoucherValidator.java new file mode 100644 index 0000000000..1ccea53a09 --- /dev/null +++ b/src/main/java/org/weekly/weekly/voucher/exception/VoucherValidator.java @@ -0,0 +1,38 @@ +package org.weekly.weekly.voucher.exception; + +import org.weekly.weekly.util.ExceptionMsg; +import org.weekly.weekly.voucher.domain.DiscountType; + +import java.time.LocalDate; +import java.util.function.LongPredicate; +import java.util.function.Predicate; + +public class VoucherValidator { + private static final int RANGE_START = 0; + private static final int RANGE_END = 100; + + private VoucherValidator() { + throw new VoucherException(ExceptionMsg.UTIL_CLASS); + } + + public static void validateExpiration(LocalDate registrationDate, long expirationMonth) { + LocalDate expirationDate = registrationDate.plusMonths(expirationMonth); + + if (registrationDate.isEqual(expirationDate) || registrationDate.isAfter(expirationDate)) { + throw new VoucherException(ExceptionMsg.EXPIRATION_ERROR); + } + } + public static void validateAmount(DiscountType discountType, long amount) { + if (DiscountType.FIXED.equals(discountType)) { + notRange(amount, input -> input < RANGE_START); + } + + notRange(amount, input -> input < RANGE_START || input > RANGE_END); + } + + private static void notRange(long userInput, LongPredicate ifCase) { + if (ifCase.test(userInput)) { + throw new VoucherException(ExceptionMsg.NOT_NUMBER_FORMAT); + } + } +} diff --git a/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java b/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java index e2c443da80..f9c3f3eae1 100644 --- a/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java +++ b/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java @@ -3,7 +3,6 @@ import org.springframework.stereotype.Service; import org.weekly.weekly.util.ExceptionMsg; import org.weekly.weekly.voucher.domain.Voucher; -import org.weekly.weekly.voucher.dto.VoucherDto; import org.weekly.weekly.voucher.dto.CreateResponse; import org.weekly.weekly.voucher.dto.ListResponse; import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; @@ -11,6 +10,7 @@ import java.util.List; import java.util.Optional; +import java.util.UUID; @Service public class VoucherService { @@ -21,7 +21,10 @@ public VoucherService(VoucherRepository voucherRepository) { } public CreateResponse insertVoucher(VoucherCreationRequest voucherCreationRequest) { - validateVoucher(voucherDto); + UUID uuid = UUID.randomUUID(); + validateUUID(uuid); + + Voucher voucher = voucherDto.parseToVoucher(); this.voucherRepository.insert(voucher); return new CreateResponse(voucher); @@ -32,8 +35,8 @@ public ListResponse getVouchers() { return new ListResponse(vouchers); } - private void validateVoucher(VoucherDto voucherDto) { - Optional voucherOptional = this.voucherRepository.findById(voucherDto.getVoucherId()); + private void validateUUID(UUID uuid) { + Optional voucherOptional = this.voucherRepository.findById(uuid); if (voucherOptional.isPresent()) { throw new RuntimeException(ExceptionMsg.VOUCHER_EXIST.getMsg()); } diff --git a/src/test/java/org/weekly/weekly/util/DiscountMapTest.java b/src/test/java/org/weekly/weekly/util/DiscountMapTest.java index 56bbb7d0e7..e425103c28 100644 --- a/src/test/java/org/weekly/weekly/util/DiscountMapTest.java +++ b/src/test/java/org/weekly/weekly/util/DiscountMapTest.java @@ -3,6 +3,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.weekly.weekly.voucher.domain.DiscountType; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/src/test/java/org/weekly/weekly/voucher/VoucherTest.java b/src/test/java/org/weekly/weekly/voucher/VoucherTest.java index 0947d69ba0..712a5d4179 100644 --- a/src/test/java/org/weekly/weekly/voucher/VoucherTest.java +++ b/src/test/java/org/weekly/weekly/voucher/VoucherTest.java @@ -5,13 +5,12 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; -import org.weekly.weekly.util.DiscountType; +import org.weekly.weekly.voucher.domain.DiscountType; import org.weekly.weekly.voucher.domain.Discount; import org.weekly.weekly.voucher.domain.FixedDiscount; import org.weekly.weekly.voucher.domain.PercentDiscount; import org.weekly.weekly.voucher.domain.Voucher; -import org.weekly.weekly.voucher.dto.VoucherDto; -import org.weekly.weekly.voucher.dto.VoucherInfoRequest; +import org.weekly.weekly.voucher.dto.request.VoucherInfoRequest; import org.weekly.weekly.voucher.repository.VoucherRepository; import java.time.LocalDate; From f1a7a71d750ac04b0b1c2fa1d12bc1fcac17b986 Mon Sep 17 00:00:00 2001 From: parksey Date: Mon, 3 Jul 2023 05:28:48 +0900 Subject: [PATCH 03/26] =?UTF-8?q?test:=20voucher=EC=97=90=20=EB=8C=80?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/ui/exception/InputValidator.java | 10 ++- .../voucher/controller/VoucherController.java | 4 +- .../weekly/weekly/voucher/domain/Voucher.java | 2 +- .../dto/request/VoucherCreationRequest.java | 1 - .../voucher/exception/VoucherValidator.java | 1 + .../voucher/repository/VoucherRepository.java | 14 +++- .../voucher/service/VoucherService.java | 13 +--- .../weekly/weekly/util/DiscountMapTest.java | 6 +- .../weekly/weekly/voucher/VoucherTest.java | 66 +++++++++---------- 9 files changed, 56 insertions(+), 61 deletions(-) diff --git a/src/main/java/org/weekly/weekly/ui/exception/InputValidator.java b/src/main/java/org/weekly/weekly/ui/exception/InputValidator.java index 696639f7d5..537b5662f2 100644 --- a/src/main/java/org/weekly/weekly/ui/exception/InputValidator.java +++ b/src/main/java/org/weekly/weekly/ui/exception/InputValidator.java @@ -19,13 +19,11 @@ public static void notVoucherInputSize(String[] userInputs) { } public static void notNumber(String[] userInputs) { - if (Arrays.stream(userInputs) - .anyMatch(input -> isDigit(input.trim()))) { + try { + Arrays.stream(userInputs) + .peek(Long::parseLong); + } catch (NumberFormatException exception) { throw new InputException(ExceptionMsg.NOT_INPUT_FORMAT); } } - - private static boolean isDigit(String userInput) { - return userInput.chars().anyMatch(value -> !Character.isDigit(value)); - } } diff --git a/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java b/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java index 732fa2a15a..e130709f55 100644 --- a/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java +++ b/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java @@ -21,12 +21,12 @@ public VoucherController(VoucherService voucherService) { public Response createVoucher(VoucherCreationRequest voucherCreationRequest) { this.voucherService.insertVoucher(voucherCreationRequest); - this.commandLineApplication.printResult(response); + return null; } public Response getVouchers() { Response response = this.voucherService.getVouchers(); logger.info("{}{}",PrintMsg.FIND_ALL_VOUCHER_SUCCESS.getMessage()); - this.commandLineApplication.printResult(response); + return null; } } diff --git a/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java b/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java index b2f1c0829b..f73f304f39 100644 --- a/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java +++ b/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java @@ -19,7 +19,7 @@ public class Voucher { private Discount discount; - public Voucher(UUID voucherId, long amount, LocalDate registrationDate, LocalDate expirationDate, Discount discount) { + private Voucher(UUID voucherId, long amount, LocalDate registrationDate, LocalDate expirationDate, Discount discount) { this.voucherId = voucherId; this.amount = amount; this.registrationDate = registrationDate; diff --git a/src/main/java/org/weekly/weekly/voucher/dto/request/VoucherCreationRequest.java b/src/main/java/org/weekly/weekly/voucher/dto/request/VoucherCreationRequest.java index 6f09ff3440..76c137ed6e 100644 --- a/src/main/java/org/weekly/weekly/voucher/dto/request/VoucherCreationRequest.java +++ b/src/main/java/org/weekly/weekly/voucher/dto/request/VoucherCreationRequest.java @@ -22,5 +22,4 @@ public Voucher toVoucher() { LocalDate now = LocalDate.now(); return Voucher.of(id, amount, now, voucherInfoRequest.getExpiration(), discountType); } - } diff --git a/src/main/java/org/weekly/weekly/voucher/exception/VoucherValidator.java b/src/main/java/org/weekly/weekly/voucher/exception/VoucherValidator.java index 1ccea53a09..e3ac855aa3 100644 --- a/src/main/java/org/weekly/weekly/voucher/exception/VoucherValidator.java +++ b/src/main/java/org/weekly/weekly/voucher/exception/VoucherValidator.java @@ -25,6 +25,7 @@ public static void validateExpiration(LocalDate registrationDate, long expiratio public static void validateAmount(DiscountType discountType, long amount) { if (DiscountType.FIXED.equals(discountType)) { notRange(amount, input -> input < RANGE_START); + return; } notRange(amount, input -> input < RANGE_START || input > RANGE_END); diff --git a/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java b/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java index a1a8c0aa38..a958255c2c 100644 --- a/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java +++ b/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java @@ -1,7 +1,9 @@ package org.weekly.weekly.voucher.repository; import org.springframework.stereotype.Repository; +import org.weekly.weekly.util.ExceptionMsg; import org.weekly.weekly.voucher.domain.Voucher; +import org.weekly.weekly.voucher.exception.VoucherException; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -10,9 +12,9 @@ public class VoucherRepository { private final Map storages = new ConcurrentHashMap<>(); - public Voucher insert(Voucher voucher) { + public void insert(Voucher voucher) { + validateUUID(voucher.getVoucherId()); storages.put(voucher.getVoucherId(), voucher); - return voucher; } public Optional findById(UUID voucherId) { @@ -23,4 +25,12 @@ public List findAll() { return storages.values().stream() .toList(); } + + + private void validateUUID(UUID uuid) { + Optional voucherOptional = findById(uuid); + if (voucherOptional.isPresent()) { + throw new VoucherException(ExceptionMsg.VOUCHER_EXIST); + } + } } diff --git a/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java b/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java index f9c3f3eae1..f53347c5b2 100644 --- a/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java +++ b/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java @@ -21,11 +21,7 @@ public VoucherService(VoucherRepository voucherRepository) { } public CreateResponse insertVoucher(VoucherCreationRequest voucherCreationRequest) { - UUID uuid = UUID.randomUUID(); - validateUUID(uuid); - - - Voucher voucher = voucherDto.parseToVoucher(); + Voucher voucher = voucherCreationRequest.toVoucher(); this.voucherRepository.insert(voucher); return new CreateResponse(voucher); } @@ -35,10 +31,5 @@ public ListResponse getVouchers() { return new ListResponse(vouchers); } - private void validateUUID(UUID uuid) { - Optional voucherOptional = this.voucherRepository.findById(uuid); - if (voucherOptional.isPresent()) { - throw new RuntimeException(ExceptionMsg.VOUCHER_EXIST.getMsg()); - } - } + } diff --git a/src/test/java/org/weekly/weekly/util/DiscountMapTest.java b/src/test/java/org/weekly/weekly/util/DiscountMapTest.java index e425103c28..3443ee7c77 100644 --- a/src/test/java/org/weekly/weekly/util/DiscountMapTest.java +++ b/src/test/java/org/weekly/weekly/util/DiscountMapTest.java @@ -18,7 +18,7 @@ public class DiscountMapTest { }) void 사용자_입력이_할인_맵에_없으면_예외발생(String userInput) { // when + then - assertThatThrownBy(()-> DiscountType.getDiscountMap(userInput)) + assertThatThrownBy(()-> DiscountType.getDiscountTypeByNumber(userInput)) .isInstanceOf(RuntimeException.class); } @@ -30,8 +30,8 @@ public class DiscountMapTest { String percentUserInput = "2"; // when - DiscountType fixedDiscount = DiscountType.getDiscountMap(fixedUserInput); - DiscountType percentDiscount = DiscountType.getDiscountMap(percentUserInput); + DiscountType fixedDiscount = DiscountType.getDiscountTypeByNumber(fixedUserInput); + DiscountType percentDiscount = DiscountType.getDiscountTypeByNumber(percentUserInput); // then assertThat(fixedDiscount).isEqualTo(DiscountType.FIXED); diff --git a/src/test/java/org/weekly/weekly/voucher/VoucherTest.java b/src/test/java/org/weekly/weekly/voucher/VoucherTest.java index 712a5d4179..a18275e63b 100644 --- a/src/test/java/org/weekly/weekly/voucher/VoucherTest.java +++ b/src/test/java/org/weekly/weekly/voucher/VoucherTest.java @@ -6,10 +6,8 @@ import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; import org.weekly.weekly.voucher.domain.DiscountType; -import org.weekly.weekly.voucher.domain.Discount; -import org.weekly.weekly.voucher.domain.FixedDiscount; -import org.weekly.weekly.voucher.domain.PercentDiscount; import org.weekly.weekly.voucher.domain.Voucher; +import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; import org.weekly.weekly.voucher.dto.request.VoucherInfoRequest; import org.weekly.weekly.voucher.repository.VoucherRepository; @@ -32,20 +30,18 @@ void setVoucherRepository() { "10,1: 1" }, delimiter = ':') void 바우처가_이미_존재하면_예외발생(String userInput, String no) { - assertThatCode(()-> { - // Given - UUID voucherId = UUID.randomUUID(); - VoucherInfoRequest voucherInfo = VoucherInfoRequest.of(userInput); - Discount discount = DiscountType.getDiscountMap(no).getCls().getDeclaredConstructor().newInstance(); - LocalDate localDate = LocalDate.now(); + // Given + UUID voucherId = UUID.randomUUID(); + VoucherInfoRequest voucherInfo = VoucherInfoRequest.of(userInput); + DiscountType discount = DiscountType.getDiscountTypeByNumber(no); + LocalDate now = LocalDate.now(); + Voucher voucher = Voucher.of(voucherId, voucherInfo.getAmount(), now, voucherInfo.getExpiration(), discount); - // when - VoucherDto voucherDto = VoucherDto.parseDto(voucherId, voucherInfo, discount, localDate); - voucherRepository.insert(voucherDto.parseToVoucher()); + // when + voucherRepository.insert(voucher); - // then - assertThat(voucherRepository.findById(voucherId).isPresent()).isTrue(); - }).doesNotThrowAnyException(); + // then + assertThat(voucherRepository.findById(voucherId).isPresent()).isTrue(); } @ParameterizedTest @@ -56,13 +52,15 @@ void setVoucherRepository() { }) void 바우처_발행시간이_유효시간보다_느리면_예외발생(String userInput) { // Given - UUID voucherId = UUID.randomUUID(); - LocalDate localDate = LocalDate.now(); - Discount discount = new FixedDiscount(); +// UUID voucherId = UUID.randomUUID(); +// LocalDate localDate = LocalDate.now(); + DiscountType discount = DiscountType.FIXED; VoucherInfoRequest voucherInfo = VoucherInfoRequest.of(userInput); + VoucherCreationRequest request = new VoucherCreationRequest(voucherInfo, discount); + // when + then - assertThatThrownBy(()->VoucherDto.parseDto(voucherId, voucherInfo, discount, localDate)) + assertThatThrownBy(()->request.toVoucher()) .isInstanceOf(RuntimeException.class); } @@ -71,17 +69,19 @@ class 고정바우처_테스트 { @ParameterizedTest @ValueSource(strings = { "-1,12", - " asfd, 1" + " -50, 1" }) void 바우처_금액이_자연수가_아니면_예외발생(String userInput) { // Given - UUID voucherId = UUID.randomUUID(); - LocalDate localDate = LocalDate.now(); - Discount discount = new FixedDiscount(); - VoucherInfoRequest voucherInfo = VoucherInfoRequest.of(userInput); + DiscountType discountType = DiscountType.FIXED; - // when + then - assertThatThrownBy(()->VoucherDto.parseDto(voucherId, voucherInfo, discount, localDate)) + VoucherInfoRequest voucherInfoRequest = VoucherInfoRequest.of(userInput); + + // when + VoucherCreationRequest request = new VoucherCreationRequest(voucherInfoRequest, discountType); + + // then + assertThatThrownBy(()-> request.toVoucher()) .isInstanceOf(RuntimeException.class); } @@ -92,10 +92,8 @@ class 고정바우처_테스트 { }) void 고정_할인금액_적용하여_결과확인(int userInput, int discountMoney, int result) { // Given - Discount discount = new FixedDiscount(); LocalDate current = LocalDate.now(); - LocalDate next = current.plusMonths(1); - Voucher voucher = new Voucher(UUID.randomUUID(), discountMoney, current, next, discount); + Voucher voucher = Voucher.of(UUID.randomUUID(), discountMoney, current, 1, DiscountType.FIXED); // when long afterApply = voucher.applyDiscount(userInput); @@ -115,12 +113,12 @@ class 퍼센트바우처_테스트 { void 바우처_퍼센트값이_자연수가_아니면_예외발생(String userInput) { // Given UUID voucherId = UUID.randomUUID(); - LocalDate localDate = LocalDate.now(); - Discount discount = new PercentDiscount(); + LocalDate now = LocalDate.now(); VoucherInfoRequest voucherInfo = VoucherInfoRequest.of(userInput); + // when + then - assertThatThrownBy(()->VoucherDto.parseDto(voucherId, voucherInfo, discount, localDate)) + assertThatThrownBy(()->Voucher.of(voucherId, voucherInfo.getAmount(), now, 1, DiscountType.PERCENT)) .isInstanceOf(RuntimeException.class); } @@ -133,9 +131,7 @@ class 퍼센트바우처_테스트 { void 퍼센트_할인금액_적용하여_결과확인(int userInput, int discountMoney, int result) { // Given LocalDate current = LocalDate.now(); - LocalDate next = current.plusMonths(1); - Discount discount = new PercentDiscount(); - Voucher voucher = new Voucher(UUID.randomUUID(), discountMoney, current, next, discount); + Voucher voucher = Voucher.of(UUID.randomUUID(), discountMoney, current, 1, DiscountType.PERCENT); // when long afterApply = voucher.applyDiscount(userInput); From 03456cb0a627296c30846f26890b8fe9d9c0d7d3 Mon Sep 17 00:00:00 2001 From: parksey Date: Mon, 3 Jul 2023 05:54:05 +0900 Subject: [PATCH 04/26] =?UTF-8?q?feat:=20=EC=A0=84=EC=B2=B4=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=A1=B0=ED=9A=8C=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=8D=B0=EC=9D=B4=ED=84=B0=20=ED=98=95?= =?UTF-8?q?=EC=8B=9D=20=EB=B0=8F=20parsing=EB=B0=A9=EB=B2=95=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/VoucherManagementController.java | 6 ++-- .../weekly/ui/writer/CommandWriter.java | 20 ++++++------- .../util/{PrintMsg.java => PrintMessage.java} | 6 ++-- .../voucher/controller/VoucherController.java | 9 ++---- .../weekly/weekly/voucher/domain/Voucher.java | 19 +++++++----- .../weekly/voucher/dto/CreateResponse.java | 16 ---------- .../weekly/voucher/dto/ListResponse.java | 27 ----------------- .../weekly/weekly/voucher/dto/Response.java | 2 +- .../dto/response/VoucherCreationResponse.java | 27 +++++++++++++++++ .../dto/response/VouchersResponse.java | 29 +++++++++++++++++++ .../voucher/service/VoucherService.java | 15 ++++------ 11 files changed, 94 insertions(+), 82 deletions(-) rename src/main/java/org/weekly/weekly/util/{PrintMsg.java => PrintMessage.java} (86%) delete mode 100644 src/main/java/org/weekly/weekly/voucher/dto/CreateResponse.java delete mode 100644 src/main/java/org/weekly/weekly/voucher/dto/ListResponse.java create mode 100644 src/main/java/org/weekly/weekly/voucher/dto/response/VoucherCreationResponse.java create mode 100644 src/main/java/org/weekly/weekly/voucher/dto/response/VouchersResponse.java diff --git a/src/main/java/org/weekly/weekly/VoucherManagementController.java b/src/main/java/org/weekly/weekly/VoucherManagementController.java index 20420d9bbe..1e2f31e434 100644 --- a/src/main/java/org/weekly/weekly/VoucherManagementController.java +++ b/src/main/java/org/weekly/weekly/VoucherManagementController.java @@ -4,7 +4,7 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.weekly.weekly.ui.CommandLineApplication; -import org.weekly.weekly.util.PrintMsg; +import org.weekly.weekly.util.PrintMessage; import org.weekly.weekly.util.VoucherMenu; import org.weekly.weekly.voucher.controller.VoucherController; import org.weekly.weekly.voucher.dto.Response; @@ -51,13 +51,13 @@ private boolean processMenuSelection(VoucherMenu selectMenu) { private void handleVoucherCreation() { VoucherCreationRequest voucherCreationRequest = this.commandLineApplication.createVoucherFromInput(); Response response = voucherController.createVoucher(voucherCreationRequest); - logger.info("{}{}", PrintMsg.CREATE_VOUCHER_SUCCESS.getMessage(),response.getResult()); + logger.info("{}{}", PrintMessage.CREATE_VOUCHER_SUCCESS.getMessage(),response.getResult()); this.commandLineApplication.printResult(response); } private void handleVoucherSearch() { Response response = voucherController.getVouchers(); - logger.info("{}{}",PrintMsg.FIND_ALL_VOUCHER_SUCCESS.getMessage(), response.getResult()); + logger.info("{}{}", PrintMessage.FIND_ALL_VOUCHER_SUCCESS.getMessage(), response.getResult()); this.commandLineApplication.printResult(response); } } diff --git a/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java b/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java index 07225bfc5a..c6f2bea23e 100644 --- a/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java +++ b/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java @@ -4,7 +4,7 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.weekly.weekly.voucher.domain.DiscountType; -import org.weekly.weekly.util.PrintMsg; +import org.weekly.weekly.util.PrintMessage; import org.weekly.weekly.util.VoucherMenu; import java.util.Arrays; @@ -18,33 +18,33 @@ private void println(String msg) { private void print(String msg) {System.out.print(msg);} public void printVoucherProgram() { - println(PrintMsg.EMPTY.getMessage()); - println(PrintMsg.PROGRAM.getMessage()); + println(PrintMessage.EMPTY.getMessage()); + println(PrintMessage.PROGRAM.getMessage()); Arrays.stream(VoucherMenu.values()) .forEach(voucherMenu -> System.out.println(voucherMenu.getPrintMsg())); } public void printErrorMsg(String errorMsg) { logger.warn(errorMsg); - println(PrintMsg.EMPTY.getMessage()); + println(PrintMessage.EMPTY.getMessage()); println(errorMsg); } public void printCreateVoucher(DiscountType discountType) { - println(PrintMsg.EMPTY.getMessage()); - println(PrintMsg.CREATE_VOUCHER.getMessage() + discountType.getInputExampleMessage()); - print(PrintMsg.INPUT_MESSAGE.getMessage()); + println(PrintMessage.EMPTY.getMessage()); + println(PrintMessage.CREATE_VOUCHER.getMessage() + discountType.getInputExampleMessage()); + print(PrintMessage.INPUT_MESSAGE.getMessage()); } public void printSelectDiscount() { - println(PrintMsg.EMPTY.getMessage()); - println(PrintMsg.DISCOUNT_SELECT.getMessage()); + println(PrintMessage.EMPTY.getMessage()); + println(PrintMessage.DISCOUNT_SELECT.getMessage()); Arrays.stream(DiscountType.values()) .forEach(discountMap -> System.out.println(discountMap.getSelectMessage())); } public void printReuslt(String result) { - println(PrintMsg.EMPTY.getMessage()); + println(PrintMessage.EMPTY.getMessage()); println(result); } } diff --git a/src/main/java/org/weekly/weekly/util/PrintMsg.java b/src/main/java/org/weekly/weekly/util/PrintMessage.java similarity index 86% rename from src/main/java/org/weekly/weekly/util/PrintMsg.java rename to src/main/java/org/weekly/weekly/util/PrintMessage.java index 18579049f0..8ddc7e5a6b 100644 --- a/src/main/java/org/weekly/weekly/util/PrintMsg.java +++ b/src/main/java/org/weekly/weekly/util/PrintMessage.java @@ -1,6 +1,6 @@ package org.weekly.weekly.util; -public enum PrintMsg { +public enum PrintMessage { PROGRAM("=== Voucher Program ==="), CREATE_VOUCHER("바우처를 생성합니다.\n" + "입력예시 => "), @@ -11,9 +11,9 @@ public enum PrintMsg { CREATE_VOUCHER_SUCCESS("[바우처 생성에 성공]: "), FIND_ALL_VOUCHER_SUCCESS("[모든 바우처 조회 성공]: "); - private String message; + private final String message; - PrintMsg(String msg) { + PrintMessage(String msg) { this.message = msg; } diff --git a/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java b/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java index e130709f55..c8b3dcd061 100644 --- a/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java +++ b/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java @@ -3,7 +3,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; -import org.weekly.weekly.util.PrintMsg; +import org.weekly.weekly.util.PrintMessage; import org.weekly.weekly.voucher.dto.Response; import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; import org.weekly.weekly.voucher.service.VoucherService; @@ -20,13 +20,10 @@ public VoucherController(VoucherService voucherService) { public Response createVoucher(VoucherCreationRequest voucherCreationRequest) { - this.voucherService.insertVoucher(voucherCreationRequest); - return null; + return this.voucherService.insertVoucher(voucherCreationRequest); } public Response getVouchers() { - Response response = this.voucherService.getVouchers(); - logger.info("{}{}",PrintMsg.FIND_ALL_VOUCHER_SUCCESS.getMessage()); - return null; + return this.voucherService.getVouchers(); } } diff --git a/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java b/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java index f73f304f39..34c70de709 100644 --- a/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java +++ b/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java @@ -42,10 +42,6 @@ private static void validation(LocalDate registrationDate, long expiration, Disc VoucherValidator.validateAmount(discountType, amount); } - public UUID getVoucherId() { - return voucherId; - } - public long applyDiscount(long beforeAmount) { long afterAmount = discount.applyDiscount(beforeAmount, amount); @@ -57,10 +53,19 @@ public long applyDiscount(long beforeAmount) { return 0L; } - @Override - public String toString() { - return MessageFormat.format("[ID: {0}, 금액: {1}, 등록일자: {2}, 유효기간: {3}]", voucherId,amount, registrationDate, expirationDate); + public UUID getVoucherId() { + return voucherId; + } + + public LocalDate getExpirationDate() { + return expirationDate; } + public LocalDate getRegistrationDate() { + return registrationDate; + } + public long getAmount() { + return amount; + } } diff --git a/src/main/java/org/weekly/weekly/voucher/dto/CreateResponse.java b/src/main/java/org/weekly/weekly/voucher/dto/CreateResponse.java deleted file mode 100644 index e845075c8f..0000000000 --- a/src/main/java/org/weekly/weekly/voucher/dto/CreateResponse.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.weekly.weekly.voucher.dto; - -import org.weekly.weekly.voucher.domain.Voucher; - -public class CreateResponse implements Response{ - private final String result; - - public CreateResponse(Voucher voucher) { - this.result = voucher.toString(); - } - - @Override - public String getResult() { - return result; - } -} diff --git a/src/main/java/org/weekly/weekly/voucher/dto/ListResponse.java b/src/main/java/org/weekly/weekly/voucher/dto/ListResponse.java deleted file mode 100644 index 1fad95ccbf..0000000000 --- a/src/main/java/org/weekly/weekly/voucher/dto/ListResponse.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.weekly.weekly.voucher.dto; - -import org.weekly.weekly.util.PrintMsg; -import org.weekly.weekly.voucher.domain.Voucher; - -import java.util.List; -import java.util.stream.Collectors; - -public class ListResponse implements Response{ - private final List result; - - public ListResponse(List vouchers) { - this.result = vouchers.stream() - .map(Voucher::toString) - .collect(Collectors.toUnmodifiableList()); - } - - public String getResult() { - if (result.isEmpty()) { - return PrintMsg.NO_VOUCHER_DATAS.getMessage(); - } - - StringBuilder sb = new StringBuilder(); - result.forEach(sb::append); - return sb.toString(); - } -} diff --git a/src/main/java/org/weekly/weekly/voucher/dto/Response.java b/src/main/java/org/weekly/weekly/voucher/dto/Response.java index 163a86e2be..7e3c7ec805 100644 --- a/src/main/java/org/weekly/weekly/voucher/dto/Response.java +++ b/src/main/java/org/weekly/weekly/voucher/dto/Response.java @@ -1,5 +1,5 @@ package org.weekly.weekly.voucher.dto; -public interface Response { +public interface Response { String getResult(); } diff --git a/src/main/java/org/weekly/weekly/voucher/dto/response/VoucherCreationResponse.java b/src/main/java/org/weekly/weekly/voucher/dto/response/VoucherCreationResponse.java new file mode 100644 index 0000000000..f02d0703a6 --- /dev/null +++ b/src/main/java/org/weekly/weekly/voucher/dto/response/VoucherCreationResponse.java @@ -0,0 +1,27 @@ +package org.weekly.weekly.voucher.dto.response; + +import org.weekly.weekly.voucher.domain.Voucher; +import org.weekly.weekly.voucher.dto.Response; + +import java.text.MessageFormat; +import java.time.LocalDate; +import java.util.UUID; + +public class VoucherCreationResponse implements Response { + private final UUID id; + private final LocalDate registrationDate; + private final LocalDate expirationDate; + private final long amount; + + public VoucherCreationResponse(Voucher voucher) { + this.id = voucher.getVoucherId(); + this.registrationDate = voucher.getRegistrationDate(); + this.expirationDate = voucher.getExpirationDate(); + this.amount = voucher.getAmount(); + } + + @Override + public String getResult() { + return MessageFormat.format("[ID: {0}, 금액: {1}, 등록일자: {2}, 유효기간: {3}]", id, amount, registrationDate, expirationDate); + } +} diff --git a/src/main/java/org/weekly/weekly/voucher/dto/response/VouchersResponse.java b/src/main/java/org/weekly/weekly/voucher/dto/response/VouchersResponse.java new file mode 100644 index 0000000000..f899d85559 --- /dev/null +++ b/src/main/java/org/weekly/weekly/voucher/dto/response/VouchersResponse.java @@ -0,0 +1,29 @@ +package org.weekly.weekly.voucher.dto.response; + +import org.weekly.weekly.util.PrintMessage; +import org.weekly.weekly.voucher.domain.Voucher; +import org.weekly.weekly.voucher.dto.Response; + +import java.util.List; +import java.util.stream.Collectors; + +public class VouchersResponse implements Response { + private final List result; + + public VouchersResponse(List vouchers) { + this.result = vouchers.stream() + .map(VoucherCreationResponse::new) + .collect(Collectors.toUnmodifiableList()); + } + + public String getResult() { + if (result.isEmpty()) { + return PrintMessage.NO_VOUCHER_DATAS.getMessage(); + } + + + StringBuilder resultBuilder = new StringBuilder(); + result.forEach(voucherResponse-> resultBuilder.append(voucherResponse.getResult())); + return resultBuilder.toString(); + } +} diff --git a/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java b/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java index f53347c5b2..3e789c7722 100644 --- a/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java +++ b/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java @@ -1,16 +1,13 @@ package org.weekly.weekly.voucher.service; import org.springframework.stereotype.Service; -import org.weekly.weekly.util.ExceptionMsg; import org.weekly.weekly.voucher.domain.Voucher; -import org.weekly.weekly.voucher.dto.CreateResponse; -import org.weekly.weekly.voucher.dto.ListResponse; +import org.weekly.weekly.voucher.dto.response.VoucherCreationResponse; +import org.weekly.weekly.voucher.dto.response.VouchersResponse; import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; import org.weekly.weekly.voucher.repository.VoucherRepository; import java.util.List; -import java.util.Optional; -import java.util.UUID; @Service public class VoucherService { @@ -20,15 +17,15 @@ public VoucherService(VoucherRepository voucherRepository) { this.voucherRepository = voucherRepository; } - public CreateResponse insertVoucher(VoucherCreationRequest voucherCreationRequest) { + public VoucherCreationResponse insertVoucher(VoucherCreationRequest voucherCreationRequest) { Voucher voucher = voucherCreationRequest.toVoucher(); this.voucherRepository.insert(voucher); - return new CreateResponse(voucher); + return new VoucherCreationResponse(voucher); } - public ListResponse getVouchers() { + public VouchersResponse getVouchers() { List vouchers = this.voucherRepository.findAll(); - return new ListResponse(vouchers); + return new VouchersResponse(vouchers); } From 685e7dbd22938499b6ecf93139eb38a3dd2a0ba3 Mon Sep 17 00:00:00 2001 From: parksey Date: Tue, 4 Jul 2023 16:53:26 +0900 Subject: [PATCH 05/26] =?UTF-8?q?docs:=202=EC=A3=BC=EC=B0=A8=20=EB=AF=B8?= =?UTF-8?q?=EC=85=98=20=EA=B8=B0=EB=8A=A5=EB=AA=85=EC=84=B8=EC=84=9C=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/VoucherManageApplication.java | 7 ++- .../weekly/ui/CommandLineApplication.java | 1 + .../weekly/ui/reader/BufferedReaderWrap.java | 4 +- .../weekly/weekly/ui/reader/ConsoleWrap.java | 3 ++ .../weekly/weekly/ui/reader/ScannerWrap.java | 6 +-- .../weekly/ui/writer/CommandWriter.java | 51 +++--------------- .../weekly/weekly/ui/writer/SystemWriter.java | 52 +++++++++++++++++++ .../dto/response/VouchersResponse.java | 2 +- src/main/resources/application.properties | 1 - src/main/resources/application.yaml | 21 ++++++++ 10 files changed, 96 insertions(+), 52 deletions(-) create mode 100644 src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java delete mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/application.yaml diff --git a/src/main/java/org/weekly/weekly/VoucherManageApplication.java b/src/main/java/org/weekly/weekly/VoucherManageApplication.java index 4c5478301d..50966722c7 100644 --- a/src/main/java/org/weekly/weekly/VoucherManageApplication.java +++ b/src/main/java/org/weekly/weekly/VoucherManageApplication.java @@ -3,11 +3,16 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; +import org.weekly.weekly.ui.reader.ScannerWrap; @SpringBootApplication public class VoucherManageApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(VoucherManageApplication.class, args); - context.getBean(VoucherManagementController.class).start(); + String read = context.getEnvironment().getProperty("command.read", String.class); + System.out.println(read); + +// context.getBean(VoucherManagementController.class).start(); + } } \ No newline at end of file diff --git a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java index 983f28ac94..f2b236126c 100644 --- a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java +++ b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java @@ -5,6 +5,7 @@ import org.weekly.weekly.ui.exception.InputValidator; import org.weekly.weekly.ui.reader.CommandReader; import org.weekly.weekly.ui.writer.CommandWriter; +import org.weekly.weekly.ui.writer.SystemWriter; import org.weekly.weekly.voucher.domain.DiscountType; import org.weekly.weekly.util.VoucherMenu; import org.weekly.weekly.voucher.dto.Response; diff --git a/src/main/java/org/weekly/weekly/ui/reader/BufferedReaderWrap.java b/src/main/java/org/weekly/weekly/ui/reader/BufferedReaderWrap.java index 09de91e959..38312125d8 100644 --- a/src/main/java/org/weekly/weekly/ui/reader/BufferedReaderWrap.java +++ b/src/main/java/org/weekly/weekly/ui/reader/BufferedReaderWrap.java @@ -1,5 +1,6 @@ package org.weekly.weekly.ui.reader; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import org.weekly.weekly.ui.exception.InputException; import org.weekly.weekly.util.ExceptionMsg; @@ -9,11 +10,12 @@ import java.io.InputStreamReader; @Component +@ConditionalOnProperty(value="command.read", havingValue = "buffer") public class BufferedReaderWrap implements CommandReader { private final BufferedReader bufferedReader; public BufferedReaderWrap() { - this.bufferedReader = new BufferedReader(new InputStreamReader(System.in)); + System.out.println("buffer");this.bufferedReader = new BufferedReader(new InputStreamReader(System.in)); } @Override diff --git a/src/main/java/org/weekly/weekly/ui/reader/ConsoleWrap.java b/src/main/java/org/weekly/weekly/ui/reader/ConsoleWrap.java index a64197e61f..525460ca8f 100644 --- a/src/main/java/org/weekly/weekly/ui/reader/ConsoleWrap.java +++ b/src/main/java/org/weekly/weekly/ui/reader/ConsoleWrap.java @@ -1,14 +1,17 @@ package org.weekly.weekly.ui.reader; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import java.io.Console; @Component +@ConditionalOnProperty(value="command.read", havingValue = "console") public class ConsoleWrap implements CommandReader{ private final Console consoleWrap; public ConsoleWrap() { + System.out.println("consol"); this.consoleWrap = System.console(); } diff --git a/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java b/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java index 17c350ba08..792861dcff 100644 --- a/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java +++ b/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java @@ -1,18 +1,18 @@ package org.weekly.weekly.ui.reader; -import org.springframework.context.annotation.Primary; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import org.weekly.weekly.ui.exception.InputValidator; import java.util.Scanner; @Component -@Primary +@ConditionalOnProperty(value="command.read", havingValue = "scanner") public class ScannerWrap implements CommandReader{ private final Scanner scanner; public ScannerWrap() { - this.scanner = new Scanner(System.in); + System.out.println("scanner");this.scanner = new Scanner(System.in); } @Override diff --git a/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java b/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java index c6f2bea23e..f26b91797c 100644 --- a/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java +++ b/src/main/java/org/weekly/weekly/ui/writer/CommandWriter.java @@ -1,50 +1,11 @@ package org.weekly.weekly.ui.writer; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; import org.weekly.weekly.voucher.domain.DiscountType; -import org.weekly.weekly.util.PrintMessage; -import org.weekly.weekly.util.VoucherMenu; -import java.util.Arrays; - -@Component -public class CommandWriter { - private final Logger logger = LoggerFactory.getLogger(CommandWriter.class); - private void println(String msg) { - System.out.println(msg); - } - private void print(String msg) {System.out.print(msg);} - - public void printVoucherProgram() { - println(PrintMessage.EMPTY.getMessage()); - println(PrintMessage.PROGRAM.getMessage()); - Arrays.stream(VoucherMenu.values()) - .forEach(voucherMenu -> System.out.println(voucherMenu.getPrintMsg())); - } - - public void printErrorMsg(String errorMsg) { - logger.warn(errorMsg); - println(PrintMessage.EMPTY.getMessage()); - println(errorMsg); - } - - public void printCreateVoucher(DiscountType discountType) { - println(PrintMessage.EMPTY.getMessage()); - println(PrintMessage.CREATE_VOUCHER.getMessage() + discountType.getInputExampleMessage()); - print(PrintMessage.INPUT_MESSAGE.getMessage()); - } - - public void printSelectDiscount() { - println(PrintMessage.EMPTY.getMessage()); - println(PrintMessage.DISCOUNT_SELECT.getMessage()); - Arrays.stream(DiscountType.values()) - .forEach(discountMap -> System.out.println(discountMap.getSelectMessage())); - } - - public void printReuslt(String result) { - println(PrintMessage.EMPTY.getMessage()); - println(result); - } +public interface CommandWriter { + void printVoucherProgram(); + void printErrorMsg(String message); + void printCreateVoucher(DiscountType discountType); + void printSelectDiscount(); + void printReuslt(String result); } diff --git a/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java b/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java new file mode 100644 index 0000000000..d15e1192bd --- /dev/null +++ b/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java @@ -0,0 +1,52 @@ +package org.weekly.weekly.ui.writer; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; +import org.weekly.weekly.voucher.domain.DiscountType; +import org.weekly.weekly.util.PrintMessage; +import org.weekly.weekly.util.VoucherMenu; + +import java.util.Arrays; + +@Component +@ConditionalOnProperty(value="command.read", havingValue = "system") +public class SystemWriter implements CommandWriter { + private final Logger logger = LoggerFactory.getLogger(SystemWriter.class); + private void println(String msg) { + System.out.println(msg); + } + private void print(String msg) {System.out.print(msg);} + + public void printVoucherProgram() { + println(PrintMessage.EMPTY.getMessage()); + println(PrintMessage.PROGRAM.getMessage()); + Arrays.stream(VoucherMenu.values()) + .forEach(voucherMenu -> System.out.println(voucherMenu.getPrintMsg())); + } + + public void printErrorMsg(String errorMsg) { + logger.warn(errorMsg); + println(PrintMessage.EMPTY.getMessage()); + println(errorMsg); + } + + public void printCreateVoucher(DiscountType discountType) { + println(PrintMessage.EMPTY.getMessage()); + println(PrintMessage.CREATE_VOUCHER.getMessage() + discountType.getInputExampleMessage()); + print(PrintMessage.INPUT_MESSAGE.getMessage()); + } + + public void printSelectDiscount() { + println(PrintMessage.EMPTY.getMessage()); + println(PrintMessage.DISCOUNT_SELECT.getMessage()); + Arrays.stream(DiscountType.values()) + .forEach(discountMap -> System.out.println(discountMap.getSelectMessage())); + } + + public void printReuslt(String result) { + println(PrintMessage.EMPTY.getMessage()); + println(result); + } +} diff --git a/src/main/java/org/weekly/weekly/voucher/dto/response/VouchersResponse.java b/src/main/java/org/weekly/weekly/voucher/dto/response/VouchersResponse.java index f899d85559..5861700091 100644 --- a/src/main/java/org/weekly/weekly/voucher/dto/response/VouchersResponse.java +++ b/src/main/java/org/weekly/weekly/voucher/dto/response/VouchersResponse.java @@ -23,7 +23,7 @@ public String getResult() { StringBuilder resultBuilder = new StringBuilder(); - result.forEach(voucherResponse-> resultBuilder.append(voucherResponse.getResult())); + result.forEach(voucherResponse-> resultBuilder.append(voucherResponse.getResult()).append('\n')); return resultBuilder.toString(); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties deleted file mode 100644 index 8b13789179..0000000000 --- a/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml new file mode 100644 index 0000000000..3efb8f2ee5 --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,21 @@ +spring.config.activate.on-profile: default +command: + write: system + read: scanner + +--- + +spring.config.activate.on-profile: dev +command: + write: system + read: console + +--- + +spring.config.activate.on-profile: local +command: + write: system + read: buffer + +--- + From d7c6407a0f2e86eddb15a257f2030ee4b7e712e5 Mon Sep 17 00:00:00 2001 From: parksey Date: Tue, 4 Jul 2023 18:52:11 +0900 Subject: [PATCH 06/26] =?UTF-8?q?feat:=20db=EA=B4=80=EB=A0=A8=20=EC=9D=98?= =?UTF-8?q?=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\353\252\205\354\204\270\354\204\234.md" | 85 +++++++++++++++++++ docs/README.md | 3 +- pom.xml | 20 +++++ .../repository/MemoryVoucherRepository.java | 36 ++++++++ .../voucher/repository/VoucherRepository.java | 37 ++------ .../voucher/service/VoucherService.java | 6 +- src/main/resources/application.yaml | 18 +++- .../weekly/voucher/VoucherRepositoryTest.java | 9 ++ .../weekly/weekly/voucher/VoucherTest.java | 6 +- 9 files changed, 182 insertions(+), 38 deletions(-) create mode 100644 "docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" create mode 100644 src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java create mode 100644 src/test/java/org/weekly/weekly/voucher/VoucherRepositoryTest.java diff --git "a/docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" "b/docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" new file mode 100644 index 0000000000..e9258e3d08 --- /dev/null +++ "b/docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" @@ -0,0 +1,85 @@ +# 2주차 기능 명세서 + +## [요구사항] + +--- + +### 1.입력 +> CLI (Command linke inteface)한 환경에서 실행되도록 한다. + +[ 프로그램 실행 구문 ] +``` +=== Manage Program === +Type customer to select customer menu. +Type voucher to select customer menu. +Type exit to exit the program. +``` + +[ voucher 실행 구문 ] +``` +=== Voucher Manage === +Type exit to exit the program. +Type create to create a new voucher. +Type list to list all vouchers. +``` + +[ customer 실행 구문 ] +``` +=== Customer Manage === +Type exit to exit the program. +Type create to create a new customer. +Type list to list all customers. +``` + +### 입력 예외 추가 기능 +- 입력시 `양쪽 공백`은 `삭제` +- `대소문자 상관없이` 동일한 메뉴 이름이면 사용가능 + +### 2. 회원 +> `create`와 `list` 커맨드를 통해 회원를 생성 및 조회할 수 있다. + +- `create`: 회원 생성 +- `list`: 회원 조회 +- customers 테이블 정의 및 추가 + - CustomerRepository 추가 및 `JdbcTemplate`을 사용해서 구현 + - CRUD 모든 기능 추가 + + +## 3. 바우처 +- `JdbcTemplate`을 사용해서 구현 +- CRUD 모든 기능 추가 + +## 4. 바우처 지갑 (심화) +- 특정 고객에게 바우처를 할당할 수 있습니다. +- 고객이 어떤 바우처를 보유하고 있는지 조회할 수 있어야 합니다. +- 고객이 보유한 바우처를 제거할 수 있어야 합니다. +- 특정 바우처를 보유한 고객을 조회할 수 있어야 합니다. + +
+ +## 기능 + +--- + +### 1. 입력 +- [ ] 회원과 바우처 선택하는 기능 + +### 2. 바우처 +- [ ] JdbcTemplate를 사용하여 Repostiroy 관리 +- [ ] CRUD 기능 + +### 3. 회원 +- [ ] 회원 CRUD 기능 + - [ ] 회원 추가 + - [ ] 회원 삭제 + - [ ] 회원 업데이트 + - [ ] 회원 조회 +- [ ] JdbcTemplate를 사용하여 Repository 관리 + +### 4. 심화 +- 특정 고객에게 바우처를 할당할 수 있습니다. +- 고객이 어떤 바우처를 보유하고 있는지 조회할 수 있어야 합니다. +- 고객이 보유한 바우처를 제거할 수 있어야 합니다. +- 특정 바우처를 보유한 고객을 조회할 수 있어야 합니다. + + diff --git a/docs/README.md b/docs/README.md index 64979c406f..4d12d67ec3 100644 --- a/docs/README.md +++ b/docs/README.md @@ -34,7 +34,8 @@ Type list to list all vouchers. - 파일을 읽을 수 있고 리스트 조회 가능 -### 3. 기타 요구사항 + +### 기타 요구사항 - `YAML`프러퍼티를 만들고 어떤 설정을 만들 수 있을지 - 실행가능한 `jar`파일을 생성 - `logback`을 통한 에러 파일로 기록 diff --git a/pom.xml b/pom.xml index eed0ea226d..0ed121bb0d 100644 --- a/pom.xml +++ b/pom.xml @@ -28,6 +28,26 @@ spring-boot-starter-test test + + + org.springframework.boot + spring-boot-starter-jdbc + test + + + + com.h2database + h2 + runtime + + + + mysql + mysql-connector-java + 8.0.28 + + + diff --git a/src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java b/src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java new file mode 100644 index 0000000000..590b10974d --- /dev/null +++ b/src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java @@ -0,0 +1,36 @@ +package org.weekly.weekly.voucher.repository; + +import org.springframework.stereotype.Repository; +import org.weekly.weekly.util.ExceptionMsg; +import org.weekly.weekly.voucher.domain.Voucher; +import org.weekly.weekly.voucher.exception.VoucherException; + +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; + +@Repository +public class MemoryVoucherRepository implements VoucherRepository{ + private final Map storages = new ConcurrentHashMap<>(); + + public void insert(Voucher voucher) { + validateUUID(voucher.getVoucherId()); + storages.put(voucher.getVoucherId(), voucher); + } + + public Optional findById(UUID voucherId) { + return Optional.ofNullable(storages.get(voucherId)); + } + + public List findAll() { + return storages.values().stream() + .toList(); + } + + + private void validateUUID(UUID uuid) { + Optional voucherOptional = findById(uuid); + if (voucherOptional.isPresent()) { + throw new VoucherException(ExceptionMsg.VOUCHER_EXIST); + } + } +} diff --git a/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java b/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java index a958255c2c..def820b3c1 100644 --- a/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java +++ b/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java @@ -1,36 +1,13 @@ package org.weekly.weekly.voucher.repository; -import org.springframework.stereotype.Repository; -import org.weekly.weekly.util.ExceptionMsg; import org.weekly.weekly.voucher.domain.Voucher; -import org.weekly.weekly.voucher.exception.VoucherException; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; +import java.util.List; +import java.util.Optional; +import java.util.UUID; -@Repository -public class VoucherRepository { - private final Map storages = new ConcurrentHashMap<>(); - - public void insert(Voucher voucher) { - validateUUID(voucher.getVoucherId()); - storages.put(voucher.getVoucherId(), voucher); - } - - public Optional findById(UUID voucherId) { - return Optional.ofNullable(storages.get(voucherId)); - } - - public List findAll() { - return storages.values().stream() - .toList(); - } - - - private void validateUUID(UUID uuid) { - Optional voucherOptional = findById(uuid); - if (voucherOptional.isPresent()) { - throw new VoucherException(ExceptionMsg.VOUCHER_EXIST); - } - } +public interface VoucherRepository { + void insert(Voucher voucher); + Optional findById(UUID voucherId); + List findAll(); } diff --git a/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java b/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java index 3e789c7722..bd2ac23828 100644 --- a/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java +++ b/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java @@ -5,15 +5,15 @@ import org.weekly.weekly.voucher.dto.response.VoucherCreationResponse; import org.weekly.weekly.voucher.dto.response.VouchersResponse; import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; -import org.weekly.weekly.voucher.repository.VoucherRepository; +import org.weekly.weekly.voucher.repository.MemoryVoucherRepository; import java.util.List; @Service public class VoucherService { - private final VoucherRepository voucherRepository; + private final MemoryVoucherRepository voucherRepository; - public VoucherService(VoucherRepository voucherRepository) { + public VoucherService(MemoryVoucherRepository voucherRepository) { this.voucherRepository = voucherRepository; } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 3efb8f2ee5..5696969094 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -2,7 +2,12 @@ spring.config.activate.on-profile: default command: write: system read: scanner - +spring: + datasource: + driver-class-name: com.mysql.jdbc.Driver + url: jdbc:mysql://localhost:3306/voucher + username: "qwe" + password: "qwe123" --- spring.config.activate.on-profile: dev @@ -19,3 +24,14 @@ command: --- +spring.config.activate.on-profile: test +command: + write: system + read: scanner + +spring: + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:voucher + username: test + password: diff --git a/src/test/java/org/weekly/weekly/voucher/VoucherRepositoryTest.java b/src/test/java/org/weekly/weekly/voucher/VoucherRepositoryTest.java new file mode 100644 index 0000000000..51eb053ac4 --- /dev/null +++ b/src/test/java/org/weekly/weekly/voucher/VoucherRepositoryTest.java @@ -0,0 +1,9 @@ +package org.weekly.weekly.voucher; + + +import org.springframework.test.context.ActiveProfiles; + +@ActiveProfiles("test") +public class VoucherRepositoryTest { + +} diff --git a/src/test/java/org/weekly/weekly/voucher/VoucherTest.java b/src/test/java/org/weekly/weekly/voucher/VoucherTest.java index a18275e63b..d786525500 100644 --- a/src/test/java/org/weekly/weekly/voucher/VoucherTest.java +++ b/src/test/java/org/weekly/weekly/voucher/VoucherTest.java @@ -9,7 +9,7 @@ import org.weekly.weekly.voucher.domain.Voucher; import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; import org.weekly.weekly.voucher.dto.request.VoucherInfoRequest; -import org.weekly.weekly.voucher.repository.VoucherRepository; +import org.weekly.weekly.voucher.repository.MemoryVoucherRepository; import java.time.LocalDate; import java.util.UUID; @@ -17,11 +17,11 @@ import static org.assertj.core.api.Assertions.*; public class VoucherTest { - private VoucherRepository voucherRepository; + private MemoryVoucherRepository voucherRepository; @BeforeEach void setVoucherRepository() { - voucherRepository = new VoucherRepository(); + voucherRepository = new MemoryVoucherRepository(); } @ParameterizedTest From 30c2ff5ef9039b8199fb265976b7f127340d40da Mon Sep 17 00:00:00 2001 From: parksey Date: Wed, 5 Jul 2023 16:48:23 +0900 Subject: [PATCH 07/26] =?UTF-8?q?feat:=20=EC=8A=A4=ED=82=A4=EB=A7=88=20?= =?UTF-8?q?=EB=B0=8F=20=EC=84=A4=EC=A0=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 1 - .../weekly/VoucherManageApplication.java | 10 +++--- .../weekly/ui/CommandLineApplication.java | 4 +-- .../weekly/weekly/ui/reader/ScannerWrap.java | 2 +- .../weekly/weekly/ui/writer/SystemWriter.java | 5 +-- .../repository/JbdcVoucherRepository.java | 32 +++++++++++++++++ .../repository/MemoryVoucherRepository.java | 7 +++- .../voucher/service/VoucherService.java | 5 +-- src/main/resources/application.yaml | 16 +++++++-- src/main/resources/schema.sql | 36 +++++++++++++++++++ 10 files changed, 101 insertions(+), 17 deletions(-) create mode 100644 src/main/java/org/weekly/weekly/voucher/repository/JbdcVoucherRepository.java create mode 100644 src/main/resources/schema.sql diff --git a/pom.xml b/pom.xml index 0ed121bb0d..10ae02a2da 100644 --- a/pom.xml +++ b/pom.xml @@ -32,7 +32,6 @@ org.springframework.boot spring-boot-starter-jdbc - test diff --git a/src/main/java/org/weekly/weekly/VoucherManageApplication.java b/src/main/java/org/weekly/weekly/VoucherManageApplication.java index 50966722c7..701aa7bdc1 100644 --- a/src/main/java/org/weekly/weekly/VoucherManageApplication.java +++ b/src/main/java/org/weekly/weekly/VoucherManageApplication.java @@ -3,16 +3,16 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; -import org.weekly.weekly.ui.reader.ScannerWrap; + +import java.util.Arrays; @SpringBootApplication public class VoucherManageApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(VoucherManageApplication.class, args); - String read = context.getEnvironment().getProperty("command.read", String.class); - System.out.println(read); - -// context.getBean(VoucherManagementController.class).start(); + Arrays.stream(Arrays.deepToString(context.getBeanDefinitionNames()).split(",")) + .forEach(System.out::println); + context.getBean(VoucherManagementController.class).start(); } } \ No newline at end of file diff --git a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java index f2b236126c..2c187783b0 100644 --- a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java +++ b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java @@ -15,10 +15,10 @@ @Component public class CommandLineApplication { private final CommandReader commandReader; - private final CommandWriter commandWriter; + private final SystemWriter commandWriter; @Autowired - public CommandLineApplication(CommandReader commandReader, CommandWriter commandWriter) { + public CommandLineApplication(CommandReader commandReader, SystemWriter commandWriter) { this.commandReader = commandReader; this.commandWriter = commandWriter; } diff --git a/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java b/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java index 792861dcff..230b3d9199 100644 --- a/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java +++ b/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java @@ -12,7 +12,7 @@ public class ScannerWrap implements CommandReader{ private final Scanner scanner; public ScannerWrap() { - System.out.println("scanner");this.scanner = new Scanner(System.in); + this.scanner = new Scanner(System.in); } @Override diff --git a/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java b/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java index d15e1192bd..9aa20272b1 100644 --- a/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java +++ b/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java @@ -8,11 +8,12 @@ import org.weekly.weekly.util.PrintMessage; import org.weekly.weekly.util.VoucherMenu; +import java.io.Closeable; import java.util.Arrays; @Component -@ConditionalOnProperty(value="command.read", havingValue = "system") -public class SystemWriter implements CommandWriter { +@ConditionalOnProperty(value="command.write", havingValue = "system") +public class SystemWriter { private final Logger logger = LoggerFactory.getLogger(SystemWriter.class); private void println(String msg) { System.out.println(msg); diff --git a/src/main/java/org/weekly/weekly/voucher/repository/JbdcVoucherRepository.java b/src/main/java/org/weekly/weekly/voucher/repository/JbdcVoucherRepository.java new file mode 100644 index 0000000000..49c1f3b160 --- /dev/null +++ b/src/main/java/org/weekly/weekly/voucher/repository/JbdcVoucherRepository.java @@ -0,0 +1,32 @@ +package org.weekly.weekly.voucher.repository; + +import org.springframework.context.annotation.Profile; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; +import org.weekly.weekly.voucher.domain.Voucher; + +import javax.sql.DataSource; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Profile({"default", "local"}) +@Repository +public class JbdcVoucherRepository implements VoucherRepository{ + + @Override + public void insert(Voucher voucher) { + + } + + @Override + public Optional findById(UUID voucherId) { + return Optional.empty(); + } + + @Override + public List findAll() { + + return null; + } +} diff --git a/src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java b/src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java index 590b10974d..9c919a6957 100644 --- a/src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java +++ b/src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java @@ -1,13 +1,18 @@ package org.weekly.weekly.voucher.repository; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import org.weekly.weekly.util.ExceptionMsg; import org.weekly.weekly.voucher.domain.Voucher; import org.weekly.weekly.voucher.exception.VoucherException; -import java.util.*; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +@Profile("dev") @Repository public class MemoryVoucherRepository implements VoucherRepository{ private final Map storages = new ConcurrentHashMap<>(); diff --git a/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java b/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java index bd2ac23828..a7a37d773b 100644 --- a/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java +++ b/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java @@ -6,14 +6,15 @@ import org.weekly.weekly.voucher.dto.response.VouchersResponse; import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; import org.weekly.weekly.voucher.repository.MemoryVoucherRepository; +import org.weekly.weekly.voucher.repository.VoucherRepository; import java.util.List; @Service public class VoucherService { - private final MemoryVoucherRepository voucherRepository; + private final VoucherRepository voucherRepository; - public VoucherService(MemoryVoucherRepository voucherRepository) { + public VoucherService(VoucherRepository voucherRepository) { this.voucherRepository = voucherRepository; } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 5696969094..bca7234727 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -2,12 +2,18 @@ spring.config.activate.on-profile: default command: write: system read: scanner + spring: datasource: - driver-class-name: com.mysql.jdbc.Driver - url: jdbc:mysql://localhost:3306/voucher - username: "qwe" + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3306/voucher_mgmt?createDatabaseIfNotExist=true + username: "root" password: "qwe123" + + sql: + init: + mode: always + --- spring.config.activate.on-profile: dev @@ -35,3 +41,7 @@ spring: url: jdbc:h2:mem:voucher username: test password: + + sql: + init: + mode: embedded diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql new file mode 100644 index 0000000000..3feaae5819 --- /dev/null +++ b/src/main/resources/schema.sql @@ -0,0 +1,36 @@ + + +DROP TABLE IF EXISTS customers; +CREATE TABLE customers ( + customer_id BINARY(16) PRIMARY KEY, + name varchar(20) NOT NULL, + email varchar(50) NOT NULL, + last_login_at datetime(6) DEFAULT NULL, + create_at datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + CONSTRAINT unq_user_email UNIQUE (email) +); + +INSERT INTO customers(customer_id, name, email) +values (uuid_to_bin(UUID()), 'tester00', 'test00@gmail.com'); +INSERT INTO customers(customer_id, name, email) +values (uuid_to_bin(UUID()), 'tester01', 'test01@gmail.com'); +INSERT INTO customers(customer_id, name, email) +values (uuid_to_bin(UUID()), 'tester02', 'test02@gmail.com'); + + +DROP TABLE IF EXISTS vouchers; +CREATE TABLE vouchers ( + voucher_id BINARY(16) PRIMARY KEY, + amount bigint NOT NULL, + discount enum('FIXED', 'PERCENT') NOT NULL, + registration_date datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), + expiration_date datetime(6) NOT NULL +); + +INSERT INTO vouchers(voucher_id, amount, discount, expiration_date) +values (uuid_to_bin(UUID()), 50, 'PERCENT', CURRENT_TIMESTAMP(6) + 7); +INSERT INTO vouchers(voucher_id, amount, discount, expiration_date) +values (uuid_to_bin(UUID()), 100000, 'FIXED', CURRENT_TIMESTAMP(6) + 7); +INSERT INTO vouchers(voucher_id, amount, discount, expiration_date) +values (uuid_to_bin(UUID()), 80, 'PERCENT', CURRENT_TIMESTAMP(6) + 7); + From 30b77b0d13c052f4ae5c205952c05338300e4a84 Mon Sep 17 00:00:00 2001 From: parksey Date: Wed, 5 Jul 2023 17:34:52 +0900 Subject: [PATCH 08/26] =?UTF-8?q?fix:=20VoucherRepository=20insert=20?= =?UTF-8?q?=EB=B0=98=ED=99=98=EA=B0=92=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...cherRepository.java => JdbcVoucherRepository.java} | 11 ++++------- .../voucher/repository/MemoryVoucherRepository.java | 3 ++- .../weekly/voucher/repository/VoucherRepository.java | 2 +- ...sitoryTest.java => JdbcVoucherRepositoryTest.java} | 5 +++-- 4 files changed, 10 insertions(+), 11 deletions(-) rename src/main/java/org/weekly/weekly/voucher/repository/{JbdcVoucherRepository.java => JdbcVoucherRepository.java} (69%) rename src/test/java/org/weekly/weekly/voucher/{VoucherRepositoryTest.java => JdbcVoucherRepositoryTest.java} (50%) diff --git a/src/main/java/org/weekly/weekly/voucher/repository/JbdcVoucherRepository.java b/src/main/java/org/weekly/weekly/voucher/repository/JdbcVoucherRepository.java similarity index 69% rename from src/main/java/org/weekly/weekly/voucher/repository/JbdcVoucherRepository.java rename to src/main/java/org/weekly/weekly/voucher/repository/JdbcVoucherRepository.java index 49c1f3b160..8e38c1c5bd 100644 --- a/src/main/java/org/weekly/weekly/voucher/repository/JbdcVoucherRepository.java +++ b/src/main/java/org/weekly/weekly/voucher/repository/JdbcVoucherRepository.java @@ -1,22 +1,19 @@ package org.weekly.weekly.voucher.repository; import org.springframework.context.annotation.Profile; -import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import org.weekly.weekly.voucher.domain.Voucher; -import javax.sql.DataSource; import java.util.List; import java.util.Optional; import java.util.UUID; -@Profile({"default", "local"}) +@Profile("!dev") @Repository -public class JbdcVoucherRepository implements VoucherRepository{ - +public class JdbcVoucherRepository implements VoucherRepository{ @Override - public void insert(Voucher voucher) { - + public Voucher insert(Voucher voucher) { + return null; } @Override diff --git a/src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java b/src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java index 9c919a6957..cbcfc16a70 100644 --- a/src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java +++ b/src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java @@ -17,9 +17,10 @@ public class MemoryVoucherRepository implements VoucherRepository{ private final Map storages = new ConcurrentHashMap<>(); - public void insert(Voucher voucher) { + public Voucher insert(Voucher voucher) { validateUUID(voucher.getVoucherId()); storages.put(voucher.getVoucherId(), voucher); + return voucher; } public Optional findById(UUID voucherId) { diff --git a/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java b/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java index def820b3c1..00c5fa59c5 100644 --- a/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java +++ b/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java @@ -7,7 +7,7 @@ import java.util.UUID; public interface VoucherRepository { - void insert(Voucher voucher); + Voucher insert(Voucher voucher); Optional findById(UUID voucherId); List findAll(); } diff --git a/src/test/java/org/weekly/weekly/voucher/VoucherRepositoryTest.java b/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java similarity index 50% rename from src/test/java/org/weekly/weekly/voucher/VoucherRepositoryTest.java rename to src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java index 51eb053ac4..ec127af724 100644 --- a/src/test/java/org/weekly/weekly/voucher/VoucherRepositoryTest.java +++ b/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java @@ -1,9 +1,10 @@ package org.weekly.weekly.voucher; - +import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; @ActiveProfiles("test") -public class VoucherRepositoryTest { +@SpringBootTest +public class JdbcVoucherRepositoryTest { } From 4b977a2e4486b51391ed2daf816fc02308c538cb Mon Sep 17 00:00:00 2001 From: parksey Date: Wed, 5 Jul 2023 18:24:23 +0900 Subject: [PATCH 09/26] =?UTF-8?q?test:=20JdbcVoucherRepository=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/weekly/voucher/domain/Voucher.java | 4 + .../voucher/JdbcVoucherRepositoryTest.java | 118 +++++++++++++++++- 2 files changed, 121 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java b/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java index 34c70de709..d3bea1715a 100644 --- a/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java +++ b/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java @@ -68,4 +68,8 @@ public LocalDate getRegistrationDate() { public long getAmount() { return amount; } + + public DiscountType getDiscountType() { + return discount.discountType(); + } } diff --git a/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java b/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java index ec127af724..a7ac6f0aae 100644 --- a/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java +++ b/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java @@ -1,10 +1,126 @@ package org.weekly.weekly.voucher; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; +import org.weekly.weekly.voucher.domain.DiscountType; +import org.weekly.weekly.voucher.domain.Voucher; +import org.weekly.weekly.voucher.repository.JdbcVoucherRepository; + +import java.time.LocalDate; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; @ActiveProfiles("test") @SpringBootTest -public class JdbcVoucherRepositoryTest { +class JdbcVoucherRepositoryTest { + @Autowired + private JdbcVoucherRepository jdbcVoucherRepository; + + static Voucher fixedVoucher; + static Voucher percentVoucher; + + @BeforeAll + static void setUp() { + fixedVoucher = Voucher.of(UUID.randomUUID(), 10000, LocalDate.now(), 7, DiscountType.FIXED); + percentVoucher = Voucher.of(UUID.randomUUID(), 50, LocalDate.now(), 7, DiscountType.PERCENT); + } + + @Test + void 아이디를_통한_검색_실패_테스트() { + Optional voucher = jdbcVoucherRepository.findById(fixedVoucher.getVoucherId()); + assertThat(voucher.isEmpty(), is(true)); + } + + @Test + void 아이디를_통한_검색_성공_테스트() { + Optional voucher = jdbcVoucherRepository.findById(fixedVoucher.getVoucherId()); + assertThat(voucher.isPresent(), is(true)); + } + + @Test + void 할인정책을_통한_검색_테스트() { + List vouchers = jdbcVoucherRepository.findByDiscountType(percentVoucher); + + assertThat(vouchers.isEmpty(), is(false)); + + vouchers.stream() + .forEach(voucher -> assertThat(voucher.getDiscountType(), is(DiscountType.PERCENT))); + } + + @Test + void 전체_바우처_검색_테스트() { + List vouchers = jdbcVoucherRepository.findAll(); + + assertThat(vouchers.isEmpty(), is(false)); + } + + @Test + void 할인바우처_등록성공_테스트() { + Voucher voucher = jdbcVoucherRepository.insert(percentVoucher); + + Optional findVoucher = jdbcVoucherRepository.findById(percentVoucher.getVoucherId()); + + assertThat(findVoucher.isEmpty(), is(false)); + assertThat(findVoucher.get(), samePropertyValuesAs(voucher)); + } + + @Test + void 고정바우처_등록성공_테스트() { + Voucher voucher = jdbcVoucherRepository.insert(fixedVoucher); + + Optional findVoucher = jdbcVoucherRepository.findById(fixedVoucher.getVoucherId()); + + assertThat(findVoucher.isEmpty(), is(false)); + assertThat(findVoucher.get(), samePropertyValuesAs(voucher)); + } + + + @Test + void 바우처_정보_업데이트_테스트() { + // Given + jdbcVoucherRepository.insert(fixedVoucher); + + // When + long remain = fixedVoucher.applyDiscount(5000); + jdbcVoucherRepository.update(fixedVoucher); + Optional voucher = jdbcVoucherRepository.findById(fixedVoucher.getVoucherId()); + + // Then + assertThat(remain, is(5000)); + assertThat(voucher.isEmpty(), is(false)); + assertThat(voucher.get(), samePropertyValuesAs(fixedVoucher)); + + } + + @Test + void 바우처_삭제_테스트() { + // Given + Voucher voucher = jdbcVoucherRepository.insert(percentVoucher); + Optional findVoucher = jdbcVoucherRepository.findById(voucher.getVoucherId()); + assertThat(findVoucher.isPresent(), is(true)); + + // when + jdbcVoucherRepository.deleteById(voucher.getVoucherId()); + + // Then + Optional deleteVoucher = jdbcVoucherRepository.findById(voucher.getVoucherId()); + assertThat(deleteVoucher.isEmpty(), is(true)); + } + + @Test + void 전체_바우처_삭제_테스트() { + // Given + jdbcVoucherRepository.deleteAll(); + // when + List vouchers = jdbcVoucherRepository.findAll(); + assertThat(vouchers.isEmpty(), is(true)); + } } From 2d01fdff7d7262b56b8a269011d50197d0fdcdbb Mon Sep 17 00:00:00 2001 From: parksey Date: Thu, 6 Jul 2023 15:47:43 +0900 Subject: [PATCH 10/26] =?UTF-8?q?feat:=20Jdbc=EB=A5=BC=20=ED=86=B5?= =?UTF-8?q?=ED=95=9C=20Voucher=20dao=20=EA=B5=AC=ED=98=84=20(CRUD),=20Vouc?= =?UTF-8?q?her=20Repo=20=ED=86=B5=ED=95=A9=20=ED=85=8C=EC=8A=A4=ED=8A=B8?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 26 +++-- .../weekly/VoucherManageApplication.java | 1 - .../org/weekly/weekly/util/ExceptionMsg.java | 3 +- .../weekly/voucher/domain/DiscountType.java | 31 ++++-- .../weekly/weekly/voucher/domain/Voucher.java | 12 +-- .../repository/JdbcVoucherRepository.java | 99 ++++++++++++++++++- .../repository/MemoryVoucherRepository.java | 20 ++++ .../voucher/repository/VoucherRepository.java | 9 ++ src/main/resources/application.yaml | 11 --- .../voucher/JdbcVoucherRepositoryTest.java | 90 +++++++++++++---- 10 files changed, 243 insertions(+), 59 deletions(-) diff --git a/pom.xml b/pom.xml index 10ae02a2da..72e5a7a170 100644 --- a/pom.xml +++ b/pom.xml @@ -34,21 +34,33 @@ spring-boot-starter-jdbc - - com.h2database - h2 - runtime - - mysql mysql-connector-java 8.0.28 - + + org.testcontainers + testcontainers + 1.18.3 + test + + + org.testcontainers + junit-jupiter + 1.18.3 + test + + + org.testcontainers + mysql + 1.18.3 + test + + diff --git a/src/main/java/org/weekly/weekly/VoucherManageApplication.java b/src/main/java/org/weekly/weekly/VoucherManageApplication.java index 701aa7bdc1..3ce06fd2c1 100644 --- a/src/main/java/org/weekly/weekly/VoucherManageApplication.java +++ b/src/main/java/org/weekly/weekly/VoucherManageApplication.java @@ -10,7 +10,6 @@ public class VoucherManageApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(VoucherManageApplication.class, args); - Arrays.stream(Arrays.deepToString(context.getBeanDefinitionNames()).split(",")) .forEach(System.out::println); context.getBean(VoucherManagementController.class).start(); diff --git a/src/main/java/org/weekly/weekly/util/ExceptionMsg.java b/src/main/java/org/weekly/weekly/util/ExceptionMsg.java index c8a4b7da7d..e8950262b6 100644 --- a/src/main/java/org/weekly/weekly/util/ExceptionMsg.java +++ b/src/main/java/org/weekly/weekly/util/ExceptionMsg.java @@ -12,7 +12,8 @@ public enum ExceptionMsg { EXPIRATION_ERROR("유효기간이 등록기간보다 빠릅니다."), VOUCHER_EXIST("이미 존재하는 바우처입니다."), NOT_FOUND("해당 종류의 할인정보를 찾을 수 없습니다."), - NOT_SAME_PARAM_SIZE("입력 파라미터 개수가 맞지 않습니다."); + NOT_SAME_PARAM_SIZE("입력 파라미터 개수가 맞지 않습니다."), + SQL_ERROR("값을 가져오기 실패"); private String msg; diff --git a/src/main/java/org/weekly/weekly/voucher/domain/DiscountType.java b/src/main/java/org/weekly/weekly/voucher/domain/DiscountType.java index f4d59f6d74..d27a2b602f 100644 --- a/src/main/java/org/weekly/weekly/voucher/domain/DiscountType.java +++ b/src/main/java/org/weekly/weekly/voucher/domain/DiscountType.java @@ -1,7 +1,9 @@ package org.weekly.weekly.voucher.domain; import org.weekly.weekly.util.ExceptionMsg; +import org.weekly.weekly.voucher.exception.VoucherException; +import java.lang.reflect.InvocationTargetException; import java.util.Collections; import java.util.HashMap; import java.util.Map; @@ -10,10 +12,10 @@ public enum DiscountType { FIXED("1", FixedDiscount.class, "1. Fixed Discount", "바우처 할인 금액, 바우처 유효 개월 수"), PERCENT("2", PercentDiscount.class, "2. Percent Discount", "0~100사이의 바우처 할인율, 바우처 유효 개월 수"); - private String no; - private Class cls; - private String selectMessage; - private String inputExampleMessage; + private final String no; + private final Class cls; + private final String selectMessage; + private final String inputExampleMessage; private static final Map discuontTypeMap; @@ -36,17 +38,28 @@ public static DiscountType getDiscountTypeByNumber(String no) { if (discuontTypeMap.containsKey(no)) { return discuontTypeMap.get(no); } - throw new RuntimeException(ExceptionMsg.NOT_DISCOUNT.getMsg()); + throw new VoucherException(ExceptionMsg.NOT_DISCOUNT); } - public Discount getNewInstance() throws Exception { - return this.cls.getDeclaredConstructor().newInstance(); + public static DiscountType getDiscountTypeByName(String name) { + for (DiscountType discount : DiscountType.values()) { + if (name.equals(discount.name())) { + return discount; + } + } + throw new VoucherException(ExceptionMsg.NOT_DISCOUNT); } - public Class getCls() { - return cls; + public Discount getNewInstance() { + try { + return this.cls.getDeclaredConstructor().newInstance(); + } catch (NoSuchMethodException | InstantiationException | IllegalAccessException | InvocationTargetException exception) { + throw new VoucherException(ExceptionMsg.NOT_FOUND); + } + } + public String getSelectMessage() { return selectMessage; } diff --git a/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java b/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java index d3bea1715a..f5242f721f 100644 --- a/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java +++ b/src/main/java/org/weekly/weekly/voucher/domain/Voucher.java @@ -19,7 +19,8 @@ public class Voucher { private Discount discount; - private Voucher(UUID voucherId, long amount, LocalDate registrationDate, LocalDate expirationDate, Discount discount) { + + public Voucher(UUID voucherId, long amount, LocalDate registrationDate, LocalDate expirationDate, Discount discount) { this.voucherId = voucherId; this.amount = amount; this.registrationDate = registrationDate; @@ -29,12 +30,7 @@ private Voucher(UUID voucherId, long amount, LocalDate registrationDate, LocalDa public static Voucher of(UUID id, long amount, LocalDate now, long expiration, DiscountType discountType) { validation(now, expiration, discountType, amount); - - try { - return new Voucher(id, amount, now, now.plusMonths(expiration), discountType.getNewInstance()); - } catch (Exception exception) { - throw new VoucherException(ExceptionMsg.NOT_FOUND); - } + return new Voucher(id, amount, now, now.plusMonths(expiration), discountType.getNewInstance()); } private static void validation(LocalDate registrationDate, long expiration, DiscountType discountType, long amount) { @@ -49,7 +45,7 @@ public long applyDiscount(long beforeAmount) { return afterAmount; } - this.amount -= afterAmount; + this.amount += afterAmount; return 0L; } diff --git a/src/main/java/org/weekly/weekly/voucher/repository/JdbcVoucherRepository.java b/src/main/java/org/weekly/weekly/voucher/repository/JdbcVoucherRepository.java index 8e38c1c5bd..0e7505f927 100644 --- a/src/main/java/org/weekly/weekly/voucher/repository/JdbcVoucherRepository.java +++ b/src/main/java/org/weekly/weekly/voucher/repository/JdbcVoucherRepository.java @@ -1,9 +1,20 @@ package org.weekly.weekly.voucher.repository; import org.springframework.context.annotation.Profile; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; +import org.weekly.weekly.util.ExceptionMsg; +import org.weekly.weekly.voucher.domain.DiscountType; import org.weekly.weekly.voucher.domain.Voucher; +import org.weekly.weekly.voucher.exception.VoucherException; +import javax.sql.DataSource; +import java.nio.ByteBuffer; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.time.LocalDate; import java.util.List; import java.util.Optional; import java.util.UUID; @@ -11,19 +22,97 @@ @Profile("!dev") @Repository public class JdbcVoucherRepository implements VoucherRepository{ - @Override - public Voucher insert(Voucher voucher) { - return null; + private final JdbcTemplate jdbcTemplate; + + public JdbcVoucherRepository(DataSource dataSource) { + jdbcTemplate = new JdbcTemplate(dataSource); } @Override public Optional findById(UUID voucherId) { - return Optional.empty(); + String sql = "SELECT * FROM vouchers WHERE voucher_id = UUID_TO_BIN(?)"; + try { + return Optional.ofNullable(jdbcTemplate.queryForObject(sql, (rs, rowNum) -> mapToVoucher(rs), uuidToBytes(voucherId))); + } catch (EmptyResultDataAccessException e) { + return Optional.empty(); + } } @Override public List findAll() { + String sql = "SELECT * FROM vouchers"; + return jdbcTemplate.query(sql, (rs, rowNum) -> mapToVoucher(rs)); + } + + @Override + public List findByDiscountType(DiscountType discountType) { + String sql = "SELECT * FROM vouchers WHERE discount = ?"; + return jdbcTemplate.query(sql, (rs, rowNum) -> mapToVoucher(rs), discountType.name()); + } + + @Override + public Voucher insert(Voucher voucher) { + String sql = "INSERT INTO vouchers(voucher_id, amount, discount, registration_date, expiration_date) VALUES (UUID_TO_BIN(?), ?, ?, ?, ?)"; + + int update = jdbcTemplate.update(sql, + uuidToBytes(voucher.getVoucherId()), + voucher.getAmount(), + voucher.getDiscountType().name(), + Timestamp.valueOf(voucher.getRegistrationDate().atStartOfDay()), + Timestamp.valueOf(voucher.getExpirationDate().atStartOfDay())); + + if (update != 1) { + throw new VoucherException(ExceptionMsg.SQL_ERROR); + } + return voucher; + } + + @Override + public Voucher update(Voucher voucher) { + String sql = "UPDATE vouchers SET amount = ?, discount = ?, expiration_date = ? WHERE voucher_id = UUID_TO_BIN(?)"; - return null; + int update = jdbcTemplate.update(sql, + voucher.getAmount(), + voucher.getDiscountType().name(), + Timestamp.valueOf(voucher.getExpirationDate().atStartOfDay()), + uuidToBytes(voucher.getVoucherId())); + if (update != 1) { + throw new VoucherException(ExceptionMsg.SQL_ERROR); + } + return voucher; } + + @Override + public void deleteById(UUID voucherId) { + String sql = "DELETE FROM vouchers WHERE voucher_id = UUID_TO_BIN(?)"; + jdbcTemplate.update(sql, uuidToBytes(voucherId)); + } + + @Override + public void deleteAll() { + String sql = "DELETE FROM vouchers"; + jdbcTemplate.update(sql); + } + + public static UUID toUUID(byte[] bytes) { + var buffer = ByteBuffer.wrap(bytes); + return new UUID(buffer.getLong(), buffer.getLong()); + } + + private byte[] uuidToBytes(UUID voucherId) { + return voucherId.toString().getBytes(); + } + + private Voucher mapToVoucher(ResultSet resultSet) throws SQLException { + UUID voucherId = toUUID(resultSet.getBytes("voucher_id")); + long amount = resultSet.getLong("amount"); + DiscountType discountType = DiscountType.getDiscountTypeByName(resultSet.getString("discount")); + LocalDate registrationDate = resultSet.getTimestamp("registration_date") == null ? null : resultSet.getTimestamp("registration_date").toLocalDateTime().toLocalDate(); + LocalDate expirationDate = resultSet.getTimestamp("expiration_date") == null ? null : resultSet.getTimestamp("expiration_date").toLocalDateTime().toLocalDate(); + + return new Voucher(voucherId,amount, registrationDate, expirationDate, discountType.getNewInstance()); + } + + + } diff --git a/src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java b/src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java index cbcfc16a70..e1b8d1bc70 100644 --- a/src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java +++ b/src/main/java/org/weekly/weekly/voucher/repository/MemoryVoucherRepository.java @@ -3,6 +3,7 @@ import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; import org.weekly.weekly.util.ExceptionMsg; +import org.weekly.weekly.voucher.domain.DiscountType; import org.weekly.weekly.voucher.domain.Voucher; import org.weekly.weekly.voucher.exception.VoucherException; @@ -32,6 +33,25 @@ public List findAll() { .toList(); } + @Override + public List findByDiscountType(DiscountType discountType) { + return null; + } + + @Override + public Voucher update(Voucher voucher) { + return null; + } + + @Override + public void deleteById(UUID voucherId) { + + } + + @Override + public void deleteAll() { + + } private void validateUUID(UUID uuid) { Optional voucherOptional = findById(uuid); diff --git a/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java b/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java index 00c5fa59c5..0e794a4f2f 100644 --- a/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java +++ b/src/main/java/org/weekly/weekly/voucher/repository/VoucherRepository.java @@ -1,5 +1,6 @@ package org.weekly.weekly.voucher.repository; +import org.weekly.weekly.voucher.domain.DiscountType; import org.weekly.weekly.voucher.domain.Voucher; import java.util.List; @@ -10,4 +11,12 @@ public interface VoucherRepository { Voucher insert(Voucher voucher); Optional findById(UUID voucherId); List findAll(); + + List findByDiscountType(DiscountType discountType); + + Voucher update(Voucher voucher); + + void deleteById(UUID voucherId); + + void deleteAll(); } diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index bca7234727..f8975c60ef 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -34,14 +34,3 @@ spring.config.activate.on-profile: test command: write: system read: scanner - -spring: - datasource: - driver-class-name: org.h2.Driver - url: jdbc:h2:mem:voucher - username: test - password: - - sql: - init: - mode: embedded diff --git a/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java b/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java index a7ac6f0aae..d1cfe7423d 100644 --- a/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java +++ b/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java @@ -1,10 +1,17 @@ package org.weekly.weekly.voucher; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.*; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.testcontainers.containers.MySQLContainer; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; import org.weekly.weekly.voucher.domain.DiscountType; import org.weekly.weekly.voucher.domain.Voucher; import org.weekly.weekly.voucher.repository.JdbcVoucherRepository; @@ -18,35 +25,68 @@ import static org.hamcrest.Matchers.*; @ActiveProfiles("test") +@Testcontainers +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) @SpringBootTest class JdbcVoucherRepositoryTest { + @Container + static MySQLContainer mySQLContainer = (MySQLContainer) new MySQLContainer("mysql:8") + .withInitScript("schema.sql"); + + @DynamicPropertySource + public static void overrideContainerProperties(DynamicPropertyRegistry dynamicPropertyRegistry) { + System.out.println(mySQLContainer.getJdbcUrl()); + System.out.println(mySQLContainer.getHost()); + System.out.println(mySQLContainer.getUsername()); + System.out.println(mySQLContainer.getPassword()); + System.out.println(mySQLContainer.getDriverClassName()); + System.out.println(mySQLContainer.getContainerName()); + System.out.println(mySQLContainer.getDatabaseName()); + dynamicPropertyRegistry.add("spring.datasource.url",mySQLContainer::getJdbcUrl); + dynamicPropertyRegistry.add("spring.datasource.username",mySQLContainer::getUsername); + dynamicPropertyRegistry.add("spring.datasource.password",mySQLContainer::getPassword); + } + @Autowired private JdbcVoucherRepository jdbcVoucherRepository; + static Voucher fixedVoucher; static Voucher percentVoucher; - @BeforeAll - static void setUp() { + @BeforeEach + void setUp() { fixedVoucher = Voucher.of(UUID.randomUUID(), 10000, LocalDate.now(), 7, DiscountType.FIXED); percentVoucher = Voucher.of(UUID.randomUUID(), 50, LocalDate.now(), 7, DiscountType.PERCENT); } @Test + @Order(1) + void 전체_바우처_검색_테스트() { + List vouchers = jdbcVoucherRepository.findAll(); + assertThat(vouchers.isEmpty(), is(false)); + + vouchers.stream().forEach(voucher -> System.out.println(voucher.getDiscountType().name())); + } + + @Test + @Order(1) void 아이디를_통한_검색_실패_테스트() { Optional voucher = jdbcVoucherRepository.findById(fixedVoucher.getVoucherId()); assertThat(voucher.isEmpty(), is(true)); } @Test + @Order(1) void 아이디를_통한_검색_성공_테스트() { Optional voucher = jdbcVoucherRepository.findById(fixedVoucher.getVoucherId()); - assertThat(voucher.isPresent(), is(true)); + assertThat(voucher.isPresent(), is(false)); } @Test + @Order(1) void 할인정책을_통한_검색_테스트() { - List vouchers = jdbcVoucherRepository.findByDiscountType(percentVoucher); + List vouchers = jdbcVoucherRepository.findByDiscountType(percentVoucher.getDiscountType()); assertThat(vouchers.isEmpty(), is(false)); @@ -55,13 +95,7 @@ static void setUp() { } @Test - void 전체_바우처_검색_테스트() { - List vouchers = jdbcVoucherRepository.findAll(); - - assertThat(vouchers.isEmpty(), is(false)); - } - - @Test + @Order(2) void 할인바우처_등록성공_테스트() { Voucher voucher = jdbcVoucherRepository.insert(percentVoucher); @@ -72,6 +106,7 @@ static void setUp() { } @Test + @Order(2) void 고정바우처_등록성공_테스트() { Voucher voucher = jdbcVoucherRepository.insert(fixedVoucher); @@ -82,24 +117,44 @@ static void setUp() { } - @Test - void 바우처_정보_업데이트_테스트() { + @ParameterizedTest + @CsvSource({"5000, 0", "15000, 5000"}) + @Order(3) + void 고정바우처_정보_업데이트_테스트(int amount, long reaminExpected) { // Given jdbcVoucherRepository.insert(fixedVoucher); // When - long remain = fixedVoucher.applyDiscount(5000); + long remain = fixedVoucher.applyDiscount(amount); jdbcVoucherRepository.update(fixedVoucher); Optional voucher = jdbcVoucherRepository.findById(fixedVoucher.getVoucherId()); // Then - assertThat(remain, is(5000)); + assertThat(remain, is(reaminExpected)); assertThat(voucher.isEmpty(), is(false)); assertThat(voucher.get(), samePropertyValuesAs(fixedVoucher)); + } + @ParameterizedTest + @CsvSource({"3000, 1500", "1000, 500"}) + @Order(3) + void 퍼센트바우처_정보_업데이트_테스트(int amount, long reaminExpected) { + // Given + jdbcVoucherRepository.insert(percentVoucher); + + // When + long remain = percentVoucher.applyDiscount(amount); + jdbcVoucherRepository.update(percentVoucher); + Optional voucher = jdbcVoucherRepository.findById(percentVoucher.getVoucherId()); + + // Then + assertThat(remain, is(reaminExpected)); + assertThat(voucher.isEmpty(), is(false)); + assertThat(voucher.get(), samePropertyValuesAs(percentVoucher)); } @Test + @Order(4) void 바우처_삭제_테스트() { // Given Voucher voucher = jdbcVoucherRepository.insert(percentVoucher); @@ -115,6 +170,7 @@ static void setUp() { } @Test + @Order(5) void 전체_바우처_삭제_테스트() { // Given jdbcVoucherRepository.deleteAll(); From 59ff2d279f0669016220df909378ee5a0dbbd59c Mon Sep 17 00:00:00 2001 From: parksey Date: Thu, 6 Jul 2023 17:37:34 +0900 Subject: [PATCH 11/26] =?UTF-8?q?test:=20Customer=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\353\252\205\354\204\270\354\204\234.md" | 4 ++-- src/main/resources/schema.sql | 8 +++---- .../weekly/weekly/customer/CustomerTest.java | 24 +++++++++++++++++++ .../voucher/JdbcVoucherRepositoryTest.java | 7 ------ 4 files changed, 30 insertions(+), 13 deletions(-) create mode 100644 src/test/java/org/weekly/weekly/customer/CustomerTest.java diff --git "a/docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" "b/docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" index e9258e3d08..ede291b3c0 100644 --- "a/docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" +++ "b/docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" @@ -65,8 +65,8 @@ Type list to list all customers. - [ ] 회원과 바우처 선택하는 기능 ### 2. 바우처 -- [ ] JdbcTemplate를 사용하여 Repostiroy 관리 -- [ ] CRUD 기능 +- [x] JdbcTemplate를 사용하여 Repostiroy 관리 +- [x] CRUD 기능 ### 3. 회원 - [ ] 회원 CRUD 기능 diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 3feaae5819..cced88071b 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -1,11 +1,8 @@ - - DROP TABLE IF EXISTS customers; CREATE TABLE customers ( customer_id BINARY(16) PRIMARY KEY, name varchar(20) NOT NULL, email varchar(50) NOT NULL, - last_login_at datetime(6) DEFAULT NULL, create_at datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), CONSTRAINT unq_user_email UNIQUE (email) ); @@ -24,7 +21,10 @@ CREATE TABLE vouchers ( amount bigint NOT NULL, discount enum('FIXED', 'PERCENT') NOT NULL, registration_date datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), - expiration_date datetime(6) NOT NULL + expiration_date datetime(6) NOT NULL, + + customer_id BINARY(16) not null, + FOREIGN KEY (customer_id) REFERENCES customers(customer_id) ); INSERT INTO vouchers(voucher_id, amount, discount, expiration_date) diff --git a/src/test/java/org/weekly/weekly/customer/CustomerTest.java b/src/test/java/org/weekly/weekly/customer/CustomerTest.java new file mode 100644 index 0000000000..f8e5cef25a --- /dev/null +++ b/src/test/java/org/weekly/weekly/customer/CustomerTest.java @@ -0,0 +1,24 @@ +package org.weekly.weekly.customer; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +public class CustomerTest { + + @Test + void 회원생성_성공_테스트() { + Customer customer = new Customer(UUID.randomUUID(), "hello", "email@gmail.com"); + + } + + @ParameterizedTest + @ValueSource(strings = {"123", "123@", "213@n", "abc@naver.", "abc@naver.c", "abc@naver.comc"}) + void 회원생성_실패_테스트(String email) { + assertThatThrownBy(()->Customer.of(UUID.randomUUID(), "hello", email)).isInstanceOf(CustomerException.class); + } +} diff --git a/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java b/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java index d1cfe7423d..a26545ec2d 100644 --- a/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java +++ b/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java @@ -35,13 +35,6 @@ class JdbcVoucherRepositoryTest { @DynamicPropertySource public static void overrideContainerProperties(DynamicPropertyRegistry dynamicPropertyRegistry) { - System.out.println(mySQLContainer.getJdbcUrl()); - System.out.println(mySQLContainer.getHost()); - System.out.println(mySQLContainer.getUsername()); - System.out.println(mySQLContainer.getPassword()); - System.out.println(mySQLContainer.getDriverClassName()); - System.out.println(mySQLContainer.getContainerName()); - System.out.println(mySQLContainer.getDatabaseName()); dynamicPropertyRegistry.add("spring.datasource.url",mySQLContainer::getJdbcUrl); dynamicPropertyRegistry.add("spring.datasource.username",mySQLContainer::getUsername); dynamicPropertyRegistry.add("spring.datasource.password",mySQLContainer::getPassword); From 9b020b20c82ecc1bf24215085ecc3bbde19d4be7 Mon Sep 17 00:00:00 2001 From: parksey Date: Thu, 6 Jul 2023 18:18:00 +0900 Subject: [PATCH 12/26] =?UTF-8?q?feat:=20Customer=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/customer/domain/Customer.java | 25 +++++++++++++++++++ .../customer/exception/CustomerException.java | 9 +++++++ .../customer/exception/CustomerValidator.java | 14 +++++++++++ .../org/weekly/weekly/util/ExceptionMsg.java | 1 + .../weekly/weekly/customer/CustomerTest.java | 9 ++++--- 5 files changed, 55 insertions(+), 3 deletions(-) create mode 100644 src/main/java/org/weekly/weekly/customer/domain/Customer.java create mode 100644 src/main/java/org/weekly/weekly/customer/exception/CustomerException.java create mode 100644 src/main/java/org/weekly/weekly/customer/exception/CustomerValidator.java diff --git a/src/main/java/org/weekly/weekly/customer/domain/Customer.java b/src/main/java/org/weekly/weekly/customer/domain/Customer.java new file mode 100644 index 0000000000..1bbd3bf21e --- /dev/null +++ b/src/main/java/org/weekly/weekly/customer/domain/Customer.java @@ -0,0 +1,25 @@ +package org.weekly.weekly.customer.domain; + +import org.weekly.weekly.customer.exception.CustomerValidator; + +import java.time.LocalDateTime; +import java.util.UUID; + +public class Customer { + UUID uuid; + String name; + String email; + LocalDateTime createAt; + + private Customer(UUID uuid, String name, String email) { + this.uuid = uuid; + this.name = name; + this.email = email; + } + + public static Customer of(UUID uuid, String name, String email) { + CustomerValidator.validateEmailFormat(email); + return new Customer(uuid, name, email); + } + +} diff --git a/src/main/java/org/weekly/weekly/customer/exception/CustomerException.java b/src/main/java/org/weekly/weekly/customer/exception/CustomerException.java new file mode 100644 index 0000000000..cfda9e7fa5 --- /dev/null +++ b/src/main/java/org/weekly/weekly/customer/exception/CustomerException.java @@ -0,0 +1,9 @@ +package org.weekly.weekly.customer.exception; + +import org.weekly.weekly.util.ExceptionMsg; + +public class CustomerException extends RuntimeException{ + public CustomerException(ExceptionMsg exceptionMsg) { + super(exceptionMsg.getMsg()); + } +} diff --git a/src/main/java/org/weekly/weekly/customer/exception/CustomerValidator.java b/src/main/java/org/weekly/weekly/customer/exception/CustomerValidator.java new file mode 100644 index 0000000000..fadc923b3e --- /dev/null +++ b/src/main/java/org/weekly/weekly/customer/exception/CustomerValidator.java @@ -0,0 +1,14 @@ +package org.weekly.weekly.customer.exception; + +import org.weekly.weekly.util.ExceptionMsg; + +import java.util.regex.Pattern; + +public class CustomerValidator { + private static final String EMAIL_FORMAT = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,3}$"; + public static void validateEmailFormat(String email) { + if (!Pattern.matches(EMAIL_FORMAT, email)) { + throw new CustomerException(ExceptionMsg.NOT_EMAIL_FORMAT); + } + } +} diff --git a/src/main/java/org/weekly/weekly/util/ExceptionMsg.java b/src/main/java/org/weekly/weekly/util/ExceptionMsg.java index e8950262b6..ad6d0242f2 100644 --- a/src/main/java/org/weekly/weekly/util/ExceptionMsg.java +++ b/src/main/java/org/weekly/weekly/util/ExceptionMsg.java @@ -13,6 +13,7 @@ public enum ExceptionMsg { VOUCHER_EXIST("이미 존재하는 바우처입니다."), NOT_FOUND("해당 종류의 할인정보를 찾을 수 없습니다."), NOT_SAME_PARAM_SIZE("입력 파라미터 개수가 맞지 않습니다."), + NOT_EMAIL_FORMAT("이메일형식이 아닙니다."), SQL_ERROR("값을 가져오기 실패"); private String msg; diff --git a/src/test/java/org/weekly/weekly/customer/CustomerTest.java b/src/test/java/org/weekly/weekly/customer/CustomerTest.java index f8e5cef25a..a809768083 100644 --- a/src/test/java/org/weekly/weekly/customer/CustomerTest.java +++ b/src/test/java/org/weekly/weekly/customer/CustomerTest.java @@ -3,22 +3,25 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; +import org.weekly.weekly.customer.domain.Customer; +import org.weekly.weekly.customer.exception.CustomerException; import java.util.UUID; +import static org.hamcrest.MatcherAssert.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.hamcrest.Matchers.*; public class CustomerTest { @Test void 회원생성_성공_테스트() { - Customer customer = new Customer(UUID.randomUUID(), "hello", "email@gmail.com"); - + assertThat(Customer.of(UUID.randomUUID(), "hello", "email@gmail.com"), instanceOf(Customer.class)); } @ParameterizedTest @ValueSource(strings = {"123", "123@", "213@n", "abc@naver.", "abc@naver.c", "abc@naver.comc"}) void 회원생성_실패_테스트(String email) { - assertThatThrownBy(()->Customer.of(UUID.randomUUID(), "hello", email)).isInstanceOf(CustomerException.class); + assertThatThrownBy(()-> Customer.of(UUID.randomUUID(), "hello", email)).isInstanceOf(CustomerException.class); } } From 1be3ab2e18fdc9fad30b1170895a4d8424ef141c Mon Sep 17 00:00:00 2001 From: parksey Date: Fri, 7 Jul 2023 10:51:10 +0900 Subject: [PATCH 13/26] =?UTF-8?q?feat:=20Customer=EC=99=80=20Voucher?= =?UTF-8?q?=EB=A9=94=EB=89=B4=20=EC=84=A0=ED=83=9D=20=EB=B6=84=EA=B8=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/VoucherManageApplication.java | 2 - .../weekly/VoucherManagementController.java | 64 +++++++++++++++++-- .../weekly/ui/CommandLineApplication.java | 35 +++++++++- .../weekly/weekly/ui/reader/ScannerWrap.java | 2 +- .../org/weekly/weekly/util/CustomerMenu.java | 36 +++++++++++ .../org/weekly/weekly/util/ManageMenu.java | 35 ++++++++++ .../java/org/weekly/weekly/util/Menu.java | 4 ++ .../org/weekly/weekly/util/VoucherMenu.java | 17 ++--- 8 files changed, 176 insertions(+), 19 deletions(-) create mode 100644 src/main/java/org/weekly/weekly/util/CustomerMenu.java create mode 100644 src/main/java/org/weekly/weekly/util/ManageMenu.java create mode 100644 src/main/java/org/weekly/weekly/util/Menu.java diff --git a/src/main/java/org/weekly/weekly/VoucherManageApplication.java b/src/main/java/org/weekly/weekly/VoucherManageApplication.java index 3ce06fd2c1..0e418c8a07 100644 --- a/src/main/java/org/weekly/weekly/VoucherManageApplication.java +++ b/src/main/java/org/weekly/weekly/VoucherManageApplication.java @@ -10,8 +10,6 @@ public class VoucherManageApplication { public static void main(String[] args) { ApplicationContext context = SpringApplication.run(VoucherManageApplication.class, args); - Arrays.stream(Arrays.deepToString(context.getBeanDefinitionNames()).split(",")) - .forEach(System.out::println); context.getBean(VoucherManagementController.class).start(); } } \ No newline at end of file diff --git a/src/main/java/org/weekly/weekly/VoucherManagementController.java b/src/main/java/org/weekly/weekly/VoucherManagementController.java index 1e2f31e434..7d8ebff0b6 100644 --- a/src/main/java/org/weekly/weekly/VoucherManagementController.java +++ b/src/main/java/org/weekly/weekly/VoucherManagementController.java @@ -4,6 +4,8 @@ import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.weekly.weekly.ui.CommandLineApplication; +import org.weekly.weekly.util.CustomerMenu; +import org.weekly.weekly.util.ManageMenu; import org.weekly.weekly.util.PrintMessage; import org.weekly.weekly.util.VoucherMenu; import org.weekly.weekly.voucher.controller.VoucherController; @@ -26,15 +28,29 @@ public void start() { while(!isExit) { try { - VoucherMenu voucherMenu = this.commandLineApplication.readMenu(); - isExit = processMenuSelection(voucherMenu); + ManageMenu manageMenu = this.commandLineApplication.readMenu(); + isExit = processManageMenuSelection(manageMenu); } catch (RuntimeException runtimeException) { this.commandLineApplication.printErrorMsg(runtimeException.getMessage()); } } } - private boolean processMenuSelection(VoucherMenu selectMenu) { + private boolean processManageMenuSelection(ManageMenu manageMenu) { + if (ManageMenu.VOUCHER.equals(manageMenu)) { + VoucherMenu voucherMenu = this.commandLineApplication.readVoucherMenu(); + return processVoucherMenuSelection(voucherMenu); + } + + if (ManageMenu.CUSTOMER.equals(manageMenu)){ + CustomerMenu customerMenu = this.commandLineApplication.readCustomerMenu(); + return processCustomerMenuSelection(customerMenu); + } + + return true; + } + + private boolean processVoucherMenuSelection(VoucherMenu selectMenu) { if (VoucherMenu.CREATE.equals(selectMenu)) { handleVoucherCreation(); return false; @@ -45,7 +61,7 @@ private boolean processMenuSelection(VoucherMenu selectMenu) { return false; } - return false; + return true; } private void handleVoucherCreation() { @@ -60,4 +76,44 @@ private void handleVoucherSearch() { logger.info("{}{}", PrintMessage.FIND_ALL_VOUCHER_SUCCESS.getMessage(), response.getResult()); this.commandLineApplication.printResult(response); } + + private boolean processCustomerMenuSelection(CustomerMenu selectMenu) { + if (CustomerMenu.CREATE.equals(selectMenu)) { + handleCustomerCreation(); + return false; + } + + if (CustomerMenu.DELETE.equals(selectMenu)) { + handleCustomerDelete(); + return false; + } + + if (CustomerMenu.SEARCH_ALL.equals(selectMenu)) { + handleCustomerSearchAll(); + return false; + } + + if (CustomerMenu.SEARCH_DETAIL_TO_EMAIL.equals(selectMenu)) { + handleSearchDetail(); + } + + return true; + } + + private void handleCustomerCreation() { + this.commandLineApplication.createCustomerFromInput(); + } + + private void handleCustomerDelete() { + this.commandLineApplication.deleteCustomerFromInput(); + } + + private void handleCustomerSearchAll() { + + } + + private void handleSearchDetail() { + + } + } diff --git a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java index 2c187783b0..e5060c968d 100644 --- a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java +++ b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java @@ -4,8 +4,9 @@ import org.springframework.stereotype.Component; import org.weekly.weekly.ui.exception.InputValidator; import org.weekly.weekly.ui.reader.CommandReader; -import org.weekly.weekly.ui.writer.CommandWriter; import org.weekly.weekly.ui.writer.SystemWriter; +import org.weekly.weekly.util.CustomerMenu; +import org.weekly.weekly.util.ManageMenu; import org.weekly.weekly.voucher.domain.DiscountType; import org.weekly.weekly.util.VoucherMenu; import org.weekly.weekly.voucher.dto.Response; @@ -23,7 +24,18 @@ public CommandLineApplication(CommandReader commandReader, SystemWriter commandW this.commandWriter = commandWriter; } - public VoucherMenu readMenu() { + public ManageMenu readMenu() { + while(true) { + try { + this.commandWriter.printVoucherProgram(); + return ManageMenu.getMenu(readUserInput()); + } catch (Exception exception) { + printErrorMsg(exception.getMessage()); + } + } + } + + public VoucherMenu readVoucherMenu() { while(true) { try { this.commandWriter.printVoucherProgram(); @@ -34,6 +46,17 @@ public VoucherMenu readMenu() { } } + public CustomerMenu readCustomerMenu() { + while(true) { + try { + this.commandWriter.printVoucherProgram(); + return CustomerMenu.getMenu(readUserInput()); + } catch (Exception exception) { + printErrorMsg(exception.getMessage()); + } + } + } + public VoucherCreationRequest createVoucherFromInput() { while(true) { try { @@ -46,6 +69,14 @@ public VoucherCreationRequest createVoucherFromInput() { } } + public void createCustomerFromInput() { + + } + + public void deleteCustomerFromInput() { + + } + public void printErrorMsg(String errorMsg) { this.commandWriter.printErrorMsg(errorMsg); } diff --git a/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java b/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java index 230b3d9199..87ea44d34a 100644 --- a/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java +++ b/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java @@ -19,7 +19,7 @@ public ScannerWrap() { public String readLine() { String userInput = this.scanner.nextLine().trim(); checkException(userInput); - return userInput.toLowerCase(); + return userInput.toUpperCase(); } private void checkException(String userInput) { diff --git a/src/main/java/org/weekly/weekly/util/CustomerMenu.java b/src/main/java/org/weekly/weekly/util/CustomerMenu.java new file mode 100644 index 0000000000..2fb50345ee --- /dev/null +++ b/src/main/java/org/weekly/weekly/util/CustomerMenu.java @@ -0,0 +1,36 @@ +package org.weekly.weekly.util; + +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public enum CustomerMenu implements Menu { + EXIT("Type exit to exit the program."), + CREATE("Type create to create a new voucher."), + DELETE("Type list to list all vouchers."), + SEARCH_ALL("Type: search all 모든 유저 검색"), + SEARCH_DETAIL_TO_EMAIL("Type: search detail to email 유저 상세 검색"); + + private final String printMessage; + private static final Map CUSTOMER_MENU_MAP; + static { + CUSTOMER_MENU_MAP = new ConcurrentHashMap<>(); + Arrays.stream(CustomerMenu.values()) + .peek(customerMenu -> CUSTOMER_MENU_MAP.put(customerMenu.name(), customerMenu)); + } + + CustomerMenu(String printMessage) { + this.printMessage = printMessage; + } + + public static CustomerMenu getMenu(String userInput) { + if (CUSTOMER_MENU_MAP.containsKey(userInput)) { + return CUSTOMER_MENU_MAP.get(userInput); + } + throw new RuntimeException(ExceptionMsg.NOT_MENU.getMsg()); + } + + public String getPrintMessage() { + return printMessage; + } +} diff --git a/src/main/java/org/weekly/weekly/util/ManageMenu.java b/src/main/java/org/weekly/weekly/util/ManageMenu.java new file mode 100644 index 0000000000..b0b3b80ea3 --- /dev/null +++ b/src/main/java/org/weekly/weekly/util/ManageMenu.java @@ -0,0 +1,35 @@ +package org.weekly.weekly.util; + +import java.util.Arrays; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public enum ManageMenu implements Menu { + EXIT("Type exit to exit the program."), + VOUCHER("Type create to create a new voucher."), + CUSTOMER("Type list to list all vouchers."); + + private final String printMessage; + private static final Map MANAGE_MENU_MAP; + + static { + MANAGE_MENU_MAP = new ConcurrentHashMap<>(); + Arrays.stream(ManageMenu.values()) + .peek(manageMenu -> MANAGE_MENU_MAP.put(manageMenu.name(), manageMenu)); + } + + ManageMenu(String printMessage) { + this.printMessage = printMessage; + } + + public static ManageMenu getMenu(String userInput) { + if (MANAGE_MENU_MAP.containsKey(userInput)) { + return MANAGE_MENU_MAP.get(userInput); + } + throw new RuntimeException(ExceptionMsg.NOT_MENU.getMsg()); + } + + public String getPrintMessage() { + return printMessage; + } +} diff --git a/src/main/java/org/weekly/weekly/util/Menu.java b/src/main/java/org/weekly/weekly/util/Menu.java new file mode 100644 index 0000000000..7d2d77e715 --- /dev/null +++ b/src/main/java/org/weekly/weekly/util/Menu.java @@ -0,0 +1,4 @@ +package org.weekly.weekly.util; + +public interface Menu { +} diff --git a/src/main/java/org/weekly/weekly/util/VoucherMenu.java b/src/main/java/org/weekly/weekly/util/VoucherMenu.java index c5da7f8eb0..b85456361b 100644 --- a/src/main/java/org/weekly/weekly/util/VoucherMenu.java +++ b/src/main/java/org/weekly/weekly/util/VoucherMenu.java @@ -5,23 +5,20 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -public enum VoucherMenu { - EXIT("exit", "Type exit to exit the program."), - CREATE("create", "Type create to create a new voucher."), - LIST("list", "Type list to list all vouchers."); - - private String input; - private String printMsg; +public enum VoucherMenu implements Menu { + EXIT("Type exit to exit the program."), + CREATE("Type create to create a new voucher."), + LIST("Type list to list all vouchers."); + private final String printMsg; private final static Map VOUCHER_MENU_MAP; static { VOUCHER_MENU_MAP = new ConcurrentHashMap<>(); Arrays.stream(VoucherMenu.values()) - .forEach(menu -> VOUCHER_MENU_MAP.put(menu.input, menu)); + .forEach(menu -> VOUCHER_MENU_MAP.put(menu.name(), menu)); } - VoucherMenu(String input, String printMsg) { - this.input = input; + VoucherMenu(String printMsg) { this.printMsg = printMsg; } From 21652c0c00f9ed42c443c9b406c048e36c880e3e Mon Sep 17 00:00:00 2001 From: parksey Date: Fri, 7 Jul 2023 11:06:04 +0900 Subject: [PATCH 14/26] =?UTF-8?q?refactor:=20SystemWriter=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=9D=98=20=EA=B3=B5=ED=86=B5=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/ui/CommandLineApplication.java | 12 ++++++++-- .../weekly/weekly/ui/writer/SystemWriter.java | 24 +++++++++++++------ .../org/weekly/weekly/util/CustomerMenu.java | 3 ++- .../org/weekly/weekly/util/ManageMenu.java | 3 ++- .../java/org/weekly/weekly/util/Menu.java | 1 + .../org/weekly/weekly/util/PrintMessage.java | 4 +++- .../org/weekly/weekly/util/VoucherMenu.java | 10 ++++---- 7 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java index e5060c968d..fd5192d4e5 100644 --- a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java +++ b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java @@ -27,7 +27,7 @@ public CommandLineApplication(CommandReader commandReader, SystemWriter commandW public ManageMenu readMenu() { while(true) { try { - this.commandWriter.printVoucherProgram(); + this.commandWriter.printMangeProgram(); return ManageMenu.getMenu(readUserInput()); } catch (Exception exception) { printErrorMsg(exception.getMessage()); @@ -49,7 +49,7 @@ public VoucherMenu readVoucherMenu() { public CustomerMenu readCustomerMenu() { while(true) { try { - this.commandWriter.printVoucherProgram(); + this.commandWriter.printCustomerProgram(); return CustomerMenu.getMenu(readUserInput()); } catch (Exception exception) { printErrorMsg(exception.getMessage()); @@ -70,7 +70,15 @@ public VoucherCreationRequest createVoucherFromInput() { } public void createCustomerFromInput() { + while(true) { + try { + DiscountType discountType = readDiscountType(); + VoucherInfoRequest voucherInfoRequest = readVoucherInfo(discountType); + } catch (Exception exception) { + printErrorMsg(exception.getMessage()); + } + } } public void deleteCustomerFromInput() { diff --git a/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java b/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java index 9aa20272b1..f50b7e84f7 100644 --- a/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java +++ b/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java @@ -4,11 +4,9 @@ import org.slf4j.LoggerFactory; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; +import org.weekly.weekly.util.*; import org.weekly.weekly.voucher.domain.DiscountType; -import org.weekly.weekly.util.PrintMessage; -import org.weekly.weekly.util.VoucherMenu; -import java.io.Closeable; import java.util.Arrays; @Component @@ -20,11 +18,16 @@ private void println(String msg) { } private void print(String msg) {System.out.print(msg);} + public void printMangeProgram() { + printMenu(ManageMenu.values(), PrintMessage.MANAGE_PROGRAM); + } + public void printVoucherProgram() { - println(PrintMessage.EMPTY.getMessage()); - println(PrintMessage.PROGRAM.getMessage()); - Arrays.stream(VoucherMenu.values()) - .forEach(voucherMenu -> System.out.println(voucherMenu.getPrintMsg())); + printMenu(VoucherMenu.values(), PrintMessage.VOUCHER_PROGRAM); + } + + public void printCustomerProgram() { + printMenu(CustomerMenu.values(), PrintMessage.CUSTOMER_PROGRAM); } public void printErrorMsg(String errorMsg) { @@ -50,4 +53,11 @@ public void printReuslt(String result) { println(PrintMessage.EMPTY.getMessage()); println(result); } + + private void printMenu(Menu[] menus, PrintMessage programMessage) { + println(PrintMessage.EMPTY.getMessage()); + println(programMessage.getMessage()); + Arrays.stream(menus) + .forEach(menu -> System.out.println(menu.printMessage())); + } } diff --git a/src/main/java/org/weekly/weekly/util/CustomerMenu.java b/src/main/java/org/weekly/weekly/util/CustomerMenu.java index 2fb50345ee..6bf2ee32af 100644 --- a/src/main/java/org/weekly/weekly/util/CustomerMenu.java +++ b/src/main/java/org/weekly/weekly/util/CustomerMenu.java @@ -30,7 +30,8 @@ public static CustomerMenu getMenu(String userInput) { throw new RuntimeException(ExceptionMsg.NOT_MENU.getMsg()); } - public String getPrintMessage() { + @Override + public String printMessage() { return printMessage; } } diff --git a/src/main/java/org/weekly/weekly/util/ManageMenu.java b/src/main/java/org/weekly/weekly/util/ManageMenu.java index b0b3b80ea3..f7ffe96a14 100644 --- a/src/main/java/org/weekly/weekly/util/ManageMenu.java +++ b/src/main/java/org/weekly/weekly/util/ManageMenu.java @@ -29,7 +29,8 @@ public static ManageMenu getMenu(String userInput) { throw new RuntimeException(ExceptionMsg.NOT_MENU.getMsg()); } - public String getPrintMessage() { + @Override + public String printMessage() { return printMessage; } } diff --git a/src/main/java/org/weekly/weekly/util/Menu.java b/src/main/java/org/weekly/weekly/util/Menu.java index 7d2d77e715..40981c0f93 100644 --- a/src/main/java/org/weekly/weekly/util/Menu.java +++ b/src/main/java/org/weekly/weekly/util/Menu.java @@ -1,4 +1,5 @@ package org.weekly.weekly.util; public interface Menu { + String printMessage(); } diff --git a/src/main/java/org/weekly/weekly/util/PrintMessage.java b/src/main/java/org/weekly/weekly/util/PrintMessage.java index 8ddc7e5a6b..a715fe41b4 100644 --- a/src/main/java/org/weekly/weekly/util/PrintMessage.java +++ b/src/main/java/org/weekly/weekly/util/PrintMessage.java @@ -1,7 +1,9 @@ package org.weekly.weekly.util; public enum PrintMessage { - PROGRAM("=== Voucher Program ==="), + MANAGE_PROGRAM("=== Manage Program ==="), + VOUCHER_PROGRAM("=== Voucher Program ==="), + CUSTOMER_PROGRAM("=== Customer Program ==="), CREATE_VOUCHER("바우처를 생성합니다.\n" + "입력예시 => "), INPUT_MESSAGE("입력하세요: "), diff --git a/src/main/java/org/weekly/weekly/util/VoucherMenu.java b/src/main/java/org/weekly/weekly/util/VoucherMenu.java index b85456361b..a9b4e621ce 100644 --- a/src/main/java/org/weekly/weekly/util/VoucherMenu.java +++ b/src/main/java/org/weekly/weekly/util/VoucherMenu.java @@ -1,7 +1,6 @@ package org.weekly.weekly.util; import java.util.Arrays; -import java.util.Collections; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -9,7 +8,7 @@ public enum VoucherMenu implements Menu { EXIT("Type exit to exit the program."), CREATE("Type create to create a new voucher."), LIST("Type list to list all vouchers."); - private final String printMsg; + private final String printMessage; private final static Map VOUCHER_MENU_MAP; static { @@ -19,7 +18,7 @@ public enum VoucherMenu implements Menu { } VoucherMenu(String printMsg) { - this.printMsg = printMsg; + this.printMessage = printMsg; } public static VoucherMenu getMenu(String userInput) { @@ -29,7 +28,8 @@ public static VoucherMenu getMenu(String userInput) { throw new RuntimeException(ExceptionMsg.NOT_MENU.getMsg()); } - public String getPrintMsg() { - return printMsg; + @Override + public String printMessage() { + return printMessage; } } \ No newline at end of file From 1a2c30760261fcf8900a07378cbaf73c9496f93a Mon Sep 17 00:00:00 2001 From: parksey Date: Fri, 7 Jul 2023 11:07:08 +0900 Subject: [PATCH 15/26] =?UTF-8?q?refactor:=20PrintMessage=20enum=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=9D=98=20=ED=81=B4=EB=9E=98=EC=8A=A4?= =?UTF-8?q?=EB=AA=85=20=EB=B3=80=EA=B2=BD=20->=20PrintMessageType?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/util/{PrintMessage.java => PrintMessageType.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/main/java/org/weekly/weekly/util/{PrintMessage.java => PrintMessageType.java} (100%) diff --git a/src/main/java/org/weekly/weekly/util/PrintMessage.java b/src/main/java/org/weekly/weekly/util/PrintMessageType.java similarity index 100% rename from src/main/java/org/weekly/weekly/util/PrintMessage.java rename to src/main/java/org/weekly/weekly/util/PrintMessageType.java From b69816e0a5036c753759106ecd662b80a47b22d7 Mon Sep 17 00:00:00 2001 From: parksey Date: Fri, 7 Jul 2023 12:26:06 +0900 Subject: [PATCH 16/26] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9A=94=EC=B2=AD=EC=97=90=20=EB=94=B0=EB=A5=B8=20dto=20?= =?UTF-8?q?=EB=B0=8F=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/VoucherManagementController.java | 8 +- .../dto/request/CustomerCreationRequest.java | 19 +++++ .../dto/request/CustomerUpdateRequest.java | 16 ++++ .../weekly/ui/CommandLineApplication.java | 82 +++++++++++-------- .../weekly/weekly/ui/writer/SystemWriter.java | 34 +++++--- .../weekly/weekly/util/PrintMessageType.java | 6 +- .../voucher/controller/VoucherController.java | 1 - .../dto/response/VouchersResponse.java | 4 +- 8 files changed, 115 insertions(+), 55 deletions(-) create mode 100644 src/main/java/org/weekly/weekly/customer/dto/request/CustomerCreationRequest.java create mode 100644 src/main/java/org/weekly/weekly/customer/dto/request/CustomerUpdateRequest.java diff --git a/src/main/java/org/weekly/weekly/VoucherManagementController.java b/src/main/java/org/weekly/weekly/VoucherManagementController.java index 7d8ebff0b6..1e201973da 100644 --- a/src/main/java/org/weekly/weekly/VoucherManagementController.java +++ b/src/main/java/org/weekly/weekly/VoucherManagementController.java @@ -6,7 +6,7 @@ import org.weekly.weekly.ui.CommandLineApplication; import org.weekly.weekly.util.CustomerMenu; import org.weekly.weekly.util.ManageMenu; -import org.weekly.weekly.util.PrintMessage; +import org.weekly.weekly.util.PrintMessageType; import org.weekly.weekly.util.VoucherMenu; import org.weekly.weekly.voucher.controller.VoucherController; import org.weekly.weekly.voucher.dto.Response; @@ -28,7 +28,7 @@ public void start() { while(!isExit) { try { - ManageMenu manageMenu = this.commandLineApplication.readMenu(); + ManageMenu manageMenu = this.commandLineApplication.readManageMenu(); isExit = processManageMenuSelection(manageMenu); } catch (RuntimeException runtimeException) { this.commandLineApplication.printErrorMsg(runtimeException.getMessage()); @@ -67,13 +67,13 @@ private boolean processVoucherMenuSelection(VoucherMenu selectMenu) { private void handleVoucherCreation() { VoucherCreationRequest voucherCreationRequest = this.commandLineApplication.createVoucherFromInput(); Response response = voucherController.createVoucher(voucherCreationRequest); - logger.info("{}{}", PrintMessage.CREATE_VOUCHER_SUCCESS.getMessage(),response.getResult()); + logger.info("{}{}", PrintMessageType.CREATE_VOUCHER_SUCCESS.getMessage(),response.getResult()); this.commandLineApplication.printResult(response); } private void handleVoucherSearch() { Response response = voucherController.getVouchers(); - logger.info("{}{}", PrintMessage.FIND_ALL_VOUCHER_SUCCESS.getMessage(), response.getResult()); + logger.info("{}{}", PrintMessageType.FIND_ALL_VOUCHER_SUCCESS.getMessage(), response.getResult()); this.commandLineApplication.printResult(response); } diff --git a/src/main/java/org/weekly/weekly/customer/dto/request/CustomerCreationRequest.java b/src/main/java/org/weekly/weekly/customer/dto/request/CustomerCreationRequest.java new file mode 100644 index 0000000000..b368a79500 --- /dev/null +++ b/src/main/java/org/weekly/weekly/customer/dto/request/CustomerCreationRequest.java @@ -0,0 +1,19 @@ +package org.weekly.weekly.customer.dto.request; + +import org.weekly.weekly.ui.exception.InputValidator; + +public class CustomerCreationRequest { + private String email; + private String name; + + public CustomerCreationRequest(String email, String name) { + this.email = email; + this.name = name; + } + + public static CustomerCreationRequest of(String email, String name) { + InputValidator.isEmpty(email); + InputValidator.isEmpty(name); + return new CustomerCreationRequest(email, name); + } +} diff --git a/src/main/java/org/weekly/weekly/customer/dto/request/CustomerUpdateRequest.java b/src/main/java/org/weekly/weekly/customer/dto/request/CustomerUpdateRequest.java new file mode 100644 index 0000000000..58230c5127 --- /dev/null +++ b/src/main/java/org/weekly/weekly/customer/dto/request/CustomerUpdateRequest.java @@ -0,0 +1,16 @@ +package org.weekly.weekly.customer.dto.request; + +import org.weekly.weekly.ui.exception.InputValidator; + +public class CustomerUpdateRequest { + private String email; + + private CustomerUpdateRequest(String email) { + this.email = email; + } + + public static CustomerUpdateRequest of(String email) { + InputValidator.isEmpty(email); + return new CustomerUpdateRequest(email); + } +} diff --git a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java index fd5192d4e5..d5c6da3460 100644 --- a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java +++ b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java @@ -2,17 +2,22 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.weekly.weekly.customer.dto.request.CustomerCreationRequest; +import org.weekly.weekly.customer.dto.request.CustomerUpdateRequest; import org.weekly.weekly.ui.exception.InputValidator; import org.weekly.weekly.ui.reader.CommandReader; import org.weekly.weekly.ui.writer.SystemWriter; import org.weekly.weekly.util.CustomerMenu; import org.weekly.weekly.util.ManageMenu; +import org.weekly.weekly.util.Menu; import org.weekly.weekly.voucher.domain.DiscountType; import org.weekly.weekly.util.VoucherMenu; import org.weekly.weekly.voucher.dto.Response; import org.weekly.weekly.voucher.dto.request.VoucherInfoRequest; import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; +import java.util.function.Supplier; + @Component public class CommandLineApplication { private final CommandReader commandReader; @@ -24,37 +29,25 @@ public CommandLineApplication(CommandReader commandReader, SystemWriter commandW this.commandWriter = commandWriter; } - public ManageMenu readMenu() { - while(true) { - try { - this.commandWriter.printMangeProgram(); - return ManageMenu.getMenu(readUserInput()); - } catch (Exception exception) { - printErrorMsg(exception.getMessage()); - } - } + public ManageMenu readManageMenu() { + return readMenu(()-> { + this.commandWriter.printMangeProgram(); + return ManageMenu.getMenu(readUserInput()); + }); } public VoucherMenu readVoucherMenu() { - while(true) { - try { - this.commandWriter.printVoucherProgram(); - return VoucherMenu.getMenu(readUserInput()); - } catch (Exception exception) { - printErrorMsg(exception.getMessage()); - } - } + return readMenu(()-> { + this.commandWriter.printVoucherProgram(); + return VoucherMenu.getMenu(readUserInput()); + }); } public CustomerMenu readCustomerMenu() { - while(true) { - try { - this.commandWriter.printCustomerProgram(); - return CustomerMenu.getMenu(readUserInput()); - } catch (Exception exception) { - printErrorMsg(exception.getMessage()); - } - } + return readMenu(()-> { + this.commandWriter.printCustomerProgram(); + return CustomerMenu.getMenu(readUserInput()); + }); } public VoucherCreationRequest createVoucherFromInput() { @@ -69,24 +62,31 @@ public VoucherCreationRequest createVoucherFromInput() { } } - public void createCustomerFromInput() { + public CustomerCreationRequest createCustomerFromInput() { while(true) { try { - DiscountType discountType = readDiscountType(); - VoucherInfoRequest voucherInfoRequest = readVoucherInfo(discountType); - + String email = processEmail(); + String name = processName(); + return CustomerCreationRequest.of(email, name); } catch (Exception exception) { printErrorMsg(exception.getMessage()); } } } - public void deleteCustomerFromInput() { - + public CustomerUpdateRequest deleteCustomerFromInput() { + while(true) { + try { + String email = processEmail(); + return CustomerUpdateRequest.of(email); + } catch (Exception exception) { + printErrorMsg(exception.getMessage()); + } + } } public void printErrorMsg(String errorMsg) { - this.commandWriter.printErrorMsg(errorMsg); + this.commandWriter.printErrorMessage(errorMsg); } public void printResult(Response response) { @@ -100,6 +100,15 @@ private String readUserInput() { return userInput; } + private T readMenu(Supplier menuSupplier) { + while(true) { + try { + return menuSupplier.get(); + } catch (Exception exception) { + printErrorMsg(exception.getMessage()); + } + } + } private DiscountType readDiscountType() { this.commandWriter.printSelectDiscount(); @@ -113,5 +122,12 @@ private VoucherInfoRequest readVoucherInfo(DiscountType discountType){ return VoucherInfoRequest.of(voucherInfo); } - + private String processEmail() { + this.commandWriter.printEmailInputMessage(); + return readUserInput(); + } + private String processName() { + this.commandWriter.printNameInputMessage(); + return readUserInput(); + } } diff --git a/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java b/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java index f50b7e84f7..401a370f15 100644 --- a/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java +++ b/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java @@ -19,43 +19,51 @@ private void println(String msg) { private void print(String msg) {System.out.print(msg);} public void printMangeProgram() { - printMenu(ManageMenu.values(), PrintMessage.MANAGE_PROGRAM); + printMenu(ManageMenu.values(), PrintMessageType.MANAGE_PROGRAM); } public void printVoucherProgram() { - printMenu(VoucherMenu.values(), PrintMessage.VOUCHER_PROGRAM); + printMenu(VoucherMenu.values(), PrintMessageType.VOUCHER_PROGRAM); } public void printCustomerProgram() { - printMenu(CustomerMenu.values(), PrintMessage.CUSTOMER_PROGRAM); + printMenu(CustomerMenu.values(), PrintMessageType.CUSTOMER_PROGRAM); } - public void printErrorMsg(String errorMsg) { + public void printErrorMessage(String errorMsg) { logger.warn(errorMsg); - println(PrintMessage.EMPTY.getMessage()); + println(PrintMessageType.EMPTY.getMessage()); println(errorMsg); } public void printCreateVoucher(DiscountType discountType) { - println(PrintMessage.EMPTY.getMessage()); - println(PrintMessage.CREATE_VOUCHER.getMessage() + discountType.getInputExampleMessage()); - print(PrintMessage.INPUT_MESSAGE.getMessage()); + println(PrintMessageType.EMPTY.getMessage()); + println(PrintMessageType.CREATE_VOUCHER.getMessage() + discountType.getInputExampleMessage()); + print(PrintMessageType.INPUT_MESSAGE.getMessage()); } public void printSelectDiscount() { - println(PrintMessage.EMPTY.getMessage()); - println(PrintMessage.DISCOUNT_SELECT.getMessage()); + println(PrintMessageType.EMPTY.getMessage()); + println(PrintMessageType.DISCOUNT_SELECT.getMessage()); Arrays.stream(DiscountType.values()) .forEach(discountMap -> System.out.println(discountMap.getSelectMessage())); } + public void printEmailInputMessage() { + println(PrintMessageType.EMAIL_INPUT.getMessage()); + } + + public void printNameInputMessage() { + println(PrintMessageType.NAME_INPUT.getMessage()); + } + public void printReuslt(String result) { - println(PrintMessage.EMPTY.getMessage()); + println(PrintMessageType.EMPTY.getMessage()); println(result); } - private void printMenu(Menu[] menus, PrintMessage programMessage) { - println(PrintMessage.EMPTY.getMessage()); + private void printMenu(Menu[] menus, PrintMessageType programMessage) { + println(PrintMessageType.EMPTY.getMessage()); println(programMessage.getMessage()); Arrays.stream(menus) .forEach(menu -> System.out.println(menu.printMessage())); diff --git a/src/main/java/org/weekly/weekly/util/PrintMessageType.java b/src/main/java/org/weekly/weekly/util/PrintMessageType.java index a715fe41b4..37deddc342 100644 --- a/src/main/java/org/weekly/weekly/util/PrintMessageType.java +++ b/src/main/java/org/weekly/weekly/util/PrintMessageType.java @@ -1,6 +1,6 @@ package org.weekly.weekly.util; -public enum PrintMessage { +public enum PrintMessageType { MANAGE_PROGRAM("=== Manage Program ==="), VOUCHER_PROGRAM("=== Voucher Program ==="), CUSTOMER_PROGRAM("=== Customer Program ==="), @@ -8,6 +8,8 @@ public enum PrintMessage { "입력예시 => "), INPUT_MESSAGE("입력하세요: "), DISCOUNT_SELECT("할인 종류중 하나를 선택하세요"), + EMAIL_INPUT("이메일을 입력하세요: "), + NAME_INPUT("이름을 입력하세요"), NO_VOUCHER_DATAS("저장소에 데이터가 없습니다."), EMPTY(""), CREATE_VOUCHER_SUCCESS("[바우처 생성에 성공]: "), @@ -15,7 +17,7 @@ public enum PrintMessage { private final String message; - PrintMessage(String msg) { + PrintMessageType(String msg) { this.message = msg; } diff --git a/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java b/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java index c8b3dcd061..d0b8b1648a 100644 --- a/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java +++ b/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java @@ -3,7 +3,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Controller; -import org.weekly.weekly.util.PrintMessage; import org.weekly.weekly.voucher.dto.Response; import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; import org.weekly.weekly.voucher.service.VoucherService; diff --git a/src/main/java/org/weekly/weekly/voucher/dto/response/VouchersResponse.java b/src/main/java/org/weekly/weekly/voucher/dto/response/VouchersResponse.java index 5861700091..64b16be1ce 100644 --- a/src/main/java/org/weekly/weekly/voucher/dto/response/VouchersResponse.java +++ b/src/main/java/org/weekly/weekly/voucher/dto/response/VouchersResponse.java @@ -1,6 +1,6 @@ package org.weekly.weekly.voucher.dto.response; -import org.weekly.weekly.util.PrintMessage; +import org.weekly.weekly.util.PrintMessageType; import org.weekly.weekly.voucher.domain.Voucher; import org.weekly.weekly.voucher.dto.Response; @@ -18,7 +18,7 @@ public VouchersResponse(List vouchers) { public String getResult() { if (result.isEmpty()) { - return PrintMessage.NO_VOUCHER_DATAS.getMessage(); + return PrintMessageType.NO_VOUCHER_DATAS.getMessage(); } From a0d1d8bede8faac1ebf20f24a58f642eb407557e Mon Sep 17 00:00:00 2001 From: parksey Date: Fri, 7 Jul 2023 12:51:39 +0900 Subject: [PATCH 17/26] =?UTF-8?q?feat:=20=EC=82=AC=EC=9A=A9=EC=9E=90=20?= =?UTF-8?q?=EC=9E=85=EB=A0=A5=EC=97=90=20=EB=94=B0=EB=A5=B8=20VoucherManag?= =?UTF-8?q?eController=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/VoucherManagementController.java | 30 +++++++++++++++---- .../controller/CustomerController.java | 29 ++++++++++++++++++ .../weekly/ui/CommandLineApplication.java | 2 +- .../org/weekly/weekly/util/CustomerMenu.java | 5 ++-- 4 files changed, 57 insertions(+), 9 deletions(-) create mode 100644 src/main/java/org/weekly/weekly/customer/controller/CustomerController.java diff --git a/src/main/java/org/weekly/weekly/VoucherManagementController.java b/src/main/java/org/weekly/weekly/VoucherManagementController.java index 1e201973da..0e0e53afd0 100644 --- a/src/main/java/org/weekly/weekly/VoucherManagementController.java +++ b/src/main/java/org/weekly/weekly/VoucherManagementController.java @@ -3,6 +3,9 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; +import org.weekly.weekly.customer.controller.CustomerController; +import org.weekly.weekly.customer.dto.request.CustomerCreationRequest; +import org.weekly.weekly.customer.dto.request.CustomerUpdateRequest; import org.weekly.weekly.ui.CommandLineApplication; import org.weekly.weekly.util.CustomerMenu; import org.weekly.weekly.util.ManageMenu; @@ -17,10 +20,12 @@ public class VoucherManagementController { private final Logger logger = LoggerFactory.getLogger(VoucherManagementController.class); private final CommandLineApplication commandLineApplication; private final VoucherController voucherController; + private final CustomerController customerController; - public VoucherManagementController(CommandLineApplication commandLineApplication, VoucherController voucherController) { + public VoucherManagementController(CommandLineApplication commandLineApplication, VoucherController voucherController, CustomerController customerController) { this.commandLineApplication = commandLineApplication; this.voucherController = voucherController; + this.customerController = customerController; } public void start() { @@ -88,32 +93,45 @@ private boolean processCustomerMenuSelection(CustomerMenu selectMenu) { return false; } + if (CustomerMenu.DELETE_ALL.equals(selectMenu)) { + handleCustomerDeleteAll(); + return false; + } + if (CustomerMenu.SEARCH_ALL.equals(selectMenu)) { handleCustomerSearchAll(); return false; } - if (CustomerMenu.SEARCH_DETAIL_TO_EMAIL.equals(selectMenu)) { + if (CustomerMenu.SEARCH_DETAIL.equals(selectMenu)) { handleSearchDetail(); + return false; } return true; } private void handleCustomerCreation() { - this.commandLineApplication.createCustomerFromInput(); + CustomerCreationRequest customerCreation = this.commandLineApplication.createCustomerFromInput(); + this.customerController.createCustomer(customerCreation); } private void handleCustomerDelete() { - this.commandLineApplication.deleteCustomerFromInput(); + CustomerUpdateRequest customerUpdateRequest = this.commandLineApplication.customerDetailFromInput(); + this.customerController.deleteCustomer(customerUpdateRequest); } - private void handleCustomerSearchAll() { + private void handleCustomerDeleteAll() { + this.customerController.deleteAllCustomer(); + } + private void handleCustomerSearchAll() { + this.customerController.searchAllCustomer(); } private void handleSearchDetail() { - + CustomerUpdateRequest customerUpdateRequest = this.commandLineApplication.customerDetailFromInput(); + this.customerController.searchDetailCustomer(customerUpdateRequest); } } diff --git a/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java b/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java new file mode 100644 index 0000000000..551effadd8 --- /dev/null +++ b/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java @@ -0,0 +1,29 @@ +package org.weekly.weekly.customer.controller; + +import org.springframework.stereotype.Controller; +import org.weekly.weekly.customer.dto.request.CustomerCreationRequest; +import org.weekly.weekly.customer.dto.request.CustomerUpdateRequest; + +@Controller +public class CustomerController { + public void createCustomer(CustomerCreationRequest creationRequest) { + + } + + public void deleteCustomer(CustomerUpdateRequest updateRequest) { + + } + + public void deleteAllCustomer() { + + } + + public void searchDetailCustomer(CustomerUpdateRequest updateRequest) { + + } + + + public void searchAllCustomer() { + + } +} diff --git a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java index d5c6da3460..2e839d04ee 100644 --- a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java +++ b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java @@ -74,7 +74,7 @@ public CustomerCreationRequest createCustomerFromInput() { } } - public CustomerUpdateRequest deleteCustomerFromInput() { + public CustomerUpdateRequest customerDetailFromInput() { while(true) { try { String email = processEmail(); diff --git a/src/main/java/org/weekly/weekly/util/CustomerMenu.java b/src/main/java/org/weekly/weekly/util/CustomerMenu.java index 6bf2ee32af..9b3d9ffeb2 100644 --- a/src/main/java/org/weekly/weekly/util/CustomerMenu.java +++ b/src/main/java/org/weekly/weekly/util/CustomerMenu.java @@ -8,8 +8,9 @@ public enum CustomerMenu implements Menu { EXIT("Type exit to exit the program."), CREATE("Type create to create a new voucher."), DELETE("Type list to list all vouchers."), - SEARCH_ALL("Type: search all 모든 유저 검색"), - SEARCH_DETAIL_TO_EMAIL("Type: search detail to email 유저 상세 검색"); + DELETE_ALL("[Type: delete_all] 모든 유저 삭제"), + SEARCH_ALL("[Type: search_all] 모든 유저 검색"), + SEARCH_DETAIL("[Type: search_detail] 유저 상세 검색"); private final String printMessage; private static final Map CUSTOMER_MENU_MAP; From 7dac4e691d1d3d7d7cafaf31156776a74513e552 Mon Sep 17 00:00:00 2001 From: parksey Date: Fri, 7 Jul 2023 13:35:57 +0900 Subject: [PATCH 18/26] =?UTF-8?q?feat:=20=EB=8F=99=EC=9E=91=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20customerservice=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\353\252\205\354\204\270\354\204\234.md" | 2 +- .../controller/CustomerController.java | 19 ++++++--- .../dto/request/CustomerCreationRequest.java | 7 ++++ .../dto/request/CustomerUpdateRequest.java | 4 ++ .../repository/CustomerRepository.java | 5 +++ .../repository/JdbcCustomerRepository.java | 10 +++++ .../customer/service/CustomerService.java | 40 +++++++++++++++++++ 7 files changed, 80 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java create mode 100644 src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java create mode 100644 src/main/java/org/weekly/weekly/customer/service/CustomerService.java diff --git "a/docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" "b/docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" index ede291b3c0..fdddc59348 100644 --- "a/docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" +++ "b/docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" @@ -62,7 +62,7 @@ Type list to list all customers. --- ### 1. 입력 -- [ ] 회원과 바우처 선택하는 기능 +- [x] 회원과 바우처 선택하는 기능 ### 2. 바우처 - [x] JdbcTemplate를 사용하여 Repostiroy 관리 diff --git a/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java b/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java index 551effadd8..a3853b3ff1 100644 --- a/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java +++ b/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java @@ -3,27 +3,34 @@ import org.springframework.stereotype.Controller; import org.weekly.weekly.customer.dto.request.CustomerCreationRequest; import org.weekly.weekly.customer.dto.request.CustomerUpdateRequest; +import org.weekly.weekly.customer.service.CustomerService; @Controller public class CustomerController { - public void createCustomer(CustomerCreationRequest creationRequest) { + private final CustomerService customerService; + + public CustomerController(CustomerService customerService) { + this.customerService = customerService; } - public void deleteCustomer(CustomerUpdateRequest updateRequest) { + public void createCustomer(CustomerCreationRequest creationRequest) { + this.customerService.createCustomer(creationRequest); + } + public void deleteCustomer(CustomerUpdateRequest updateRequest) { + this.customerService.deleteCustomer(updateRequest); } public void deleteAllCustomer() { - + this.customerService.deleteAllCustomer(); } public void searchDetailCustomer(CustomerUpdateRequest updateRequest) { - + this.customerService.searchDetailCustomer(updateRequest); } - public void searchAllCustomer() { - + this.customerService.searchAllCustomer(); } } diff --git a/src/main/java/org/weekly/weekly/customer/dto/request/CustomerCreationRequest.java b/src/main/java/org/weekly/weekly/customer/dto/request/CustomerCreationRequest.java index b368a79500..3ec0eafe87 100644 --- a/src/main/java/org/weekly/weekly/customer/dto/request/CustomerCreationRequest.java +++ b/src/main/java/org/weekly/weekly/customer/dto/request/CustomerCreationRequest.java @@ -1,7 +1,10 @@ package org.weekly.weekly.customer.dto.request; +import org.weekly.weekly.customer.domain.Customer; import org.weekly.weekly.ui.exception.InputValidator; +import java.util.UUID; + public class CustomerCreationRequest { private String email; private String name; @@ -16,4 +19,8 @@ public static CustomerCreationRequest of(String email, String name) { InputValidator.isEmpty(name); return new CustomerCreationRequest(email, name); } + + public Customer toCustomer() { + return Customer.of(UUID.randomUUID(), name, email); + } } diff --git a/src/main/java/org/weekly/weekly/customer/dto/request/CustomerUpdateRequest.java b/src/main/java/org/weekly/weekly/customer/dto/request/CustomerUpdateRequest.java index 58230c5127..6849647305 100644 --- a/src/main/java/org/weekly/weekly/customer/dto/request/CustomerUpdateRequest.java +++ b/src/main/java/org/weekly/weekly/customer/dto/request/CustomerUpdateRequest.java @@ -13,4 +13,8 @@ public static CustomerUpdateRequest of(String email) { InputValidator.isEmpty(email); return new CustomerUpdateRequest(email); } + + public String email() { + return email; + } } diff --git a/src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java b/src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java new file mode 100644 index 0000000000..e0b181c4ca --- /dev/null +++ b/src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java @@ -0,0 +1,5 @@ +package org.weekly.weekly.customer.repository; + + +public interface CustomerRepository { +} diff --git a/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java b/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java new file mode 100644 index 0000000000..6acccbdb3a --- /dev/null +++ b/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java @@ -0,0 +1,10 @@ +package org.weekly.weekly.customer.repository; + +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Repository; + +@Profile("!dev") +@Repository +public class JdbcCustomerRepository implements CustomerRepository{ + +} diff --git a/src/main/java/org/weekly/weekly/customer/service/CustomerService.java b/src/main/java/org/weekly/weekly/customer/service/CustomerService.java new file mode 100644 index 0000000000..ac24a90945 --- /dev/null +++ b/src/main/java/org/weekly/weekly/customer/service/CustomerService.java @@ -0,0 +1,40 @@ +package org.weekly.weekly.customer.service; + +import org.springframework.stereotype.Service; +import org.weekly.weekly.customer.domain.Customer; +import org.weekly.weekly.customer.dto.request.CustomerCreationRequest; +import org.weekly.weekly.customer.dto.request.CustomerUpdateRequest; +import org.weekly.weekly.customer.repository.CustomerRepository; + +@Service +public class CustomerService { + private final CustomerRepository customerRepository; + + public CustomerService(CustomerRepository customerRepository) { + this.customerRepository = customerRepository; + } + + public Customer createCustomer(CustomerCreationRequest creationRequest) { + Customer customer = creationRequest.toCustomer(); + this.customerRepository.insert(customer); + return customer; + } + + public void deleteCustomer(CustomerUpdateRequest updateRequest) { + String email = updateRequest.email(); + this.customerRepository.deleteByEmail(email); + } + + public void deleteAllCustomer() { + this.customerRepository.deleteAll(); + } + + public void searchDetailCustomer(CustomerUpdateRequest updateRequest) { + String email = updateRequest.email(); + this.customerRepository.findByEmail(); + } + + public void searchAllCustomer() { + this.customerRepository.findAll(); + } +} From 9e55e6614ba07f636288760db972f1ec45ddca6e Mon Sep 17 00:00:00 2001 From: parksey Date: Sat, 8 Jul 2023 13:34:19 +0900 Subject: [PATCH 19/26] =?UTF-8?q?feat:=20CustomerRepository=EC=97=90=20?= =?UTF-8?q?=EB=8C=80=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/customer/domain/Customer.java | 28 +++- .../repository/CustomerRepository.java | 10 ++ .../repository/JdbcCustomerRepository.java | 92 +++++++++++++ .../customer/service/CustomerService.java | 2 +- .../org/weekly/weekly/util/ExceptionMsg.java | 4 +- src/main/resources/application.yaml | 10 ++ src/main/resources/schema.sql | 25 ++-- .../customer/JdbcCustomerRepositoryTest.java | 125 ++++++++++++++++++ .../voucher/JdbcVoucherRepositoryTest.java | 30 +---- 9 files changed, 281 insertions(+), 45 deletions(-) create mode 100644 src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java diff --git a/src/main/java/org/weekly/weekly/customer/domain/Customer.java b/src/main/java/org/weekly/weekly/customer/domain/Customer.java index 1bbd3bf21e..ddebd17185 100644 --- a/src/main/java/org/weekly/weekly/customer/domain/Customer.java +++ b/src/main/java/org/weekly/weekly/customer/domain/Customer.java @@ -6,13 +6,20 @@ import java.util.UUID; public class Customer { - UUID uuid; + UUID customerId; String name; String email; LocalDateTime createAt; - private Customer(UUID uuid, String name, String email) { - this.uuid = uuid; + public Customer(UUID customerId, String name, String email, LocalDateTime createAt) { + this.customerId = customerId; + this.name = name; + this.email = email; + this.customerId = customerId; + } + + private Customer(UUID customerId, String name, String email) { + this.customerId = customerId; this.name = name; this.email = email; } @@ -22,4 +29,19 @@ public static Customer of(UUID uuid, String name, String email) { return new Customer(uuid, name, email); } + public String getName() { + return name; + } + + public LocalDateTime getCreateAt() { + return createAt; + } + + public String getEmail() { + return email; + } + + public UUID getCustomerId() { + return customerId; + } } diff --git a/src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java b/src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java index e0b181c4ca..833785f364 100644 --- a/src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java +++ b/src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java @@ -1,5 +1,15 @@ package org.weekly.weekly.customer.repository; +import org.weekly.weekly.customer.domain.Customer; + +import java.util.List; +import java.util.Optional; public interface CustomerRepository { + Customer insert(Customer customer); + void deleteByEmail(String email); + void deleteAll(); + Optional findByEmail(String email); + List findAll(); } + diff --git a/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java b/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java index 6acccbdb3a..aea452a56f 100644 --- a/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java +++ b/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java @@ -1,10 +1,102 @@ package org.weekly.weekly.customer.repository; import org.springframework.context.annotation.Profile; +import org.springframework.dao.DataAccessException; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; +import org.weekly.weekly.customer.domain.Customer; +import org.weekly.weekly.customer.exception.CustomerException; +import org.weekly.weekly.util.ExceptionMsg; +import org.weekly.weekly.voucher.domain.DiscountType; +import org.weekly.weekly.voucher.domain.Voucher; + +import javax.sql.DataSource; +import java.nio.ByteBuffer; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; +import java.util.UUID; @Profile("!dev") @Repository public class JdbcCustomerRepository implements CustomerRepository{ + private final JdbcTemplate jdbcTemplate; + + public JdbcCustomerRepository(DataSource dataSource) { + this.jdbcTemplate = new JdbcTemplate(dataSource); + } + + + @Override + public Customer insert(Customer customer) { + String sql = "INSERT INTO customers(customer_id, name, email, create_at) VALUES(UUID_TO_BIN(?), ?, ?, ?)"; + int insert = 0; + try { + insert = jdbcTemplate.update(sql, + uuidToBytes(customer.getCustomerId()), + customer.getName(), + customer.getEmail(), + LocalDateTime.now()); + + if (insert != 1) { + throw new CustomerException(ExceptionMsg.SQL_INSERT_ERROR); + } + } catch (DataAccessException ex) { + throw new CustomerException(ExceptionMsg.SQL_ERROR); + } + + return customer; + } + + @Override + public void deleteByEmail(String email) { + String sql = "DELETE FROM customers WHERE email = ?"; + jdbcTemplate.update(sql, email); + } + + @Override + public void deleteAll() { + String sql = "DELETE FROM customers"; + jdbcTemplate.update(sql); + } + + @Override + public Optional findByEmail(String email) { + String sql = "SELECT * FROM customers WHERE email = ?"; + + try { + return Optional.ofNullable(jdbcTemplate.queryForObject(sql, (rs, rowNum) -> mapToCustomer(rs), email)); + } catch (EmptyResultDataAccessException exception) { + return Optional.empty(); + } + } + + @Override + public List findAll() { + String sql = "SELECT * FROM customers"; + return jdbcTemplate.query(sql, (rs, rowNum) -> mapToCustomer(rs)); + } + + public static UUID toUUID(byte[] bytes) { + var buffer = ByteBuffer.wrap(bytes); + return new UUID(buffer.getLong(), buffer.getLong()); + } + + private Customer mapToCustomer(ResultSet resultSet) throws SQLException { + UUID customerId = toUUID(resultSet.getBytes("customer_id")); + String name = resultSet.getString("name"); + String email = resultSet.getString("email"); + LocalDateTime createAt = resultSet.getTimestamp("create_at") == null? null : resultSet.getTimestamp("create_at").toLocalDateTime(); + + return new Customer(customerId, name, email, createAt); + } + + private byte[] uuidToBytes(UUID voucherId) { + return voucherId.toString().getBytes(); + } } diff --git a/src/main/java/org/weekly/weekly/customer/service/CustomerService.java b/src/main/java/org/weekly/weekly/customer/service/CustomerService.java index ac24a90945..574d2df03e 100644 --- a/src/main/java/org/weekly/weekly/customer/service/CustomerService.java +++ b/src/main/java/org/weekly/weekly/customer/service/CustomerService.java @@ -31,7 +31,7 @@ public void deleteAllCustomer() { public void searchDetailCustomer(CustomerUpdateRequest updateRequest) { String email = updateRequest.email(); - this.customerRepository.findByEmail(); + this.customerRepository.findByEmail(email); } public void searchAllCustomer() { diff --git a/src/main/java/org/weekly/weekly/util/ExceptionMsg.java b/src/main/java/org/weekly/weekly/util/ExceptionMsg.java index ad6d0242f2..5dbfee8ef7 100644 --- a/src/main/java/org/weekly/weekly/util/ExceptionMsg.java +++ b/src/main/java/org/weekly/weekly/util/ExceptionMsg.java @@ -14,7 +14,9 @@ public enum ExceptionMsg { NOT_FOUND("해당 종류의 할인정보를 찾을 수 없습니다."), NOT_SAME_PARAM_SIZE("입력 파라미터 개수가 맞지 않습니다."), NOT_EMAIL_FORMAT("이메일형식이 아닙니다."), - SQL_ERROR("값을 가져오기 실패"); + SQL_ERROR("값을 가져오기 실패"), + SQL_INSERT_ERROR("값 추가 실패"), + SQL_DELETE_ERROR("삭제 실패"); private String msg; diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index f8975c60ef..90244d6551 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -34,3 +34,13 @@ spring.config.activate.on-profile: test command: write: system read: scanner + +spring: + datasource: + url: jdbc:tc:mysql:8://test + + sql: + init: + mode: always + + diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index cced88071b..0b88d26b44 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -8,11 +8,10 @@ CREATE TABLE customers ( ); INSERT INTO customers(customer_id, name, email) -values (uuid_to_bin(UUID()), 'tester00', 'test00@gmail.com'); -INSERT INTO customers(customer_id, name, email) -values (uuid_to_bin(UUID()), 'tester01', 'test01@gmail.com'); -INSERT INTO customers(customer_id, name, email) -values (uuid_to_bin(UUID()), 'tester02', 'test02@gmail.com'); +VALUES (uuid_to_bin(UUID()), 'tester00', 'test00@gmail.com'), + (uuid_to_bin(UUID()), 'tester01', 'test01@gmail.com'), + (uuid_to_bin(UUID()), 'tester02', 'test02@gmail.com'); + DROP TABLE IF EXISTS vouchers; @@ -21,16 +20,10 @@ CREATE TABLE vouchers ( amount bigint NOT NULL, discount enum('FIXED', 'PERCENT') NOT NULL, registration_date datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), - expiration_date datetime(6) NOT NULL, - - customer_id BINARY(16) not null, - FOREIGN KEY (customer_id) REFERENCES customers(customer_id) + expiration_date datetime(6) NOT NULL ); -INSERT INTO vouchers(voucher_id, amount, discount, expiration_date) -values (uuid_to_bin(UUID()), 50, 'PERCENT', CURRENT_TIMESTAMP(6) + 7); -INSERT INTO vouchers(voucher_id, amount, discount, expiration_date) -values (uuid_to_bin(UUID()), 100000, 'FIXED', CURRENT_TIMESTAMP(6) + 7); -INSERT INTO vouchers(voucher_id, amount, discount, expiration_date) -values (uuid_to_bin(UUID()), 80, 'PERCENT', CURRENT_TIMESTAMP(6) + 7); - +INSERT INTO vouchers (voucher_id, amount, discount, expiration_date) +VALUES (uuid_to_bin(UUID()), 50, 'PERCENT', DATE_ADD(CURRENT_TIMESTAMP(6), INTERVAL 7 DAY)), + (uuid_to_bin(UUID()), 100000, 'FIXED', DATE_ADD(CURRENT_TIMESTAMP(6), INTERVAL 7 DAY)), + (uuid_to_bin(UUID()), 80, 'PERCENT', DATE_ADD(CURRENT_TIMESTAMP(6), INTERVAL 7 DAY)); \ No newline at end of file diff --git a/src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java b/src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java new file mode 100644 index 0000000000..1f81807a3a --- /dev/null +++ b/src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java @@ -0,0 +1,125 @@ +package org.weekly.weekly.customer; + +import org.junit.jupiter.api.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.testcontainers.junit.jupiter.Testcontainers; +import org.weekly.weekly.customer.domain.Customer; +import org.weekly.weekly.customer.exception.CustomerException; +import org.weekly.weekly.customer.repository.JdbcCustomerRepository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.samePropertyValuesAs; + +@Testcontainers +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) +@ActiveProfiles("test") +@SpringBootTest +class JdbcCustomerRepositoryTest { + @Autowired + private JdbcCustomerRepository jdbcCustomerRepository; + + Customer customer; + + @BeforeEach + void setUp() { + customer = Customer.of(UUID.randomUUID(), "tester", "test@naver.com"); + } + + @AfterEach + void deleteCustomer() { + assertThatCode(() -> jdbcCustomerRepository.deleteByEmail(customer.getEmail())); + } + + @Test + void 전체_회원_검색_테스트() { + // Given + Customer insertCustomer = jdbcCustomerRepository.insert(customer); + + // When + Then + List customers = jdbcCustomerRepository.findAll(); + assertThat(customers.isEmpty(), is(false)); + } + + @Test + void 회원_등록성공_테스트() { + // Given + Customer insertCustomer = jdbcCustomerRepository.insert(customer); + + // When + Optional findCustomer = jdbcCustomerRepository.findByEmail(insertCustomer.getEmail()); + + // Then + assertThat(findCustomer.isEmpty(), is(false)); + assertThat(findCustomer.get(), samePropertyValuesAs(insertCustomer)); + } + + @Test + void 회원_등록실패_테스트() { + // Given + Customer insertCustomer = jdbcCustomerRepository.insert(customer); + Optional findCustomer = jdbcCustomerRepository.findByEmail(insertCustomer.getEmail()); + + // When + Then + assertThatThrownBy(()->jdbcCustomerRepository.insert(customer)).isInstanceOf(CustomerException.class); + } + + + + @Test + void 이메일_회원_검색_성공_테스트() { + // Given + Customer insertCustomer = jdbcCustomerRepository.insert(customer); + + // When + Optional customers = jdbcCustomerRepository.findByEmail(insertCustomer.getEmail()); + + // Then + assertThat(customers.isEmpty(), is(false)); + } + + @Test + void 이메일_회원_검색_실패_테스트() { + Optional customers = jdbcCustomerRepository.findByEmail(customer.getEmail()); + assertThat(customers.isEmpty(), is(true)); + } + + @Test + void 회원_삭제_성공_테스트() { + // Given + Customer insertCustomer = jdbcCustomerRepository.insert(customer); + Optional findCustomer = jdbcCustomerRepository.findByEmail(insertCustomer.getEmail()); + assertThat(findCustomer.isPresent(), is(true)); + + // When + jdbcCustomerRepository.deleteByEmail(findCustomer.get().getEmail()); + + // THen + Optional deleteCustomer = jdbcCustomerRepository.findByEmail(insertCustomer.getEmail()); + assertThat(deleteCustomer.isEmpty(), is(true)); + } + + @Test + void 회원_삭제_실패_테스트() { + // when + jdbcCustomerRepository.deleteByEmail(customer.getEmail()); + + } + + @Test + void 전체_회원_삭제_테스트() { + // Given + jdbcCustomerRepository.deleteAll(); + + List customers = jdbcCustomerRepository.findAll(); + assertThat(customers.isEmpty(), is(true)); + } +} diff --git a/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java b/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java index a26545ec2d..6a47bcc496 100644 --- a/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java +++ b/src/test/java/org/weekly/weekly/voucher/JdbcVoucherRepositoryTest.java @@ -3,14 +3,9 @@ import org.junit.jupiter.api.*; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; -import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.DynamicPropertyRegistry; -import org.springframework.test.context.DynamicPropertySource; -import org.testcontainers.containers.MySQLContainer; -import org.testcontainers.junit.jupiter.Container; import org.testcontainers.junit.jupiter.Testcontainers; import org.weekly.weekly.voucher.domain.DiscountType; import org.weekly.weekly.voucher.domain.Voucher; @@ -22,30 +17,19 @@ import java.util.UUID; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.*; +import static org.hamcrest.Matchers.is; +import static org.hamcrest.Matchers.samePropertyValuesAs; +@TestMethodOrder(MethodOrderer.OrderAnnotation.class) @ActiveProfiles("test") @Testcontainers -@TestMethodOrder(MethodOrderer.OrderAnnotation.class) @SpringBootTest -class JdbcVoucherRepositoryTest { - @Container - static MySQLContainer mySQLContainer = (MySQLContainer) new MySQLContainer("mysql:8") - .withInitScript("schema.sql"); - - @DynamicPropertySource - public static void overrideContainerProperties(DynamicPropertyRegistry dynamicPropertyRegistry) { - dynamicPropertyRegistry.add("spring.datasource.url",mySQLContainer::getJdbcUrl); - dynamicPropertyRegistry.add("spring.datasource.username",mySQLContainer::getUsername); - dynamicPropertyRegistry.add("spring.datasource.password",mySQLContainer::getPassword); - } - +class JdbcVoucherRepositoryTest{ @Autowired private JdbcVoucherRepository jdbcVoucherRepository; - - static Voucher fixedVoucher; - static Voucher percentVoucher; + Voucher fixedVoucher; + Voucher percentVoucher; @BeforeEach void setUp() { @@ -58,8 +42,6 @@ void setUp() { void 전체_바우처_검색_테스트() { List vouchers = jdbcVoucherRepository.findAll(); assertThat(vouchers.isEmpty(), is(false)); - - vouchers.stream().forEach(voucher -> System.out.println(voucher.getDiscountType().name())); } @Test From 269c9fb76f50dd8b5af21ce510219940dc9a4239 Mon Sep 17 00:00:00 2001 From: parksey Date: Sat, 8 Jul 2023 13:38:02 +0900 Subject: [PATCH 20/26] =?UTF-8?q?fix:=20VoucherRepository=20=EC=A1=B4?= =?UTF-8?q?=EC=9E=AC=ED=95=98=EB=8A=94=20pk=EC=97=90=20=EB=8C=80=ED=95=9C?= =?UTF-8?q?=20=EC=A4=91=EB=B3=B5=20insert=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/JdbcVoucherRepository.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/weekly/weekly/voucher/repository/JdbcVoucherRepository.java b/src/main/java/org/weekly/weekly/voucher/repository/JdbcVoucherRepository.java index 0e7505f927..8892e68ef2 100644 --- a/src/main/java/org/weekly/weekly/voucher/repository/JdbcVoucherRepository.java +++ b/src/main/java/org/weekly/weekly/voucher/repository/JdbcVoucherRepository.java @@ -1,6 +1,7 @@ package org.weekly.weekly.voucher.repository; import org.springframework.context.annotation.Profile; +import org.springframework.dao.DataAccessException; import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; @@ -53,13 +54,17 @@ public List findByDiscountType(DiscountType discountType) { @Override public Voucher insert(Voucher voucher) { String sql = "INSERT INTO vouchers(voucher_id, amount, discount, registration_date, expiration_date) VALUES (UUID_TO_BIN(?), ?, ?, ?, ?)"; - - int update = jdbcTemplate.update(sql, - uuidToBytes(voucher.getVoucherId()), - voucher.getAmount(), - voucher.getDiscountType().name(), - Timestamp.valueOf(voucher.getRegistrationDate().atStartOfDay()), - Timestamp.valueOf(voucher.getExpirationDate().atStartOfDay())); + int update = 0; + try { + update = jdbcTemplate.update(sql, + uuidToBytes(voucher.getVoucherId()), + voucher.getAmount(), + voucher.getDiscountType().name(), + Timestamp.valueOf(voucher.getRegistrationDate().atStartOfDay()), + Timestamp.valueOf(voucher.getExpirationDate().atStartOfDay())); + } catch(DataAccessException dataAccessException) { + throw new VoucherException(ExceptionMsg.SQL_INSERT_ERROR); + } if (update != 1) { throw new VoucherException(ExceptionMsg.SQL_ERROR); From ea61bc32aaf31a1a7d8292fe83245ac975772940 Mon Sep 17 00:00:00 2001 From: parksey Date: Sat, 8 Jul 2023 16:23:52 +0900 Subject: [PATCH 21/26] =?UTF-8?q?=20test:=20Customer=20=EC=97=85=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=8A=B8=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/customer/domain/Customer.java | 4 ++++ .../repository/CustomerRepository.java | 2 ++ .../repository/JdbcCustomerRepository.java | 18 +++++++++++++++++- .../customer/JdbcCustomerRepositoryTest.java | 15 +++++++++++++++ 4 files changed, 38 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/weekly/weekly/customer/domain/Customer.java b/src/main/java/org/weekly/weekly/customer/domain/Customer.java index ddebd17185..8346d758f9 100644 --- a/src/main/java/org/weekly/weekly/customer/domain/Customer.java +++ b/src/main/java/org/weekly/weekly/customer/domain/Customer.java @@ -44,4 +44,8 @@ public String getEmail() { public UUID getCustomerId() { return customerId; } + + public void updateName(String name) { + this.name = name; + } } diff --git a/src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java b/src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java index 833785f364..f0a3affd89 100644 --- a/src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java +++ b/src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java @@ -11,5 +11,7 @@ public interface CustomerRepository { void deleteAll(); Optional findByEmail(String email); List findAll(); + + Customer update(Customer customer); } diff --git a/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java b/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java index aea452a56f..867b6bbf74 100644 --- a/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java +++ b/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java @@ -10,6 +10,7 @@ import org.weekly.weekly.util.ExceptionMsg; import org.weekly.weekly.voucher.domain.DiscountType; import org.weekly.weekly.voucher.domain.Voucher; +import org.weekly.weekly.voucher.exception.VoucherException; import javax.sql.DataSource; import java.nio.ByteBuffer; @@ -81,7 +82,22 @@ public List findAll() { return jdbcTemplate.query(sql, (rs, rowNum) -> mapToCustomer(rs)); } - public static UUID toUUID(byte[] bytes) { + @Override + public Customer update(Customer customer) { + String sql = "UPDATE customers SET name = ? WHERE email = ?"; + + int update = jdbcTemplate.update(sql, + customer.getName(), + customer.getEmail()); + + if (update != 1) { + throw new CustomerException(ExceptionMsg.SQL_ERROR); + } + return customer; + } + + + private static UUID toUUID(byte[] bytes) { var buffer = ByteBuffer.wrap(bytes); return new UUID(buffer.getLong(), buffer.getLong()); } diff --git a/src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java b/src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java index 1f81807a3a..bf57b3f812 100644 --- a/src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java +++ b/src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java @@ -122,4 +122,19 @@ void deleteCustomer() { List customers = jdbcCustomerRepository.findAll(); assertThat(customers.isEmpty(), is(true)); } + + @Test + void 회원_닉네임_업데이트_테스트() { + // Given + Customer insertCusomter = jdbcCustomerRepository.insert(customer); + + // When + insertCusomter.updateName("newName"); + jdbcCustomerRepository.update(insertCusomter); + + // Then + Optional updateCustomer = jdbcCustomerRepository.findByEmail(insertCusomter.getEmail()); + assertThat(updateCustomer.isPresent(), is(true)); + assertThat(updateCustomer.get(), samePropertyValuesAs(insertCusomter)); + } } From 169600b4f6e77399d84710ed06734d9e3da95fe8 Mon Sep 17 00:00:00 2001 From: parksey Date: Sat, 8 Jul 2023 16:30:31 +0900 Subject: [PATCH 22/26] =?UTF-8?q?docs:=20=EA=B8=B0=EB=8A=A5=20=EB=AA=85?= =?UTF-8?q?=EC=84=B8=EC=84=9C=20=EC=8B=AC=ED=99=94=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...45\353\252\205\354\204\270\354\204\234.md" | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git "a/docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" "b/docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" index fdddc59348..b657033a6c 100644 --- "a/docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" +++ "b/docs/2\354\243\274\354\260\250 \352\270\260\353\212\245\353\252\205\354\204\270\354\204\234.md" @@ -69,17 +69,18 @@ Type list to list all customers. - [x] CRUD 기능 ### 3. 회원 -- [ ] 회원 CRUD 기능 - - [ ] 회원 추가 - - [ ] 회원 삭제 - - [ ] 회원 업데이트 - - [ ] 회원 조회 -- [ ] JdbcTemplate를 사용하여 Repository 관리 +- [x] 회원 CRUD 기능 + - [x] 회원 추가 + - [x] 회원 삭제 + - [x] 회원 업데이트 + - [x] 회원 조회 +- [x] JdbcTemplate를 사용하여 Repository 관리 ### 4. 심화 -- 특정 고객에게 바우처를 할당할 수 있습니다. -- 고객이 어떤 바우처를 보유하고 있는지 조회할 수 있어야 합니다. -- 고객이 보유한 바우처를 제거할 수 있어야 합니다. -- 특정 바우처를 보유한 고객을 조회할 수 있어야 합니다. +- [ ] 지갑 생성 +- [ ] 고객이 바우처 조회 기능 +- [ ] 고객이 보유한 바우처 제거 기능 +- [ ] 특정 바우처를 보유한 고객 조회 기능 + From 6232845bf6866225699d0dffc31058cc4ad03c5b Mon Sep 17 00:00:00 2001 From: parksey Date: Sat, 8 Jul 2023 18:10:32 +0900 Subject: [PATCH 23/26] =?UTF-8?q?feat:=20Customer=20=EB=8F=99=EC=9E=91?= =?UTF-8?q?=EC=97=90=20=EB=94=B0=EB=A5=B8=20CRUD=20service=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/VoucherManagementController.java | 21 +++++--- .../controller/CustomerController.java | 23 +++++--- .../dto/request/CustomerCreationRequest.java | 4 ++ .../dto/request/CustomerUpdateRequest.java | 13 +++++ .../customer/dto/response/CustomerDto.java | 22 ++++++++ .../repository/JdbcCustomerRepository.java | 22 +++----- .../customer/service/CustomerService.java | 53 +++++++++++++++---- .../weekly/ui/CommandLineApplication.java | 18 +++++++ .../weekly/weekly/ui/writer/SystemWriter.java | 4 ++ .../org/weekly/weekly/util/ExceptionMsg.java | 1 + .../weekly/weekly/util/PrintMessageType.java | 1 + .../customer/JdbcCustomerRepositoryTest.java | 12 ----- 12 files changed, 142 insertions(+), 52 deletions(-) create mode 100644 src/main/java/org/weekly/weekly/customer/dto/response/CustomerDto.java diff --git a/src/main/java/org/weekly/weekly/VoucherManagementController.java b/src/main/java/org/weekly/weekly/VoucherManagementController.java index 0e0e53afd0..23ba9595e4 100644 --- a/src/main/java/org/weekly/weekly/VoucherManagementController.java +++ b/src/main/java/org/weekly/weekly/VoucherManagementController.java @@ -112,26 +112,31 @@ private boolean processCustomerMenuSelection(CustomerMenu selectMenu) { } private void handleCustomerCreation() { - CustomerCreationRequest customerCreation = this.commandLineApplication.createCustomerFromInput(); - this.customerController.createCustomer(customerCreation); + CustomerCreationRequest customerCreation = commandLineApplication.createCustomerFromInput(); + customerController.createCustomer(customerCreation); } private void handleCustomerDelete() { - CustomerUpdateRequest customerUpdateRequest = this.commandLineApplication.customerDetailFromInput(); - this.customerController.deleteCustomer(customerUpdateRequest); + CustomerUpdateRequest customerUpdateRequest = commandLineApplication.customerDetailFromInput(); + customerController.deleteCustomer(customerUpdateRequest); } private void handleCustomerDeleteAll() { - this.customerController.deleteAllCustomer(); + customerController.deleteAllCustomer(); } private void handleCustomerSearchAll() { - this.customerController.searchAllCustomer(); + customerController.searchAllCustomer(); } private void handleSearchDetail() { - CustomerUpdateRequest customerUpdateRequest = this.commandLineApplication.customerDetailFromInput(); - this.customerController.searchDetailCustomer(customerUpdateRequest); + CustomerUpdateRequest customerUpdateRequest = commandLineApplication.customerDetailFromInput(); + customerController.searchDetailCustomer(customerUpdateRequest); + } + + private void handleUpdateCustomer() { + CustomerUpdateRequest customerUpdateRequest = commandLineApplication.customerUpdateRequest(); + customerController.updateCustomer(customerUpdateRequest); } } diff --git a/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java b/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java index a3853b3ff1..53ea3490e9 100644 --- a/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java +++ b/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java @@ -3,8 +3,11 @@ import org.springframework.stereotype.Controller; import org.weekly.weekly.customer.dto.request.CustomerCreationRequest; import org.weekly.weekly.customer.dto.request.CustomerUpdateRequest; +import org.weekly.weekly.customer.dto.response.CustomerDto; import org.weekly.weekly.customer.service.CustomerService; +import java.util.List; + @Controller public class CustomerController { @@ -14,23 +17,27 @@ public CustomerController(CustomerService customerService) { this.customerService = customerService; } - public void createCustomer(CustomerCreationRequest creationRequest) { - this.customerService.createCustomer(creationRequest); + public CustomerDto createCustomer(CustomerCreationRequest creationRequest) { + return customerService.createCustomer(creationRequest); } public void deleteCustomer(CustomerUpdateRequest updateRequest) { - this.customerService.deleteCustomer(updateRequest); + customerService.deleteCustomer(updateRequest); } public void deleteAllCustomer() { - this.customerService.deleteAllCustomer(); + customerService.deleteAllCustomers(); + } + + public CustomerDto searchDetailCustomer(CustomerUpdateRequest updateRequest) { + return customerService.searchDetailCustomer(updateRequest); } - public void searchDetailCustomer(CustomerUpdateRequest updateRequest) { - this.customerService.searchDetailCustomer(updateRequest); + public List searchAllCustomer() { + return customerService.searchAllCustomer(); } - public void searchAllCustomer() { - this.customerService.searchAllCustomer(); + public void updateCustomer(CustomerUpdateRequest updateRequest) { + customerService.updateCustomer(updateRequest); } } diff --git a/src/main/java/org/weekly/weekly/customer/dto/request/CustomerCreationRequest.java b/src/main/java/org/weekly/weekly/customer/dto/request/CustomerCreationRequest.java index 3ec0eafe87..f21ac3cb5b 100644 --- a/src/main/java/org/weekly/weekly/customer/dto/request/CustomerCreationRequest.java +++ b/src/main/java/org/weekly/weekly/customer/dto/request/CustomerCreationRequest.java @@ -23,4 +23,8 @@ public static CustomerCreationRequest of(String email, String name) { public Customer toCustomer() { return Customer.of(UUID.randomUUID(), name, email); } + + public String getEmail() { + return email; + } } diff --git a/src/main/java/org/weekly/weekly/customer/dto/request/CustomerUpdateRequest.java b/src/main/java/org/weekly/weekly/customer/dto/request/CustomerUpdateRequest.java index 6849647305..5567f226b4 100644 --- a/src/main/java/org/weekly/weekly/customer/dto/request/CustomerUpdateRequest.java +++ b/src/main/java/org/weekly/weekly/customer/dto/request/CustomerUpdateRequest.java @@ -4,7 +4,12 @@ public class CustomerUpdateRequest { private String email; + private String newEmail; + private CustomerUpdateRequest(String email, String afterEmail) { + this.email = email; + this.newEmail = afterEmail; + } private CustomerUpdateRequest(String email) { this.email = email; } @@ -14,7 +19,15 @@ public static CustomerUpdateRequest of(String email) { return new CustomerUpdateRequest(email); } + public static CustomerUpdateRequest of(String email, String afterEmail) { + InputValidator.isEmpty(email); + InputValidator.isEmpty(afterEmail); + return new CustomerUpdateRequest(email, afterEmail); + } + public String email() { return email; } + + public String newEmail() {return newEmail;} } diff --git a/src/main/java/org/weekly/weekly/customer/dto/response/CustomerDto.java b/src/main/java/org/weekly/weekly/customer/dto/response/CustomerDto.java new file mode 100644 index 0000000000..02327c70a2 --- /dev/null +++ b/src/main/java/org/weekly/weekly/customer/dto/response/CustomerDto.java @@ -0,0 +1,22 @@ +package org.weekly.weekly.customer.dto.response; + +import org.weekly.weekly.customer.domain.Customer; + +import java.time.LocalDateTime; +import java.util.UUID; + +public class CustomerDto { + String name; + String email; + LocalDateTime createAt; + + private CustomerDto(String name, String email, LocalDateTime createAt) { + this.name = name; + this.email = email; + this.createAt = createAt; + } + + public static CustomerDto of(Customer customer) { + return new CustomerDto(customer.getName(), customer.getEmail(), customer.getCreateAt()); + } +} diff --git a/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java b/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java index 867b6bbf74..912f7a928b 100644 --- a/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java +++ b/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java @@ -35,21 +35,15 @@ public JdbcCustomerRepository(DataSource dataSource) { @Override public Customer insert(Customer customer) { String sql = "INSERT INTO customers(customer_id, name, email, create_at) VALUES(UUID_TO_BIN(?), ?, ?, ?)"; - int insert = 0; - try { - insert = jdbcTemplate.update(sql, - uuidToBytes(customer.getCustomerId()), - customer.getName(), - customer.getEmail(), - LocalDateTime.now()); - - if (insert != 1) { - throw new CustomerException(ExceptionMsg.SQL_INSERT_ERROR); - } - } catch (DataAccessException ex) { - throw new CustomerException(ExceptionMsg.SQL_ERROR); - } + int insert = jdbcTemplate.update(sql, + uuidToBytes(customer.getCustomerId()), + customer.getName(), + customer.getEmail(), + LocalDateTime.now()); + if (insert != 1) { + throw new CustomerException(ExceptionMsg.SQL_INSERT_ERROR); + } return customer; } diff --git a/src/main/java/org/weekly/weekly/customer/service/CustomerService.java b/src/main/java/org/weekly/weekly/customer/service/CustomerService.java index 574d2df03e..ddaf6ecb8e 100644 --- a/src/main/java/org/weekly/weekly/customer/service/CustomerService.java +++ b/src/main/java/org/weekly/weekly/customer/service/CustomerService.java @@ -4,7 +4,13 @@ import org.weekly.weekly.customer.domain.Customer; import org.weekly.weekly.customer.dto.request.CustomerCreationRequest; import org.weekly.weekly.customer.dto.request.CustomerUpdateRequest; +import org.weekly.weekly.customer.dto.response.CustomerDto; +import org.weekly.weekly.customer.exception.CustomerException; import org.weekly.weekly.customer.repository.CustomerRepository; +import org.weekly.weekly.util.ExceptionMsg; + +import java.util.List; +import java.util.Optional; @Service public class CustomerService { @@ -14,27 +20,54 @@ public CustomerService(CustomerRepository customerRepository) { this.customerRepository = customerRepository; } - public Customer createCustomer(CustomerCreationRequest creationRequest) { + public CustomerDto createCustomer(CustomerCreationRequest creationRequest) { + validateCustomerNotExist(creationRequest.getEmail()); + Customer customer = creationRequest.toCustomer(); - this.customerRepository.insert(customer); - return customer; + customerRepository.insert(customer); + return CustomerDto.of(customer); } public void deleteCustomer(CustomerUpdateRequest updateRequest) { String email = updateRequest.email(); - this.customerRepository.deleteByEmail(email); + customerRepository.deleteByEmail(email); } - public void deleteAllCustomer() { - this.customerRepository.deleteAll(); + public void deleteAllCustomers() { + customerRepository.deleteAll(); } - public void searchDetailCustomer(CustomerUpdateRequest updateRequest) { + + public CustomerDto searchDetailCustomer(CustomerUpdateRequest updateRequest) { String email = updateRequest.email(); - this.customerRepository.findByEmail(email); + Customer customer = validateCustomerExistAndGet(email); + return CustomerDto.of(customer); + } + + public List searchAllCustomer() { + List customers = customerRepository.findAll(); + return customers.stream().map(CustomerDto::of).toList(); + } + + public void updateCustomer(CustomerUpdateRequest updateRequest) { + validateCustomerNotExist(updateRequest.newEmail()); + + Customer customer = validateCustomerExistAndGet(updateRequest.email()); + customerRepository.update(customer); + } + + private void validateCustomerNotExist(String email) { + Optional findCustomer = customerRepository.findByEmail(email); + if (findCustomer.isPresent()) { + throw new CustomerException(ExceptionMsg.SQL_EXIST); + } } - public void searchAllCustomer() { - this.customerRepository.findAll(); + private Customer validateCustomerExistAndGet(String email) { + Optional customer = customerRepository.findByEmail(email); + if (customer.isEmpty()) { + throw new CustomerException(ExceptionMsg.SQL_ERROR); + } + return customer.get(); } } diff --git a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java index 2e839d04ee..fcb92a117b 100644 --- a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java +++ b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java @@ -85,6 +85,18 @@ public CustomerUpdateRequest customerDetailFromInput() { } } + public CustomerUpdateRequest customerUpdateRequest(){ + while(true) { + try { + String email = processEmail(); + String newEmail = processNewEmail(); + return CustomerUpdateRequest.of(email, newEmail); + } catch (Exception exception) { + printErrorMsg(exception.getMessage()); + } + } + } + public void printErrorMsg(String errorMsg) { this.commandWriter.printErrorMessage(errorMsg); } @@ -126,6 +138,12 @@ private String processEmail() { this.commandWriter.printEmailInputMessage(); return readUserInput(); } + + private String processNewEmail() { + this.commandWriter.printNewEmailInputMessage(); + return readUserInput(); + } + private String processName() { this.commandWriter.printNameInputMessage(); return readUserInput(); diff --git a/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java b/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java index 401a370f15..052760c49a 100644 --- a/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java +++ b/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java @@ -53,6 +53,10 @@ public void printEmailInputMessage() { println(PrintMessageType.EMAIL_INPUT.getMessage()); } + public void printNewEmailInputMessage() { + println(PrintMessageType.NEW_EMAIL_INPUT.getMessage()); + } + public void printNameInputMessage() { println(PrintMessageType.NAME_INPUT.getMessage()); } diff --git a/src/main/java/org/weekly/weekly/util/ExceptionMsg.java b/src/main/java/org/weekly/weekly/util/ExceptionMsg.java index 5dbfee8ef7..e018ef1d06 100644 --- a/src/main/java/org/weekly/weekly/util/ExceptionMsg.java +++ b/src/main/java/org/weekly/weekly/util/ExceptionMsg.java @@ -16,6 +16,7 @@ public enum ExceptionMsg { NOT_EMAIL_FORMAT("이메일형식이 아닙니다."), SQL_ERROR("값을 가져오기 실패"), SQL_INSERT_ERROR("값 추가 실패"), + SQL_EXIST("이미 존재합니다."), SQL_DELETE_ERROR("삭제 실패"); private String msg; diff --git a/src/main/java/org/weekly/weekly/util/PrintMessageType.java b/src/main/java/org/weekly/weekly/util/PrintMessageType.java index 37deddc342..5734889da7 100644 --- a/src/main/java/org/weekly/weekly/util/PrintMessageType.java +++ b/src/main/java/org/weekly/weekly/util/PrintMessageType.java @@ -9,6 +9,7 @@ public enum PrintMessageType { INPUT_MESSAGE("입력하세요: "), DISCOUNT_SELECT("할인 종류중 하나를 선택하세요"), EMAIL_INPUT("이메일을 입력하세요: "), + NEW_EMAIL_INPUT("새 이메일을 입력하세요: "), NAME_INPUT("이름을 입력하세요"), NO_VOUCHER_DATAS("저장소에 데이터가 없습니다."), EMPTY(""), diff --git a/src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java b/src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java index bf57b3f812..3bb08a8258 100644 --- a/src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java +++ b/src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java @@ -62,18 +62,6 @@ void deleteCustomer() { assertThat(findCustomer.get(), samePropertyValuesAs(insertCustomer)); } - @Test - void 회원_등록실패_테스트() { - // Given - Customer insertCustomer = jdbcCustomerRepository.insert(customer); - Optional findCustomer = jdbcCustomerRepository.findByEmail(insertCustomer.getEmail()); - - // When + Then - assertThatThrownBy(()->jdbcCustomerRepository.insert(customer)).isInstanceOf(CustomerException.class); - } - - - @Test void 이메일_회원_검색_성공_테스트() { // Given From 581db86d7084b74a59d75b0f3f57f35897eefa04 Mon Sep 17 00:00:00 2001 From: parksey Date: Sat, 8 Jul 2023 18:28:09 +0900 Subject: [PATCH 24/26] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20this=EC=97=B0=EC=82=B0=EC=9E=90=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0=20=EB=B0=8F=20controller=20=EB=B0=98=ED=99=98?= =?UTF-8?q?=EA=B0=92=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/VoucherManageApplication.java | 2 -- .../weekly/VoucherManagementController.java | 14 ++++++------ .../controller/CustomerController.java | 8 +++---- .../customer/service/CustomerService.java | 15 +++++++++---- .../weekly/ui/CommandLineApplication.java | 22 +++++++++---------- .../weekly/ui/reader/BufferedReaderWrap.java | 4 ++-- .../weekly/weekly/ui/reader/ConsoleWrap.java | 3 +-- .../weekly/weekly/ui/reader/ScannerWrap.java | 4 ++-- .../org/weekly/weekly/util/ExceptionMsg.java | 2 +- .../voucher/controller/VoucherController.java | 4 ++-- .../voucher/service/VoucherService.java | 7 +++--- 11 files changed, 44 insertions(+), 41 deletions(-) diff --git a/src/main/java/org/weekly/weekly/VoucherManageApplication.java b/src/main/java/org/weekly/weekly/VoucherManageApplication.java index 0e418c8a07..4c5478301d 100644 --- a/src/main/java/org/weekly/weekly/VoucherManageApplication.java +++ b/src/main/java/org/weekly/weekly/VoucherManageApplication.java @@ -4,8 +4,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ApplicationContext; -import java.util.Arrays; - @SpringBootApplication public class VoucherManageApplication { public static void main(String[] args) { diff --git a/src/main/java/org/weekly/weekly/VoucherManagementController.java b/src/main/java/org/weekly/weekly/VoucherManagementController.java index 23ba9595e4..f797d74cc8 100644 --- a/src/main/java/org/weekly/weekly/VoucherManagementController.java +++ b/src/main/java/org/weekly/weekly/VoucherManagementController.java @@ -33,22 +33,22 @@ public void start() { while(!isExit) { try { - ManageMenu manageMenu = this.commandLineApplication.readManageMenu(); + ManageMenu manageMenu = commandLineApplication.readManageMenu(); isExit = processManageMenuSelection(manageMenu); } catch (RuntimeException runtimeException) { - this.commandLineApplication.printErrorMsg(runtimeException.getMessage()); + commandLineApplication.printErrorMsg(runtimeException.getMessage()); } } } private boolean processManageMenuSelection(ManageMenu manageMenu) { if (ManageMenu.VOUCHER.equals(manageMenu)) { - VoucherMenu voucherMenu = this.commandLineApplication.readVoucherMenu(); + VoucherMenu voucherMenu = commandLineApplication.readVoucherMenu(); return processVoucherMenuSelection(voucherMenu); } if (ManageMenu.CUSTOMER.equals(manageMenu)){ - CustomerMenu customerMenu = this.commandLineApplication.readCustomerMenu(); + CustomerMenu customerMenu = commandLineApplication.readCustomerMenu(); return processCustomerMenuSelection(customerMenu); } @@ -70,16 +70,16 @@ private boolean processVoucherMenuSelection(VoucherMenu selectMenu) { } private void handleVoucherCreation() { - VoucherCreationRequest voucherCreationRequest = this.commandLineApplication.createVoucherFromInput(); + VoucherCreationRequest voucherCreationRequest = commandLineApplication.createVoucherFromInput(); Response response = voucherController.createVoucher(voucherCreationRequest); logger.info("{}{}", PrintMessageType.CREATE_VOUCHER_SUCCESS.getMessage(),response.getResult()); - this.commandLineApplication.printResult(response); + commandLineApplication.printResult(response); } private void handleVoucherSearch() { Response response = voucherController.getVouchers(); logger.info("{}{}", PrintMessageType.FIND_ALL_VOUCHER_SUCCESS.getMessage(), response.getResult()); - this.commandLineApplication.printResult(response); + commandLineApplication.printResult(response); } private boolean processCustomerMenuSelection(CustomerMenu selectMenu) { diff --git a/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java b/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java index 53ea3490e9..6255be162c 100644 --- a/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java +++ b/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java @@ -30,14 +30,14 @@ public void deleteAllCustomer() { } public CustomerDto searchDetailCustomer(CustomerUpdateRequest updateRequest) { - return customerService.searchDetailCustomer(updateRequest); + return customerService.findDetailCustomer(updateRequest); } public List searchAllCustomer() { - return customerService.searchAllCustomer(); + return customerService.findAllCustomer(); } - public void updateCustomer(CustomerUpdateRequest updateRequest) { - customerService.updateCustomer(updateRequest); + public CustomerDto updateCustomer(CustomerUpdateRequest updateRequest) { + return customerService.updateCustomer(updateRequest); } } diff --git a/src/main/java/org/weekly/weekly/customer/service/CustomerService.java b/src/main/java/org/weekly/weekly/customer/service/CustomerService.java index ddaf6ecb8e..60c9ae252f 100644 --- a/src/main/java/org/weekly/weekly/customer/service/CustomerService.java +++ b/src/main/java/org/weekly/weekly/customer/service/CustomerService.java @@ -1,6 +1,7 @@ package org.weekly.weekly.customer.service; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import org.weekly.weekly.customer.domain.Customer; import org.weekly.weekly.customer.dto.request.CustomerCreationRequest; import org.weekly.weekly.customer.dto.request.CustomerUpdateRequest; @@ -20,6 +21,7 @@ public CustomerService(CustomerRepository customerRepository) { this.customerRepository = customerRepository; } + @Transactional public CustomerDto createCustomer(CustomerCreationRequest creationRequest) { validateCustomerNotExist(creationRequest.getEmail()); @@ -28,6 +30,7 @@ public CustomerDto createCustomer(CustomerCreationRequest creationRequest) { return CustomerDto.of(customer); } + @Transactional public void deleteCustomer(CustomerUpdateRequest updateRequest) { String email = updateRequest.email(); customerRepository.deleteByEmail(email); @@ -38,22 +41,26 @@ public void deleteAllCustomers() { } - public CustomerDto searchDetailCustomer(CustomerUpdateRequest updateRequest) { + public CustomerDto findDetailCustomer(CustomerUpdateRequest updateRequest) { String email = updateRequest.email(); Customer customer = validateCustomerExistAndGet(email); return CustomerDto.of(customer); } - public List searchAllCustomer() { + public List findAllCustomer() { List customers = customerRepository.findAll(); return customers.stream().map(CustomerDto::of).toList(); } - public void updateCustomer(CustomerUpdateRequest updateRequest) { + @Transactional + public CustomerDto updateCustomer(CustomerUpdateRequest updateRequest) { validateCustomerNotExist(updateRequest.newEmail()); Customer customer = validateCustomerExistAndGet(updateRequest.email()); - customerRepository.update(customer); + + customer.updateName(updateRequest.newEmail()); + Customer updateCustomer = customerRepository.update(customer); + return CustomerDto.of(updateCustomer); } private void validateCustomerNotExist(String email) { diff --git a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java index fcb92a117b..d96d6b6a5d 100644 --- a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java +++ b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java @@ -31,21 +31,21 @@ public CommandLineApplication(CommandReader commandReader, SystemWriter commandW public ManageMenu readManageMenu() { return readMenu(()-> { - this.commandWriter.printMangeProgram(); + commandWriter.printMangeProgram(); return ManageMenu.getMenu(readUserInput()); }); } public VoucherMenu readVoucherMenu() { return readMenu(()-> { - this.commandWriter.printVoucherProgram(); + commandWriter.printVoucherProgram(); return VoucherMenu.getMenu(readUserInput()); }); } public CustomerMenu readCustomerMenu() { return readMenu(()-> { - this.commandWriter.printCustomerProgram(); + commandWriter.printCustomerProgram(); return CustomerMenu.getMenu(readUserInput()); }); } @@ -98,16 +98,16 @@ public CustomerUpdateRequest customerUpdateRequest(){ } public void printErrorMsg(String errorMsg) { - this.commandWriter.printErrorMessage(errorMsg); + commandWriter.printErrorMessage(errorMsg); } public void printResult(Response response) { - this.commandWriter.printReuslt(response.getResult()); + commandWriter.printReuslt(response.getResult()); } private String readUserInput() { - String userInput = this.commandReader.readLine(); + String userInput = commandReader.readLine(); InputValidator.isEmpty(userInput); return userInput; } @@ -123,29 +123,29 @@ private T readMenu(Supplier menuSupplier) { } private DiscountType readDiscountType() { - this.commandWriter.printSelectDiscount(); + commandWriter.printSelectDiscount(); String no = readUserInput(); return DiscountType.getDiscountTypeByNumber(no); } private VoucherInfoRequest readVoucherInfo(DiscountType discountType){ - this.commandWriter.printCreateVoucher(discountType); + commandWriter.printCreateVoucher(discountType); String voucherInfo = readUserInput(); return VoucherInfoRequest.of(voucherInfo); } private String processEmail() { - this.commandWriter.printEmailInputMessage(); + commandWriter.printEmailInputMessage(); return readUserInput(); } private String processNewEmail() { - this.commandWriter.printNewEmailInputMessage(); + commandWriter.printNewEmailInputMessage(); return readUserInput(); } private String processName() { - this.commandWriter.printNameInputMessage(); + commandWriter.printNameInputMessage(); return readUserInput(); } } diff --git a/src/main/java/org/weekly/weekly/ui/reader/BufferedReaderWrap.java b/src/main/java/org/weekly/weekly/ui/reader/BufferedReaderWrap.java index 38312125d8..6542b3dc7c 100644 --- a/src/main/java/org/weekly/weekly/ui/reader/BufferedReaderWrap.java +++ b/src/main/java/org/weekly/weekly/ui/reader/BufferedReaderWrap.java @@ -15,13 +15,13 @@ public class BufferedReaderWrap implements CommandReader { private final BufferedReader bufferedReader; public BufferedReaderWrap() { - System.out.println("buffer");this.bufferedReader = new BufferedReader(new InputStreamReader(System.in)); + bufferedReader = new BufferedReader(new InputStreamReader(System.in)); } @Override public String readLine(){ try { - return this.bufferedReader.readLine(); + return bufferedReader.readLine(); } catch (IOException exception) { throw new InputException(ExceptionMsg.NOT_INPUT_FORMAT); } diff --git a/src/main/java/org/weekly/weekly/ui/reader/ConsoleWrap.java b/src/main/java/org/weekly/weekly/ui/reader/ConsoleWrap.java index 525460ca8f..b4e02e6bb8 100644 --- a/src/main/java/org/weekly/weekly/ui/reader/ConsoleWrap.java +++ b/src/main/java/org/weekly/weekly/ui/reader/ConsoleWrap.java @@ -11,8 +11,7 @@ public class ConsoleWrap implements CommandReader{ private final Console consoleWrap; public ConsoleWrap() { - System.out.println("consol"); - this.consoleWrap = System.console(); + consoleWrap = System.console(); } @Override diff --git a/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java b/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java index 87ea44d34a..e51580abe0 100644 --- a/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java +++ b/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java @@ -12,12 +12,12 @@ public class ScannerWrap implements CommandReader{ private final Scanner scanner; public ScannerWrap() { - this.scanner = new Scanner(System.in); + scanner = new Scanner(System.in); } @Override public String readLine() { - String userInput = this.scanner.nextLine().trim(); + String userInput = scanner.nextLine().trim(); checkException(userInput); return userInput.toUpperCase(); } diff --git a/src/main/java/org/weekly/weekly/util/ExceptionMsg.java b/src/main/java/org/weekly/weekly/util/ExceptionMsg.java index e018ef1d06..c77ec9ab02 100644 --- a/src/main/java/org/weekly/weekly/util/ExceptionMsg.java +++ b/src/main/java/org/weekly/weekly/util/ExceptionMsg.java @@ -19,7 +19,7 @@ public enum ExceptionMsg { SQL_EXIST("이미 존재합니다."), SQL_DELETE_ERROR("삭제 실패"); - private String msg; + private final String msg; ExceptionMsg(String msg) { this.msg = msg; diff --git a/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java b/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java index d0b8b1648a..5e9c1e2804 100644 --- a/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java +++ b/src/main/java/org/weekly/weekly/voucher/controller/VoucherController.java @@ -19,10 +19,10 @@ public VoucherController(VoucherService voucherService) { public Response createVoucher(VoucherCreationRequest voucherCreationRequest) { - return this.voucherService.insertVoucher(voucherCreationRequest); + return voucherService.insertVoucher(voucherCreationRequest); } public Response getVouchers() { - return this.voucherService.getVouchers(); + return voucherService.getVouchers(); } } diff --git a/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java b/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java index a7a37d773b..a79e89cd54 100644 --- a/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java +++ b/src/main/java/org/weekly/weekly/voucher/service/VoucherService.java @@ -2,10 +2,9 @@ import org.springframework.stereotype.Service; import org.weekly.weekly.voucher.domain.Voucher; +import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; import org.weekly.weekly.voucher.dto.response.VoucherCreationResponse; import org.weekly.weekly.voucher.dto.response.VouchersResponse; -import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; -import org.weekly.weekly.voucher.repository.MemoryVoucherRepository; import org.weekly.weekly.voucher.repository.VoucherRepository; import java.util.List; @@ -20,12 +19,12 @@ public VoucherService(VoucherRepository voucherRepository) { public VoucherCreationResponse insertVoucher(VoucherCreationRequest voucherCreationRequest) { Voucher voucher = voucherCreationRequest.toVoucher(); - this.voucherRepository.insert(voucher); + voucherRepository.insert(voucher); return new VoucherCreationResponse(voucher); } public VouchersResponse getVouchers() { - List vouchers = this.voucherRepository.findAll(); + List vouchers = voucherRepository.findAll(); return new VouchersResponse(vouchers); } From 9981e62e1311989249caa2ed489799beb97c5b46 Mon Sep 17 00:00:00 2001 From: parksey Date: Sat, 8 Jul 2023 19:00:29 +0900 Subject: [PATCH 25/26] =?UTF-8?q?feat:=20Util=20=ED=81=B4=EB=9E=98?= =?UTF-8?q?=EC=8A=A4=20public=20=EC=83=9D=EC=84=B1=EC=9E=90=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=8B=9C=20error=20throw=20=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EB=B3=80=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/weekly/weekly/VoucherManagementController.java | 9 ++++++++- .../weekly/weekly/customer/dto/response/CustomerDto.java | 6 ++++++ .../weekly/customer/exception/CustomerValidator.java | 4 ++++ .../org/weekly/weekly/ui/exception/InputException.java | 1 + .../org/weekly/weekly/ui/exception/InputValidator.java | 5 +++++ src/main/java/org/weekly/weekly/util/CustomerMenu.java | 3 ++- .../weekly/voucher/exception/VoucherValidator.java | 1 - 7 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/weekly/weekly/VoucherManagementController.java b/src/main/java/org/weekly/weekly/VoucherManagementController.java index f797d74cc8..b242673a67 100644 --- a/src/main/java/org/weekly/weekly/VoucherManagementController.java +++ b/src/main/java/org/weekly/weekly/VoucherManagementController.java @@ -6,6 +6,7 @@ import org.weekly.weekly.customer.controller.CustomerController; import org.weekly.weekly.customer.dto.request.CustomerCreationRequest; import org.weekly.weekly.customer.dto.request.CustomerUpdateRequest; +import org.weekly.weekly.customer.dto.response.CustomerDto; import org.weekly.weekly.ui.CommandLineApplication; import org.weekly.weekly.util.CustomerMenu; import org.weekly.weekly.util.ManageMenu; @@ -108,12 +109,18 @@ private boolean processCustomerMenuSelection(CustomerMenu selectMenu) { return false; } + if (CustomerMenu.UPDATE.equals(selectMenu)) { + handleUpdateCustomer(); + return false; + } + return true; } private void handleCustomerCreation() { CustomerCreationRequest customerCreation = commandLineApplication.createCustomerFromInput(); - customerController.createCustomer(customerCreation); + CustomerDto customerDto = customerController.createCustomer(customerCreation); + } private void handleCustomerDelete() { diff --git a/src/main/java/org/weekly/weekly/customer/dto/response/CustomerDto.java b/src/main/java/org/weekly/weekly/customer/dto/response/CustomerDto.java index 02327c70a2..a952aef71b 100644 --- a/src/main/java/org/weekly/weekly/customer/dto/response/CustomerDto.java +++ b/src/main/java/org/weekly/weekly/customer/dto/response/CustomerDto.java @@ -2,6 +2,7 @@ import org.weekly.weekly.customer.domain.Customer; +import java.text.MessageFormat; import java.time.LocalDateTime; import java.util.UUID; @@ -19,4 +20,9 @@ private CustomerDto(String name, String email, LocalDateTime createAt) { public static CustomerDto of(Customer customer) { return new CustomerDto(customer.getName(), customer.getEmail(), customer.getCreateAt()); } + + @Override + public String toString() { + return MessageFormat.format("[이름: {0}, 이메일: {1}, 생성 시기: {2}]", name, email, createAt); + } } diff --git a/src/main/java/org/weekly/weekly/customer/exception/CustomerValidator.java b/src/main/java/org/weekly/weekly/customer/exception/CustomerValidator.java index fadc923b3e..d30f721d32 100644 --- a/src/main/java/org/weekly/weekly/customer/exception/CustomerValidator.java +++ b/src/main/java/org/weekly/weekly/customer/exception/CustomerValidator.java @@ -5,6 +5,10 @@ import java.util.regex.Pattern; public class CustomerValidator { + + public CustomerValidator() { + throw new CustomerException(ExceptionMsg.UTIL_CLASS); + } private static final String EMAIL_FORMAT = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,3}$"; public static void validateEmailFormat(String email) { if (!Pattern.matches(EMAIL_FORMAT, email)) { diff --git a/src/main/java/org/weekly/weekly/ui/exception/InputException.java b/src/main/java/org/weekly/weekly/ui/exception/InputException.java index cecfae6f61..6eb0516cfb 100644 --- a/src/main/java/org/weekly/weekly/ui/exception/InputException.java +++ b/src/main/java/org/weekly/weekly/ui/exception/InputException.java @@ -3,6 +3,7 @@ import org.weekly.weekly.util.ExceptionMsg; public class InputException extends RuntimeException{ + public InputException(ExceptionMsg exception) { super(exception.getMsg()); } diff --git a/src/main/java/org/weekly/weekly/ui/exception/InputValidator.java b/src/main/java/org/weekly/weekly/ui/exception/InputValidator.java index 537b5662f2..0c4c3ef6c0 100644 --- a/src/main/java/org/weekly/weekly/ui/exception/InputValidator.java +++ b/src/main/java/org/weekly/weekly/ui/exception/InputValidator.java @@ -1,10 +1,15 @@ package org.weekly.weekly.ui.exception; import org.weekly.weekly.util.ExceptionMsg; +import org.weekly.weekly.voucher.exception.VoucherException; import java.util.Arrays; public class InputValidator { + public InputValidator() { + throw new InputException(ExceptionMsg.UTIL_CLASS); + } + private static final int VOUCHER_INPUT_SIZE = 2; public static void isEmpty(String userInput) { if (userInput == null || userInput.isBlank()) { diff --git a/src/main/java/org/weekly/weekly/util/CustomerMenu.java b/src/main/java/org/weekly/weekly/util/CustomerMenu.java index 9b3d9ffeb2..bf9cfd648e 100644 --- a/src/main/java/org/weekly/weekly/util/CustomerMenu.java +++ b/src/main/java/org/weekly/weekly/util/CustomerMenu.java @@ -10,7 +10,8 @@ public enum CustomerMenu implements Menu { DELETE("Type list to list all vouchers."), DELETE_ALL("[Type: delete_all] 모든 유저 삭제"), SEARCH_ALL("[Type: search_all] 모든 유저 검색"), - SEARCH_DETAIL("[Type: search_detail] 유저 상세 검색"); + SEARCH_DETAIL("[Type: search_detail] 유저 상세 검색"), + UPDATE("[Type: update] 유저 정보 업데이트"); private final String printMessage; private static final Map CUSTOMER_MENU_MAP; diff --git a/src/main/java/org/weekly/weekly/voucher/exception/VoucherValidator.java b/src/main/java/org/weekly/weekly/voucher/exception/VoucherValidator.java index e3ac855aa3..872558d980 100644 --- a/src/main/java/org/weekly/weekly/voucher/exception/VoucherValidator.java +++ b/src/main/java/org/weekly/weekly/voucher/exception/VoucherValidator.java @@ -5,7 +5,6 @@ import java.time.LocalDate; import java.util.function.LongPredicate; -import java.util.function.Predicate; public class VoucherValidator { private static final int RANGE_START = 0; From 1e2b9092aca598e6bb0601e629ad59afd5dde95b Mon Sep 17 00:00:00 2001 From: parksey Date: Sat, 8 Jul 2023 20:25:09 +0900 Subject: [PATCH 26/26] =?UTF-8?q?fix:=20=ED=9A=8C=EC=9B=90=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=EC=8B=9C=20=EB=82=A0=EC=A7=9C=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20Manage=EC=9D=98=20exit?= =?UTF-8?q?=EB=A7=8C=20=EC=A2=85=EB=A3=8C=ED=95=98=EA=B2=8C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weekly/VoucherManageApplication.java | 1 + .../weekly/VoucherManagementController.java | 43 +++++++++++++------ .../controller/CustomerController.java | 11 ++--- .../weekly/customer/domain/Customer.java | 14 ++---- ...CustomerDto.java => CustomerResponse.java} | 12 +++--- .../dto/response/CustomersResponse.java | 31 +++++++++++++ .../repository/CustomerRepository.java | 2 +- .../repository/JdbcCustomerRepository.java | 14 +++--- .../customer/service/CustomerService.java | 22 +++++----- .../weekly/ui/CommandLineApplication.java | 17 ++++++-- .../weekly/weekly/ui/reader/ScannerWrap.java | 2 +- .../weekly/weekly/ui/writer/SystemWriter.java | 5 +++ .../org/weekly/weekly/util/CustomerMenu.java | 12 +++--- .../org/weekly/weekly/util/ManageMenu.java | 6 +-- .../weekly/weekly/util/PrintMessageType.java | 3 +- .../weekly/weekly/voucher/dto/Response.java | 3 ++ .../customer/JdbcCustomerRepositoryTest.java | 8 ++-- 17 files changed, 136 insertions(+), 70 deletions(-) rename src/main/java/org/weekly/weekly/customer/dto/response/{CustomerDto.java => CustomerResponse.java} (55%) create mode 100644 src/main/java/org/weekly/weekly/customer/dto/response/CustomersResponse.java diff --git a/src/main/java/org/weekly/weekly/VoucherManageApplication.java b/src/main/java/org/weekly/weekly/VoucherManageApplication.java index 4c5478301d..7fe8ed5f34 100644 --- a/src/main/java/org/weekly/weekly/VoucherManageApplication.java +++ b/src/main/java/org/weekly/weekly/VoucherManageApplication.java @@ -7,6 +7,7 @@ @SpringBootApplication public class VoucherManageApplication { public static void main(String[] args) { + ApplicationContext context = SpringApplication.run(VoucherManageApplication.class, args); context.getBean(VoucherManagementController.class).start(); } diff --git a/src/main/java/org/weekly/weekly/VoucherManagementController.java b/src/main/java/org/weekly/weekly/VoucherManagementController.java index b242673a67..8cc14adbd3 100644 --- a/src/main/java/org/weekly/weekly/VoucherManagementController.java +++ b/src/main/java/org/weekly/weekly/VoucherManagementController.java @@ -6,7 +6,8 @@ import org.weekly.weekly.customer.controller.CustomerController; import org.weekly.weekly.customer.dto.request.CustomerCreationRequest; import org.weekly.weekly.customer.dto.request.CustomerUpdateRequest; -import org.weekly.weekly.customer.dto.response.CustomerDto; +import org.weekly.weekly.customer.dto.response.CustomerResponse; +import org.weekly.weekly.customer.dto.response.CustomersResponse; import org.weekly.weekly.ui.CommandLineApplication; import org.weekly.weekly.util.CustomerMenu; import org.weekly.weekly.util.ManageMenu; @@ -16,6 +17,8 @@ import org.weekly.weekly.voucher.dto.Response; import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; +import java.util.List; + @Component public class VoucherManagementController { private final Logger logger = LoggerFactory.getLogger(VoucherManagementController.class); @@ -43,14 +46,20 @@ public void start() { } private boolean processManageMenuSelection(ManageMenu manageMenu) { + if (ManageMenu.EXIT.equals(manageMenu)) { + return true; + } + if (ManageMenu.VOUCHER.equals(manageMenu)) { VoucherMenu voucherMenu = commandLineApplication.readVoucherMenu(); - return processVoucherMenuSelection(voucherMenu); + processVoucherMenuSelection(voucherMenu); + return false; } if (ManageMenu.CUSTOMER.equals(manageMenu)){ CustomerMenu customerMenu = commandLineApplication.readCustomerMenu(); - return processCustomerMenuSelection(customerMenu); + processCustomerMenuSelection(customerMenu); + return false; } return true; @@ -67,6 +76,7 @@ private boolean processVoucherMenuSelection(VoucherMenu selectMenu) { return false; } + return true; } @@ -99,13 +109,13 @@ private boolean processCustomerMenuSelection(CustomerMenu selectMenu) { return false; } - if (CustomerMenu.SEARCH_ALL.equals(selectMenu)) { - handleCustomerSearchAll(); + if (CustomerMenu.FIND_ALL.equals(selectMenu)) { + handleCustomerFindAll(); return false; } - if (CustomerMenu.SEARCH_DETAIL.equals(selectMenu)) { - handleSearchDetail(); + if (CustomerMenu.FIND_DETAIL.equals(selectMenu)) { + handleFindDetail(); return false; } @@ -119,31 +129,36 @@ private boolean processCustomerMenuSelection(CustomerMenu selectMenu) { private void handleCustomerCreation() { CustomerCreationRequest customerCreation = commandLineApplication.createCustomerFromInput(); - CustomerDto customerDto = customerController.createCustomer(customerCreation); - + CustomerResponse customerDto = customerController.createCustomer(customerCreation); + commandLineApplication.printResult(customerDto); } private void handleCustomerDelete() { CustomerUpdateRequest customerUpdateRequest = commandLineApplication.customerDetailFromInput(); customerController.deleteCustomer(customerUpdateRequest); + commandLineApplication.printDeleteMessage(); } private void handleCustomerDeleteAll() { customerController.deleteAllCustomer(); + commandLineApplication.printDeleteMessage(); } - private void handleCustomerSearchAll() { - customerController.searchAllCustomer(); + private void handleCustomerFindAll() { + CustomersResponse customerResponses = customerController.findAllCustomer(); + commandLineApplication.printResult(customerResponses); } - private void handleSearchDetail() { + private void handleFindDetail() { CustomerUpdateRequest customerUpdateRequest = commandLineApplication.customerDetailFromInput(); - customerController.searchDetailCustomer(customerUpdateRequest); + CustomerResponse customerResponse = customerController.findDetailCustomer(customerUpdateRequest); + commandLineApplication.printResult(customerResponse); } private void handleUpdateCustomer() { CustomerUpdateRequest customerUpdateRequest = commandLineApplication.customerUpdateRequest(); - customerController.updateCustomer(customerUpdateRequest); + CustomerResponse customerResponse = customerController.updateCustomer(customerUpdateRequest); + commandLineApplication.printResult(customerResponse); } } diff --git a/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java b/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java index 6255be162c..83abc90697 100644 --- a/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java +++ b/src/main/java/org/weekly/weekly/customer/controller/CustomerController.java @@ -3,7 +3,8 @@ import org.springframework.stereotype.Controller; import org.weekly.weekly.customer.dto.request.CustomerCreationRequest; import org.weekly.weekly.customer.dto.request.CustomerUpdateRequest; -import org.weekly.weekly.customer.dto.response.CustomerDto; +import org.weekly.weekly.customer.dto.response.CustomerResponse; +import org.weekly.weekly.customer.dto.response.CustomersResponse; import org.weekly.weekly.customer.service.CustomerService; import java.util.List; @@ -17,7 +18,7 @@ public CustomerController(CustomerService customerService) { this.customerService = customerService; } - public CustomerDto createCustomer(CustomerCreationRequest creationRequest) { + public CustomerResponse createCustomer(CustomerCreationRequest creationRequest) { return customerService.createCustomer(creationRequest); } @@ -29,15 +30,15 @@ public void deleteAllCustomer() { customerService.deleteAllCustomers(); } - public CustomerDto searchDetailCustomer(CustomerUpdateRequest updateRequest) { + public CustomerResponse findDetailCustomer(CustomerUpdateRequest updateRequest) { return customerService.findDetailCustomer(updateRequest); } - public List searchAllCustomer() { + public CustomersResponse findAllCustomer() { return customerService.findAllCustomer(); } - public CustomerDto updateCustomer(CustomerUpdateRequest updateRequest) { + public CustomerResponse updateCustomer(CustomerUpdateRequest updateRequest) { return customerService.updateCustomer(updateRequest); } } diff --git a/src/main/java/org/weekly/weekly/customer/domain/Customer.java b/src/main/java/org/weekly/weekly/customer/domain/Customer.java index 8346d758f9..b6cdb8d6fb 100644 --- a/src/main/java/org/weekly/weekly/customer/domain/Customer.java +++ b/src/main/java/org/weekly/weekly/customer/domain/Customer.java @@ -12,21 +12,15 @@ public class Customer { LocalDateTime createAt; public Customer(UUID customerId, String name, String email, LocalDateTime createAt) { - this.customerId = customerId; this.name = name; this.email = email; this.customerId = customerId; - } - - private Customer(UUID customerId, String name, String email) { - this.customerId = customerId; - this.name = name; - this.email = email; + this.createAt = createAt; } public static Customer of(UUID uuid, String name, String email) { CustomerValidator.validateEmailFormat(email); - return new Customer(uuid, name, email); + return new Customer(uuid, name, email, LocalDateTime.now()); } public String getName() { @@ -45,7 +39,7 @@ public UUID getCustomerId() { return customerId; } - public void updateName(String name) { - this.name = name; + public void updateEmail(String email) { + this.email = email; } } diff --git a/src/main/java/org/weekly/weekly/customer/dto/response/CustomerDto.java b/src/main/java/org/weekly/weekly/customer/dto/response/CustomerResponse.java similarity index 55% rename from src/main/java/org/weekly/weekly/customer/dto/response/CustomerDto.java rename to src/main/java/org/weekly/weekly/customer/dto/response/CustomerResponse.java index a952aef71b..343af5edb7 100644 --- a/src/main/java/org/weekly/weekly/customer/dto/response/CustomerDto.java +++ b/src/main/java/org/weekly/weekly/customer/dto/response/CustomerResponse.java @@ -1,28 +1,28 @@ package org.weekly.weekly.customer.dto.response; import org.weekly.weekly.customer.domain.Customer; +import org.weekly.weekly.voucher.dto.Response; import java.text.MessageFormat; import java.time.LocalDateTime; -import java.util.UUID; -public class CustomerDto { +public class CustomerResponse implements Response { String name; String email; LocalDateTime createAt; - private CustomerDto(String name, String email, LocalDateTime createAt) { + private CustomerResponse(String name, String email, LocalDateTime createAt) { this.name = name; this.email = email; this.createAt = createAt; } - public static CustomerDto of(Customer customer) { - return new CustomerDto(customer.getName(), customer.getEmail(), customer.getCreateAt()); + public static CustomerResponse of(Customer customer) { + return new CustomerResponse(customer.getName(), customer.getEmail(), customer.getCreateAt()); } @Override - public String toString() { + public String getResult() { return MessageFormat.format("[이름: {0}, 이메일: {1}, 생성 시기: {2}]", name, email, createAt); } } diff --git a/src/main/java/org/weekly/weekly/customer/dto/response/CustomersResponse.java b/src/main/java/org/weekly/weekly/customer/dto/response/CustomersResponse.java new file mode 100644 index 0000000000..eb601c9e82 --- /dev/null +++ b/src/main/java/org/weekly/weekly/customer/dto/response/CustomersResponse.java @@ -0,0 +1,31 @@ +package org.weekly.weekly.customer.dto.response; + +import org.weekly.weekly.customer.domain.Customer; +import org.weekly.weekly.util.PrintMessageType; +import org.weekly.weekly.voucher.domain.Voucher; +import org.weekly.weekly.voucher.dto.Response; +import org.weekly.weekly.voucher.dto.response.VoucherCreationResponse; + +import java.util.List; +import java.util.stream.Collectors; + +public class CustomersResponse implements Response { + List result; + + public CustomersResponse(List customers) { + result = customers.stream() + .map(CustomerResponse::of) + .collect(Collectors.toUnmodifiableList()); + } + + @Override + public String getResult() { + if (result.isEmpty()) { + return PrintMessageType.NO_VOUCHER_DATAS.getMessage(); + } + + StringBuilder resultBuilder = new StringBuilder(); + result.forEach(customerResponse-> resultBuilder.append(customerResponse.getResult()).append('\n')); + return resultBuilder.toString(); + } +} diff --git a/src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java b/src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java index f0a3affd89..a8a7352288 100644 --- a/src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java +++ b/src/main/java/org/weekly/weekly/customer/repository/CustomerRepository.java @@ -12,6 +12,6 @@ public interface CustomerRepository { Optional findByEmail(String email); List findAll(); - Customer update(Customer customer); + Customer update(Customer customer, String newEmail); } diff --git a/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java b/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java index 912f7a928b..b332fa85f4 100644 --- a/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java +++ b/src/main/java/org/weekly/weekly/customer/repository/JdbcCustomerRepository.java @@ -16,6 +16,7 @@ import java.nio.ByteBuffer; import java.sql.ResultSet; import java.sql.SQLException; +import java.sql.Timestamp; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @@ -39,7 +40,7 @@ public Customer insert(Customer customer) { uuidToBytes(customer.getCustomerId()), customer.getName(), customer.getEmail(), - LocalDateTime.now()); + Timestamp.valueOf(customer.getCreateAt())); if (insert != 1) { throw new CustomerException(ExceptionMsg.SQL_INSERT_ERROR); @@ -77,12 +78,15 @@ public List findAll() { } @Override - public Customer update(Customer customer) { - String sql = "UPDATE customers SET name = ? WHERE email = ?"; + public Customer update(Customer customer, String newEmail) { + String sql = "UPDATE customers SET email = ? WHERE email = ?"; + + String beforeEmail = customer.getEmail(); + customer.updateEmail(newEmail); int update = jdbcTemplate.update(sql, - customer.getName(), - customer.getEmail()); + customer.getEmail(), + beforeEmail); if (update != 1) { throw new CustomerException(ExceptionMsg.SQL_ERROR); diff --git a/src/main/java/org/weekly/weekly/customer/service/CustomerService.java b/src/main/java/org/weekly/weekly/customer/service/CustomerService.java index 60c9ae252f..dcfa849365 100644 --- a/src/main/java/org/weekly/weekly/customer/service/CustomerService.java +++ b/src/main/java/org/weekly/weekly/customer/service/CustomerService.java @@ -5,7 +5,8 @@ import org.weekly.weekly.customer.domain.Customer; import org.weekly.weekly.customer.dto.request.CustomerCreationRequest; import org.weekly.weekly.customer.dto.request.CustomerUpdateRequest; -import org.weekly.weekly.customer.dto.response.CustomerDto; +import org.weekly.weekly.customer.dto.response.CustomerResponse; +import org.weekly.weekly.customer.dto.response.CustomersResponse; import org.weekly.weekly.customer.exception.CustomerException; import org.weekly.weekly.customer.repository.CustomerRepository; import org.weekly.weekly.util.ExceptionMsg; @@ -22,12 +23,12 @@ public CustomerService(CustomerRepository customerRepository) { } @Transactional - public CustomerDto createCustomer(CustomerCreationRequest creationRequest) { + public CustomerResponse createCustomer(CustomerCreationRequest creationRequest) { validateCustomerNotExist(creationRequest.getEmail()); Customer customer = creationRequest.toCustomer(); customerRepository.insert(customer); - return CustomerDto.of(customer); + return CustomerResponse.of(customer); } @Transactional @@ -41,26 +42,25 @@ public void deleteAllCustomers() { } - public CustomerDto findDetailCustomer(CustomerUpdateRequest updateRequest) { + public CustomerResponse findDetailCustomer(CustomerUpdateRequest updateRequest) { String email = updateRequest.email(); Customer customer = validateCustomerExistAndGet(email); - return CustomerDto.of(customer); + return CustomerResponse.of(customer); } - public List findAllCustomer() { + public CustomersResponse findAllCustomer() { List customers = customerRepository.findAll(); - return customers.stream().map(CustomerDto::of).toList(); + return new CustomersResponse(customers); } @Transactional - public CustomerDto updateCustomer(CustomerUpdateRequest updateRequest) { + public CustomerResponse updateCustomer(CustomerUpdateRequest updateRequest) { validateCustomerNotExist(updateRequest.newEmail()); Customer customer = validateCustomerExistAndGet(updateRequest.email()); - customer.updateName(updateRequest.newEmail()); - Customer updateCustomer = customerRepository.update(customer); - return CustomerDto.of(updateCustomer); + Customer updateCustomer = customerRepository.update(customer, updateRequest.newEmail()); + return CustomerResponse.of(updateCustomer); } private void validateCustomerNotExist(String email) { diff --git a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java index d96d6b6a5d..5798232ca1 100644 --- a/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java +++ b/src/main/java/org/weekly/weekly/ui/CommandLineApplication.java @@ -16,6 +16,7 @@ import org.weekly.weekly.voucher.dto.request.VoucherInfoRequest; import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest; +import java.util.List; import java.util.function.Supplier; @Component @@ -32,21 +33,21 @@ public CommandLineApplication(CommandReader commandReader, SystemWriter commandW public ManageMenu readManageMenu() { return readMenu(()-> { commandWriter.printMangeProgram(); - return ManageMenu.getMenu(readUserInput()); + return ManageMenu.getMenu(readMenuInput()); }); } public VoucherMenu readVoucherMenu() { return readMenu(()-> { commandWriter.printVoucherProgram(); - return VoucherMenu.getMenu(readUserInput()); + return VoucherMenu.getMenu(readMenuInput()); }); } public CustomerMenu readCustomerMenu() { return readMenu(()-> { commandWriter.printCustomerProgram(); - return CustomerMenu.getMenu(readUserInput()); + return CustomerMenu.getMenu(readMenuInput()); }); } @@ -105,6 +106,16 @@ public void printResult(Response response) { commandWriter.printReuslt(response.getResult()); } + public void printDeleteMessage() { + commandWriter.printDeleteMessage(); + } + + + private String readMenuInput() { + String userInput = commandReader.readLine(); + InputValidator.isEmpty(userInput); + return userInput.toUpperCase(); + } private String readUserInput() { String userInput = commandReader.readLine(); diff --git a/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java b/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java index e51580abe0..35fb98e407 100644 --- a/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java +++ b/src/main/java/org/weekly/weekly/ui/reader/ScannerWrap.java @@ -19,7 +19,7 @@ public ScannerWrap() { public String readLine() { String userInput = scanner.nextLine().trim(); checkException(userInput); - return userInput.toUpperCase(); + return userInput; } private void checkException(String userInput) { diff --git a/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java b/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java index 052760c49a..241130f9f4 100644 --- a/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java +++ b/src/main/java/org/weekly/weekly/ui/writer/SystemWriter.java @@ -66,6 +66,11 @@ public void printReuslt(String result) { println(result); } + public void printDeleteMessage() { + println(PrintMessageType.DELETE.getMessage()); + } + + private void printMenu(Menu[] menus, PrintMessageType programMessage) { println(PrintMessageType.EMPTY.getMessage()); println(programMessage.getMessage()); diff --git a/src/main/java/org/weekly/weekly/util/CustomerMenu.java b/src/main/java/org/weekly/weekly/util/CustomerMenu.java index bf9cfd648e..14bcd473fe 100644 --- a/src/main/java/org/weekly/weekly/util/CustomerMenu.java +++ b/src/main/java/org/weekly/weekly/util/CustomerMenu.java @@ -5,12 +5,12 @@ import java.util.concurrent.ConcurrentHashMap; public enum CustomerMenu implements Menu { - EXIT("Type exit to exit the program."), - CREATE("Type create to create a new voucher."), - DELETE("Type list to list all vouchers."), + EXIT("[Type: exit] to exit the program."), + CREATE("[Type: create] to create a new voucher."), + DELETE("[Type: list] to list all vouchers."), DELETE_ALL("[Type: delete_all] 모든 유저 삭제"), - SEARCH_ALL("[Type: search_all] 모든 유저 검색"), - SEARCH_DETAIL("[Type: search_detail] 유저 상세 검색"), + FIND_ALL("[Type: find_all] 모든 유저 검색"), + FIND_DETAIL("[Type: find_detail] 유저 상세 검색"), UPDATE("[Type: update] 유저 정보 업데이트"); private final String printMessage; @@ -18,7 +18,7 @@ public enum CustomerMenu implements Menu { static { CUSTOMER_MENU_MAP = new ConcurrentHashMap<>(); Arrays.stream(CustomerMenu.values()) - .peek(customerMenu -> CUSTOMER_MENU_MAP.put(customerMenu.name(), customerMenu)); + .forEach(customerMenu -> CUSTOMER_MENU_MAP.put(customerMenu.name(), customerMenu)); } CustomerMenu(String printMessage) { diff --git a/src/main/java/org/weekly/weekly/util/ManageMenu.java b/src/main/java/org/weekly/weekly/util/ManageMenu.java index f7ffe96a14..fcd829a672 100644 --- a/src/main/java/org/weekly/weekly/util/ManageMenu.java +++ b/src/main/java/org/weekly/weekly/util/ManageMenu.java @@ -6,8 +6,8 @@ public enum ManageMenu implements Menu { EXIT("Type exit to exit the program."), - VOUCHER("Type create to create a new voucher."), - CUSTOMER("Type list to list all vouchers."); + VOUCHER("Type voucher to voucher a new voucher."), + CUSTOMER("Type customer to customer all vouchers."); private final String printMessage; private static final Map MANAGE_MENU_MAP; @@ -15,7 +15,7 @@ public enum ManageMenu implements Menu { static { MANAGE_MENU_MAP = new ConcurrentHashMap<>(); Arrays.stream(ManageMenu.values()) - .peek(manageMenu -> MANAGE_MENU_MAP.put(manageMenu.name(), manageMenu)); + .forEach(manageMenu -> MANAGE_MENU_MAP.put(manageMenu.name(), manageMenu)); } ManageMenu(String printMessage) { diff --git a/src/main/java/org/weekly/weekly/util/PrintMessageType.java b/src/main/java/org/weekly/weekly/util/PrintMessageType.java index 5734889da7..c42e69ef39 100644 --- a/src/main/java/org/weekly/weekly/util/PrintMessageType.java +++ b/src/main/java/org/weekly/weekly/util/PrintMessageType.java @@ -14,7 +14,8 @@ public enum PrintMessageType { NO_VOUCHER_DATAS("저장소에 데이터가 없습니다."), EMPTY(""), CREATE_VOUCHER_SUCCESS("[바우처 생성에 성공]: "), - FIND_ALL_VOUCHER_SUCCESS("[모든 바우처 조회 성공]: "); + FIND_ALL_VOUCHER_SUCCESS("[모든 바우처 조회 성공]: "), + DELETE("삭제에 성공했습니다!"); private final String message; diff --git a/src/main/java/org/weekly/weekly/voucher/dto/Response.java b/src/main/java/org/weekly/weekly/voucher/dto/Response.java index 7e3c7ec805..86c2795d86 100644 --- a/src/main/java/org/weekly/weekly/voucher/dto/Response.java +++ b/src/main/java/org/weekly/weekly/voucher/dto/Response.java @@ -1,5 +1,8 @@ package org.weekly.weekly.voucher.dto; +/** + * 모든 반환 값에 대해 동일한 동작을 적용시키고 싶어서 이렇게 했습니다. + */ public interface Response { String getResult(); } diff --git a/src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java b/src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java index 3bb08a8258..54b4f22fed 100644 --- a/src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java +++ b/src/test/java/org/weekly/weekly/customer/JdbcCustomerRepositoryTest.java @@ -114,15 +114,15 @@ void deleteCustomer() { @Test void 회원_닉네임_업데이트_테스트() { // Given + String newName = "newName"; Customer insertCusomter = jdbcCustomerRepository.insert(customer); // When - insertCusomter.updateName("newName"); - jdbcCustomerRepository.update(insertCusomter); + jdbcCustomerRepository.update(insertCusomter,newName); // Then - Optional updateCustomer = jdbcCustomerRepository.findByEmail(insertCusomter.getEmail()); + Optional updateCustomer = jdbcCustomerRepository.findByEmail(newName); assertThat(updateCustomer.isPresent(), is(true)); - assertThat(updateCustomer.get(), samePropertyValuesAs(insertCusomter)); + assertThat(updateCustomer.get().getEmail(), is(newName)); } }