From 5842e2cbe949356acbbc3dc41b5ef00568f7be19 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Thu, 6 Jul 2023 03:24:27 +0900 Subject: [PATCH 01/19] =?UTF-8?q?build:=20H2=20=EB=8D=B0=EC=9D=B4=ED=84=B0?= =?UTF-8?q?=EB=B2=A0=EC=9D=B4=EC=8A=A4=20=EC=97=B0=EB=8F=99=20=EB=B0=8F=20?= =?UTF-8?q?=EC=B4=88=EA=B8=B0=20=EC=8A=A4=ED=82=A4=EB=A7=88=20=EC=9E=90?= =?UTF-8?q?=EB=8F=99=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 5 ++++- src/main/resources/application.properties | 1 - src/main/resources/application.yaml | 10 ++++++++++ src/main/resources/logback.xml | 12 +++++++++++- src/main/resources/schema.sql | 7 +++++++ 5 files changed, 32 insertions(+), 3 deletions(-) delete mode 100644 src/main/resources/application.properties create mode 100644 src/main/resources/application.yaml create mode 100644 src/main/resources/schema.sql diff --git a/build.gradle b/build.gradle index b10c7b38ec..7dc9b5f9ea 100644 --- a/build.gradle +++ b/build.gradle @@ -16,9 +16,12 @@ repositories { } dependencies { - implementation 'org.springframework.boot:spring-boot-starter' + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' testImplementation 'org.springframework.boot:spring-boot-starter-test' + runtimeOnly 'com.h2database:h2' + compileOnly 'org.projectlombok:lombok:1.18.28' annotationProcessor 'org.projectlombok:lombok:1.18.28' 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..dc3c5ade74 --- /dev/null +++ b/src/main/resources/application.yaml @@ -0,0 +1,10 @@ +spring: + h2: + console: + enabled: true + path: /h2-console + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:test + username: sa + password: \ No newline at end of file diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 9d10ca43fb..0ffddee44e 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -2,16 +2,26 @@ + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n + + + logs/access_log-%d{yyyy-MM-dd}.log + + ERROR + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n - + + diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql new file mode 100644 index 0000000000..fef45f8da8 --- /dev/null +++ b/src/main/resources/schema.sql @@ -0,0 +1,7 @@ +DROP TABLE IF EXISTS voucher; + +CREATE TABLE voucher ( + id VARCHAR(36) PRIMARY KEY, + type VARCHAR(5) NOT NULL, + discount_amount INTEGER NOT NULL +); \ No newline at end of file From 4bd6c885498136137519b4c8955e52ca0acf0f2f Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Thu, 6 Jul 2023 21:28:16 +0900 Subject: [PATCH 02/19] =?UTF-8?q?feat:=20JDBC=20template=EC=9D=84=20?= =?UTF-8?q?=EC=9D=B4=EC=9A=A9=ED=95=9C=20=ED=95=A0=EC=9D=B8=EA=B6=8C=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EB=B0=8F=20=EC=A0=84=EC=B2=B4=20=ED=95=A0?= =?UTF-8?q?=EC=9D=B8=EA=B6=8C=20=EC=A1=B0=ED=9A=8C=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 --- .../voucherapp/entity/TriFunction.java | 7 +++ .../voucherapp/entity/VoucherType.java | 16 +++++-- .../entity/voucher/FixDiscountVoucher.java | 31 +++++++----- .../voucher/PercentDiscountVoucher.java | 31 +++++++----- .../voucherapp/entity/voucher/Voucher.java | 4 ++ .../repository/JdbcVoucherRepository.java | 48 +++++++++++++++++++ src/main/resources/logback.xml | 12 +---- 7 files changed, 111 insertions(+), 38 deletions(-) create mode 100644 src/main/java/com/devcourse/voucherapp/entity/TriFunction.java create mode 100644 src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java diff --git a/src/main/java/com/devcourse/voucherapp/entity/TriFunction.java b/src/main/java/com/devcourse/voucherapp/entity/TriFunction.java new file mode 100644 index 0000000000..8ba435aa8d --- /dev/null +++ b/src/main/java/com/devcourse/voucherapp/entity/TriFunction.java @@ -0,0 +1,7 @@ +package com.devcourse.voucherapp.entity; + +@FunctionalInterface +public interface TriFunction { + + R apply(T t, U u, V v); +} diff --git a/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java b/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java index 8e37537c93..8f49563362 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java +++ b/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java @@ -8,6 +8,7 @@ import com.devcourse.voucherapp.exception.VoucherTypeInputException; import java.util.Collections; import java.util.Map; +import java.util.function.BiFunction; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -19,12 +20,14 @@ public enum VoucherType { "1", "고정 할인", "\n고정 할인 금액을 입력하세요. (1이상의 자연수, 단위: 원)", + FixDiscountVoucher::new, FixDiscountVoucher::new ), PERCENT( "2", "비율 할인", "\n비율 할인 퍼센트를 입력하세요. (1이상 100이하의 자연수, 단위: %)", + PercentDiscountVoucher::new, PercentDiscountVoucher::new ); @@ -34,13 +37,16 @@ public enum VoucherType { private final String number; private final String name; private final String message; - private final Function voucherGenerator; + private final BiFunction voucherGenerator; + private final TriFunction voucherDuplicator; - VoucherType(String number, String name, String message, Function voucherGenerator) { + VoucherType(String number, String name, String message, BiFunction voucherGenerator, + TriFunction voucherDuplicator) { this.number = number; this.name = name; this.message = message; this.voucherGenerator = voucherGenerator; + this.voucherDuplicator = voucherDuplicator; } public static VoucherType of(String voucherTypeNumber) { @@ -52,7 +58,11 @@ public static VoucherType of(String voucherTypeNumber) { } public Voucher makeVoucher(String discountAmount) { - return voucherGenerator.apply(discountAmount); + return voucherGenerator.apply(number, discountAmount); + } + + public Voucher duplicateVoucher(String voucherId, String typeNumber, int discountAmount) { + return voucherDuplicator.apply(voucherId, typeNumber, discountAmount); } @Override diff --git a/src/main/java/com/devcourse/voucherapp/entity/voucher/FixDiscountVoucher.java b/src/main/java/com/devcourse/voucherapp/entity/voucher/FixDiscountVoucher.java index 53dda6214a..7b11747e07 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/voucher/FixDiscountVoucher.java +++ b/src/main/java/com/devcourse/voucherapp/entity/voucher/FixDiscountVoucher.java @@ -6,34 +6,41 @@ import java.util.UUID; import lombok.Getter; +@Getter public class FixDiscountVoucher implements Voucher { private static final String FIX_DISCOUNT_PRICE_REGEX = "^[1-9][0-9]*$"; - @Getter private final UUID voucherId; + private final String typeNumber; + private final int discountAmount; - private final int discountPrice; - - public FixDiscountVoucher(String discountPrice) { + public FixDiscountVoucher(String typeNumber, String discountAmount) { this.voucherId = UUID.randomUUID(); - this.discountPrice = getValidPrice(discountPrice); + this.typeNumber = typeNumber; + this.discountAmount = getValidPrice(discountAmount); + } + + public FixDiscountVoucher(String voucherId, String typeNumber, int discountAmount) { + this.voucherId = UUID.fromString(voucherId); + this.typeNumber = typeNumber; + this.discountAmount = discountAmount; } @Override public String toString() { - return format("{0} | 고정 할인 | {1}원", voucherId, discountPrice); + return format("{0} | 고정 할인 | {1}원", voucherId, discountAmount); } - private int getValidPrice(String discountPrice) { - if (isNotValid(discountPrice)) { - throw new DiscountAmountException(discountPrice); + private int getValidPrice(String discountAmount) { + if (isNotValid(discountAmount)) { + throw new DiscountAmountException(discountAmount); } - return Integer.parseInt(discountPrice); + return Integer.parseInt(discountAmount); } - private boolean isNotValid(String discountPrice) { - return !discountPrice.matches(FIX_DISCOUNT_PRICE_REGEX); + private boolean isNotValid(String discountAmount) { + return !discountAmount.matches(FIX_DISCOUNT_PRICE_REGEX); } } diff --git a/src/main/java/com/devcourse/voucherapp/entity/voucher/PercentDiscountVoucher.java b/src/main/java/com/devcourse/voucherapp/entity/voucher/PercentDiscountVoucher.java index e9e9013b6e..14442ee9a7 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/voucher/PercentDiscountVoucher.java +++ b/src/main/java/com/devcourse/voucherapp/entity/voucher/PercentDiscountVoucher.java @@ -6,34 +6,41 @@ import java.util.UUID; import lombok.Getter; +@Getter public class PercentDiscountVoucher implements Voucher { private static final String PERCENT_DISCOUNT_RATE_REGEX = "^[1-9]|[1-9][0-9]|100$"; - @Getter private final UUID voucherId; + private final String typeNumber; + private final int discountAmount; - private final int discountRate; - - public PercentDiscountVoucher(String discountRate) { + public PercentDiscountVoucher(String typeNumber, String discountAmount) { this.voucherId = UUID.randomUUID(); - this.discountRate = getValidRate(discountRate); + this.typeNumber = typeNumber; + this.discountAmount = getValidRate(discountAmount); + } + + public PercentDiscountVoucher(String voucherId, String typeNumber, int discountAmount) { + this.voucherId = UUID.fromString(voucherId); + this.typeNumber = typeNumber; + this.discountAmount = discountAmount; } @Override public String toString() { - return format("{0} | 비율 할인 | {1}%", voucherId, discountRate); + return format("{0} | 비율 할인 | {1}%", voucherId, discountAmount); } - private int getValidRate(String discountRate) { - if (isNotValid(discountRate)) { - throw new DiscountAmountException(discountRate); + private int getValidRate(String discountAmount) { + if (isNotValid(discountAmount)) { + throw new DiscountAmountException(discountAmount); } - return Integer.parseInt(discountRate); + return Integer.parseInt(discountAmount); } - private boolean isNotValid(String discountRate) { - return !discountRate.matches(PERCENT_DISCOUNT_RATE_REGEX); + private boolean isNotValid(String discountAmount) { + return !discountAmount.matches(PERCENT_DISCOUNT_RATE_REGEX); } } diff --git a/src/main/java/com/devcourse/voucherapp/entity/voucher/Voucher.java b/src/main/java/com/devcourse/voucherapp/entity/voucher/Voucher.java index 4550240816..90354ea0eb 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/voucher/Voucher.java +++ b/src/main/java/com/devcourse/voucherapp/entity/voucher/Voucher.java @@ -5,4 +5,8 @@ public interface Voucher { UUID getVoucherId(); + + String getTypeNumber(); + + int getDiscountAmount(); } diff --git a/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java new file mode 100644 index 0000000000..6bae1adf8c --- /dev/null +++ b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java @@ -0,0 +1,48 @@ +package com.devcourse.voucherapp.repository; + +import com.devcourse.voucherapp.entity.VoucherType; +import com.devcourse.voucherapp.entity.voucher.Voucher; +import java.util.List; +import javax.sql.DataSource; +import org.springframework.context.annotation.Primary; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.core.namedparam.SqlParameterSource; +import org.springframework.stereotype.Repository; + +@Repository +@Primary +public class JdbcVoucherRepository implements VoucherRepository { + + private final NamedParameterJdbcTemplate template; + + public JdbcVoucherRepository(DataSource dataSource) { + this.template = new NamedParameterJdbcTemplate(dataSource); + } + + @Override + public Voucher save(Voucher voucher) { + String sql = "insert into voucher(id, type, discount_amount) values (:voucherId, :typeNumber, :discountAmount)"; + SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(voucher); + template.update(sql, parameterSource); + + return voucher; + } + + @Override + public List findAllVouchers() { + String sql = "select id, type, discount_amount from voucher"; + + RowMapper voucherRowMapper = ((resultSet, rowNum) -> { + String voucherId = resultSet.getString("id"); + String typeNumber = resultSet.getString("type"); + int discountAmount = resultSet.getInt("discount_amount"); + + return VoucherType.of(typeNumber) + .duplicateVoucher(voucherId, typeNumber, discountAmount); + }); + + return template.query(sql, voucherRowMapper); + } +} diff --git a/src/main/resources/logback.xml b/src/main/resources/logback.xml index 0ffddee44e..9d10ca43fb 100644 --- a/src/main/resources/logback.xml +++ b/src/main/resources/logback.xml @@ -2,26 +2,16 @@ - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n - - - logs/access_log-%d{yyyy-MM-dd}.log - - ERROR - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%kvp- %msg%n - - + From df2ec0bb4b1b3ae552dc7649486768bcec256326 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Thu, 6 Jul 2023 21:56:39 +0900 Subject: [PATCH 03/19] =?UTF-8?q?build:=20yaml=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=8D=BC=ED=8B=B0=EB=A5=BC=20=EC=9D=B4=EC=9A=A9=ED=95=B4=20?= =?UTF-8?q?=EA=B0=9C=EB=B0=9C=20=ED=99=98=EA=B2=BD=20=EA=B5=AC=EB=B6=84=20?= =?UTF-8?q?-=20dev=20:=20Map=EC=9D=84=20=EC=9D=B4=EC=9A=A9=ED=95=9C=20repo?= =?UTF-8?q?sitory=20-=20local=20:=20H2=20database=EB=A5=BC=20=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=ED=95=9C=20repository?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/JdbcVoucherRepository.java | 4 ++-- .../repository/MemoryVoucherRepository.java | 2 ++ src/main/resources/application.yaml | 18 +++++++++++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java index 6bae1adf8c..bddcc8fe0b 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java @@ -4,7 +4,7 @@ import com.devcourse.voucherapp.entity.voucher.Voucher; import java.util.List; import javax.sql.DataSource; -import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; @@ -12,7 +12,7 @@ import org.springframework.stereotype.Repository; @Repository -@Primary +@Profile("local") public class JdbcVoucherRepository implements VoucherRepository { private final NamedParameterJdbcTemplate template; diff --git a/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java index f52cfaf945..5686255013 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java @@ -5,9 +5,11 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; @Repository +@Profile("dev") public class MemoryVoucherRepository implements VoucherRepository { private final Map storage = new LinkedHashMap<>(); diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index dc3c5ade74..4b86199d10 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,10 +1,26 @@ spring: + profiles: + active: local + +--- + +spring: + config: + activate: + on-profile: dev + +--- + +spring: + config: + activate: + on-profile: local h2: console: enabled: true path: /h2-console datasource: driver-class-name: org.h2.Driver - url: jdbc:h2:mem:test + url: jdbc:h2:mem:local username: sa password: \ No newline at end of file From 3ae4714bc1341df34bc2addaa84e6225ea057934 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 7 Jul 2023 02:28:38 +0900 Subject: [PATCH 04/19] =?UTF-8?q?refactor:=20=ED=95=A0=EC=9D=B8=EA=B6=8C?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=EC=9D=84=20DTO=EB=A5=BC=20=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8A=94=20=EB=B0=A9=EC=8B=9D=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucherapp/CommandLineApplication.java | 9 ++++++--- .../controller/VoucherController.java | 6 +++--- .../voucherapp/entity/VoucherType.java | 19 +++++-------------- .../entity/dto/VoucherCreateRequestDto.java | 13 +++++++++++++ .../entity/voucher/FixDiscountVoucher.java | 19 +++++++------------ .../voucher/PercentDiscountVoucher.java | 19 +++++++------------ .../voucherapp/entity/voucher/Voucher.java | 5 +++-- .../repository/JdbcVoucherRepository.java | 16 +++++++++++----- .../repository/MemoryVoucherRepository.java | 2 +- .../voucherapp/service/VoucherService.java | 7 +++++-- .../voucherapp/entity/VoucherTypeTest.java | 5 +++-- 11 files changed, 64 insertions(+), 56 deletions(-) create mode 100644 src/main/java/com/devcourse/voucherapp/entity/dto/VoucherCreateRequestDto.java diff --git a/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java b/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java index c4a67234c4..a6ed5489dd 100644 --- a/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java +++ b/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java @@ -3,6 +3,7 @@ import com.devcourse.voucherapp.controller.VoucherController; import com.devcourse.voucherapp.entity.Menu; import com.devcourse.voucherapp.entity.VoucherType; +import com.devcourse.voucherapp.entity.dto.VoucherCreateRequestDto; import com.devcourse.voucherapp.entity.voucher.Voucher; import com.devcourse.voucherapp.view.ViewManager; import java.util.List; @@ -44,13 +45,15 @@ private void executeMenu(Menu selectedMenu) { } private void createVoucher() { - String voucherTypeNumber = viewManager.readVoucherTypeNumber(); - VoucherType voucherType = VoucherType.of(voucherTypeNumber); + String typeNumber = viewManager.readVoucherTypeNumber(); + VoucherType voucherType = VoucherType.of(typeNumber); String message = voucherType.getMessage(); String discountAmount = viewManager.readDiscountAmount(message); - Voucher voucher = voucherController.createVoucher(voucherType, discountAmount); + VoucherCreateRequestDto request = new VoucherCreateRequestDto(voucherType, discountAmount); + Voucher voucher = voucherController.create(request); + viewManager.showVoucherCreationSuccessMessage(voucher); } diff --git a/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java b/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java index 5a98171738..66c8f71a47 100644 --- a/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java +++ b/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java @@ -1,6 +1,6 @@ package com.devcourse.voucherapp.controller; -import com.devcourse.voucherapp.entity.VoucherType; +import com.devcourse.voucherapp.entity.dto.VoucherCreateRequestDto; import com.devcourse.voucherapp.entity.voucher.Voucher; import com.devcourse.voucherapp.service.VoucherService; import java.util.List; @@ -13,8 +13,8 @@ public class VoucherController { private final VoucherService voucherService; - public Voucher createVoucher(VoucherType voucherType, String discountAmount) { - return voucherService.create(voucherType, discountAmount); + public Voucher create(VoucherCreateRequestDto request) { + return voucherService.create(request); } public List findAllVouchers() { diff --git a/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java b/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java index 8f49563362..c9e0862fb7 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java +++ b/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java @@ -8,7 +8,7 @@ import com.devcourse.voucherapp.exception.VoucherTypeInputException; import java.util.Collections; import java.util.Map; -import java.util.function.BiFunction; +import java.util.UUID; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -20,14 +20,12 @@ public enum VoucherType { "1", "고정 할인", "\n고정 할인 금액을 입력하세요. (1이상의 자연수, 단위: 원)", - FixDiscountVoucher::new, FixDiscountVoucher::new ), PERCENT( "2", "비율 할인", "\n비율 할인 퍼센트를 입력하세요. (1이상 100이하의 자연수, 단위: %)", - PercentDiscountVoucher::new, PercentDiscountVoucher::new ); @@ -37,16 +35,13 @@ public enum VoucherType { private final String number; private final String name; private final String message; - private final BiFunction voucherGenerator; - private final TriFunction voucherDuplicator; + private final TriFunction voucherGenerator; - VoucherType(String number, String name, String message, BiFunction voucherGenerator, - TriFunction voucherDuplicator) { + VoucherType(String number, String name, String message, TriFunction voucherGenerator) { this.number = number; this.name = name; this.message = message; this.voucherGenerator = voucherGenerator; - this.voucherDuplicator = voucherDuplicator; } public static VoucherType of(String voucherTypeNumber) { @@ -57,12 +52,8 @@ public static VoucherType of(String voucherTypeNumber) { throw new VoucherTypeInputException(voucherTypeNumber); } - public Voucher makeVoucher(String discountAmount) { - return voucherGenerator.apply(number, discountAmount); - } - - public Voucher duplicateVoucher(String voucherId, String typeNumber, int discountAmount) { - return voucherDuplicator.apply(voucherId, typeNumber, discountAmount); + public Voucher makeVoucher(UUID id, String discountAmount) { + return voucherGenerator.apply(id, this, discountAmount); } @Override diff --git a/src/main/java/com/devcourse/voucherapp/entity/dto/VoucherCreateRequestDto.java b/src/main/java/com/devcourse/voucherapp/entity/dto/VoucherCreateRequestDto.java new file mode 100644 index 0000000000..30cc6af96a --- /dev/null +++ b/src/main/java/com/devcourse/voucherapp/entity/dto/VoucherCreateRequestDto.java @@ -0,0 +1,13 @@ +package com.devcourse.voucherapp.entity.dto; + +import com.devcourse.voucherapp.entity.VoucherType; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public class VoucherCreateRequestDto { + + private final VoucherType type; + private final String discountAmount; +} diff --git a/src/main/java/com/devcourse/voucherapp/entity/voucher/FixDiscountVoucher.java b/src/main/java/com/devcourse/voucherapp/entity/voucher/FixDiscountVoucher.java index 7b11747e07..db9133591d 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/voucher/FixDiscountVoucher.java +++ b/src/main/java/com/devcourse/voucherapp/entity/voucher/FixDiscountVoucher.java @@ -2,6 +2,7 @@ import static java.text.MessageFormat.format; +import com.devcourse.voucherapp.entity.VoucherType; import com.devcourse.voucherapp.exception.DiscountAmountException; import java.util.UUID; import lombok.Getter; @@ -11,25 +12,19 @@ public class FixDiscountVoucher implements Voucher { private static final String FIX_DISCOUNT_PRICE_REGEX = "^[1-9][0-9]*$"; - private final UUID voucherId; - private final String typeNumber; + private final UUID id; + private final VoucherType type; private final int discountAmount; - public FixDiscountVoucher(String typeNumber, String discountAmount) { - this.voucherId = UUID.randomUUID(); - this.typeNumber = typeNumber; + public FixDiscountVoucher(UUID id, VoucherType type, String discountAmount) { + this.id = id; + this.type = type; this.discountAmount = getValidPrice(discountAmount); } - public FixDiscountVoucher(String voucherId, String typeNumber, int discountAmount) { - this.voucherId = UUID.fromString(voucherId); - this.typeNumber = typeNumber; - this.discountAmount = discountAmount; - } - @Override public String toString() { - return format("{0} | 고정 할인 | {1}원", voucherId, discountAmount); + return format("{0} | 고정 할인 | {1}원", id, discountAmount); } private int getValidPrice(String discountAmount) { diff --git a/src/main/java/com/devcourse/voucherapp/entity/voucher/PercentDiscountVoucher.java b/src/main/java/com/devcourse/voucherapp/entity/voucher/PercentDiscountVoucher.java index 14442ee9a7..6a606ae058 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/voucher/PercentDiscountVoucher.java +++ b/src/main/java/com/devcourse/voucherapp/entity/voucher/PercentDiscountVoucher.java @@ -2,6 +2,7 @@ import static java.text.MessageFormat.format; +import com.devcourse.voucherapp.entity.VoucherType; import com.devcourse.voucherapp.exception.DiscountAmountException; import java.util.UUID; import lombok.Getter; @@ -11,25 +12,19 @@ public class PercentDiscountVoucher implements Voucher { private static final String PERCENT_DISCOUNT_RATE_REGEX = "^[1-9]|[1-9][0-9]|100$"; - private final UUID voucherId; - private final String typeNumber; + private final UUID id; + private final VoucherType type; private final int discountAmount; - public PercentDiscountVoucher(String typeNumber, String discountAmount) { - this.voucherId = UUID.randomUUID(); - this.typeNumber = typeNumber; + public PercentDiscountVoucher(UUID id, VoucherType type, String discountAmount) { + this.id = id; + this.type = type; this.discountAmount = getValidRate(discountAmount); } - public PercentDiscountVoucher(String voucherId, String typeNumber, int discountAmount) { - this.voucherId = UUID.fromString(voucherId); - this.typeNumber = typeNumber; - this.discountAmount = discountAmount; - } - @Override public String toString() { - return format("{0} | 비율 할인 | {1}%", voucherId, discountAmount); + return format("{0} | 비율 할인 | {1}%", id, discountAmount); } private int getValidRate(String discountAmount) { diff --git a/src/main/java/com/devcourse/voucherapp/entity/voucher/Voucher.java b/src/main/java/com/devcourse/voucherapp/entity/voucher/Voucher.java index 90354ea0eb..b94e6428db 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/voucher/Voucher.java +++ b/src/main/java/com/devcourse/voucherapp/entity/voucher/Voucher.java @@ -1,12 +1,13 @@ package com.devcourse.voucherapp.entity.voucher; +import com.devcourse.voucherapp.entity.VoucherType; import java.util.UUID; public interface Voucher { - UUID getVoucherId(); + UUID getId(); - String getTypeNumber(); + VoucherType getType(); int getDiscountAmount(); } diff --git a/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java index bddcc8fe0b..be3d2adc91 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java @@ -3,10 +3,11 @@ import com.devcourse.voucherapp.entity.VoucherType; import com.devcourse.voucherapp.entity.voucher.Voucher; import java.util.List; +import java.util.UUID; import javax.sql.DataSource; import org.springframework.context.annotation.Profile; import org.springframework.jdbc.core.RowMapper; -import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.SqlParameterSource; import org.springframework.stereotype.Repository; @@ -23,8 +24,13 @@ public JdbcVoucherRepository(DataSource dataSource) { @Override public Voucher save(Voucher voucher) { - String sql = "insert into voucher(id, type, discount_amount) values (:voucherId, :typeNumber, :discountAmount)"; - SqlParameterSource parameterSource = new BeanPropertySqlParameterSource(voucher); + String sql = "insert into voucher(id, type, discount_amount) values (:id, :typeNumber, :discountAmount)"; + + SqlParameterSource parameterSource = new MapSqlParameterSource() + .addValue("id", voucher.getId().toString()) + .addValue("typeNumber", voucher.getType().getNumber()) + .addValue("discountAmount", voucher.getDiscountAmount()); + template.update(sql, parameterSource); return voucher; @@ -35,12 +41,12 @@ public List findAllVouchers() { String sql = "select id, type, discount_amount from voucher"; RowMapper voucherRowMapper = ((resultSet, rowNum) -> { - String voucherId = resultSet.getString("id"); + String id = resultSet.getString("id"); String typeNumber = resultSet.getString("type"); int discountAmount = resultSet.getInt("discount_amount"); return VoucherType.of(typeNumber) - .duplicateVoucher(voucherId, typeNumber, discountAmount); + .makeVoucher(UUID.fromString(id), String.valueOf(discountAmount)); }); return template.query(sql, voucherRowMapper); diff --git a/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java index 5686255013..ea77ec821c 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java @@ -16,7 +16,7 @@ public class MemoryVoucherRepository implements VoucherRepository { @Override public Voucher save(Voucher voucher) { - storage.put(voucher.getVoucherId(), voucher); + storage.put(voucher.getId(), voucher); return voucher; } diff --git a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java index 65c784b82c..096d432c29 100644 --- a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java +++ b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java @@ -1,9 +1,11 @@ package com.devcourse.voucherapp.service; import com.devcourse.voucherapp.entity.VoucherType; +import com.devcourse.voucherapp.entity.dto.VoucherCreateRequestDto; import com.devcourse.voucherapp.entity.voucher.Voucher; import com.devcourse.voucherapp.repository.VoucherRepository; import java.util.List; +import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -13,8 +15,9 @@ public class VoucherService { private final VoucherRepository voucherRepository; - public Voucher create(VoucherType voucherType, String discountAmount) { - Voucher voucher = voucherType.makeVoucher(discountAmount); + public Voucher create(VoucherCreateRequestDto request) { + VoucherType voucherType = request.getType(); + Voucher voucher = voucherType.makeVoucher(UUID.randomUUID(), request.getDiscountAmount()); return voucherRepository.save(voucher); } diff --git a/src/test/java/com/devcourse/voucherapp/entity/VoucherTypeTest.java b/src/test/java/com/devcourse/voucherapp/entity/VoucherTypeTest.java index 940f50fc41..b3e84bae26 100644 --- a/src/test/java/com/devcourse/voucherapp/entity/VoucherTypeTest.java +++ b/src/test/java/com/devcourse/voucherapp/entity/VoucherTypeTest.java @@ -5,6 +5,7 @@ import com.devcourse.voucherapp.exception.DiscountAmountException; import com.devcourse.voucherapp.exception.VoucherTypeInputException; +import java.util.UUID; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -33,13 +34,13 @@ void selectNotExistedVoucherTypeTest() { @ParameterizedTest @ValueSource(strings = {"0", "-1", "10.1", "string", "", " ", "\n"}) void invalidFixDiscountPriceTest(String discountPrice) { - assertThrows(DiscountAmountException.class, () -> VoucherType.FIX.makeVoucher(discountPrice)); + assertThrows(DiscountAmountException.class, () -> VoucherType.FIX.makeVoucher(UUID.randomUUID(), discountPrice)); } @DisplayName("비율 퍼센트 할인권 생성 시, 잘못된 퍼센트를 입력한 경우 VoucherInputException 예외가 발생한다.") @ParameterizedTest @ValueSource(strings = {"0", "-1", "10.1", "string", "101", "", " ", "\n"}) void invalidPercentDiscountRateTest(String discountRate) { - assertThrows(DiscountAmountException.class, () -> VoucherType.PERCENT.makeVoucher(discountRate)); + assertThrows(DiscountAmountException.class, () -> VoucherType.PERCENT.makeVoucher(UUID.randomUUID(), discountRate)); } } From a3f20f04696db3af36e2b6c5efd23f29a198d002 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 7 Jul 2023 02:56:05 +0900 Subject: [PATCH 05/19] =?UTF-8?q?refactor:=20=ED=95=A0=EC=9D=B8=EA=B6=8C?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=EB=A5=BC=20DTO=EB=A5=BC=20=EC=9D=B4?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EB=8A=94=20=EB=B0=A9=EC=8B=9D=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucherapp/CommandLineApplication.java | 10 ++++--- .../controller/VoucherController.java | 6 +++-- .../voucherapp/entity/VoucherType.java | 7 ++++- .../entity/dto/VoucherResponseDto.java | 27 +++++++++++++++++++ .../entity/dto/VouchersResponseDto.java | 18 +++++++++++++ .../entity/voucher/FixDiscountVoucher.java | 5 ---- .../voucher/PercentDiscountVoucher.java | 5 ---- .../voucherapp/service/VoucherService.java | 15 +++++++---- .../voucherapp/view/ViewManager.java | 12 ++++----- 9 files changed, 77 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/devcourse/voucherapp/entity/dto/VoucherResponseDto.java create mode 100644 src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java diff --git a/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java b/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java index a6ed5489dd..e8deabffcc 100644 --- a/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java +++ b/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java @@ -4,6 +4,8 @@ import com.devcourse.voucherapp.entity.Menu; import com.devcourse.voucherapp.entity.VoucherType; import com.devcourse.voucherapp.entity.dto.VoucherCreateRequestDto; +import com.devcourse.voucherapp.entity.dto.VoucherResponseDto; +import com.devcourse.voucherapp.entity.dto.VouchersResponseDto; import com.devcourse.voucherapp.entity.voucher.Voucher; import com.devcourse.voucherapp.view.ViewManager; import java.util.List; @@ -52,14 +54,14 @@ private void createVoucher() { String discountAmount = viewManager.readDiscountAmount(message); VoucherCreateRequestDto request = new VoucherCreateRequestDto(voucherType, discountAmount); - Voucher voucher = voucherController.create(request); + VoucherResponseDto response = voucherController.create(request); - viewManager.showVoucherCreationSuccessMessage(voucher); + viewManager.showVoucherCreationSuccessMessage(response); } private void listAllVouchers() { - List vouchers = voucherController.findAllVouchers(); - viewManager.showAllVouchers(vouchers); + VouchersResponseDto response = voucherController.findAllVouchers(); + viewManager.showAllVouchers(response); } private void quitApplication() { diff --git a/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java b/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java index 66c8f71a47..6fbffa3d18 100644 --- a/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java +++ b/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java @@ -1,6 +1,8 @@ package com.devcourse.voucherapp.controller; import com.devcourse.voucherapp.entity.dto.VoucherCreateRequestDto; +import com.devcourse.voucherapp.entity.dto.VoucherResponseDto; +import com.devcourse.voucherapp.entity.dto.VouchersResponseDto; import com.devcourse.voucherapp.entity.voucher.Voucher; import com.devcourse.voucherapp.service.VoucherService; import java.util.List; @@ -13,11 +15,11 @@ public class VoucherController { private final VoucherService voucherService; - public Voucher create(VoucherCreateRequestDto request) { + public VoucherResponseDto create(VoucherCreateRequestDto request) { return voucherService.create(request); } - public List findAllVouchers() { + public VouchersResponseDto findAllVouchers() { return voucherService.findAllVouchers(); } } diff --git a/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java b/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java index c9e0862fb7..aec6123724 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java +++ b/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java @@ -20,12 +20,14 @@ public enum VoucherType { "1", "고정 할인", "\n고정 할인 금액을 입력하세요. (1이상의 자연수, 단위: 원)", + "원", FixDiscountVoucher::new ), PERCENT( "2", "비율 할인", "\n비율 할인 퍼센트를 입력하세요. (1이상 100이하의 자연수, 단위: %)", + "%", PercentDiscountVoucher::new ); @@ -35,12 +37,15 @@ public enum VoucherType { private final String number; private final String name; private final String message; + private final String unit; private final TriFunction voucherGenerator; - VoucherType(String number, String name, String message, TriFunction voucherGenerator) { + VoucherType(String number, String name, String message, String unit, + TriFunction voucherGenerator) { this.number = number; this.name = name; this.message = message; + this.unit = unit; this.voucherGenerator = voucherGenerator; } diff --git a/src/main/java/com/devcourse/voucherapp/entity/dto/VoucherResponseDto.java b/src/main/java/com/devcourse/voucherapp/entity/dto/VoucherResponseDto.java new file mode 100644 index 0000000000..d171a52b72 --- /dev/null +++ b/src/main/java/com/devcourse/voucherapp/entity/dto/VoucherResponseDto.java @@ -0,0 +1,27 @@ +package com.devcourse.voucherapp.entity.dto; + +import static java.text.MessageFormat.format; + +import com.devcourse.voucherapp.entity.VoucherType; +import com.devcourse.voucherapp.entity.voucher.Voucher; +import java.util.UUID; +import lombok.Getter; + +@Getter +public class VoucherResponseDto { + + private final UUID id; + private final VoucherType type; + private final int discountAmount; + + public VoucherResponseDto(Voucher voucher) { + this.id = voucher.getId(); + this.type = voucher.getType(); + this.discountAmount = voucher.getDiscountAmount(); + } + + @Override + public String toString() { + return format("{0} | {1} | {2}{3}", id, type.getName(), discountAmount, type.getUnit()); + } +} diff --git a/src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java b/src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java new file mode 100644 index 0000000000..028543a041 --- /dev/null +++ b/src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java @@ -0,0 +1,18 @@ +package com.devcourse.voucherapp.entity.dto; + +import com.devcourse.voucherapp.entity.voucher.Voucher; +import java.util.List; +import java.util.stream.Collectors; +import lombok.Getter; + +@Getter +public class VouchersResponseDto { + + private final List vouchers; + + public VouchersResponseDto(List vouchers) { + this.vouchers = vouchers.stream() + .map(VoucherResponseDto::new) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/devcourse/voucherapp/entity/voucher/FixDiscountVoucher.java b/src/main/java/com/devcourse/voucherapp/entity/voucher/FixDiscountVoucher.java index db9133591d..12287085dc 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/voucher/FixDiscountVoucher.java +++ b/src/main/java/com/devcourse/voucherapp/entity/voucher/FixDiscountVoucher.java @@ -22,11 +22,6 @@ public FixDiscountVoucher(UUID id, VoucherType type, String discountAmount) { this.discountAmount = getValidPrice(discountAmount); } - @Override - public String toString() { - return format("{0} | 고정 할인 | {1}원", id, discountAmount); - } - private int getValidPrice(String discountAmount) { if (isNotValid(discountAmount)) { throw new DiscountAmountException(discountAmount); diff --git a/src/main/java/com/devcourse/voucherapp/entity/voucher/PercentDiscountVoucher.java b/src/main/java/com/devcourse/voucherapp/entity/voucher/PercentDiscountVoucher.java index 6a606ae058..8545ec1447 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/voucher/PercentDiscountVoucher.java +++ b/src/main/java/com/devcourse/voucherapp/entity/voucher/PercentDiscountVoucher.java @@ -22,11 +22,6 @@ public PercentDiscountVoucher(UUID id, VoucherType type, String discountAmount) this.discountAmount = getValidRate(discountAmount); } - @Override - public String toString() { - return format("{0} | 비율 할인 | {1}%", id, discountAmount); - } - private int getValidRate(String discountAmount) { if (isNotValid(discountAmount)) { throw new DiscountAmountException(discountAmount); diff --git a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java index 096d432c29..bf6b380d9d 100644 --- a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java +++ b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java @@ -2,6 +2,8 @@ import com.devcourse.voucherapp.entity.VoucherType; import com.devcourse.voucherapp.entity.dto.VoucherCreateRequestDto; +import com.devcourse.voucherapp.entity.dto.VoucherResponseDto; +import com.devcourse.voucherapp.entity.dto.VouchersResponseDto; import com.devcourse.voucherapp.entity.voucher.Voucher; import com.devcourse.voucherapp.repository.VoucherRepository; import java.util.List; @@ -15,14 +17,17 @@ public class VoucherService { private final VoucherRepository voucherRepository; - public Voucher create(VoucherCreateRequestDto request) { + public VoucherResponseDto create(VoucherCreateRequestDto request) { VoucherType voucherType = request.getType(); - Voucher voucher = voucherType.makeVoucher(UUID.randomUUID(), request.getDiscountAmount()); + Voucher newVoucher = voucherType.makeVoucher(UUID.randomUUID(), request.getDiscountAmount()); + Voucher voucher = voucherRepository.save(newVoucher); - return voucherRepository.save(voucher); + return new VoucherResponseDto(voucher); } - public List findAllVouchers() { - return voucherRepository.findAllVouchers(); + public VouchersResponseDto findAllVouchers() { + List vouchers = voucherRepository.findAllVouchers(); + + return new VouchersResponseDto(vouchers); } } diff --git a/src/main/java/com/devcourse/voucherapp/view/ViewManager.java b/src/main/java/com/devcourse/voucherapp/view/ViewManager.java index cbe0481840..ef8cf5f0dc 100644 --- a/src/main/java/com/devcourse/voucherapp/view/ViewManager.java +++ b/src/main/java/com/devcourse/voucherapp/view/ViewManager.java @@ -2,8 +2,8 @@ import com.devcourse.voucherapp.entity.Menu; import com.devcourse.voucherapp.entity.VoucherType; -import com.devcourse.voucherapp.entity.voucher.Voucher; -import java.util.List; +import com.devcourse.voucherapp.entity.dto.VoucherResponseDto; +import com.devcourse.voucherapp.entity.dto.VouchersResponseDto; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -56,14 +56,14 @@ public void showQuitMessage() { outputView.printWithLineBreak(QUIT_MESSAGE); } - public void showVoucherCreationSuccessMessage(Voucher voucher) { + public void showVoucherCreationSuccessMessage(VoucherResponseDto response) { outputView.printWithLineBreak(VOUCHER_CREATION_SUCCESS_MESSAGE); - outputView.printWithLineBreak(voucher); + outputView.printWithLineBreak(response); } - public void showAllVouchers(List vouchers) { + public void showAllVouchers(VouchersResponseDto response) { outputView.printWithLineBreak(ALL_VOUCHERS_LIST_MESSAGE); - for (Voucher voucher : vouchers) { + for (VoucherResponseDto voucher : response.getVouchers()) { outputView.printWithLineBreak(voucher); } } From a9d70508aca69ae97dea5265aca105444fe2622d Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 7 Jul 2023 03:46:40 +0900 Subject: [PATCH 06/19] =?UTF-8?q?feat:=20=ED=95=A0=EC=9D=B8=EA=B6=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=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 --- .../voucherapp/CommandLineApplication.java | 17 ++++++- .../controller/VoucherController.java | 11 +++- .../com/devcourse/voucherapp/entity/Menu.java | 3 +- .../entity/dto/VoucherUpdateRequestDto.java | 15 ++++++ .../exception/NotFoundVoucherException.java | 12 +++++ .../repository/JdbcVoucherRepository.java | 51 ++++++++++++++----- .../repository/MemoryVoucherRepository.java | 11 ++++ .../repository/VoucherRepository.java | 5 ++ .../voucherapp/service/VoucherService.java | 17 +++++++ .../voucherapp/view/ViewManager.java | 23 +++++++++ .../devcourse/voucherapp/entity/MenuTest.java | 4 +- 11 files changed, 151 insertions(+), 18 deletions(-) create mode 100644 src/main/java/com/devcourse/voucherapp/entity/dto/VoucherUpdateRequestDto.java create mode 100644 src/main/java/com/devcourse/voucherapp/exception/NotFoundVoucherException.java diff --git a/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java b/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java index e8deabffcc..eafbb6ade5 100644 --- a/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java +++ b/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java @@ -5,10 +5,9 @@ import com.devcourse.voucherapp.entity.VoucherType; import com.devcourse.voucherapp.entity.dto.VoucherCreateRequestDto; import com.devcourse.voucherapp.entity.dto.VoucherResponseDto; +import com.devcourse.voucherapp.entity.dto.VoucherUpdateRequestDto; import com.devcourse.voucherapp.entity.dto.VouchersResponseDto; -import com.devcourse.voucherapp.entity.voucher.Voucher; import com.devcourse.voucherapp.view.ViewManager; -import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.CommandLineRunner; @@ -42,6 +41,7 @@ private void executeMenu(Menu selectedMenu) { switch (selectedMenu) { case CREATE -> createVoucher(); case LIST -> listAllVouchers(); + case UPDATE -> updateVoucher(); case QUIT -> quitApplication(); } } @@ -64,6 +64,19 @@ private void listAllVouchers() { viewManager.showAllVouchers(response); } + private void updateVoucher() { + listAllVouchers(); + + String id = viewManager.readVoucherIdToUpdate(); + VoucherResponseDto findResponse = voucherController.findVoucherById(id); + + String discountAmount = viewManager.readVoucherDiscountAmountToUpdate(findResponse); + VoucherUpdateRequestDto request = new VoucherUpdateRequestDto(findResponse.getId(), findResponse.getType(), discountAmount); + VoucherResponseDto response = voucherController.update(request); + + viewManager.showVoucherUpdateSuccessMessage(response); + } + private void quitApplication() { isRunning = false; viewManager.showQuitMessage(); diff --git a/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java b/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java index 6fbffa3d18..b8ec695756 100644 --- a/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java +++ b/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java @@ -2,10 +2,9 @@ import com.devcourse.voucherapp.entity.dto.VoucherCreateRequestDto; import com.devcourse.voucherapp.entity.dto.VoucherResponseDto; +import com.devcourse.voucherapp.entity.dto.VoucherUpdateRequestDto; import com.devcourse.voucherapp.entity.dto.VouchersResponseDto; -import com.devcourse.voucherapp.entity.voucher.Voucher; import com.devcourse.voucherapp.service.VoucherService; -import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; @@ -22,4 +21,12 @@ public VoucherResponseDto create(VoucherCreateRequestDto request) { public VouchersResponseDto findAllVouchers() { return voucherService.findAllVouchers(); } + + public VoucherResponseDto findVoucherById(String id) { + return voucherService.findVoucherById(id); + } + + public VoucherResponseDto update(VoucherUpdateRequestDto request) { + return voucherService.update(request); + } } diff --git a/src/main/java/com/devcourse/voucherapp/entity/Menu.java b/src/main/java/com/devcourse/voucherapp/entity/Menu.java index 4c4f0cd6f6..e26571f869 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/Menu.java +++ b/src/main/java/com/devcourse/voucherapp/entity/Menu.java @@ -13,7 +13,8 @@ public enum Menu { CREATE("1", "새 할인권 생성"), LIST("2", "할인권 조회"), - QUIT("3", "프로그램 종료"); + UPDATE("3", "할인권 수정"), + QUIT("4", "프로그램 종료"); private static final Map MENUS = Collections.unmodifiableMap(Stream.of(values()) .collect(Collectors.toMap(Menu::getNumber, Function.identity()))); diff --git a/src/main/java/com/devcourse/voucherapp/entity/dto/VoucherUpdateRequestDto.java b/src/main/java/com/devcourse/voucherapp/entity/dto/VoucherUpdateRequestDto.java new file mode 100644 index 0000000000..b2238f1e50 --- /dev/null +++ b/src/main/java/com/devcourse/voucherapp/entity/dto/VoucherUpdateRequestDto.java @@ -0,0 +1,15 @@ +package com.devcourse.voucherapp.entity.dto; + +import com.devcourse.voucherapp.entity.VoucherType; +import java.util.UUID; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public class VoucherUpdateRequestDto { + + private final UUID id; + private final VoucherType type; + private final String discountAmount; +} diff --git a/src/main/java/com/devcourse/voucherapp/exception/NotFoundVoucherException.java b/src/main/java/com/devcourse/voucherapp/exception/NotFoundVoucherException.java new file mode 100644 index 0000000000..85091de575 --- /dev/null +++ b/src/main/java/com/devcourse/voucherapp/exception/NotFoundVoucherException.java @@ -0,0 +1,12 @@ +package com.devcourse.voucherapp.exception; + +import static java.text.MessageFormat.format; + +public class NotFoundVoucherException extends RuntimeException { + + private static final String NOT_FOUND_VOUCHER_MESSAGE = "입력하신 ID에 해당하는 할인권이 없습니다."; + + public NotFoundVoucherException(String id) { + super(format("{0} | 입력 : {1}", NOT_FOUND_VOUCHER_MESSAGE, id)); + } +} diff --git a/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java index be3d2adc91..b03e655611 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java @@ -3,13 +3,15 @@ import com.devcourse.voucherapp.entity.VoucherType; import com.devcourse.voucherapp.entity.voucher.Voucher; import java.util.List; +import java.util.Map; +import java.util.Optional; import java.util.UUID; import javax.sql.DataSource; import org.springframework.context.annotation.Profile; +import org.springframework.dao.EmptyResultDataAccessException; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; -import org.springframework.jdbc.core.namedparam.SqlParameterSource; import org.springframework.stereotype.Repository; @Repository @@ -25,13 +27,7 @@ public JdbcVoucherRepository(DataSource dataSource) { @Override public Voucher save(Voucher voucher) { String sql = "insert into voucher(id, type, discount_amount) values (:id, :typeNumber, :discountAmount)"; - - SqlParameterSource parameterSource = new MapSqlParameterSource() - .addValue("id", voucher.getId().toString()) - .addValue("typeNumber", voucher.getType().getNumber()) - .addValue("discountAmount", voucher.getDiscountAmount()); - - template.update(sql, parameterSource); + template.update(sql, getParameterSource(voucher)); return voucher; } @@ -40,15 +36,46 @@ public Voucher save(Voucher voucher) { public List findAllVouchers() { String sql = "select id, type, discount_amount from voucher"; - RowMapper voucherRowMapper = ((resultSet, rowNum) -> { + return template.query(sql, getVoucherRowMapper()); + } + + @Override + public Optional findVoucherById(String id) { + String sql = "select id, type, discount_amount from voucher where id = :id"; + + try { + Map param = Map.of("id", id); + Voucher voucher = template.queryForObject(sql, param, getVoucherRowMapper()); + + return Optional.of(voucher); + } catch (EmptyResultDataAccessException e) { + return Optional.empty(); + } + } + + @Override + public Voucher update(Voucher voucher) { + String sql = "update voucher set type = :typeNumber, discount_amount = :discountAmount where id = :id"; + template.update(sql, getParameterSource(voucher)); + + return voucher; + } + + private MapSqlParameterSource getParameterSource(Voucher voucher) { + return new MapSqlParameterSource() + .addValue("id", voucher.getId().toString()) + .addValue("typeNumber", voucher.getType().getNumber()) + .addValue("discountAmount", voucher.getDiscountAmount()); + } + + private RowMapper getVoucherRowMapper() { + return (resultSet, rowNum) -> { String id = resultSet.getString("id"); String typeNumber = resultSet.getString("type"); int discountAmount = resultSet.getInt("discount_amount"); return VoucherType.of(typeNumber) .makeVoucher(UUID.fromString(id), String.valueOf(discountAmount)); - }); - - return template.query(sql, voucherRowMapper); + }; } } diff --git a/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java index ea77ec821c..ffeddd52cd 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java @@ -4,6 +4,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; @@ -25,4 +26,14 @@ public Voucher save(Voucher voucher) { public List findAllVouchers() { return List.copyOf(storage.values()); } + + @Override + public Optional findVoucherById(String id) { + return Optional.empty(); + } + + @Override + public Voucher update(Voucher voucher) { + return null; + } } diff --git a/src/main/java/com/devcourse/voucherapp/repository/VoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/VoucherRepository.java index afb0b8cb1a..b1f9394a39 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/VoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/VoucherRepository.java @@ -2,10 +2,15 @@ import com.devcourse.voucherapp.entity.voucher.Voucher; import java.util.List; +import java.util.Optional; public interface VoucherRepository { Voucher save(Voucher voucher); List findAllVouchers(); + + Optional findVoucherById(String id); + + Voucher update(Voucher voucher); } diff --git a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java index bf6b380d9d..52a9616147 100644 --- a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java +++ b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java @@ -3,8 +3,10 @@ import com.devcourse.voucherapp.entity.VoucherType; import com.devcourse.voucherapp.entity.dto.VoucherCreateRequestDto; import com.devcourse.voucherapp.entity.dto.VoucherResponseDto; +import com.devcourse.voucherapp.entity.dto.VoucherUpdateRequestDto; import com.devcourse.voucherapp.entity.dto.VouchersResponseDto; import com.devcourse.voucherapp.entity.voucher.Voucher; +import com.devcourse.voucherapp.exception.NotFoundVoucherException; import com.devcourse.voucherapp.repository.VoucherRepository; import java.util.List; import java.util.UUID; @@ -30,4 +32,19 @@ public VouchersResponseDto findAllVouchers() { return new VouchersResponseDto(vouchers); } + + public VoucherResponseDto findVoucherById(String id) { + Voucher voucher = voucherRepository.findVoucherById(id) + .orElseThrow(() -> new NotFoundVoucherException(id)); + + return new VoucherResponseDto(voucher); + } + + public VoucherResponseDto update(VoucherUpdateRequestDto request) { + VoucherType voucherType = request.getType(); + Voucher updatedVoucher = voucherType.makeVoucher(request.getId(), request.getDiscountAmount()); + Voucher voucher = voucherRepository.update(updatedVoucher); + + return new VoucherResponseDto(voucher); + } } diff --git a/src/main/java/com/devcourse/voucherapp/view/ViewManager.java b/src/main/java/com/devcourse/voucherapp/view/ViewManager.java index ef8cf5f0dc..91680e5ebf 100644 --- a/src/main/java/com/devcourse/voucherapp/view/ViewManager.java +++ b/src/main/java/com/devcourse/voucherapp/view/ViewManager.java @@ -17,6 +17,9 @@ public class ViewManager { private static final String VOUCHER_TYPE_SELECTION_MESSAGE = "\n할인 방식을 선택하세요."; private static final String VOUCHER_CREATION_SUCCESS_MESSAGE = "\n할인권 생성이 완료되었습니다."; private static final String ALL_VOUCHERS_LIST_MESSAGE = "\n현재까지 생성된 할인권 목록입니다."; + private static final String UPDATE_VOUCHER_ID_INPUT_MESSAGE = "\n수정할 할인권의 ID를 입력하세요."; + private static final String UPDATE_VOUCHER_INFORMATION_MESSAGE = "\n선택하신 할인권의 정보를 수정합니다."; + private static final String VOUCHER_UPDATE_SUCCESS_MESSAGE = "\n할인권 수정이 완료되었습니다."; private final InputView inputView; private final OutputView outputView; @@ -48,6 +51,21 @@ public String readDiscountAmount(String message) { return inputView.inputWithTrimming(); } + public String readVoucherIdToUpdate() { + outputView.printWithLineBreak(UPDATE_VOUCHER_ID_INPUT_MESSAGE); + outputView.printWithoutLineBreak(INPUT_MESSAGE); + + return inputView.inputWithTrimming(); + } + + public String readVoucherDiscountAmountToUpdate(VoucherResponseDto findResponse) { + outputView.printWithLineBreak(UPDATE_VOUCHER_INFORMATION_MESSAGE); + outputView.printWithLineBreak(findResponse); + VoucherType voucherType = findResponse.getType(); + + return readDiscountAmount(voucherType.getMessage()); + } + public void showExceptionMessage(String message) { outputView.printWithLineBreak(message); } @@ -67,4 +85,9 @@ public void showAllVouchers(VouchersResponseDto response) { outputView.printWithLineBreak(voucher); } } + + public void showVoucherUpdateSuccessMessage(VoucherResponseDto response) { + outputView.printWithLineBreak(VOUCHER_UPDATE_SUCCESS_MESSAGE); + outputView.printWithLineBreak(response); + } } diff --git a/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java b/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java index 6b881b58c2..9d7a9b1140 100644 --- a/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java +++ b/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java @@ -14,10 +14,12 @@ class MenuTest { void selectExistedMenuTest() { Menu createMenu = Menu.of("1"); Menu listMenu = Menu.of("2"); - Menu quitMenu = Menu.of("3"); + Menu updateMenu = Menu.of("3"); + Menu quitMenu = Menu.of("4"); assertEquals(Menu.CREATE, createMenu); assertEquals(Menu.LIST, listMenu); + assertEquals(Menu.UPDATE, updateMenu); assertEquals(Menu.QUIT, quitMenu); } From bdad28082ce6b4091234261c4905051415ca03ab Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 7 Jul 2023 04:09:48 +0900 Subject: [PATCH 07/19] =?UTF-8?q?feat:=20=ED=95=A0=EC=9D=B8=EA=B6=8C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=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 --- .../voucherapp/CommandLineApplication.java | 10 +++++++ .../controller/VoucherController.java | 4 +++ .../com/devcourse/voucherapp/entity/Menu.java | 3 +- .../repository/JdbcVoucherRepository.java | 14 +++++++-- .../repository/MemoryVoucherRepository.java | 5 ++++ .../repository/VoucherRepository.java | 2 ++ .../voucherapp/service/VoucherService.java | 10 +++++++ .../voucherapp/view/ViewManager.java | 30 ++++++++++++++----- .../devcourse/voucherapp/entity/MenuTest.java | 4 ++- 9 files changed, 70 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java b/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java index eafbb6ade5..076c40be55 100644 --- a/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java +++ b/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java @@ -42,6 +42,7 @@ private void executeMenu(Menu selectedMenu) { case CREATE -> createVoucher(); case LIST -> listAllVouchers(); case UPDATE -> updateVoucher(); + case DELETE -> deleteVoucher(); case QUIT -> quitApplication(); } } @@ -77,6 +78,15 @@ private void updateVoucher() { viewManager.showVoucherUpdateSuccessMessage(response); } + private void deleteVoucher() { + listAllVouchers(); + + String id = viewManager.readVoucherIdToDelete(); + voucherController.delete(id); + + viewManager.showVoucherDeleteSuccessMessage(); + } + private void quitApplication() { isRunning = false; viewManager.showQuitMessage(); diff --git a/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java b/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java index b8ec695756..9a48a6cf04 100644 --- a/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java +++ b/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java @@ -29,4 +29,8 @@ public VoucherResponseDto findVoucherById(String id) { public VoucherResponseDto update(VoucherUpdateRequestDto request) { return voucherService.update(request); } + + public void delete(String id) { + voucherService.delete(id); + } } diff --git a/src/main/java/com/devcourse/voucherapp/entity/Menu.java b/src/main/java/com/devcourse/voucherapp/entity/Menu.java index e26571f869..6e94380d9f 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/Menu.java +++ b/src/main/java/com/devcourse/voucherapp/entity/Menu.java @@ -14,7 +14,8 @@ public enum Menu { CREATE("1", "새 할인권 생성"), LIST("2", "할인권 조회"), UPDATE("3", "할인권 수정"), - QUIT("4", "프로그램 종료"); + DELETE("4", "할인권 삭제"), + QUIT("5", "프로그램 종료"); private static final Map MENUS = Collections.unmodifiableMap(Stream.of(values()) .collect(Collectors.toMap(Menu::getNumber, Function.identity()))); diff --git a/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java index b03e655611..1a6359cf1f 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java @@ -44,8 +44,7 @@ public Optional findVoucherById(String id) { String sql = "select id, type, discount_amount from voucher where id = :id"; try { - Map param = Map.of("id", id); - Voucher voucher = template.queryForObject(sql, param, getVoucherRowMapper()); + Voucher voucher = template.queryForObject(sql, getParameterMap(id), getVoucherRowMapper()); return Optional.of(voucher); } catch (EmptyResultDataAccessException e) { @@ -61,6 +60,13 @@ public Voucher update(Voucher voucher) { return voucher; } + @Override + public int delete(String id) { + String sql = "delete from voucher where id = :id"; + + return template.update(sql, getParameterMap(id)); + } + private MapSqlParameterSource getParameterSource(Voucher voucher) { return new MapSqlParameterSource() .addValue("id", voucher.getId().toString()) @@ -68,6 +74,10 @@ private MapSqlParameterSource getParameterSource(Voucher voucher) { .addValue("discountAmount", voucher.getDiscountAmount()); } + private Map getParameterMap(String id) { + return Map.of("id", id); + } + private RowMapper getVoucherRowMapper() { return (resultSet, rowNum) -> { String id = resultSet.getString("id"); diff --git a/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java index ffeddd52cd..7ce819b06f 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java @@ -36,4 +36,9 @@ public Optional findVoucherById(String id) { public Voucher update(Voucher voucher) { return null; } + + @Override + public int delete(String id) { + return 0; + } } diff --git a/src/main/java/com/devcourse/voucherapp/repository/VoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/VoucherRepository.java index b1f9394a39..15532d579f 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/VoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/VoucherRepository.java @@ -13,4 +13,6 @@ public interface VoucherRepository { Optional findVoucherById(String id); Voucher update(Voucher voucher); + + int delete(String id); } diff --git a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java index 52a9616147..7f38f5180b 100644 --- a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java +++ b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java @@ -17,6 +17,8 @@ @RequiredArgsConstructor public class VoucherService { + private static final int ZERO = 0; + private final VoucherRepository voucherRepository; public VoucherResponseDto create(VoucherCreateRequestDto request) { @@ -47,4 +49,12 @@ public VoucherResponseDto update(VoucherUpdateRequestDto request) { return new VoucherResponseDto(voucher); } + + public void delete(String id) { + int deletionCounts = voucherRepository.delete(id); + + if (deletionCounts == ZERO) { + throw new NotFoundVoucherException(id); + } + } } diff --git a/src/main/java/com/devcourse/voucherapp/view/ViewManager.java b/src/main/java/com/devcourse/voucherapp/view/ViewManager.java index 91680e5ebf..ba975082e8 100644 --- a/src/main/java/com/devcourse/voucherapp/view/ViewManager.java +++ b/src/main/java/com/devcourse/voucherapp/view/ViewManager.java @@ -20,6 +20,8 @@ public class ViewManager { private static final String UPDATE_VOUCHER_ID_INPUT_MESSAGE = "\n수정할 할인권의 ID를 입력하세요."; private static final String UPDATE_VOUCHER_INFORMATION_MESSAGE = "\n선택하신 할인권의 정보를 수정합니다."; private static final String VOUCHER_UPDATE_SUCCESS_MESSAGE = "\n할인권 수정이 완료되었습니다."; + private static final String DELETE_VOUCHER_ID_INPUT_MESSAGE = "\n삭제할 할인권의 ID를 입력하세요."; + private static final String VOUCHER_DELETE_SUCCESS_MESSAGE = "\n할인권이 정상적으로 삭제되었습니다."; private final InputView inputView; private final OutputView outputView; @@ -29,9 +31,8 @@ public String readMenuNumber() { for (Menu menu : Menu.values()) { outputView.printWithLineBreak(menu); } - outputView.printWithoutLineBreak(INPUT_MESSAGE); - return inputView.inputWithTrimming(); + return readUserInput(); } public String readVoucherTypeNumber() { @@ -39,23 +40,20 @@ public String readVoucherTypeNumber() { for (VoucherType voucherType : VoucherType.values()) { outputView.printWithLineBreak(voucherType); } - outputView.printWithoutLineBreak(INPUT_MESSAGE); - return inputView.inputWithTrimming(); + return readUserInput(); } public String readDiscountAmount(String message) { outputView.printWithLineBreak(message); - outputView.printWithoutLineBreak(INPUT_MESSAGE); - return inputView.inputWithTrimming(); + return readUserInput(); } public String readVoucherIdToUpdate() { outputView.printWithLineBreak(UPDATE_VOUCHER_ID_INPUT_MESSAGE); - outputView.printWithoutLineBreak(INPUT_MESSAGE); - return inputView.inputWithTrimming(); + return readUserInput(); } public String readVoucherDiscountAmountToUpdate(VoucherResponseDto findResponse) { @@ -66,6 +64,12 @@ public String readVoucherDiscountAmountToUpdate(VoucherResponseDto findResponse) return readDiscountAmount(voucherType.getMessage()); } + public String readVoucherIdToDelete() { + outputView.printWithLineBreak(DELETE_VOUCHER_ID_INPUT_MESSAGE); + + return readUserInput(); + } + public void showExceptionMessage(String message) { outputView.printWithLineBreak(message); } @@ -90,4 +94,14 @@ public void showVoucherUpdateSuccessMessage(VoucherResponseDto response) { outputView.printWithLineBreak(VOUCHER_UPDATE_SUCCESS_MESSAGE); outputView.printWithLineBreak(response); } + + public void showVoucherDeleteSuccessMessage() { + outputView.printWithLineBreak(VOUCHER_DELETE_SUCCESS_MESSAGE); + } + + private String readUserInput() { + outputView.printWithoutLineBreak(INPUT_MESSAGE); + + return inputView.inputWithTrimming(); + } } diff --git a/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java b/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java index 9d7a9b1140..b9470ef7d7 100644 --- a/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java +++ b/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java @@ -15,11 +15,13 @@ void selectExistedMenuTest() { Menu createMenu = Menu.of("1"); Menu listMenu = Menu.of("2"); Menu updateMenu = Menu.of("3"); - Menu quitMenu = Menu.of("4"); + Menu deleteMenu = Menu.of("4"); + Menu quitMenu = Menu.of("5"); assertEquals(Menu.CREATE, createMenu); assertEquals(Menu.LIST, listMenu); assertEquals(Menu.UPDATE, updateMenu); + assertEquals(Menu.DELETE, deleteMenu); assertEquals(Menu.QUIT, quitMenu); } From a22b2405da267ce0ddd48a6ce7e86567fef83332 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 7 Jul 2023 14:32:56 +0900 Subject: [PATCH 08/19] =?UTF-8?q?docs:=20README.md=EC=97=90=202=EC=A3=BC?= =?UTF-8?q?=EC=B0=A8=20=EB=AF=B8=EC=85=98=20=EB=82=B4=EC=9A=A9=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 262 ++++++++++++------------------------------------------ 1 file changed, 56 insertions(+), 206 deletions(-) diff --git a/README.md b/README.md index 02f0ec0004..ee421721f8 100644 --- a/README.md +++ b/README.md @@ -1,163 +1,10 @@ -# SpringBoot Basic Weekly Mission 1 -> 바우처 관리 애플리케이션 만들기 1 - 김영주 - - - -# 1. 요구사항 - -## 프로젝트 요구사항 - -1. Gradle로 프로젝트를 빌드하고, SpringBoot 프로젝트 환경을 설정한다. -2. Web 기능 없이 Command-line Application으로 만든다. -3. logback을 통해 로그를 띄우고, 특히 에러는 별도의 파일로 기록한다. -4. 실행 가능한 jar 파일을 생성한다. - - - -## 기능 요구사항 - -### 1. 프로그램 시작(랜딩 화면) - - ``` - [할인권 프로그램 v1.0] - 1. 새 할인권 생성 - 2. 할인권 조회 - 3. 프로그램 종료 - - 입력 : 1 - ``` - -사용자는 숫자를 입력해서 원하는 메뉴를 선택할 수 있다. -- `1` → 새 할인권 생성 메뉴 실행 -- `2` → 저장된 할인권 조회 메뉴 실행 -- `3` → 프로그램 종료 - - - -### 2. 새 할인권 생성 - -사용자는 숫자를 입력해서 원하는 할인 방식을 선택할 수 있다. - -- `1` → 고정 할인 방식 -- `2` → 비율 할인 방식 - - - -할인권 생성이 완료되면 생성된 할인권의 `UUID, 할인 방식, 금액/비율` 내용을 보여준다. - - - `고정 할인 방식` - - ``` - 할인 방식을 선택하세요. - 1. 고정 할인 - 2. 비율 할인 - 입력 : 1 - - 고정 할인 금액을 입력하세요. - 1이상의 자연수만 입력하세요. 단위는 원입니다. - 입력 : 1000 - - 할인권 생성이 완료되었습니다. - sf5e8400-53m2-nn53-me09-456292156231 | 고정 할인 | 1,000원 - ``` - - - 사용자는 1 이상의 자연수를 입력하여, 고정 할인 금액을 설정할 수 있다. - - - `비율 할인 방식` - - ``` - 할인 방식을 선택하세요. - 1. 고정 할인 - 2. 비율 할인 - 입력 : 2 - - 비율 할인 퍼센트를 입력하세요. - 1이상 100이하의 자연수만 입력하세요. 단위는 %입니다. - 입력 : 40 - - 할인권 생성이 완료되었습니다. - 550e8400-e29b-41d4-a716-446655440000 | 비율 할인 | 40% - ``` - - - 사용자는 1 이상 100 이하의 자연수를 입력하여, 비율 할인 퍼센트를 설정할 수 있다. - - - -### 3. 할인권 조회 - - ``` - 현재까지 생성된 할인권 목록입니다. - 550e8400-e29b-41d4-a716-446655440000 | 비율 할인 | 40% - sf5e8400-53m2-nn53-me09-456292156231 | 고정 할인 | 1,000원 - ``` - -저장된 할인권들의 `UUID, 할인 방식, 금액/비율` 목록을 조회한다. - - - -### 4. 프로그램 종료 - - ``` - [할인권 프로그램 v1.0] - 1. 새 할인권 생성 - 2. 할인권 조회 - 3. 프로그램 종료 - - 입력 : 3 - - 프로그램을 종료합니다. - ``` - -실행 중인 프로그램을 종료한다. - - - ------- - -# 2. 설계 - -## 주요 객체 목록 - -1. **클라이언트** - - 입력(InputView.java) : 각종 메뉴, 할인 금액/비율에 대해 사용자 입력을 받는다. - - 출력(OutputView.java) : 각종 결과 및 예외메시지를 출력한다. -2. **컨트롤러(VoucherController.java)** - - 사용자의 메뉴 입력에 따라 각 메뉴를 실행한다. -3. **서비스(VoucherService.java)** - - 할인권과 관련된 기능을 수행한다. - - 새로운 할인권(고정, 비율)을 생성한다. - - 저장된 모든 할인권 목록을 조회한다. -4. **할인권(Voucher.java)** - - 실제 발행되는 할인권 객체 - - 할인권의 UUID, 할인 금액/비율 수치 정보를 갖는다. - - 고정 할인 방식(FixDiscountVoucher)과 비율 할인 방식(PercentDiscountVoucher)이 존재한다. -5. **저장소(VoucherRepository.java)** - - 할인권 정보를 저장한다. - - 저장된 할인권 목록을 조회하여 전달한다. -6. **메뉴(Menu.java)** - - 사용자가 실행할 수 있는 메뉴 정보를 가진다. -7. **할인권 종류(VoucherType.java)** - - 발행할 수 있는 할인권의 종류 정보를 가진다. - - 각 종류에 맞는 실제 할인권을 발행한다. - - - -## 예외처리 - -1. 메뉴 입력 예외 - - 없는 메뉴 번호인 경우 -2. 할인권 생성 예외 - - 할인 방식을 선택할 때, 없는 방식 번호를 선택한 경우 - - 고정 할인권 생성할 때, 금액의 범위를 벗어난 경우 - - 고정 할인권 생성할 때, 자연수 이외의 숫자나 문자를 입력한 경우 - - 비율 할인권 생성할 때, 퍼센트 범위를 벗어난 경우 - - 비율 할인권 생성할 때, 자연수 이외의 숫자나 문자를 입력한 경우 - - +# SpringBoot Basic Weekly Mission 2 +> 바우처 관리 애플리케이션 만들기 2 - 김영주 +# 1. 설계 ## 프로그램 구조도 -![](https://github.com/prgrms-be-devcourse/java-calculator/assets/49775540/6d4e6aba-824e-4e8e-b5fe-9c05589cdce7) +![image](https://github.com/prgrms-be-devcourse/springboot-basic/assets/49775540/1b4f4d03-b56b-4c2a-9cf6-410db2bdffb7) @@ -170,20 +17,29 @@ src/main/java/com.devcourse.voucherapp/ - VoucherController.java - entity/ + - dto/ + - VoucherCreateRequestDto.java + - VoucherUpdateRequestDto.java + - VoucherResponseDto.java + - VouchersResponseDto.java - voucher/ - Voucher.java - FixDiscountVoucher.java - PercentDiscountVoucher.java - Menu.java - VoucherType.java + - TriFunction.java - exception/ - MenuInputException.java - - VoucherInputException.java + - NotFoundVoucherException.java + - DiscountAmountException.java + - VoucherTypeInputException.java - repository/ - VoucherRepository.java - MemoryVoucherRepository.java + - JdbcVoucherRepository.java - service/ - VoucherService.java @@ -193,7 +49,9 @@ src/main/java/com.devcourse.voucherapp/ - OutputView.java - ConsoleInputView.java - ConsoleOutputView.java + - ViewManager.java +- CommandLineApplication.java - VoucherappApplication.java ``` @@ -201,9 +59,9 @@ src/main/java/com.devcourse.voucherapp/ ------ -## 3. 컨벤션 +# 2. 컨벤션 -### Git commit convention +## Git commit convention > [Angular JS commit convention](https://velog.io/@outstandingboy/Git-커밋-메시지-규약-정리-the-AngularJS-commit-conventions)를 참고 @@ -234,79 +92,71 @@ src/main/java/com.devcourse.voucherapp/ ------ -# 4. 기능 구현 및 실행 화면 +# 3. 기능 구현 및 실행 화면 -## 기능 구현 +## 구현 사항 -- [x] 메뉴 선택 화면 -- [x] 메뉴 입력 및 예외처리 -- [x] 프로그램 종료 -- [x] 고정 할인권 생성 -- [x] 비율 할인권 생성 -- [x] 할인권 조회 -- [x] logback 이용한 로그 파일 생성 -- [x] 실행 가능한 jar 파일 생성 +- [x] H2 데이터베이스를 적용한다. +- [x] 프로필을 이용해 개발과 로컬 환경을 구분한다. +- [x] 할인권 수정 기능을 추가한다. +- [x] 할인권 삭제 기능을 추가한다. ## 실행 화면 +> 할인권 수정, 삭제 기능 추가 + ``` [할인권 프로그램 v1.0] 1. 새 할인권 생성 2. 할인권 조회 -3. 프로그램 종료 +3. 할인권 수정 +4. 할인권 삭제 +5. 프로그램 종료 +입력 : 3 + +현재까지 생성된 할인권 목록입니다. +62f590c0-61c0-461d-90ce-ebafd031a4d8 | 고정 할인 | 1,000원 +38de7fec-e170-49ee-b5bd-30d768a11fd5 | 비율 할인 | 20% -입력 : 1 +수정할 할인권의 ID를 입력하세요. +입력 : 62f590c0-61c0-461d-90ce-ebafd031a4d8 -할인 방식을 선택하세요. -1. 고정 할인 -2. 비율 할인 -입력 : 1 +선택하신 할인권의 정보를 수정합니다. +62f590c0-61c0-461d-90ce-ebafd031a4d8 | 고정 할인 | 1,000원 -고정 할인 금액을 입력하세요. -1이상의 자연수만 입력하세요. 단위는 원입니다. -입력 : 1000 +고정 할인 금액을 입력하세요. (1이상의 자연수, 단위: 원) +입력 : 3000 -할인권 생성이 완료되었습니다. -0437e68e-7fc1-4136-9090-e8a4c3f50ed1 | 고정 할인 | 1,000원 +할인권 수정이 완료되었습니다. +62f590c0-61c0-461d-90ce-ebafd031a4d8 | 고정 할인 | 3,000원 [할인권 프로그램 v1.0] 1. 새 할인권 생성 2. 할인권 조회 -3. 프로그램 종료 +3. 할인권 수정 +4. 할인권 삭제 +5. 프로그램 종료 +입력 : 4 -입력 : 1 - -할인 방식을 선택하세요. -1. 고정 할인 -2. 비율 할인 -입력 : 2 +현재까지 생성된 할인권 목록입니다. +62f590c0-61c0-461d-90ce-ebafd031a4d8 | 고정 할인 | 3,000원 +38de7fec-e170-49ee-b5bd-30d768a11fd5 | 비율 할인 | 20% -비율 할인 퍼센트를 입력하세요. -1이상 100이하의 자연수만 입력하세요. 단위는 %입니다. -입력 : 40 +삭제할 할인권의 ID를 입력하세요. +입력 : 62f590c0-61c0-461d-90ce-ebafd031a4d8 -할인권 생성이 완료되었습니다. -71a70469-3e03-49a6-ad53-e8ec37531dce | 비율 할인 | 40% +할인권이 정상적으로 삭제되었습니다. [할인권 프로그램 v1.0] 1. 새 할인권 생성 2. 할인권 조회 -3. 프로그램 종료 - +3. 할인권 수정 +4. 할인권 삭제 +5. 프로그램 종료 입력 : 2 현재까지 생성된 할인권 목록입니다. -71a70469-3e03-49a6-ad53-e8ec37531dce | 비율 할인 | 40% -0437e68e-7fc1-4136-9090-e8a4c3f50ed1 | 고정 할인 | 1,000원 - -[할인권 프로그램 v1.0] -1. 새 할인권 생성 -2. 할인권 조회 -3. 프로그램 종료 - -입력 : 3 - -프로그램을 종료합니다. +38de7fec-e170-49ee-b5bd-30d768a11fd5 | 비율 할인 | 20% ``` From 6e2b111a5a18f11260a6ef68cc05354f5b4561d8 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 7 Jul 2023 14:34:12 +0900 Subject: [PATCH 09/19] =?UTF-8?q?docs:=20README.md=20=EC=9D=B8=EB=8D=B4?= =?UTF-8?q?=ED=8A=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index ee421721f8..3e26e6964b 100644 --- a/README.md +++ b/README.md @@ -17,11 +17,11 @@ src/main/java/com.devcourse.voucherapp/ - VoucherController.java - entity/ - - dto/ - - VoucherCreateRequestDto.java - - VoucherUpdateRequestDto.java - - VoucherResponseDto.java - - VouchersResponseDto.java + - dto/ + - VoucherCreateRequestDto.java + - VoucherUpdateRequestDto.java + - VoucherResponseDto.java + - VouchersResponseDto.java - voucher/ - Voucher.java - FixDiscountVoucher.java From f442b1e28752f31248c93c2e4d577936086bbadc Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Fri, 7 Jul 2023 16:21:17 +0900 Subject: [PATCH 10/19] =?UTF-8?q?feat:=20dev=20=ED=99=98=EA=B2=BD=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=ED=95=A0=EC=9D=B8=EA=B6=8C=20=EC=A1=B0=ED=9A=8C,?= =?UTF-8?q?=20=EC=88=98=EC=A0=95,=20=EC=82=AD=EC=A0=9C=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 --- .../repository/MemoryVoucherRepository.java | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java index 7ce819b06f..c20698f6a7 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java @@ -1,6 +1,7 @@ package com.devcourse.voucherapp.repository; import com.devcourse.voucherapp.entity.voucher.Voucher; +import com.devcourse.voucherapp.exception.NotFoundVoucherException; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -29,16 +30,29 @@ public List findAllVouchers() { @Override public Optional findVoucherById(String id) { - return Optional.empty(); + UUID voucherId = convertToUuid(id); + + return Optional.ofNullable(storage.get(voucherId)); } @Override public Voucher update(Voucher voucher) { - return null; + return save(voucher); } @Override public int delete(String id) { - return 0; + UUID voucherId = convertToUuid(id); + Voucher deletedVoucher = storage.remove(voucherId); + + return deletedVoucher == null ? 0 : 1; + } + + private UUID convertToUuid(String id) { + try { + return UUID.fromString(id); + } catch (IllegalArgumentException e) { + throw new NotFoundVoucherException(id); + } } } From 8d051315a4a5572bd52c989ee18c8d42df7de9b9 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sun, 9 Jul 2023 17:05:39 +0900 Subject: [PATCH 11/19] =?UTF-8?q?style:=20=EA=B0=81=EC=A2=85=20=EB=84=A4?= =?UTF-8?q?=EC=9D=B4=EB=B0=8D=EC=9D=84=20=EA=B5=AC=EC=B2=B4=EC=A0=81?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=98=EB=AF=B8=EB=A5=BC=20=EB=82=98?= =?UTF-8?q?=ED=83=80=EB=82=B4=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD=20-?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=EB=A9=94=EB=89=B4=20=EC=9D=B4=EB=A6=84?= =?UTF-8?q?=EC=9D=84=20LIST=EC=97=90=EC=84=9C=20READ=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20-=20delete=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=A5=BC?= =?UTF-8?q?=20deleteById=EB=A1=9C=20=EB=B3=80=EA=B2=BD=ED=95=98=EC=97=AC?= =?UTF-8?q?=20ID=EC=97=90=20=EC=9D=98=ED=95=B4=20=ED=95=A0=EC=9D=B8?= =?UTF-8?q?=EA=B6=8C=EC=9D=B4=20=EC=82=AD=EC=A0=9C=EB=90=A8=EC=9D=84=20?= =?UTF-8?q?=EB=AA=85=EC=8B=9C=20-=20Java=2016=EB=B6=80=ED=84=B0=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=EB=90=9C=20toList()=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=EC=9D=84=20=EC=9D=B4=EC=9A=A9=ED=95=B4=20collect=20=EB=8C=80?= =?UTF-8?q?=EC=B2=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devcourse/voucherapp/CommandLineApplication.java | 10 +++++----- .../voucherapp/controller/VoucherController.java | 4 ++-- .../java/com/devcourse/voucherapp/entity/Menu.java | 2 +- .../voucherapp/entity/dto/VouchersResponseDto.java | 3 +-- .../voucherapp/repository/JdbcVoucherRepository.java | 2 +- .../voucherapp/repository/MemoryVoucherRepository.java | 2 +- .../voucherapp/repository/VoucherRepository.java | 2 +- .../devcourse/voucherapp/service/VoucherService.java | 4 ++-- .../java/com/devcourse/voucherapp/entity/MenuTest.java | 2 +- 9 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java b/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java index 076c40be55..76977ac0b6 100644 --- a/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java +++ b/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java @@ -40,7 +40,7 @@ public void run(String... args) { private void executeMenu(Menu selectedMenu) { switch (selectedMenu) { case CREATE -> createVoucher(); - case LIST -> listAllVouchers(); + case READ -> readAllVouchers(); case UPDATE -> updateVoucher(); case DELETE -> deleteVoucher(); case QUIT -> quitApplication(); @@ -60,13 +60,13 @@ private void createVoucher() { viewManager.showVoucherCreationSuccessMessage(response); } - private void listAllVouchers() { + private void readAllVouchers() { VouchersResponseDto response = voucherController.findAllVouchers(); viewManager.showAllVouchers(response); } private void updateVoucher() { - listAllVouchers(); + readAllVouchers(); String id = viewManager.readVoucherIdToUpdate(); VoucherResponseDto findResponse = voucherController.findVoucherById(id); @@ -79,10 +79,10 @@ private void updateVoucher() { } private void deleteVoucher() { - listAllVouchers(); + readAllVouchers(); String id = viewManager.readVoucherIdToDelete(); - voucherController.delete(id); + voucherController.deleteById(id); viewManager.showVoucherDeleteSuccessMessage(); } diff --git a/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java b/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java index 9a48a6cf04..1754a04ebb 100644 --- a/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java +++ b/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java @@ -30,7 +30,7 @@ public VoucherResponseDto update(VoucherUpdateRequestDto request) { return voucherService.update(request); } - public void delete(String id) { - voucherService.delete(id); + public void deleteById(String id) { + voucherService.deleteById(id); } } diff --git a/src/main/java/com/devcourse/voucherapp/entity/Menu.java b/src/main/java/com/devcourse/voucherapp/entity/Menu.java index 6e94380d9f..a0c4eadaaa 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/Menu.java +++ b/src/main/java/com/devcourse/voucherapp/entity/Menu.java @@ -12,7 +12,7 @@ public enum Menu { CREATE("1", "새 할인권 생성"), - LIST("2", "할인권 조회"), + READ("2", "할인권 조회"), UPDATE("3", "할인권 수정"), DELETE("4", "할인권 삭제"), QUIT("5", "프로그램 종료"); diff --git a/src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java b/src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java index 028543a041..37539a37b3 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java +++ b/src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java @@ -2,7 +2,6 @@ import com.devcourse.voucherapp.entity.voucher.Voucher; import java.util.List; -import java.util.stream.Collectors; import lombok.Getter; @Getter @@ -13,6 +12,6 @@ public class VouchersResponseDto { public VouchersResponseDto(List vouchers) { this.vouchers = vouchers.stream() .map(VoucherResponseDto::new) - .collect(Collectors.toList()); + .toList(); } } diff --git a/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java index 1a6359cf1f..1533703281 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java @@ -61,7 +61,7 @@ public Voucher update(Voucher voucher) { } @Override - public int delete(String id) { + public int deleteById(String id) { String sql = "delete from voucher where id = :id"; return template.update(sql, getParameterMap(id)); diff --git a/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java index c20698f6a7..7126207f5c 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java @@ -41,7 +41,7 @@ public Voucher update(Voucher voucher) { } @Override - public int delete(String id) { + public int deleteById(String id) { UUID voucherId = convertToUuid(id); Voucher deletedVoucher = storage.remove(voucherId); diff --git a/src/main/java/com/devcourse/voucherapp/repository/VoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/VoucherRepository.java index 15532d579f..a541fc7b7f 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/VoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/VoucherRepository.java @@ -14,5 +14,5 @@ public interface VoucherRepository { Voucher update(Voucher voucher); - int delete(String id); + int deleteById(String id); } diff --git a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java index 7f38f5180b..6d00094e79 100644 --- a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java +++ b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java @@ -50,8 +50,8 @@ public VoucherResponseDto update(VoucherUpdateRequestDto request) { return new VoucherResponseDto(voucher); } - public void delete(String id) { - int deletionCounts = voucherRepository.delete(id); + public void deleteById(String id) { + int deletionCounts = voucherRepository.deleteById(id); if (deletionCounts == ZERO) { throw new NotFoundVoucherException(id); diff --git a/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java b/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java index b9470ef7d7..3ab79bf766 100644 --- a/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java +++ b/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java @@ -19,7 +19,7 @@ void selectExistedMenuTest() { Menu quitMenu = Menu.of("5"); assertEquals(Menu.CREATE, createMenu); - assertEquals(Menu.LIST, listMenu); + assertEquals(Menu.READ, listMenu); assertEquals(Menu.UPDATE, updateMenu); assertEquals(Menu.DELETE, deleteMenu); assertEquals(Menu.QUIT, quitMenu); From 2d17e60a0e6eed16cd0112ceebfbf537a640abd8 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sun, 9 Jul 2023 18:37:41 +0900 Subject: [PATCH 12/19] =?UTF-8?q?refactor:=20DTO=20=EA=B0=9D=EC=B2=B4=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9D=84=20=EC=A0=95=EC=A0=81=20=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=A5=BC=20?= =?UTF-8?q?=EC=9D=B4=EC=9A=A9=ED=95=98=EB=8F=84=EB=A1=9D=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 --- .../voucherapp/entity/dto/VoucherResponseDto.java | 8 ++++---- .../voucherapp/entity/dto/VouchersResponseDto.java | 11 +++++++---- .../devcourse/voucherapp/service/VoucherService.java | 8 ++++---- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/devcourse/voucherapp/entity/dto/VoucherResponseDto.java b/src/main/java/com/devcourse/voucherapp/entity/dto/VoucherResponseDto.java index d171a52b72..53d5be7694 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/dto/VoucherResponseDto.java +++ b/src/main/java/com/devcourse/voucherapp/entity/dto/VoucherResponseDto.java @@ -6,7 +6,9 @@ import com.devcourse.voucherapp.entity.voucher.Voucher; import java.util.UUID; import lombok.Getter; +import lombok.RequiredArgsConstructor; +@RequiredArgsConstructor @Getter public class VoucherResponseDto { @@ -14,10 +16,8 @@ public class VoucherResponseDto { private final VoucherType type; private final int discountAmount; - public VoucherResponseDto(Voucher voucher) { - this.id = voucher.getId(); - this.type = voucher.getType(); - this.discountAmount = voucher.getDiscountAmount(); + public static VoucherResponseDto from(Voucher voucher) { + return new VoucherResponseDto(voucher.getId(), voucher.getType(), voucher.getDiscountAmount()); } @Override diff --git a/src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java b/src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java index 37539a37b3..04170ab285 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java +++ b/src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java @@ -3,15 +3,18 @@ import com.devcourse.voucherapp.entity.voucher.Voucher; import java.util.List; import lombok.Getter; +import lombok.RequiredArgsConstructor; +@RequiredArgsConstructor @Getter public class VouchersResponseDto { private final List vouchers; - public VouchersResponseDto(List vouchers) { - this.vouchers = vouchers.stream() - .map(VoucherResponseDto::new) - .toList(); + public static VouchersResponseDto from(List vouchers) { + + return new VouchersResponseDto(vouchers.stream() + .map(VoucherResponseDto::from) + .toList()); } } diff --git a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java index 6d00094e79..113340d9e4 100644 --- a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java +++ b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java @@ -26,20 +26,20 @@ public VoucherResponseDto create(VoucherCreateRequestDto request) { Voucher newVoucher = voucherType.makeVoucher(UUID.randomUUID(), request.getDiscountAmount()); Voucher voucher = voucherRepository.save(newVoucher); - return new VoucherResponseDto(voucher); + return VoucherResponseDto.from(voucher); } public VouchersResponseDto findAllVouchers() { List vouchers = voucherRepository.findAllVouchers(); - return new VouchersResponseDto(vouchers); + return VouchersResponseDto.from(vouchers); } public VoucherResponseDto findVoucherById(String id) { Voucher voucher = voucherRepository.findVoucherById(id) .orElseThrow(() -> new NotFoundVoucherException(id)); - return new VoucherResponseDto(voucher); + return VoucherResponseDto.from(voucher); } public VoucherResponseDto update(VoucherUpdateRequestDto request) { @@ -47,7 +47,7 @@ public VoucherResponseDto update(VoucherUpdateRequestDto request) { Voucher updatedVoucher = voucherType.makeVoucher(request.getId(), request.getDiscountAmount()); Voucher voucher = voucherRepository.update(updatedVoucher); - return new VoucherResponseDto(voucher); + return VoucherResponseDto.from(voucher); } public void deleteById(String id) { From 61c517583f72205a963f9e066ddb6178856f3eec Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sun, 9 Jul 2023 18:40:16 +0900 Subject: [PATCH 13/19] =?UTF-8?q?style:=20Menu,=20VoucherType=20=ED=81=B4?= =?UTF-8?q?=EB=9E=98=EC=8A=A4=EC=9D=98=20=EC=A0=95=EC=A0=81=20=ED=8C=A9?= =?UTF-8?q?=ED=86=A0=EB=A6=AC=20=EB=A9=94=EC=84=9C=EB=93=9C=20=EB=AA=85?= =?UTF-8?q?=EC=9D=84=20of=EC=97=90=EC=84=9C=20from=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD=20-=20=EB=A7=A4=EA=B0=9C=EB=B3=80=EC=88=98?= =?UTF-8?q?=EA=B0=80=201=EA=B0=9C=EC=9D=BC=20=EB=95=8C=EB=8A=94=20from?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=A7=93=EB=8A=94=20=EA=B2=83=EC=9D=B4=20?= =?UTF-8?q?=EA=B6=8C=EC=9E=A5=EB=90=98=EA=B8=B0=20=EB=95=8C=EB=AC=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucherapp/CommandLineApplication.java | 4 ++-- .../java/com/devcourse/voucherapp/entity/Menu.java | 2 +- .../devcourse/voucherapp/entity/VoucherType.java | 2 +- .../repository/JdbcVoucherRepository.java | 2 +- .../com/devcourse/voucherapp/entity/MenuTest.java | 14 +++++++------- .../voucherapp/entity/VoucherTypeTest.java | 8 ++++---- 6 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java b/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java index 76977ac0b6..8609140c78 100644 --- a/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java +++ b/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java @@ -27,7 +27,7 @@ public void run(String... args) { while (isRunning) { try { String menuNumber = viewManager.readMenuNumber(); - Menu selectedMenu = Menu.of(menuNumber); + Menu selectedMenu = Menu.from(menuNumber); executeMenu(selectedMenu); } catch (Exception e) { String message = e.getMessage(); @@ -49,7 +49,7 @@ private void executeMenu(Menu selectedMenu) { private void createVoucher() { String typeNumber = viewManager.readVoucherTypeNumber(); - VoucherType voucherType = VoucherType.of(typeNumber); + VoucherType voucherType = VoucherType.from(typeNumber); String message = voucherType.getMessage(); String discountAmount = viewManager.readDiscountAmount(message); diff --git a/src/main/java/com/devcourse/voucherapp/entity/Menu.java b/src/main/java/com/devcourse/voucherapp/entity/Menu.java index a0c4eadaaa..ce28f30ffa 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/Menu.java +++ b/src/main/java/com/devcourse/voucherapp/entity/Menu.java @@ -30,7 +30,7 @@ public enum Menu { this.name = name; } - public static Menu of(String menuNumber) { + public static Menu from(String menuNumber) { if (MENUS.containsKey(menuNumber)) { return MENUS.get(menuNumber); } diff --git a/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java b/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java index aec6123724..98606446a3 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java +++ b/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java @@ -49,7 +49,7 @@ public enum VoucherType { this.voucherGenerator = voucherGenerator; } - public static VoucherType of(String voucherTypeNumber) { + public static VoucherType from(String voucherTypeNumber) { if (VOUCHER_TYPES.containsKey(voucherTypeNumber)) { return VOUCHER_TYPES.get(voucherTypeNumber); } diff --git a/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java index 1533703281..bb5a9036a9 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java @@ -84,7 +84,7 @@ private RowMapper getVoucherRowMapper() { String typeNumber = resultSet.getString("type"); int discountAmount = resultSet.getInt("discount_amount"); - return VoucherType.of(typeNumber) + return VoucherType.from(typeNumber) .makeVoucher(UUID.fromString(id), String.valueOf(discountAmount)); }; } diff --git a/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java b/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java index 3ab79bf766..6de65ea4bf 100644 --- a/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java +++ b/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java @@ -12,11 +12,11 @@ class MenuTest { @DisplayName("존재하는 메뉴 번호 입력 시, 해당 메뉴 객체가 반환된다.") @Test void selectExistedMenuTest() { - Menu createMenu = Menu.of("1"); - Menu listMenu = Menu.of("2"); - Menu updateMenu = Menu.of("3"); - Menu deleteMenu = Menu.of("4"); - Menu quitMenu = Menu.of("5"); + Menu createMenu = Menu.from("1"); + Menu listMenu = Menu.from("2"); + Menu updateMenu = Menu.from("3"); + Menu deleteMenu = Menu.from("4"); + Menu quitMenu = Menu.from("5"); assertEquals(Menu.CREATE, createMenu); assertEquals(Menu.READ, listMenu); @@ -28,7 +28,7 @@ void selectExistedMenuTest() { @DisplayName("존재하지 않는 메뉴 번호 입력 시, MenuInputException 예외가 발생한다.") @Test void selectNotExistedMenuTest() { - assertThrows(MenuInputException.class, () -> Menu.of("10000")); - assertThrows(MenuInputException.class, () -> Menu.of("string")); + assertThrows(MenuInputException.class, () -> Menu.from("10000")); + assertThrows(MenuInputException.class, () -> Menu.from("string")); } } diff --git a/src/test/java/com/devcourse/voucherapp/entity/VoucherTypeTest.java b/src/test/java/com/devcourse/voucherapp/entity/VoucherTypeTest.java index b3e84bae26..15f28fff4c 100644 --- a/src/test/java/com/devcourse/voucherapp/entity/VoucherTypeTest.java +++ b/src/test/java/com/devcourse/voucherapp/entity/VoucherTypeTest.java @@ -16,8 +16,8 @@ class VoucherTypeTest { @DisplayName("존재하는 할인권 방식 입력 시, 해당 할인권 방식 객체가 반환된다.") @Test void selectExistedVoucherTypeTest() { - VoucherType fixType = VoucherType.of("1"); - VoucherType percentType = VoucherType.of("2"); + VoucherType fixType = VoucherType.from("1"); + VoucherType percentType = VoucherType.from("2"); assertEquals(VoucherType.FIX, fixType); assertEquals(VoucherType.PERCENT, percentType); @@ -26,8 +26,8 @@ void selectExistedVoucherTypeTest() { @DisplayName("존재하지 않는 할인권 방식 입력 시, VoucherInputException 예외가 발생한다.") @Test void selectNotExistedVoucherTypeTest() { - assertThrows(VoucherTypeInputException.class, () -> VoucherType.of("10000")); - assertThrows(VoucherTypeInputException.class, () -> VoucherType.of("string")); + assertThrows(VoucherTypeInputException.class, () -> VoucherType.from("10000")); + assertThrows(VoucherTypeInputException.class, () -> VoucherType.from("string")); } @DisplayName("고정 금액 할인권 생성 시, 잘못된 금액을 입력한 경우 VoucherInputException 예외가 발생한다.") From 354246d1c57c42a43f75b7a512ccd0910bc3e6b3 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Sun, 9 Jul 2023 18:45:57 +0900 Subject: [PATCH 14/19] =?UTF-8?q?style:=20=EA=B8=B0=EC=A1=B4=20Profile=20l?= =?UTF-8?q?ocal,=20dev=20=EB=84=A4=EC=9D=B4=EB=B0=8D=EC=9D=84=20=EC=84=9C?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20-=20MemoryVoucherRepository?= =?UTF-8?q?=EB=A1=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=8B=A8=EA=B3=84=EB=A5=BC=20dev=EC=97=90=EC=84=9C=20local?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD=20-=20JdbcVoucherRepository?= =?UTF-8?q?=EB=A1=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=8B=A8=EA=B3=84=EB=A5=BC=20local=EC=97=90=EC=84=9C=20dev?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucherapp/repository/JdbcVoucherRepository.java | 2 +- .../voucherapp/repository/MemoryVoucherRepository.java | 2 +- src/main/resources/application.yaml | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java index bb5a9036a9..be66a5af8e 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/JdbcVoucherRepository.java @@ -15,7 +15,7 @@ import org.springframework.stereotype.Repository; @Repository -@Profile("local") +@Profile("dev") public class JdbcVoucherRepository implements VoucherRepository { private final NamedParameterJdbcTemplate template; diff --git a/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java b/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java index 7126207f5c..e4bddf6638 100644 --- a/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java +++ b/src/main/java/com/devcourse/voucherapp/repository/MemoryVoucherRepository.java @@ -11,7 +11,7 @@ import org.springframework.stereotype.Repository; @Repository -@Profile("dev") +@Profile("local") public class MemoryVoucherRepository implements VoucherRepository { private final Map storage = new LinkedHashMap<>(); diff --git a/src/main/resources/application.yaml b/src/main/resources/application.yaml index 4b86199d10..96ed0446b4 100644 --- a/src/main/resources/application.yaml +++ b/src/main/resources/application.yaml @@ -1,26 +1,26 @@ spring: profiles: - active: local + active: dev --- spring: config: activate: - on-profile: dev + on-profile: local --- spring: config: activate: - on-profile: local + on-profile: dev h2: console: enabled: true path: /h2-console datasource: driver-class-name: org.h2.Driver - url: jdbc:h2:mem:local + url: jdbc:h2:mem:testDB username: sa password: \ No newline at end of file From 4fc2b9244993a9661c98a4e638875270f48b95fc Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 12 Jul 2023 14:57:09 +0900 Subject: [PATCH 15/19] =?UTF-8?q?refactor:=20=EC=97=AC=EB=9F=AC=20Voucher?= =?UTF-8?q?=EB=A5=BC=20=EC=9D=91=EB=8B=B5=ED=95=98=EB=8A=94=20DTO=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=EB=A5=BC=20=EC=82=AD=EC=A0=9C=ED=95=98?= =?UTF-8?q?=EA=B3=A0=20=EB=8B=A8=EC=88=9C=20List=EB=A1=9C=20=EB=B0=98?= =?UTF-8?q?=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucherapp/CommandLineApplication.java | 4 ++-- .../controller/VoucherController.java | 4 ++-- .../entity/dto/VouchersResponseDto.java | 20 ------------------- .../voucherapp/service/VoucherService.java | 9 ++++----- .../voucherapp/view/ViewManager.java | 6 +++--- 5 files changed, 11 insertions(+), 32 deletions(-) delete mode 100644 src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java diff --git a/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java b/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java index 8609140c78..f0cd5227e4 100644 --- a/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java +++ b/src/main/java/com/devcourse/voucherapp/CommandLineApplication.java @@ -6,8 +6,8 @@ import com.devcourse.voucherapp.entity.dto.VoucherCreateRequestDto; import com.devcourse.voucherapp.entity.dto.VoucherResponseDto; import com.devcourse.voucherapp.entity.dto.VoucherUpdateRequestDto; -import com.devcourse.voucherapp.entity.dto.VouchersResponseDto; import com.devcourse.voucherapp.view.ViewManager; +import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.CommandLineRunner; @@ -61,7 +61,7 @@ private void createVoucher() { } private void readAllVouchers() { - VouchersResponseDto response = voucherController.findAllVouchers(); + List response = voucherController.findAllVouchers(); viewManager.showAllVouchers(response); } diff --git a/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java b/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java index 1754a04ebb..3c8025af1f 100644 --- a/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java +++ b/src/main/java/com/devcourse/voucherapp/controller/VoucherController.java @@ -3,8 +3,8 @@ import com.devcourse.voucherapp.entity.dto.VoucherCreateRequestDto; import com.devcourse.voucherapp.entity.dto.VoucherResponseDto; import com.devcourse.voucherapp.entity.dto.VoucherUpdateRequestDto; -import com.devcourse.voucherapp.entity.dto.VouchersResponseDto; import com.devcourse.voucherapp.service.VoucherService; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; @@ -18,7 +18,7 @@ public VoucherResponseDto create(VoucherCreateRequestDto request) { return voucherService.create(request); } - public VouchersResponseDto findAllVouchers() { + public List findAllVouchers() { return voucherService.findAllVouchers(); } diff --git a/src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java b/src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java deleted file mode 100644 index 04170ab285..0000000000 --- a/src/main/java/com/devcourse/voucherapp/entity/dto/VouchersResponseDto.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.devcourse.voucherapp.entity.dto; - -import com.devcourse.voucherapp.entity.voucher.Voucher; -import java.util.List; -import lombok.Getter; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Getter -public class VouchersResponseDto { - - private final List vouchers; - - public static VouchersResponseDto from(List vouchers) { - - return new VouchersResponseDto(vouchers.stream() - .map(VoucherResponseDto::from) - .toList()); - } -} diff --git a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java index 113340d9e4..a0caa2d627 100644 --- a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java +++ b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java @@ -4,7 +4,6 @@ import com.devcourse.voucherapp.entity.dto.VoucherCreateRequestDto; import com.devcourse.voucherapp.entity.dto.VoucherResponseDto; import com.devcourse.voucherapp.entity.dto.VoucherUpdateRequestDto; -import com.devcourse.voucherapp.entity.dto.VouchersResponseDto; import com.devcourse.voucherapp.entity.voucher.Voucher; import com.devcourse.voucherapp.exception.NotFoundVoucherException; import com.devcourse.voucherapp.repository.VoucherRepository; @@ -29,10 +28,10 @@ public VoucherResponseDto create(VoucherCreateRequestDto request) { return VoucherResponseDto.from(voucher); } - public VouchersResponseDto findAllVouchers() { - List vouchers = voucherRepository.findAllVouchers(); - - return VouchersResponseDto.from(vouchers); + public List findAllVouchers() { + return voucherRepository.findAllVouchers().stream() + .map(VoucherResponseDto::from) + .toList(); } public VoucherResponseDto findVoucherById(String id) { diff --git a/src/main/java/com/devcourse/voucherapp/view/ViewManager.java b/src/main/java/com/devcourse/voucherapp/view/ViewManager.java index ba975082e8..a556b5c8b4 100644 --- a/src/main/java/com/devcourse/voucherapp/view/ViewManager.java +++ b/src/main/java/com/devcourse/voucherapp/view/ViewManager.java @@ -3,7 +3,7 @@ import com.devcourse.voucherapp.entity.Menu; import com.devcourse.voucherapp.entity.VoucherType; import com.devcourse.voucherapp.entity.dto.VoucherResponseDto; -import com.devcourse.voucherapp.entity.dto.VouchersResponseDto; +import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; @@ -83,9 +83,9 @@ public void showVoucherCreationSuccessMessage(VoucherResponseDto response) { outputView.printWithLineBreak(response); } - public void showAllVouchers(VouchersResponseDto response) { + public void showAllVouchers(List response) { outputView.printWithLineBreak(ALL_VOUCHERS_LIST_MESSAGE); - for (VoucherResponseDto voucher : response.getVouchers()) { + for (VoucherResponseDto voucher : response) { outputView.printWithLineBreak(voucher); } } From e675be26bf96eae8c5319d3d34d9aae9ce32c5eb Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 12 Jul 2023 15:18:17 +0900 Subject: [PATCH 16/19] =?UTF-8?q?test:=20ParameterizedTest=EB=A5=BC=20?= =?UTF-8?q?=EC=9D=B4=EC=9A=A9=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=BD=94=EB=93=9C=20=EA=B0=84=EC=86=8C=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devcourse/voucherapp/entity/MenuTest.java | 29 +++++++------------ .../voucherapp/entity/VoucherTypeTest.java | 21 ++++++-------- 2 files changed, 20 insertions(+), 30 deletions(-) diff --git a/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java b/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java index 6de65ea4bf..0bdb27bf34 100644 --- a/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java +++ b/src/test/java/com/devcourse/voucherapp/entity/MenuTest.java @@ -5,30 +5,23 @@ import com.devcourse.voucherapp.exception.MenuInputException; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; +import org.junit.jupiter.params.provider.ValueSource; class MenuTest { @DisplayName("존재하는 메뉴 번호 입력 시, 해당 메뉴 객체가 반환된다.") - @Test - void selectExistedMenuTest() { - Menu createMenu = Menu.from("1"); - Menu listMenu = Menu.from("2"); - Menu updateMenu = Menu.from("3"); - Menu deleteMenu = Menu.from("4"); - Menu quitMenu = Menu.from("5"); - - assertEquals(Menu.CREATE, createMenu); - assertEquals(Menu.READ, listMenu); - assertEquals(Menu.UPDATE, updateMenu); - assertEquals(Menu.DELETE, deleteMenu); - assertEquals(Menu.QUIT, quitMenu); + @ParameterizedTest + @CsvSource(value = {"1,CREATE", "2,READ", "3,UPDATE", "4,DELETE", "5,QUIT"}) + void selectExistedMenuTest(String menuNumber, Menu menu) { + assertEquals(menu, Menu.from(menuNumber)); } @DisplayName("존재하지 않는 메뉴 번호 입력 시, MenuInputException 예외가 발생한다.") - @Test - void selectNotExistedMenuTest() { - assertThrows(MenuInputException.class, () -> Menu.from("10000")); - assertThrows(MenuInputException.class, () -> Menu.from("string")); + @ParameterizedTest + @ValueSource(strings = {"10000", "string"}) + void selectNotExistedMenuTest(String invalidMenuNumber) { + assertThrows(MenuInputException.class, () -> Menu.from(invalidMenuNumber)); } } diff --git a/src/test/java/com/devcourse/voucherapp/entity/VoucherTypeTest.java b/src/test/java/com/devcourse/voucherapp/entity/VoucherTypeTest.java index 15f28fff4c..04d43a6182 100644 --- a/src/test/java/com/devcourse/voucherapp/entity/VoucherTypeTest.java +++ b/src/test/java/com/devcourse/voucherapp/entity/VoucherTypeTest.java @@ -7,27 +7,24 @@ import com.devcourse.voucherapp.exception.VoucherTypeInputException; import java.util.UUID; import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.ValueSource; class VoucherTypeTest { @DisplayName("존재하는 할인권 방식 입력 시, 해당 할인권 방식 객체가 반환된다.") - @Test - void selectExistedVoucherTypeTest() { - VoucherType fixType = VoucherType.from("1"); - VoucherType percentType = VoucherType.from("2"); - - assertEquals(VoucherType.FIX, fixType); - assertEquals(VoucherType.PERCENT, percentType); + @ParameterizedTest + @CsvSource(value = {"1,FIX", "2,PERCENT"}) + void selectExistedVoucherTypeTest(String typeNumber, VoucherType type) { + assertEquals(type, VoucherType.from(typeNumber)); } @DisplayName("존재하지 않는 할인권 방식 입력 시, VoucherInputException 예외가 발생한다.") - @Test - void selectNotExistedVoucherTypeTest() { - assertThrows(VoucherTypeInputException.class, () -> VoucherType.from("10000")); - assertThrows(VoucherTypeInputException.class, () -> VoucherType.from("string")); + @ParameterizedTest + @ValueSource(strings = {"10000", "string"}) + void selectNotExistedVoucherTypeTest(String invalidTypeNumber) { + assertThrows(VoucherTypeInputException.class, () -> VoucherType.from(invalidTypeNumber)); } @DisplayName("고정 금액 할인권 생성 시, 잘못된 금액을 입력한 경우 VoucherInputException 예외가 발생한다.") From 6223d0951081e68b68ed2839299cc2c92f90ca9a Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 12 Jul 2023 16:32:47 +0900 Subject: [PATCH 17/19] =?UTF-8?q?refactor:=20VoucherType=20Enum=20?= =?UTF-8?q?=EA=B0=9D=EC=B2=B4=EC=97=90=20=EB=B9=8C=EB=8D=94=20=ED=8C=A8?= =?UTF-8?q?=ED=84=B4=20=EC=A0=81=EC=9A=A9=20-=20VoucherType=EC=9D=98=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=9E=90=20=ED=8C=8C=EB=9D=BC=EB=AF=B8?= =?UTF-8?q?=ED=84=B0=EA=B0=80=20=EB=84=88=EB=AC=B4=20=EB=A7=8E=EC=95=84?= =?UTF-8?q?=EC=84=9C=20=EA=B0=80=EB=8F=85=EC=84=B1=20=EC=A0=80=ED=95=B4=20?= =?UTF-8?q?-=20VoucherTypeInfo=EB=9D=BC=EB=8A=94=20=EB=B9=8C=EB=8D=94=20?= =?UTF-8?q?=ED=81=B4=EB=9E=98=EC=8A=A4=EB=A5=BC=20=EB=A7=8C=EB=93=A4?= =?UTF-8?q?=EC=96=B4=EC=84=9C=20=EC=83=9D=EC=84=B1=EC=9E=90=20=ED=8C=8C?= =?UTF-8?q?=EB=9D=BC=EB=AF=B8=ED=84=B0=EB=A1=9C=20=EC=A3=BC=EC=9E=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../voucherapp/entity/VoucherType.java | 39 ++++++++++--------- .../voucherapp/entity/VoucherTypeInfo.java | 17 ++++++++ 2 files changed, 37 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/devcourse/voucherapp/entity/VoucherTypeInfo.java diff --git a/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java b/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java index 98606446a3..645d59a905 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java +++ b/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java @@ -16,19 +16,21 @@ @Getter public enum VoucherType { - FIX( - "1", - "고정 할인", - "\n고정 할인 금액을 입력하세요. (1이상의 자연수, 단위: 원)", - "원", - FixDiscountVoucher::new + FIX(VoucherTypeInfo.builder() + .number("1") + .name("고정 할인") + .message("\n고정 할인 금액을 입력하세요. (1이상의 자연수, 단위: 원)") + .unit("원") + .voucherGenerator(FixDiscountVoucher::new) + .build() ), - PERCENT( - "2", - "비율 할인", - "\n비율 할인 퍼센트를 입력하세요. (1이상 100이하의 자연수, 단위: %)", - "%", - PercentDiscountVoucher::new + PERCENT(VoucherTypeInfo.builder() + .number("2") + .name("비율 할인") + .message("\n비율 할인 퍼센트를 입력하세요. (1이상 100이하의 자연수, 단위: %)") + .unit("%") + .voucherGenerator(PercentDiscountVoucher::new) + .build() ); private static final Map VOUCHER_TYPES = Collections.unmodifiableMap(Stream.of(values()) @@ -40,13 +42,12 @@ public enum VoucherType { private final String unit; private final TriFunction voucherGenerator; - VoucherType(String number, String name, String message, String unit, - TriFunction voucherGenerator) { - this.number = number; - this.name = name; - this.message = message; - this.unit = unit; - this.voucherGenerator = voucherGenerator; + VoucherType(VoucherTypeInfo voucherTypeInfo) { + this.number = voucherTypeInfo.getNumber(); + this.name = voucherTypeInfo.getName(); + this.message = voucherTypeInfo.getMessage(); + this.unit = voucherTypeInfo.getUnit(); + this.voucherGenerator = voucherTypeInfo.getVoucherGenerator(); } public static VoucherType from(String voucherTypeNumber) { diff --git a/src/main/java/com/devcourse/voucherapp/entity/VoucherTypeInfo.java b/src/main/java/com/devcourse/voucherapp/entity/VoucherTypeInfo.java new file mode 100644 index 0000000000..afcc61b127 --- /dev/null +++ b/src/main/java/com/devcourse/voucherapp/entity/VoucherTypeInfo.java @@ -0,0 +1,17 @@ +package com.devcourse.voucherapp.entity; + +import com.devcourse.voucherapp.entity.voucher.Voucher; +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class VoucherTypeInfo { + + private final String number; + private final String name; + private final String message; + private final String unit; + private final TriFunction voucherGenerator; +} From a006a6daf3ece2be0106e53a10ec308dabbe054c Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 12 Jul 2023 16:43:05 +0900 Subject: [PATCH 18/19] =?UTF-8?q?build:=20Apache=20Commons=20Lang=203.12.0?= =?UTF-8?q?=20=EC=9D=98=EC=A1=B4=EC=84=B1=20=EC=B6=94=EA=B0=80=20=EB=B0=8F?= =?UTF-8?q?=20TriFunction=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 1 + .../java/com/devcourse/voucherapp/entity/TriFunction.java | 7 ------- .../java/com/devcourse/voucherapp/entity/VoucherType.java | 1 + .../com/devcourse/voucherapp/entity/VoucherTypeInfo.java | 1 + 4 files changed, 3 insertions(+), 7 deletions(-) delete mode 100644 src/main/java/com/devcourse/voucherapp/entity/TriFunction.java diff --git a/build.gradle b/build.gradle index 7dc9b5f9ea..bbcc557d80 100644 --- a/build.gradle +++ b/build.gradle @@ -18,6 +18,7 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-jdbc' + implementation 'org.apache.commons:commons-lang3:3.12.0' testImplementation 'org.springframework.boot:spring-boot-starter-test' runtimeOnly 'com.h2database:h2' diff --git a/src/main/java/com/devcourse/voucherapp/entity/TriFunction.java b/src/main/java/com/devcourse/voucherapp/entity/TriFunction.java deleted file mode 100644 index 8ba435aa8d..0000000000 --- a/src/main/java/com/devcourse/voucherapp/entity/TriFunction.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.devcourse.voucherapp.entity; - -@FunctionalInterface -public interface TriFunction { - - R apply(T t, U u, V v); -} diff --git a/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java b/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java index 645d59a905..477f2ede52 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java +++ b/src/main/java/com/devcourse/voucherapp/entity/VoucherType.java @@ -13,6 +13,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; import lombok.Getter; +import org.apache.commons.lang3.function.TriFunction; @Getter public enum VoucherType { diff --git a/src/main/java/com/devcourse/voucherapp/entity/VoucherTypeInfo.java b/src/main/java/com/devcourse/voucherapp/entity/VoucherTypeInfo.java index afcc61b127..488c500bfd 100644 --- a/src/main/java/com/devcourse/voucherapp/entity/VoucherTypeInfo.java +++ b/src/main/java/com/devcourse/voucherapp/entity/VoucherTypeInfo.java @@ -4,6 +4,7 @@ import java.util.UUID; import lombok.Builder; import lombok.Getter; +import org.apache.commons.lang3.function.TriFunction; @Builder @Getter From 9bf6ed80991c23a3e58b2dfe3266ad6d03c3db08 Mon Sep 17 00:00:00 2001 From: kylekim2123 Date: Wed, 12 Jul 2023 17:44:30 +0900 Subject: [PATCH 19/19] =?UTF-8?q?refactor:=20=EC=83=81=EC=88=98=20?= =?UTF-8?q?=EB=8C=80=EC=8B=A0=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=A5=BC=20?= =?UTF-8?q?=ED=86=B5=ED=95=B4=20=EB=A1=9C=EC=A7=81=EC=97=90=20=EC=9D=98?= =?UTF-8?q?=EB=AF=B8=20=EB=B6=80=EC=97=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../devcourse/voucherapp/service/VoucherService.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java index a0caa2d627..370fdd6409 100644 --- a/src/main/java/com/devcourse/voucherapp/service/VoucherService.java +++ b/src/main/java/com/devcourse/voucherapp/service/VoucherService.java @@ -16,8 +16,6 @@ @RequiredArgsConstructor public class VoucherService { - private static final int ZERO = 0; - private final VoucherRepository voucherRepository; public VoucherResponseDto create(VoucherCreateRequestDto request) { @@ -50,10 +48,14 @@ public VoucherResponseDto update(VoucherUpdateRequestDto request) { } public void deleteById(String id) { - int deletionCounts = voucherRepository.deleteById(id); + int deleteCounts = voucherRepository.deleteById(id); - if (deletionCounts == ZERO) { + if (isEmptyDeleteResult(deleteCounts)) { throw new NotFoundVoucherException(id); } } + + private boolean isEmptyDeleteResult(int deleteCounts) { + return deleteCounts == 0; + } }