diff --git a/.gitignore b/.gitignore index dcf5515b50..8ba760f713 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 .idea +file # User-specific stuff .idea/**/workspace.xml @@ -169,4 +170,4 @@ gradle-app.setting # Java heap dump *.hprof -# End of https://www.toptal.com/developers/gitignore/api/java,intellij,gradle \ No newline at end of file +# End of https://www.toptal.com/developers/gitignore/api/java,intellij,gradle diff --git a/README.md b/README.md index d6e844dee2..210ff572f6 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,65 @@ # SpringBoot Basic Weekly Mission + ## ๐Ÿ“Œ ๊ณผ์ œ ์„ค๋ช… ### **๋ฐ”์šฐ์ฒ˜ ๊ด€๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜** + +### 1์ฃผ์ฐจ ๋ฏธ์…˜ + - **๊ธฐ๋ณธ** -- [x] SpringBoot CLI๋ฅผ ์ด์šฉํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. +- [x] SpringBoot CLI๋ฅผ ์ด์šฉํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. - [x] CLI๋กœ ์ œ์ž‘ํ•œ๋‹ค. - [x] ์Šคํ”„๋ง ๋ถ€ํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋งŒ๋“ ๋‹ค. - [x] ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ง€์› ๊ฐ€๋Šฅํ•œ ๋ช…๋ น์–ด๋ฅผ ์•Œ๋ ค์ค€๋‹ค. + ``` shell === Voucher Program === Type exit to exit the program. Type create to create a new voucher. Type list to list all vouchers. ``` + - [x] create, list ์ปค๋งจ๋“œ๋ฅผ ์ง€์›ํ•œ๋‹ค. - - [x] create ์ปค๋งจ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ”์šฐ์ฒ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.(FixedAmountVoucher, PercentDiscountVoucher) - - [x] list ์ปค๋งจ๋“œ๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ๋ฐ”์šฐ์ฒ˜๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. - - [x] ๋ฐ”์šฐ์ฒ˜ ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๊ด€๋ฆฌํ•œ๋‹ค. + - [x] create ์ปค๋งจ๋“œ๋ฅผ ํ†ตํ•ด ๋ฐ”์šฐ์ฒ˜๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.(FixedAmountVoucher, PercentDiscountVoucher) + - [x] list ์ปค๋งจ๋“œ๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ๋ฐ”์šฐ์ฒ˜๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค. + - [x] ๋ฐ”์šฐ์ฒ˜ ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๊ด€๋ฆฌํ•œ๋‹ค. - [x] ์ ์ ˆํ•œ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๊ณ  logback ์„ค์ •์„ํ•ด์„œ ์—๋Ÿฌ๋Š” ํŒŒ์ผ๋กœ ๊ธฐ๋ก๋œ๋‹ค. - [x] ์‹คํ–‰๊ฐ€๋Šฅํ•œ jar ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. - **์‹ฌํ™”** - [x] ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ฐ€ ์•„๋‹Œ ํŒŒ์ผ๋กœ ๊ด€๋ฆฌ๊ฐ€ ๋˜๋Š” Repository ์ƒ์„ฑ - - [x] ๊ธฐ์กด ๋ฉ”๋ชจ๋ฆฌ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๋Š” ์ง€์šฐ์ง€ ๋ง๊ณ  ๊ฐœ๋ฐœ ํ”„๋กœํŒŒ์ผ์—์„œ๋งŒ ๋™์ž‘ํ•˜๊ฒŒ ์„ค์ • + - [x] ๊ธฐ์กด ๋ฉ”๋ชจ๋ฆฌ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ๋Š” ์ง€์šฐ์ง€ ๋ง๊ณ  ๊ฐœ๋ฐœ ํ”„๋กœํŒŒ์ผ์—์„œ๋งŒ ๋™์ž‘ํ•˜๊ฒŒ ์„ค์ • - [x] ๊ณ ๊ฐ ๋ธ”๋ž™ ๋ฆฌ์ŠคํŠธ ๋ช…๋‹จ์„ ์ž‘์„ฑํ•œ๋‹ค. - - [x] customer_blacklist.csv ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•ด๋‹น ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ๊ณ  ๋ธ”๋ž™ ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐํšŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. -- [x] YAML ํ”„๋กœํผํ‹ฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์–ด๋–ค ์„ค์ •์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•ด๋ณธ๋‹ค. + - [x] customer_blacklist.csv ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์Šคํ”„๋ง ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•ด๋‹น ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์žˆ๊ณ  ๋ธ”๋ž™ ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐํšŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. +- [x] YAML ํ”„๋กœํผํ‹ฐ๋ฅผ ๋งŒ๋“ค๊ณ  ์–ด๋–ค ์„ค์ •์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•ด๋ณธ๋‹ค. + +### 2์ฃผ์ฐจ ๋ฏธ์…˜ + +**๊ธฐ๋ณธ** + +**2-1** + +- [x] ๋ฐ”์šฐ์ฒ˜ ๊ด€๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์„ธ์š”. + - [x] ๊ฐ€๋Šฅํ•œ ๋งŽ์€ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ด๋ณด์„ธ์š”. + - [x] ์—ฃ์ง€ ์ผ€์ด์Šค(์˜ˆ์™ธ ์ผ€์ด์Šค)๋ฅผ ๊ณ ๋ คํ•ด์„œ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.. + +**2-2** + +- [x] ๋ฐ”์šฐ์ฒ˜ ๊ด€๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋„ ๊ณผ์ •์—์„œ ๋‹ค๋ฃจ์—ˆ๋˜ ๊ณ ๊ฐ์„ ์ ์šฉํ•ด๋ณด์„ธ์š”. + - [x] customers ํ…Œ์ด๋ธ” ์ •์˜ ๋ฐ ์ถ”๊ฐ€ + - [x] CustomerRepository ์ถ”๊ฐ€ ๋ฐ JdbcTemplate์„ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„ + +**2-3** + +- [x] (1์ฃผ์ฐจ์—” ํŒŒ์ผ๋กœ ๊ด€๋ฆฌํ•˜๊ฒŒ ํ–ˆ๋‹ค.) ๋ฐ”์šฐ์ฒ˜ ์ •๋ณด๋ฅผ DB๋กœ ๊ด€๋ฆฌํ•ด๋ณด์„ธ์š”. + - [x] ๋ฐ”์šฐ์ฒ˜์— ์—”ํ„ฐํ‹ฐ์— ํ•ด๋‹นํ•˜๋Š” vouchers ํ…Œ์ด๋ธ”์„ ํ•œ๋ฒˆ ์ •์˜ํ•ด๋ณด์„ธ์š”. + - [x] ๋ฐ”์šฐ์ฒ˜ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”. (JdbcTemplate์„ ์‚ฌ์šฉํ•ด์„œ ๊ตฌํ˜„) + - [x] ๊ธฐ์กด์˜ ํŒŒ์ผ์—์„œ ๋ฐ”์šฐ์ฒ˜๋ฅผ ๊ด€๋ฆฌํ•œ ๊ฒƒ์„ vouchers ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด์„œ CRUD๊ฐ€ ๋˜๊ฒŒ ํ•ด๋ณด์„ธ์š”. + +**์‹ฌํ™”** + +**2-4** +- [ ] ํŠน์ • ๊ณ ๊ฐ์—๊ฒŒ ๋ฐ”์šฐ์ฒ˜๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- [ ] ๊ณ ๊ฐ์ด ์–ด๋–ค ๋ฐ”์šฐ์ฒ˜๋ฅผ ๋ณด์œ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- [ ] ๊ณ ๊ฐ์ด ๋ณด์œ ํ•œ ๋ฐ”์šฐ์ฒ˜๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +- [ ] ํŠน์ • ๋ฐ”์šฐ์ฒ˜๋ฅผ ๋ณด์œ ํ•œ ๊ณ ๊ฐ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. diff --git a/build.gradle b/build.gradle index 775a10ebfc..e8d564472a 100644 --- a/build.gradle +++ b/build.gradle @@ -1,31 +1,34 @@ plugins { - id 'java' - id 'org.springframework.boot' version '3.1.0' - id 'io.spring.dependency-management' version '1.1.0' + id 'java' + id 'org.springframework.boot' version '3.1.0' + id 'io.spring.dependency-management' version '1.1.0' } group = 'com.programmers' version = '0.0.1-SNAPSHOT' java { - sourceCompatibility = '17' + sourceCompatibility = '17' } repositories { - mavenCentral() + mavenCentral() } dependencies { - implementation 'org.springframework.boot:spring-boot-starter' - testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'org.springframework.boot:spring-boot-starter' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + implementation 'org.springframework.boot:spring-boot-starter-jdbc' - compileOnly 'org.projectlombok:lombok:1.18.28' - annotationProcessor 'org.projectlombok:lombok:1.18.28' + runtimeOnly 'com.h2database:h2' - testCompileOnly 'org.projectlombok:lombok:1.18.28' - testAnnotationProcessor 'org.projectlombok:lombok:1.18.28' + compileOnly 'org.projectlombok:lombok:1.18.28' + annotationProcessor 'org.projectlombok:lombok:1.18.28' + + testCompileOnly 'org.projectlombok:lombok:1.18.28' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.28' } tasks.named('test') { - useJUnitPlatform() + useJUnitPlatform() } diff --git a/file/customer_blacklist.csv b/file/customer_blacklist.csv deleted file mode 100644 index 0c3bb1dfec..0000000000 --- a/file/customer_blacklist.csv +++ /dev/null @@ -1,3 +0,0 @@ -1927f6b6-55bf-4f1f-d6e2-043198833df7,blacklist -80f4ef40-1a44-4ef2-9c8d-714ff0c8353e,blacklist -202e65fe-bdd2-4f0b-db43-307d5c24ad4a,blacklist \ No newline at end of file diff --git a/file/voucher_list.csv b/file/voucher_list.csv deleted file mode 100644 index d66e73bcc4..0000000000 --- a/file/voucher_list.csv +++ /dev/null @@ -1,11 +0,0 @@ -16100e8f-08d1-457b-a04a-38f774f54f1b,3000,fixed -ad85b739-0915-4f6f-ad3e-8e5f85dd0a4d,30,percent -9d481cf6-1368-4ab8-9388-db7f77aeb34b,300,fixed -5522a620-b4c3-4db6-a6fd-8cfa6dbc1b2c,3000,fixed -ba3e634e-2315-450a-9f86-f6e460404b7f,300,fixed -e0d973da-7643-426a-8dd5-caa08f98fd1c,3000,fixed -5223e534-faed-4b57-ab1a-15830436a70e,2123,fixed -55a2f939-62d4-44a6-96f4-96a0fbdc612b,3000,fixed -a647cad0-5f70-4863-9baf-41822a6ec868,3000,fixed -0c83d929-ab57-46c9-b481-537f879bfaf0,3000,fixed -d7d3e8c5-98cd-4a80-b912-b332a7716709,30,percent diff --git a/src/main/java/com/programmers/springweekly/ConsoleApplication.java b/src/main/java/com/programmers/springweekly/ConsoleApplication.java index cb0580d828..3ef26e1aea 100644 --- a/src/main/java/com/programmers/springweekly/ConsoleApplication.java +++ b/src/main/java/com/programmers/springweekly/ConsoleApplication.java @@ -1,26 +1,21 @@ package com.programmers.springweekly; -import com.programmers.springweekly.controller.CustomerController; -import com.programmers.springweekly.controller.VoucherController; import com.programmers.springweekly.domain.ProgramMenu; -import com.programmers.springweekly.domain.customer.Customer; -import com.programmers.springweekly.domain.voucher.Voucher; -import com.programmers.springweekly.domain.voucher.VoucherType; import com.programmers.springweekly.view.Console; -import java.util.Map; -import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.CommandLineRunner; +import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Component; @Component @RequiredArgsConstructor @Slf4j +@Profile("!test") public class ConsoleApplication implements CommandLineRunner { - private final CustomerController customerController; - private final VoucherController voucherController; + private final ConsoleVoucher consoleVoucher; + private final ConsoleCustomer consoleCustomer; private final Console console; private boolean running = true; @@ -30,19 +25,17 @@ public void run(String... args) { while (running) { console.outputProgramGuide(); try { - ProgramMenu selectMenu = ProgramMenu.findProgramMenu(console.inputMessage()); + ProgramMenu selectMenu = ProgramMenu.from(console.inputMessage()); switch (selectMenu) { - case CREATE -> createVoucher(); - case LIST -> getVoucherList(); + case CUSTOMER -> consoleCustomer.menu(); + case VOUCHER -> consoleVoucher.menu(); case EXIT -> { console.outputExitMessage(); running = false; } - case BLACKLIST -> getBlackList(); default -> throw new IllegalArgumentException("Input :" + selectMenu + "The type you are looking for is not found."); } - } catch (IllegalArgumentException e) { log.error("์ž˜๋ชป๋œ ์ž…๋ ฅ๊ฐ’ ์ž…๋‹ˆ๋‹ค -> " + e.getMessage()); } catch (Exception e) { @@ -51,36 +44,4 @@ public void run(String... args) { } } - private void createVoucher() { - console.outputSelectCreateVoucherGuide(); - VoucherType voucherType = VoucherType.findVoucherMenu(console.inputMessage()); - - console.outputDiscountGuide(); - String inputNumber = console.inputMessage(); - log.info("user input: {} ", inputNumber); - - voucherController.createVoucher(voucherType, inputNumber); - } - - private void getVoucherList() { - Map voucherMap = voucherController.getVoucherList(); - - if (voucherMap.isEmpty()) { - console.outputErrorMessage("No vouchers saved"); - return; - } - - console.outputGetVoucherAll(voucherMap); - } - - private void getBlackList() { - Map customerMap = customerController.getBlackList(); - - if (customerMap.isEmpty()) { - console.outputErrorMessage("There are no saved blacklists."); - return; - } - - console.outputGetCustomerBlackList(customerMap); - } } diff --git a/src/main/java/com/programmers/springweekly/ConsoleCustomer.java b/src/main/java/com/programmers/springweekly/ConsoleCustomer.java new file mode 100644 index 0000000000..a8615e66f4 --- /dev/null +++ b/src/main/java/com/programmers/springweekly/ConsoleCustomer.java @@ -0,0 +1,82 @@ +package com.programmers.springweekly; + +import com.programmers.springweekly.controller.CustomerController; +import com.programmers.springweekly.domain.CustomerMenu; +import com.programmers.springweekly.dto.customer.request.CustomerUpdateRequest; +import com.programmers.springweekly.dto.customer.response.CustomerListResponse; +import com.programmers.springweekly.view.Console; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +@Component +@RequiredArgsConstructor +public class ConsoleCustomer { + + private final CustomerController customerController; + private final Console console; + + public void menu() { + console.outputCustomerMenuGuide(); + CustomerMenu customerMenu = CustomerMenu.from(console.inputMessage()); + + switch (customerMenu) { + case CREATE -> createCustomer(); + case UPDATE -> updateCustomer(); + case DELETE -> deleteCustomer(); + case SELECT -> selectCustomer(); + case BLACKLIST -> getBlackList(); + default -> throw new IllegalArgumentException("Input :" + customerMenu + "์ฐพ์œผ์‹œ๋Š” ๊ณ ๊ฐ ๋ฉ”๋‰ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); + } + } + + private void selectCustomer() { + CustomerListResponse customerListResponse = customerController.findAll(); + + if (CollectionUtils.isEmpty(customerListResponse.getCustomerList())) { + console.outputErrorMessage("๊ณ ๊ฐ์ด ์ €์žฅ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค."); + return; + } + + console.outputGetCustomerList(customerListResponse); + } + + private void deleteCustomer() { + console.outputUUIDGuide(); + UUID customerId = console.inputUUID(); + + customerController.deleteById(customerId); + console.outputCompleteGuide(); + } + + private void updateCustomer() { + console.outputUUIDGuide(); + UUID customerId = console.inputUUID(); + + console.outputCustomerUpdateGuide(); + CustomerUpdateRequest customerUpdateRequest = console.inputCustomerUpdate(customerId); + + customerController.update(customerUpdateRequest); + console.outputCompleteGuide(); + } + + private void createCustomer() { + console.outputCustomerCreateGuide(); + + customerController.save(console.inputCustomerCreate()); + console.outputCompleteGuide(); + } + + private void getBlackList() { + CustomerListResponse customerBlacklistResponse = customerController.getBlackList(); + + if (CollectionUtils.isEmpty(customerBlacklistResponse.getCustomerList())) { + console.outputErrorMessage("๋ธ”๋ž™ ๋ฆฌ์ŠคํŠธ์ธ ๊ณ ๊ฐ์ด ์—†์Šต๋‹ˆ๋‹ค."); + return; + } + + console.outputGetCustomerList(customerBlacklistResponse); + } + +} diff --git a/src/main/java/com/programmers/springweekly/ConsoleVoucher.java b/src/main/java/com/programmers/springweekly/ConsoleVoucher.java new file mode 100644 index 0000000000..0eca4e7619 --- /dev/null +++ b/src/main/java/com/programmers/springweekly/ConsoleVoucher.java @@ -0,0 +1,76 @@ +package com.programmers.springweekly; + +import com.programmers.springweekly.controller.VoucherController; +import com.programmers.springweekly.domain.VoucherMenu; +import com.programmers.springweekly.domain.voucher.VoucherType; +import com.programmers.springweekly.dto.voucher.request.VoucherCreateRequest; +import com.programmers.springweekly.dto.voucher.request.VoucherUpdateRequest; +import com.programmers.springweekly.dto.voucher.response.VoucherListResponse; +import com.programmers.springweekly.view.Console; +import java.util.UUID; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +@Component +@RequiredArgsConstructor +public class ConsoleVoucher { + + private final VoucherController voucherController; + private final Console console; + + public void menu() { + console.outputVoucherMenuGuide(); + VoucherMenu voucherMenu = VoucherMenu.from(console.inputMessage()); + + switch (voucherMenu) { + case CREATE -> createVoucher(); + case UPDATE -> updateVoucher(); + case DELETE -> deleteVoucher(); + case SELECT -> selectVoucher(); + default -> throw new IllegalArgumentException("Input :" + voucherMenu + "์ฐพ์œผ์‹œ๋Š” ๋ฐ”์šฐ์ฒ˜ ๋ฉ”๋‰ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); + } + } + + private void createVoucher() { + console.outputSelectCreateVoucherGuide(); + VoucherType voucherType = VoucherType.from(console.inputMessage()); + + console.outputDiscountGuide(); + VoucherCreateRequest voucherCreateRequest = console.inputVoucherCreate(voucherType); + + voucherController.save(voucherCreateRequest); + console.outputCompleteGuide(); + } + + private void updateVoucher() { + console.outputUUIDGuide(); + UUID voucherId = console.inputUUID(); + + console.outputVoucherUpdateGuide(); + VoucherUpdateRequest voucherUpdateRequest = console.inputVoucherUpdate(voucherId); + + voucherController.update(voucherUpdateRequest); + console.outputCompleteGuide(); + } + + private void deleteVoucher() { + console.outputUUIDGuide(); + UUID voucherId = console.inputUUID(); + + voucherController.deleteById(voucherId); + console.outputCompleteGuide(); + } + + private void selectVoucher() { + VoucherListResponse voucherListResponse = voucherController.findAll(); + + if (CollectionUtils.isEmpty(voucherListResponse.getVoucherList())) { + console.outputErrorMessage("์ €์žฅ๋œ ๋ฐ”์šฐ์ฒ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); + return; + } + + console.outputGetVoucherAll(voucherListResponse); + } + +} diff --git a/src/main/java/com/programmers/springweekly/VoucherProgramApplication.java b/src/main/java/com/programmers/springweekly/VoucherProgramApplication.java index 1a643201c8..dd9394b4a5 100644 --- a/src/main/java/com/programmers/springweekly/VoucherProgramApplication.java +++ b/src/main/java/com/programmers/springweekly/VoucherProgramApplication.java @@ -9,5 +9,5 @@ public class VoucherProgramApplication { public static void main(String[] args) { SpringApplication.run(VoucherProgramApplication.class, args); } + } - \ No newline at end of file diff --git a/src/main/java/com/programmers/springweekly/controller/CustomerController.java b/src/main/java/com/programmers/springweekly/controller/CustomerController.java index be5ea527d6..40005b4545 100644 --- a/src/main/java/com/programmers/springweekly/controller/CustomerController.java +++ b/src/main/java/com/programmers/springweekly/controller/CustomerController.java @@ -1,19 +1,46 @@ package com.programmers.springweekly.controller; -import com.programmers.springweekly.domain.customer.Customer; +import com.programmers.springweekly.dto.customer.request.CustomerCreateRequest; +import com.programmers.springweekly.dto.customer.request.CustomerUpdateRequest; +import com.programmers.springweekly.dto.customer.response.CustomerListResponse; +import com.programmers.springweekly.dto.customer.response.CustomerResponse; import com.programmers.springweekly.service.CustomerService; -import java.util.Map; import java.util.UUID; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; @Controller -@AllArgsConstructor +@RequiredArgsConstructor public class CustomerController { private final CustomerService customerService; - public Map getBlackList() { + public void save(CustomerCreateRequest customerCreateRequest) { + customerService.save(customerCreateRequest); + } + + public void update(CustomerUpdateRequest customerUpdateRequest) { + customerService.update(customerUpdateRequest); + } + + public CustomerResponse findById(UUID customerId) { + return customerService.findById(customerId); + } + + public CustomerListResponse findAll() { + return customerService.findAll(); + } + + public CustomerListResponse getBlackList() { return customerService.getBlackList(); } + + public void deleteById(UUID customerId) { + customerService.deleteById(customerId); + } + + public void deleteAll() { + customerService.deleteAll(); + } + } diff --git a/src/main/java/com/programmers/springweekly/controller/VoucherController.java b/src/main/java/com/programmers/springweekly/controller/VoucherController.java index 81a3b4761c..6341f2a631 100644 --- a/src/main/java/com/programmers/springweekly/controller/VoucherController.java +++ b/src/main/java/com/programmers/springweekly/controller/VoucherController.java @@ -1,26 +1,42 @@ package com.programmers.springweekly.controller; -import com.programmers.springweekly.domain.voucher.Voucher; -import com.programmers.springweekly.domain.voucher.VoucherType; +import com.programmers.springweekly.dto.voucher.request.VoucherCreateRequest; +import com.programmers.springweekly.dto.voucher.request.VoucherUpdateRequest; +import com.programmers.springweekly.dto.voucher.response.VoucherListResponse; +import com.programmers.springweekly.dto.voucher.response.VoucherResponse; import com.programmers.springweekly.service.VoucherService; -import java.util.Map; import java.util.UUID; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Controller; @Controller -@AllArgsConstructor -@Slf4j +@RequiredArgsConstructor public class VoucherController { private final VoucherService voucherService; - public void createVoucher(VoucherType voucherType, String inputNumber) { - voucherService.saveVoucher(voucherType, inputNumber); + public void save(VoucherCreateRequest voucherCreateRequest) { + voucherService.save(voucherCreateRequest); } - public Map getVoucherList() { - return voucherService.findVoucherAll(); + public void update(VoucherUpdateRequest voucherUpdateRequest) { + voucherService.update(voucherUpdateRequest); } + + public VoucherResponse findById(UUID voucherId) { + return voucherService.findById(voucherId); + } + + public VoucherListResponse findAll() { + return voucherService.findAll(); + } + + public void deleteById(UUID voucherId) { + voucherService.deleteById(voucherId); + } + + public void deleteAll() { + voucherService.deleteAll(); + } + } diff --git a/src/main/java/com/programmers/springweekly/docs/specification.md b/src/main/java/com/programmers/springweekly/docs/specification.md index 70c5d208da..0a959be759 100644 --- a/src/main/java/com/programmers/springweekly/docs/specification.md +++ b/src/main/java/com/programmers/springweekly/docs/specification.md @@ -1,16 +1,14 @@ ## ๐Ÿ“‹ ์š”๊ตฌ ์‚ฌํ•ญ ๋ถ„์„ ๋ฐ ๊ตฌํ˜„ ๋‚ด์šฉ -### ํด๋ž˜์Šค ๋‹ค์ด์–ด๊ทธ๋žจ +## **Weekly1 - Basic + intensification** -**Weekly1 - Basic + intensification** +### ์ฝ˜์†” -![แ„‡แ…กแ„‹แ…ฎแ„Žแ…ฅ แ„‘แ…ณแ„…แ…ฉแ„€แ…ณแ„…แ…ขแ†ท แ„แ…ณแ†ฏแ„…แ…ขแ„‰แ…ณ แ„ƒแ…กแ„‹แ…ตแ„‹แ…ฅแ„€แ…ณแ„…แ…ขแ†ท](https://github.com/Hchanghyeon/springboot-basic/assets/92444744/601d6710-d883-4576-8696-be9a3310d0b7) - -### ์ฝ˜์†” > - ๋ฐ”์šฐ์ฒ˜ ํ”„๋กœ๊ทธ๋žจ์˜ ์ž…๋ ฅ, ์ถœ๋ ฅ์„ ํ•œ๋‹ค. -> - GUI๋กœ ๊ฐœ์„  ๋  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜์—ฌ Input๊ณผ Output์„ interface๋กœ ์ƒ์„ฑ - -- **Input** +> - GUI๋กœ ๊ฐœ์„  ๋  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์„ ๊ณ ๋ คํ•˜์—ฌ Input๊ณผ Output์„ interface๋กœ ์ƒ์„ฑ + +- **Input** + ``` markdown menu - exit, create, list, blacklist์— ๋Œ€ํ•œ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค. @@ -19,8 +17,9 @@ voucher - ๊ณ ์ •๋œ ๊ธˆ์•ก ๋ฐ”์šฐ์ฒ˜, ํผ์„ผํŠธ ๋ฐ”์šฐ์ฒ˜ ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์ƒ์„ฑํ• ์ง€์— ๋Œ€ํ•œ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค. - ์–ผ๋งˆ๋ฅผ ํ• ์ธ ํ•ด์ค„ ๊ฒƒ์ธ์ง€์— ๋Œ€ํ•œ ์ž…๋ ฅ์„ ๋ฐ›๋Š”๋‹ค. ``` - -- **output** + +- **output** + ``` markdown menu - exit, create, list์— ๋Œ€ํ•œ ์•ˆ๋‚ด ๋ฌธ๊ตฌ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. @@ -36,57 +35,147 @@ list blacklist - ํŒŒ์ผ์— ์ €์žฅ๋œ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ณ ๊ฐ ๋ช…๋‹จ์„ ์ถœ๋ ฅํ•œ๋‹ค. ``` - -### ๋ฐ”์šฐ์ฒ˜ + +### ๋ฐ”์šฐ์ฒ˜ + > - ๋ฐ”์šฐ์ฒ˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. > - ๋ฐ”์šฐ์ฒ˜๋ฅผ ์ €์žฅํ•œ๋‹ค. > - ์ €์žฅ๋œ ๋ฐ”์šฐ์ฒ˜๋ฅผ ์กฐํšŒํ•œ๋‹ค. - -- **๋ฐ”์šฐ์ฒ˜ ์ƒ์„ฑ** + +- **๋ฐ”์šฐ์ฒ˜ ์ƒ์„ฑ** + ``` markdown - ์ž…๋ ฅ๋ฐ›์€ ๋ฐ”์šฐ์ฒ˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ์„œ ๋ฐ”์šฐ์ฒ˜๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ๊ณ ์ •๋œ ๊ธˆ์•ก ๋˜๋Š” ํผ์„ผํŠธ๋ฅผ ๋ฐ›์•„์„œ ๋ฐ”์šฐ์ฒ˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ``` - -- **๋ฐ”์šฐ์ฒ˜ ์ €์žฅ** + +- **๋ฐ”์šฐ์ฒ˜ ์ €์žฅ** + ``` markdown - ์ƒ์„ฑ๋œ ๋ฐ”์šฐ์ฒ˜๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•œ๋‹ค. (profile์ด local์ผ ๋•Œ) - ์ƒ์„ฑ๋œ ๋ฐ”์šฐ์ฒ˜๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅํ•œ๋‹ค. (profile์ด dev์ผ ๋•Œ) ``` - -- **๋ฐ”์šฐ์ฒ˜ ์กฐํšŒ** + +- **๋ฐ”์šฐ์ฒ˜ ์กฐํšŒ** + ``` markdown - ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ฐ”์šฐ์ฒ˜๋“ค์„ ์กฐํšŒํ•œ๋‹ค. - ํŒŒ์ผ์— ์ €์žฅ๋œ ๋ฐ”์šฐ์ฒ˜๋“ค์„ ์กฐํšŒํ•œ๋‹ค. ``` ### ๊ฒ€์ฆ + > - ์ž…๋ ฅ๊ฐ’์— ๋Œ€ํ•œ ๊ฒ€์ฆ์„ ํ•œ๋‹ค. - **์ƒ์„ฑ๋˜๋Š” ๋ฐ”์šฐ์ฒ˜ ์ข…๋ฅ˜์— ๋Œ€ํ•œ ์ž…๋ ฅ ๊ฐ’** + ``` markdown - ์ž…๋ ฅ ๊ฐ’์ด ๋ฌธ์ž์—ด์ธ์ง€ ์ฒดํฌํ•œ๋‹ค. - ํผ์„ผํŠธ ๋ฐ”์šฐ์ฒ˜์ผ ๊ฒฝ์šฐ 1๊ณผ 100์‚ฌ์ด์˜ ๊ฐ’์„ ์ž…๋ ฅํ–ˆ๋Š”์ง€ ์ฒดํฌํ•œ๋‹ค. ``` ### ๋กœ๊น… + > - ๋กœ๊ทธ ๋ ˆ๋ฒจ์— ๋”ฐ๋ผ ๋กœ๊ทธ๋ฅผ ๋‚จ๊ธด๋‹ค. - **Error** + ``` markdown - Error๋ ˆ๋ฒจ์€ ํŒŒ์ผ๋กœ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•œ๋‹ค. ``` - **Info ~ Error** + ``` markdown - Info๋ถ€ํ„ฐ Error๋ ˆ๋ฒจ์€ ์ฝ˜์†”์— ๋กœ๊ทธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ``` ### ๊ณ ๊ฐ + > - ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์— ์ €์žฅ๋œ ๊ณ ๊ฐ์„ ์กฐํšŒํ•˜๋Š” ๋ถ€๋ถ„ ``` markdown - ํŒŒ์ผ์— ์ €์žฅ๋œ ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ณ ๊ฐ ๋ช…๋‹จ์„ ์กฐํšŒํ•œ๋‹ค. ``` +## **Weekly2 - Basic** + +### 2-1 ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ + +### Domain + +**VoucherTest** + +- ๊ณ ์ • ํ• ์ธ ๋ฐ”์šฐ์ฒ˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. +- ๊ณ ์ • ํ• ์ธ์„ ์ง„ํ–‰ํ•œ๋‹ค. +- ํผ์„ผํŠธ ํ• ์ธ ๋ฐ”์šฐ์ฒ˜๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. +- ํผ์„ผํŠธ ํ• ์ธ์„ ์ง„ํ–‰ํ•œ๋‹ค. +- ๊ณ ์ • ํ• ์ธ ๋ฐ”์šฐ์ฒ˜๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ž…๋ ฅ ๊ฐ’์ด ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. +- ํผ์„ผํŠธ ํ• ์ธ ๋ฐ”์šฐ์ฒ˜๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ž…๋ ฅ ๊ฐ’์ด ์ˆซ์ž๊ฐ€ ์•„๋‹ˆ๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. +- ํผ์„ผํŠธ ํ• ์ธ ๋ฐ”์šฐ์ฒ˜๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์ž…๋ ฅ ๊ฐ’์ด ๋ฒ”์œ„ ๋‚ด ์ˆซ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. + +**CustomerTest** + +- ๊ณ ๊ฐ์„ ์ƒ์„ฑํ•œ๋‹ค. + +**EnumTest** + +- ํ”„๋กœ๊ทธ๋žจ ๋ฉ”๋‰ด์— ์—†๋Š” ๋ฉ”๋‰ด๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. +- ๋ฐ”์šฐ์ฒ˜ ํƒ€์ž…์— ์—†๋Š” ํƒ€์ž…์ด ์ž…๋ ฅ๋˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. +- ๊ณ ๊ฐ ํƒ€์ž…์— ์—†๋Š” ํƒ€์ž…์ด ์ž…๋ ฅ๋˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค. + +
+ +### Repository + +**FileVoucherRepository** + +- ํŒŒ์ผ ์ €์žฅ์†Œ์— ๊ณ ์ • ํ• ์ธ ๋ฐ”์šฐ์ฒ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ €์žฅ๋œ๋‹ค. +- ํŒŒ์ผ ์ €์žฅ์†Œ์— ํผ์„ผํŠธ ํ• ์ธ ๋ฐ”์šฐ์ฒ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ €์žฅ๋œ๋‹ค. + +**MemoryVoucherRepository** + +- ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ์†Œ์— ๊ณ ์ • ํ• ์ธ ๋ฐ”์šฐ์ฒ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ €์žฅ๋œ๋‹ค. +- ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ์†Œ์— ํผ์„ผํŠธ ํ• ์ธ ๋ฐ”์šฐ์ฒ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ €์žฅ๋œ๋‹ค. +- ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ์†Œ์— ์—ฌ๋Ÿฌ ๋ฐ”์šฐ์ฒ˜๋ฅผ ๋“ฑ๋ก ํ–ˆ์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ๋ฐ”์šฐ์ฒ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. + +**FileCustomerRepository** + +- ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๋ช…๋‹จ์„ ์ •์ƒ์ ์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค. + +
+ +### 2-2 Customer CRUD ๊ธฐ๋Šฅ ๊ตฌํ˜„ + +### ์š”์•ฝ + +- Jdbc๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฝ˜์†”์—์„œ `๊ณ ๊ฐ์„ CRUD` ํ•  ์ˆ˜ ์žˆ๋„๋ก `Controller`, `Service`, `Repository`๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. +- 1์ฃผ์ฐจ์—์„œ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๋˜ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ **ํ˜„์žฌ๊นŒ์ง€ ๊ตฌํ˜„ ๋œ ๊ธฐ๋Šฅ๋“ค์— ๋Œ€ํ•ด ๋ชจ๋‘ ์ž‘์„ฑ**ํ–ˆ์Šต๋‹ˆ๋‹ค. + +### Customer + +- NamedParameterJdbcTemplate์„ ์ด์šฉ +- ๊ณ ๊ฐ ์ €์žฅ ๊ธฐ๋Šฅ(save) +- ๊ณ ๊ฐ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ(update) +- ๊ณ ๊ฐ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ(findById, findAll) +- ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ(getBlackList) +- ๊ณ ๊ฐ ์‚ญ์ œ ๊ธฐ๋Šฅ(deleteById, deleteAll) +- ๊ธฐ์กด์— ConsoleApplication์— ์žˆ์—ˆ๋˜ ๊ณ ๊ฐ๊ณผ ๋ฐ”์šฐ์ฒ˜๋ฅผ ๊ธฐ๋Šฅ์ด ๋Š˜์–ด๋‚จ์— ๋”ฐ๋ผ `ConsoleCustomer`์™€ `ConsoleVoucher`๋กœ ๋ถ„๋ฆฌ +- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ตฌํ˜„ + +
+ +### 2-3 Voucher CRUD ๊ธฐ๋Šฅ ๊ตฌํ˜„ + +### ์š”์•ฝ + +- Jdbc๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ฝ˜์†”์—์„œ `๋ฐ”์šฐ์ฒ˜๋ฅผ CRUD` ํ•  ์ˆ˜ ์žˆ๋„๋ก `Controller`, `Service`, `Repository`๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. +### Voucher +- NamedParameterJdbcTemplate์„ ์ด์šฉ +- ๋ฐ”์šฐ์ฒ˜ ์ €์žฅ ๊ธฐ๋Šฅ(save) +- ๋ฐ”์šฐ์ฒ˜ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ(update) +- ๋ฐ”์šฐ์ฒ˜ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ(findById, findAll) +- ๋ฐ”์šฐ์ฒ˜ ์‚ญ์ œ ๊ธฐ๋Šฅ(deleteById, deleteAll) +- ๋ ˆ์ด์–ด ๊ฐ„ ๋ฐ์ดํ„ฐ ์ด๋™์‹œ dto๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋„๋ก dto๊ฐ์ฒด ์ƒ์„ฑ +- ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ตฌํ˜„ diff --git a/src/main/java/com/programmers/springweekly/domain/CustomerMenu.java b/src/main/java/com/programmers/springweekly/domain/CustomerMenu.java new file mode 100644 index 0000000000..dd45e33622 --- /dev/null +++ b/src/main/java/com/programmers/springweekly/domain/CustomerMenu.java @@ -0,0 +1,18 @@ +package com.programmers.springweekly.domain; + +public enum CustomerMenu { + CREATE, + UPDATE, + DELETE, + SELECT, + BLACKLIST; + + public static CustomerMenu from(String type) { + try { + return valueOf(type.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Input: " + type + ", ์ฐพ์œผ์‹œ๋Š” ๊ณ ๊ฐ ๋ฉ”๋‰ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); + } + } + +} diff --git a/src/main/java/com/programmers/springweekly/domain/ProgramMenu.java b/src/main/java/com/programmers/springweekly/domain/ProgramMenu.java index cce62d51ec..045d28a315 100644 --- a/src/main/java/com/programmers/springweekly/domain/ProgramMenu.java +++ b/src/main/java/com/programmers/springweekly/domain/ProgramMenu.java @@ -2,15 +2,15 @@ public enum ProgramMenu { EXIT, - CREATE, - LIST, - BLACKLIST; + CUSTOMER, + VOUCHER; - public static ProgramMenu findProgramMenu(String type) { + public static ProgramMenu from(String type) { try { return valueOf(type.toUpperCase()); } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("Input: " + type + ", The type you are looking for is not found."); + throw new IllegalArgumentException("Input: " + type + ", ์ฐพ์œผ์‹œ๋Š” ํ”„๋กœ๊ทธ๋žจ ๋ฉ”๋‰ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); } } + } diff --git a/src/main/java/com/programmers/springweekly/domain/VoucherMenu.java b/src/main/java/com/programmers/springweekly/domain/VoucherMenu.java new file mode 100644 index 0000000000..9bcb1996ef --- /dev/null +++ b/src/main/java/com/programmers/springweekly/domain/VoucherMenu.java @@ -0,0 +1,17 @@ +package com.programmers.springweekly.domain; + +public enum VoucherMenu { + CREATE, + UPDATE, + DELETE, + SELECT; + + public static VoucherMenu from(String type) { + try { + return valueOf(type.toUpperCase()); + } catch (IllegalArgumentException e) { + throw new IllegalArgumentException("Input: " + type + ", ์ฐพ์œผ์‹œ๋Š” ๋ฐ”์šฐ์ฒ˜ ๋ฉ”๋‰ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); + } + } + +} diff --git a/src/main/java/com/programmers/springweekly/domain/customer/Customer.java b/src/main/java/com/programmers/springweekly/domain/customer/Customer.java index 031d948b33..c88e88f7a4 100644 --- a/src/main/java/com/programmers/springweekly/domain/customer/Customer.java +++ b/src/main/java/com/programmers/springweekly/domain/customer/Customer.java @@ -1,14 +1,23 @@ package com.programmers.springweekly.domain.customer; import java.util.UUID; +import lombok.Builder; import lombok.Getter; -import lombok.RequiredArgsConstructor; -@RequiredArgsConstructor @Getter public class Customer { private final UUID customerId; + private final String customerName; + private final String customerEmail; private final CustomerType customerType; - + + @Builder + public Customer(UUID customerId, String customerName, String customerEmail, CustomerType customerType) { + this.customerId = customerId; + this.customerName = customerName; + this.customerEmail = customerEmail; + this.customerType = customerType; + } + } diff --git a/src/main/java/com/programmers/springweekly/domain/customer/CustomerType.java b/src/main/java/com/programmers/springweekly/domain/customer/CustomerType.java index 272523debc..85f272c819 100644 --- a/src/main/java/com/programmers/springweekly/domain/customer/CustomerType.java +++ b/src/main/java/com/programmers/springweekly/domain/customer/CustomerType.java @@ -4,15 +4,16 @@ public enum CustomerType { NORMAL, BLACKLIST; - public static CustomerType findCustomerType(String type) { + public static CustomerType from(String type) { try { return valueOf(type.toUpperCase()); } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("Input: " + type + ", The type you are looking for is not found."); + throw new IllegalArgumentException("Input: " + type + ", ์ฐพ์œผ์‹œ๋Š” ๊ณ ๊ฐ ํƒ€์ž…์ด ์—†์Šต๋‹ˆ๋‹ค."); } } public static boolean isBlacklistedCustomer(CustomerType customerType) { return customerType == CustomerType.BLACKLIST; } + } diff --git a/src/main/java/com/programmers/springweekly/domain/voucher/FixedAmountVoucher.java b/src/main/java/com/programmers/springweekly/domain/voucher/FixedAmountVoucher.java index 4336c52901..a35cdff3a1 100644 --- a/src/main/java/com/programmers/springweekly/domain/voucher/FixedAmountVoucher.java +++ b/src/main/java/com/programmers/springweekly/domain/voucher/FixedAmountVoucher.java @@ -5,11 +5,11 @@ public class FixedAmountVoucher implements Voucher { private final UUID voucherId; - private final long fixedDiscountAmount; + private final long discountAmount; - public FixedAmountVoucher(long fixedDiscountAmount) { - this.voucherId = UUID.randomUUID(); - this.fixedDiscountAmount = fixedDiscountAmount; + public FixedAmountVoucher(UUID voucherId, long discountAmount) { + this.voucherId = voucherId; + this.discountAmount = discountAmount; } @Override @@ -19,16 +19,17 @@ public UUID getVoucherId() { @Override public long discount(long beforeDiscount) { - return beforeDiscount - fixedDiscountAmount; + return beforeDiscount - discountAmount; } @Override public long getVoucherAmount() { - return fixedDiscountAmount; + return discountAmount; } @Override public VoucherType getVoucherType() { return VoucherType.FIXED; } + } diff --git a/src/main/java/com/programmers/springweekly/domain/voucher/PercentDiscountVoucher.java b/src/main/java/com/programmers/springweekly/domain/voucher/PercentDiscountVoucher.java index f9b9ebd6b0..d812407481 100644 --- a/src/main/java/com/programmers/springweekly/domain/voucher/PercentDiscountVoucher.java +++ b/src/main/java/com/programmers/springweekly/domain/voucher/PercentDiscountVoucher.java @@ -5,11 +5,11 @@ public class PercentDiscountVoucher implements Voucher { private final UUID voucherId; - private final long discountPercent; + private final long discountAmount; - public PercentDiscountVoucher(long discountPercent) { - this.voucherId = UUID.randomUUID(); - this.discountPercent = discountPercent; + public PercentDiscountVoucher(UUID voucherId, long discountAmount) { + this.voucherId = voucherId; + this.discountAmount = discountAmount; } @Override @@ -19,16 +19,17 @@ public UUID getVoucherId() { @Override public long discount(long beforeDiscount) { - return beforeDiscount * (discountPercent / 100); + return (long) (beforeDiscount - beforeDiscount * ((double) discountAmount / 100)); } @Override public long getVoucherAmount() { - return discountPercent; + return discountAmount; } @Override public VoucherType getVoucherType() { return VoucherType.PERCENT; } + } diff --git a/src/main/java/com/programmers/springweekly/domain/voucher/Voucher.java b/src/main/java/com/programmers/springweekly/domain/voucher/Voucher.java index 1a403b8e0e..685eeda644 100644 --- a/src/main/java/com/programmers/springweekly/domain/voucher/Voucher.java +++ b/src/main/java/com/programmers/springweekly/domain/voucher/Voucher.java @@ -11,4 +11,5 @@ public interface Voucher { long getVoucherAmount(); VoucherType getVoucherType(); + } diff --git a/src/main/java/com/programmers/springweekly/domain/voucher/VoucherFactory.java b/src/main/java/com/programmers/springweekly/domain/voucher/VoucherFactory.java index f4d0853363..40dd4bac78 100644 --- a/src/main/java/com/programmers/springweekly/domain/voucher/VoucherFactory.java +++ b/src/main/java/com/programmers/springweekly/domain/voucher/VoucherFactory.java @@ -1,21 +1,14 @@ package com.programmers.springweekly.domain.voucher; -import com.programmers.springweekly.util.Validator; +import java.util.UUID; public class VoucherFactory { - public static Voucher createVoucher(VoucherType voucherType, String discount) { + public static Voucher createVoucher(UUID voucherId, VoucherType voucherType, long discount) { - switch (voucherType) { - case FIXED -> { - Validator.fixedAmountValidate(discount); - return new FixedAmountVoucher(Long.parseLong(discount)); - } - case PERCENT -> { - Validator.percentValidate(discount); - return new PercentDiscountVoucher(Long.parseLong(discount)); - } - default -> throw new IllegalArgumentException("Input: " + voucherType + "There is no voucher menu."); - } + return switch (voucherType) { + case FIXED -> new FixedAmountVoucher(voucherId, discount); + case PERCENT -> new PercentDiscountVoucher(voucherId, discount); + }; } } diff --git a/src/main/java/com/programmers/springweekly/domain/voucher/VoucherType.java b/src/main/java/com/programmers/springweekly/domain/voucher/VoucherType.java index e8937b2f7b..d6920b1d8f 100644 --- a/src/main/java/com/programmers/springweekly/domain/voucher/VoucherType.java +++ b/src/main/java/com/programmers/springweekly/domain/voucher/VoucherType.java @@ -4,11 +4,12 @@ public enum VoucherType { FIXED, PERCENT; - public static VoucherType findVoucherMenu(String type) { + public static VoucherType from(String type) { try { return valueOf(type.toUpperCase()); } catch (IllegalArgumentException e) { - throw new IllegalArgumentException("Input: " + type + ", The type you are looking for is not found."); + throw new IllegalArgumentException("Input: " + type + ", ์ฐพ์œผ์‹œ๋Š” ๋ฐ”์šฐ์ฒ˜ ํƒ€์ž…์ด ์—†์Šต๋‹ˆ๋‹ค."); } } -} \ No newline at end of file + +} diff --git a/src/main/java/com/programmers/springweekly/dto/ReadVoucherDto.java b/src/main/java/com/programmers/springweekly/dto/ReadVoucherDto.java deleted file mode 100644 index 7fa33e90cc..0000000000 --- a/src/main/java/com/programmers/springweekly/dto/ReadVoucherDto.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.programmers.springweekly.dto; - -import com.programmers.springweekly.domain.voucher.VoucherType; -import java.util.UUID; -import lombok.Getter; - -@Getter -public class ReadVoucherDto { - - private final UUID voucherId; - private final String discountAmount; - private final VoucherType voucherType; - - public ReadVoucherDto(String voucherId, String discountAmount, String voucherType) { - this.voucherId = UUID.fromString(voucherId); - this.discountAmount = discountAmount; - this.voucherType = VoucherType.findVoucherMenu(voucherType); - } -} diff --git a/src/main/java/com/programmers/springweekly/dto/customer/request/CustomerCreateRequest.java b/src/main/java/com/programmers/springweekly/dto/customer/request/CustomerCreateRequest.java new file mode 100644 index 0000000000..29d48716b0 --- /dev/null +++ b/src/main/java/com/programmers/springweekly/dto/customer/request/CustomerCreateRequest.java @@ -0,0 +1,21 @@ +package com.programmers.springweekly.dto.customer.request; + +import com.programmers.springweekly.domain.customer.CustomerType; +import lombok.Builder; +import lombok.Getter; + +@Getter +public class CustomerCreateRequest { + + private String customerName; + private String customerEmail; + private CustomerType customerType; + + @Builder + public CustomerCreateRequest(String customerName, String customerEmail, CustomerType customerType) { + this.customerName = customerName; + this.customerEmail = customerEmail; + this.customerType = customerType; + } + +} diff --git a/src/main/java/com/programmers/springweekly/dto/customer/request/CustomerUpdateRequest.java b/src/main/java/com/programmers/springweekly/dto/customer/request/CustomerUpdateRequest.java new file mode 100644 index 0000000000..ec3c9e7a0f --- /dev/null +++ b/src/main/java/com/programmers/springweekly/dto/customer/request/CustomerUpdateRequest.java @@ -0,0 +1,24 @@ +package com.programmers.springweekly.dto.customer.request; + +import com.programmers.springweekly.domain.customer.CustomerType; +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +public class CustomerUpdateRequest { + + private UUID customerId; + private String customerName; + private String customerEmail; + private CustomerType customerType; + + @Builder + public CustomerUpdateRequest(UUID customerId, String customerName, String customerEmail, CustomerType customerType) { + this.customerId = customerId; + this.customerName = customerName; + this.customerEmail = customerEmail; + this.customerType = customerType; + } + +} diff --git a/src/main/java/com/programmers/springweekly/dto/customer/response/CustomerListResponse.java b/src/main/java/com/programmers/springweekly/dto/customer/response/CustomerListResponse.java new file mode 100644 index 0000000000..d80cba4eb3 --- /dev/null +++ b/src/main/java/com/programmers/springweekly/dto/customer/response/CustomerListResponse.java @@ -0,0 +1,15 @@ +package com.programmers.springweekly.dto.customer.response; + +import java.util.List; +import lombok.Getter; + +@Getter +public class CustomerListResponse { + + private final List customerList; + + public CustomerListResponse(List customerList) { + this.customerList = customerList; + } + +} diff --git a/src/main/java/com/programmers/springweekly/dto/customer/response/CustomerResponse.java b/src/main/java/com/programmers/springweekly/dto/customer/response/CustomerResponse.java new file mode 100644 index 0000000000..7a097a0789 --- /dev/null +++ b/src/main/java/com/programmers/springweekly/dto/customer/response/CustomerResponse.java @@ -0,0 +1,23 @@ +package com.programmers.springweekly.dto.customer.response; + +import com.programmers.springweekly.domain.customer.Customer; +import com.programmers.springweekly.domain.customer.CustomerType; +import java.util.UUID; +import lombok.Getter; + +@Getter +public class CustomerResponse { + + private UUID customerId; + private String customerName; + private String customerEmail; + private CustomerType customerType; + + public CustomerResponse(Customer customer) { + this.customerId = customer.getCustomerId(); + this.customerName = customer.getCustomerName(); + this.customerEmail = customer.getCustomerEmail(); + this.customerType = customer.getCustomerType(); + } + +} diff --git a/src/main/java/com/programmers/springweekly/dto/voucher/request/VoucherCreateRequest.java b/src/main/java/com/programmers/springweekly/dto/voucher/request/VoucherCreateRequest.java new file mode 100644 index 0000000000..63b160cd2f --- /dev/null +++ b/src/main/java/com/programmers/springweekly/dto/voucher/request/VoucherCreateRequest.java @@ -0,0 +1,19 @@ +package com.programmers.springweekly.dto.voucher.request; + +import com.programmers.springweekly.domain.voucher.VoucherType; +import lombok.Builder; +import lombok.Getter; + +@Getter +public class VoucherCreateRequest { + + private long discountAmount; + private VoucherType voucherType; + + @Builder + public VoucherCreateRequest(long discountAmount, VoucherType voucherType) { + this.discountAmount = discountAmount; + this.voucherType = voucherType; + } + +} diff --git a/src/main/java/com/programmers/springweekly/dto/voucher/request/VoucherUpdateRequest.java b/src/main/java/com/programmers/springweekly/dto/voucher/request/VoucherUpdateRequest.java new file mode 100644 index 0000000000..8a6f260f84 --- /dev/null +++ b/src/main/java/com/programmers/springweekly/dto/voucher/request/VoucherUpdateRequest.java @@ -0,0 +1,22 @@ +package com.programmers.springweekly.dto.voucher.request; + +import com.programmers.springweekly.domain.voucher.VoucherType; +import java.util.UUID; +import lombok.Builder; +import lombok.Getter; + +@Getter +public class VoucherUpdateRequest { + + private UUID voucherId; + private long discountAmount; + private VoucherType voucherType; + + @Builder + public VoucherUpdateRequest(UUID voucherId, long discountAmount, VoucherType voucherType) { + this.voucherId = voucherId; + this.discountAmount = discountAmount; + this.voucherType = voucherType; + } + +} diff --git a/src/main/java/com/programmers/springweekly/dto/voucher/response/VoucherListResponse.java b/src/main/java/com/programmers/springweekly/dto/voucher/response/VoucherListResponse.java new file mode 100644 index 0000000000..a98df3ee6e --- /dev/null +++ b/src/main/java/com/programmers/springweekly/dto/voucher/response/VoucherListResponse.java @@ -0,0 +1,15 @@ +package com.programmers.springweekly.dto.voucher.response; + +import java.util.List; +import lombok.Getter; + +@Getter +public class VoucherListResponse { + + private final List voucherList; + + public VoucherListResponse(List voucherList) { + this.voucherList = voucherList; + } + +} diff --git a/src/main/java/com/programmers/springweekly/dto/voucher/response/VoucherResponse.java b/src/main/java/com/programmers/springweekly/dto/voucher/response/VoucherResponse.java new file mode 100644 index 0000000000..f12d219bb8 --- /dev/null +++ b/src/main/java/com/programmers/springweekly/dto/voucher/response/VoucherResponse.java @@ -0,0 +1,21 @@ +package com.programmers.springweekly.dto.voucher.response; + +import com.programmers.springweekly.domain.voucher.Voucher; +import com.programmers.springweekly.domain.voucher.VoucherType; +import java.util.UUID; +import lombok.Getter; + +@Getter +public class VoucherResponse { + + private UUID voucherId; + private long discountAmount; + private VoucherType voucherType; + + public VoucherResponse(Voucher voucher) { + this.voucherId = voucher.getVoucherId(); + this.discountAmount = voucher.getVoucherAmount(); + this.voucherType = voucher.getVoucherType(); + } + +} diff --git a/src/main/java/com/programmers/springweekly/repository/customer/CustomerRepository.java b/src/main/java/com/programmers/springweekly/repository/customer/CustomerRepository.java index affe864d70..597ccabd50 100644 --- a/src/main/java/com/programmers/springweekly/repository/customer/CustomerRepository.java +++ b/src/main/java/com/programmers/springweekly/repository/customer/CustomerRepository.java @@ -1,10 +1,24 @@ package com.programmers.springweekly.repository.customer; import com.programmers.springweekly.domain.customer.Customer; -import java.util.Map; +import java.util.List; +import java.util.Optional; import java.util.UUID; public interface CustomerRepository { - Map getBlackList(); + Customer save(Customer customer); + + void update(Customer customer); + + Optional findById(UUID customerId); + + List findAll(); + + List getBlackList(); + + void deleteById(UUID customerId); + + void deleteAll(); + } diff --git a/src/main/java/com/programmers/springweekly/repository/customer/FileCustomerRepository.java b/src/main/java/com/programmers/springweekly/repository/customer/FileCustomerRepository.java index 923041c33c..fd420952db 100644 --- a/src/main/java/com/programmers/springweekly/repository/customer/FileCustomerRepository.java +++ b/src/main/java/com/programmers/springweekly/repository/customer/FileCustomerRepository.java @@ -6,35 +6,37 @@ import java.io.BufferedReader; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.Collections; -import java.util.Map; +import java.util.List; import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Repository; -@Repository @Slf4j -public class FileCustomerRepository implements CustomerRepository { +public class FileCustomerRepository { - private final Map customerMap = new ConcurrentHashMap<>(); + private final List customerList = new ArrayList<>(); @Value("${file.customer.path}") private String filePath; - @Override - public Map getBlackList() { - return Collections.unmodifiableMap(customerMap); + public List getBlackList() { + return Collections.unmodifiableList(customerList); } - private void saveIfBlacklistedCustomer(String uuid, String customerType) { - CustomerType type = CustomerType.findCustomerType(customerType); + private void saveIfBlacklistedCustomer(String uuid, String name, String email, String customerType) { + CustomerType type = CustomerType.from(customerType); if (CustomerType.isBlacklistedCustomer(type)) { - Customer customer = new Customer(UUID.fromString(uuid), CustomerType.BLACKLIST); - - customerMap.put(customer.getCustomerId(), customer); + Customer customer = Customer.builder() + .customerId(UUID.fromString(uuid)) + .customerName(name) + .customerEmail(email) + .customerType(CustomerType.BLACKLIST) + .build(); + + customerList.add(customer); } } @@ -45,11 +47,12 @@ public void loadingBlackListToMemory() { while ((line = bufferedReader.readLine()) != null) { String[] readLine = line.split(","); - saveIfBlacklistedCustomer(readLine[0], readLine[1]); + saveIfBlacklistedCustomer(readLine[0], readLine[1], readLine[2], readLine[3]); } } catch (Exception e) { log.error("error message: {}", e.getMessage()); } } + } diff --git a/src/main/java/com/programmers/springweekly/repository/customer/JdbcTemplateCustomerRepository.java b/src/main/java/com/programmers/springweekly/repository/customer/JdbcTemplateCustomerRepository.java new file mode 100644 index 0000000000..79242a137e --- /dev/null +++ b/src/main/java/com/programmers/springweekly/repository/customer/JdbcTemplateCustomerRepository.java @@ -0,0 +1,113 @@ +package com.programmers.springweekly.repository.customer; + +import com.programmers.springweekly.domain.customer.Customer; +import com.programmers.springweekly.domain.customer.CustomerType; +import java.util.List; +import java.util.Optional; +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.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; +import org.springframework.jdbc.core.namedparam.SqlParameterSource; +import org.springframework.stereotype.Repository; + +@Repository +@Profile({"test", "local"}) +public class JdbcTemplateCustomerRepository implements CustomerRepository { + + private NamedParameterJdbcTemplate template; + + public JdbcTemplateCustomerRepository(DataSource dataSource) { + this.template = new NamedParameterJdbcTemplate(dataSource); + } + + @Override + public Customer save(Customer customer) { + String sql = "insert into customers values (:customerId, :customerName, :customerEmail, :customerType)"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("customerId", customer.getCustomerId().toString()) + .addValue("customerName", customer.getCustomerName()) + .addValue("customerEmail", customer.getCustomerEmail()) + .addValue("customerType", customer.getCustomerType().toString()); + + template.update(sql, param); + + return customer; + } + + @Override + public void update(Customer customer) { + String sql = "update customers set customer_name = :customerName, customer_email = :customerEmail, customer_type = :customerType where customer_id = :customerId"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("customerName", customer.getCustomerName()) + .addValue("customerEmail", customer.getCustomerEmail()) + .addValue("customerType", customer.getCustomerType().toString()) + .addValue("customerId", customer.getCustomerId().toString()); + + template.update(sql, param); + } + + @Override + public Optional findById(UUID customerId) { + String sql = "select * from customers where customer_id = :customerId"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("customerId", customerId.toString()); + + Customer customer = template.queryForObject(sql, param, customerRowMapper()); + + return Optional.ofNullable(customer); + } + + @Override + public List findAll() { + String sql = "select * from customers"; + + return template.query(sql, customerRowMapper()); + } + + @Override + public List getBlackList() { + String sql = "select * from customers where customer_type = :customerType"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("customerType", CustomerType.BLACKLIST.toString()); + + return template.query(sql, param, customerRowMapper()); + } + + @Override + public void deleteById(UUID customerId) { + String sql = "delete from customers where customer_id = :customerId"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("customerId", customerId.toString()); + + template.update(sql, param); + } + + @Override + public void deleteAll() { + String sql = "delete from customers"; + + SqlParameterSource param = new MapSqlParameterSource(); + + template.update(sql, param); + } + + private RowMapper customerRowMapper() { + return ((resultSet, rowMap) -> + Customer.builder() + .customerId(UUID.fromString(resultSet.getString("customer_id"))) + .customerName(resultSet.getString("customer_name")) + .customerEmail(resultSet.getString("customer_email")) + .customerType(CustomerType.valueOf(resultSet.getString("customer_type"))) + .build() + ); + } + +} diff --git a/src/main/java/com/programmers/springweekly/repository/voucher/FileVoucherRepository.java b/src/main/java/com/programmers/springweekly/repository/voucher/FileVoucherRepository.java index 6e2a0343db..c4ede76c58 100644 --- a/src/main/java/com/programmers/springweekly/repository/voucher/FileVoucherRepository.java +++ b/src/main/java/com/programmers/springweekly/repository/voucher/FileVoucherRepository.java @@ -2,10 +2,11 @@ import com.programmers.springweekly.domain.voucher.Voucher; import com.programmers.springweekly.domain.voucher.VoucherFactory; -import com.programmers.springweekly.dto.ReadVoucherDto; +import com.programmers.springweekly.domain.voucher.VoucherType; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Collections; @@ -14,21 +15,16 @@ import java.util.concurrent.ConcurrentHashMap; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Profile; -import org.springframework.stereotype.Repository; -@Repository -@Profile("dev") @Slf4j -public class FileVoucherRepository implements VoucherRepository { +public class FileVoucherRepository { private final Map voucherMap = new ConcurrentHashMap<>(); @Value("${file.voucher.path}") private String filePath; - @Override - public void save(Voucher voucher) { + public Voucher save(Voucher voucher) { try (BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(filePath, true))) { String voucherId = String.valueOf(voucher.getVoucherId()); @@ -42,31 +38,31 @@ public void save(Voucher voucher) { bufferedWriter.newLine(); bufferedWriter.flush(); - - } catch (Exception e) { + return voucher; + } catch (IOException e) { log.error("error message: {}", e.getMessage()); + throw new RuntimeException("IO ์ž‘์—…์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค."); } } - @Override - public Map getList() { + public Map findAll() { try (BufferedReader bufferedReader = Files.newBufferedReader(Paths.get(filePath))) { String line = ""; while ((line = bufferedReader.readLine()) != null) { String[] readLine = line.split(","); - ReadVoucherDto readVoucherDto = new ReadVoucherDto(readLine[0], readLine[1], readLine[2]); - - Voucher voucher = VoucherFactory.createVoucher(readVoucherDto.getVoucherType(), readVoucherDto.getDiscountAmount()); + Voucher voucher = VoucherFactory.createVoucher(UUID.fromString(readLine[0]), VoucherType.valueOf(readLine[2]), Long.parseLong(readLine[1])); - voucherMap.put(readVoucherDto.getVoucherId(), voucher); + voucherMap.put(voucher.getVoucherId(), voucher); } - } catch (Exception e) { + } catch (IOException e) { log.error("error message: {}", e.getMessage()); + throw new RuntimeException("IO ์ž‘์—…์ค‘ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค."); } return Collections.unmodifiableMap(voucherMap); } + } diff --git a/src/main/java/com/programmers/springweekly/repository/voucher/JdbcTemplateVoucherRepository.java b/src/main/java/com/programmers/springweekly/repository/voucher/JdbcTemplateVoucherRepository.java new file mode 100644 index 0000000000..ddbc42048e --- /dev/null +++ b/src/main/java/com/programmers/springweekly/repository/voucher/JdbcTemplateVoucherRepository.java @@ -0,0 +1,103 @@ +package com.programmers.springweekly.repository.voucher; + +import com.programmers.springweekly.domain.voucher.Voucher; +import com.programmers.springweekly.domain.voucher.VoucherFactory; +import com.programmers.springweekly.domain.voucher.VoucherType; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import javax.sql.DataSource; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Primary; +import org.springframework.context.annotation.Profile; +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 +@Primary +@Slf4j +@Profile({"local", "test"}) +public class JdbcTemplateVoucherRepository implements VoucherRepository { + + private final NamedParameterJdbcTemplate template; + + public JdbcTemplateVoucherRepository(DataSource dataSource) { + this.template = new NamedParameterJdbcTemplate(dataSource); + } + + @Override + public Voucher save(Voucher voucher) { + String sql = "insert into vouchers values(:voucherId, :discountAmount, :voucherType)"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("voucherId", voucher.getVoucherId()) + .addValue("discountAmount", voucher.getVoucherAmount()) + .addValue("voucherType", voucher.getVoucherType().toString()); + + template.update(sql, param); + + return voucher; + } + + @Override + public void update(Voucher voucher) { + String sql = "update vouchers set voucher_discount_amount = :discountAmount, voucher_type = :voucherType where voucher_id = :voucherId"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("voucherId", voucher.getVoucherId()) + .addValue("discountAmount", voucher.getVoucherAmount()) + .addValue("voucherType", voucher.getVoucherType().toString()); + + template.update(sql, param); + } + + @Override + public Optional findById(UUID voucherId) { + String sql = "select * from vouchers where voucher_id = :voucherId"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("voucherId", voucherId); + + Voucher voucher = template.queryForObject(sql, param, voucherRowMapper()); + return Optional.ofNullable(voucher); + } + + @Override + public List findAll() { + String sql = "select * from vouchers"; + + return template.query(sql, voucherRowMapper()); + } + + @Override + public void deleteById(UUID voucherId) { + String sql = "delete from vouchers where voucher_id = :voucherId"; + + SqlParameterSource param = new MapSqlParameterSource() + .addValue("voucherId", voucherId); + + template.update(sql, param); + } + + @Override + public void deleteAll() { + String sql = "delete from vouchers"; + + SqlParameterSource param = new MapSqlParameterSource(); + + template.update(sql, param); + } + + private RowMapper voucherRowMapper() { + return ((resultSet, rowMap) -> + VoucherFactory.createVoucher(UUID.fromString(resultSet.getString("voucher_id")), + VoucherType.valueOf(resultSet.getString("voucher_type")), + Long.parseLong(resultSet.getString("voucher_discount_amount")) + ) + ); + } + +} diff --git a/src/main/java/com/programmers/springweekly/repository/voucher/MemoryVoucherRepository.java b/src/main/java/com/programmers/springweekly/repository/voucher/MemoryVoucherRepository.java index a0b06c0f71..c81b9694ef 100644 --- a/src/main/java/com/programmers/springweekly/repository/voucher/MemoryVoucherRepository.java +++ b/src/main/java/com/programmers/springweekly/repository/voucher/MemoryVoucherRepository.java @@ -1,26 +1,56 @@ package com.programmers.springweekly.repository.voucher; import com.programmers.springweekly.domain.voucher.Voucher; -import java.util.Collections; +import java.util.ArrayList; +import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import org.springframework.context.annotation.Profile; import org.springframework.stereotype.Repository; @Repository -@Profile("local") +@Profile("test") public class MemoryVoucherRepository implements VoucherRepository { private final Map voucherMap = new ConcurrentHashMap<>(); @Override - public void save(Voucher voucher) { + public Voucher save(Voucher voucher) { voucherMap.put(voucher.getVoucherId(), voucher); + + return voucher; + } + + @Override + public void update(Voucher voucher) { + voucherMap.put(voucher.getVoucherId(), voucher); + } + + @Override + public Optional findById(UUID voucherId) { + try { + Voucher voucher = voucherMap.get(voucherId); + return Optional.of(voucher); + } catch (NullPointerException e) { + return Optional.empty(); + } } @Override - public Map getList() { - return Collections.unmodifiableMap(voucherMap); + public List findAll() { + return new ArrayList<>(voucherMap.values()); } + + @Override + public void deleteById(UUID voucherId) { + voucherMap.remove(voucherId); + } + + @Override + public void deleteAll() { + voucherMap.clear(); + } + } diff --git a/src/main/java/com/programmers/springweekly/repository/voucher/VoucherRepository.java b/src/main/java/com/programmers/springweekly/repository/voucher/VoucherRepository.java index 7ce9e2c01d..d549b160b2 100644 --- a/src/main/java/com/programmers/springweekly/repository/voucher/VoucherRepository.java +++ b/src/main/java/com/programmers/springweekly/repository/voucher/VoucherRepository.java @@ -1,12 +1,22 @@ package com.programmers.springweekly.repository.voucher; import com.programmers.springweekly.domain.voucher.Voucher; -import java.util.Map; +import java.util.List; +import java.util.Optional; import java.util.UUID; public interface VoucherRepository { - void save(Voucher voucher); + Voucher save(Voucher voucher); + + void update(Voucher voucher); + + Optional findById(UUID voucherId); + + List findAll(); + + void deleteById(UUID voucherId); + + void deleteAll(); - Map getList(); } diff --git a/src/main/java/com/programmers/springweekly/service/CustomerService.java b/src/main/java/com/programmers/springweekly/service/CustomerService.java index 0bb7ea9743..521f89f57e 100644 --- a/src/main/java/com/programmers/springweekly/service/CustomerService.java +++ b/src/main/java/com/programmers/springweekly/service/CustomerService.java @@ -1,19 +1,68 @@ package com.programmers.springweekly.service; import com.programmers.springweekly.domain.customer.Customer; +import com.programmers.springweekly.dto.customer.request.CustomerCreateRequest; +import com.programmers.springweekly.dto.customer.request.CustomerUpdateRequest; +import com.programmers.springweekly.dto.customer.response.CustomerListResponse; +import com.programmers.springweekly.dto.customer.response.CustomerResponse; import com.programmers.springweekly.repository.customer.CustomerRepository; -import java.util.Map; +import java.util.List; +import java.util.NoSuchElementException; import java.util.UUID; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @Service -@AllArgsConstructor +@RequiredArgsConstructor public class CustomerService { private final CustomerRepository customerRepository; - public Map getBlackList() { - return customerRepository.getBlackList(); + public void save(CustomerCreateRequest customerCreateRequest) { + Customer customer = Customer.builder() + .customerId(UUID.randomUUID()) + .customerName(customerCreateRequest.getCustomerName()) + .customerEmail(customerCreateRequest.getCustomerEmail()) + .customerType(customerCreateRequest.getCustomerType()) + .build(); + + customerRepository.save(customer); + } + + public void update(CustomerUpdateRequest customerUpdateRequest) { + customerRepository.update( + Customer.builder() + .customerId(customerUpdateRequest.getCustomerId()) + .customerName(customerUpdateRequest.getCustomerName()) + .customerEmail(customerUpdateRequest.getCustomerEmail()) + .customerType(customerUpdateRequest.getCustomerType()) + .build() + ); + } + + public CustomerResponse findById(UUID customerId) { + Customer customer = customerRepository.findById(customerId) + .orElseThrow(() -> new NoSuchElementException("Input : " + customerId + ", ์ฐพ๋Š” ํšŒ์›์ด ์—†์Šต๋‹ˆ๋‹ค.")); + + return new CustomerResponse(customer); + } + + public CustomerListResponse findAll() { + List customerList = customerRepository.findAll(); + return new CustomerListResponse(customerList.stream().map(CustomerResponse::new).toList()); } + + public CustomerListResponse getBlackList() { + List customerList = customerRepository.getBlackList(); + return new CustomerListResponse(customerList.stream().map(CustomerResponse::new).toList()); + } + + public void deleteById(UUID customerId) { + customerRepository.deleteById(customerId); + } + + public void deleteAll() { + customerRepository.deleteAll(); + } + } diff --git a/src/main/java/com/programmers/springweekly/service/VoucherService.java b/src/main/java/com/programmers/springweekly/service/VoucherService.java index b350a64aea..c4932a6b63 100644 --- a/src/main/java/com/programmers/springweekly/service/VoucherService.java +++ b/src/main/java/com/programmers/springweekly/service/VoucherService.java @@ -2,25 +2,61 @@ import com.programmers.springweekly.domain.voucher.Voucher; import com.programmers.springweekly.domain.voucher.VoucherFactory; -import com.programmers.springweekly.domain.voucher.VoucherType; +import com.programmers.springweekly.dto.voucher.request.VoucherCreateRequest; +import com.programmers.springweekly.dto.voucher.request.VoucherUpdateRequest; +import com.programmers.springweekly.dto.voucher.response.VoucherListResponse; +import com.programmers.springweekly.dto.voucher.response.VoucherResponse; import com.programmers.springweekly.repository.voucher.VoucherRepository; -import java.util.Map; +import java.util.List; +import java.util.NoSuchElementException; import java.util.UUID; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @Service -@AllArgsConstructor +@RequiredArgsConstructor public class VoucherService { private final VoucherRepository voucherRepository; - public void saveVoucher(VoucherType voucherType, String discount) { - Voucher voucher = VoucherFactory.createVoucher(voucherType, discount); + public void save(VoucherCreateRequest voucherCreateRequest) { + Voucher voucher = VoucherFactory.createVoucher( + UUID.randomUUID(), + voucherCreateRequest.getVoucherType(), + voucherCreateRequest.getDiscountAmount() + ); + voucherRepository.save(voucher); } - public Map findVoucherAll() { - return voucherRepository.getList(); + public void update(VoucherUpdateRequest voucherUpdateRequest) { + Voucher voucher = VoucherFactory.createVoucher( + voucherUpdateRequest.getVoucherId(), + voucherUpdateRequest.getVoucherType(), + voucherUpdateRequest.getDiscountAmount() + ); + + voucherRepository.update(voucher); + } + + public VoucherResponse findById(UUID voucherId) { + Voucher voucher = voucherRepository.findById(voucherId) + .orElseThrow(() -> new NoSuchElementException("์ฐพ๋Š” ๋ฐ”์šฐ์ฒ˜๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.")); + + return new VoucherResponse(voucher); + } + + public VoucherListResponse findAll() { + List voucherList = voucherRepository.findAll(); + return new VoucherListResponse(voucherList.stream().map(VoucherResponse::new).toList()); + } + + public void deleteById(UUID voucherId) { + voucherRepository.deleteById(voucherId); } + + public void deleteAll() { + voucherRepository.deleteAll(); + } + } diff --git a/src/main/java/com/programmers/springweekly/util/Validator.java b/src/main/java/com/programmers/springweekly/util/Validator.java index 93108d2f6f..637bb36132 100644 --- a/src/main/java/com/programmers/springweekly/util/Validator.java +++ b/src/main/java/com/programmers/springweekly/util/Validator.java @@ -1,5 +1,6 @@ package com.programmers.springweekly.util; +import com.programmers.springweekly.domain.voucher.VoucherType; import java.util.regex.Matcher; import java.util.regex.Pattern; import lombok.AccessLevel; @@ -8,34 +9,57 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class Validator { - private static final Pattern pattern = Pattern.compile("\\d+"); - private static final String IS_NOT_A_NUMBER = "Is not a number"; - private static final String A_NUMBER_THAT_IS_OUT_OF_RANGE = "A number that is out of range"; + private static final Pattern numberPattern = Pattern.compile("\\d+"); + private static final Pattern englishPattern = Pattern.compile("^[a-zA-Z]*$"); + private static final Pattern emailPattern = Pattern.compile("^[_a-zA-Z0-9-\\.]+@[\\.a-zA-Z0-9-]+\\.[a-zA-Z]+$"); private static final int PERCENT_MAX = 100; private static final int PERCENT_MIN = 0; - public static void fixedAmountValidate(String fixedAmount) { - isNumber(fixedAmount); + public static void validateDiscountAmount(VoucherType voucherType, String discountAmount) { + if (voucherType == VoucherType.FIXED) { + validateNumber(discountAmount); + } + + if (voucherType == VoucherType.PERCENT) { + validateNumber(discountAmount); + validateRange(discountAmount); + } } - public static void percentValidate(String percent) { - isNumber(percent); - isValidRange(percent); + public static String[] inputParse(String input) { + return input.split(","); + } + + public static void validateName(String input) { + Matcher match = englishPattern.matcher(input); + + if (!match.matches()) { + throw new IllegalArgumentException("Input : " + input + ", ์ž…๋ ฅํ•˜์‹  ๊ฒƒ์€ ์˜์–ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค."); + } + } + + public static void validateEmail(String input) { + Matcher match = emailPattern.matcher(input); + + if (!match.matches()) { + throw new IllegalArgumentException("Input : " + input + "์ž…๋ ฅํ•˜์‹  ๊ฒƒ์€ ์ด๋ฉ”์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค."); + } } - private static void isNumber(String number) { - Matcher match = pattern.matcher(number); + private static void validateNumber(String input) { + Matcher match = numberPattern.matcher(input); if (!match.matches()) { - throw new IllegalArgumentException(IS_NOT_A_NUMBER); + throw new IllegalArgumentException("Input : " + input + ", ์ž…๋ ฅํ•˜์‹  ๊ฒƒ์€ ์ˆซ์ž๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค."); } } - private static void isValidRange(String inputPercent) { + private static void validateRange(String inputPercent) { int percent = Integer.parseInt(inputPercent); if (percent > PERCENT_MAX || percent < PERCENT_MIN) { - throw new IllegalArgumentException(A_NUMBER_THAT_IS_OUT_OF_RANGE); + throw new IllegalArgumentException("Input : " + inputPercent + ", ์ž…๋ ฅํ•˜์‹  ์ˆซ์ž๋Š” ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚ฉ๋‹ˆ๋‹ค."); } } + } diff --git a/src/main/java/com/programmers/springweekly/view/Console.java b/src/main/java/com/programmers/springweekly/view/Console.java index 776bfbcfbf..19dcdc7b52 100644 --- a/src/main/java/com/programmers/springweekly/view/Console.java +++ b/src/main/java/com/programmers/springweekly/view/Console.java @@ -1,8 +1,16 @@ package com.programmers.springweekly.view; -import com.programmers.springweekly.domain.customer.Customer; -import com.programmers.springweekly.domain.voucher.Voucher; -import java.util.Map; +import com.programmers.springweekly.domain.customer.CustomerType; +import com.programmers.springweekly.domain.voucher.VoucherType; +import com.programmers.springweekly.dto.customer.request.CustomerCreateRequest; +import com.programmers.springweekly.dto.customer.request.CustomerUpdateRequest; +import com.programmers.springweekly.dto.customer.response.CustomerListResponse; +import com.programmers.springweekly.dto.customer.response.CustomerResponse; +import com.programmers.springweekly.dto.voucher.request.VoucherCreateRequest; +import com.programmers.springweekly.dto.voucher.request.VoucherUpdateRequest; +import com.programmers.springweekly.dto.voucher.response.VoucherListResponse; +import com.programmers.springweekly.dto.voucher.response.VoucherResponse; +import com.programmers.springweekly.util.Validator; import java.util.Scanner; import java.util.UUID; import org.springframework.stereotype.Component; @@ -11,63 +19,121 @@ public class Console implements Input, Output { private static final Scanner SCANNER = new Scanner(System.in); - - private static final String PROGRAM_TITLE = "=== Voucher Program ==="; - private static final String PROGRAM_EXIT_GUIDE = "Type exit to exit the program."; - private static final String PROGRAM_CREATE_GUIDE = "Type create to create a new voucher."; - private static final String PROGRAM_LIST_GUIDE = "Type list to list all vouchers."; - private static final String PROGRAM_BLACKLIST_GUIDE = "Type blacklist to blacklist all customer blacklist"; - private static final String VOUCHER_SELECT_GUIDE = "Select fixed or percent."; - private static final String VOUCHER_DISCOUNT_GUIDE = "If fixed, enter freely, and if percentage, enter a number between 1 and 100."; - private static final String GAME_END_EXIT_MESSAGE = "Program has ended."; + private static final String NEW_LINE = "========================================================="; @Override public String inputMessage() { return SCANNER.nextLine(); } + @Override + public VoucherCreateRequest inputVoucherCreate(VoucherType voucherType) { + String inputDiscountAmount = SCANNER.nextLine(); + Validator.validateDiscountAmount(voucherType, inputDiscountAmount); + + return VoucherCreateRequest.builder() + .discountAmount(Long.parseLong(inputDiscountAmount)) + .voucherType(voucherType) + .build(); + } + + @Override + public VoucherUpdateRequest inputVoucherUpdate(UUID voucherId) { + String[] voucherInfo = Validator.inputParse(SCANNER.nextLine()); + VoucherType voucherType = VoucherType.from(voucherInfo[1]); + Validator.validateDiscountAmount(voucherType, voucherInfo[0]); + + return VoucherUpdateRequest.builder() + .voucherId(voucherId) + .discountAmount(Long.parseLong(voucherInfo[0])) + .voucherType(voucherType) + .build(); + } + + + @Override + public CustomerCreateRequest inputCustomerCreate() { + String[] customerInfo = Validator.inputParse(SCANNER.nextLine()); + Validator.validateName(customerInfo[0]); + Validator.validateEmail(customerInfo[1]); + + return CustomerCreateRequest.builder() + .customerName(customerInfo[0]) + .customerEmail(customerInfo[1]) + .customerType(CustomerType.from(customerInfo[2])) + .build(); + } + + @Override + public CustomerUpdateRequest inputCustomerUpdate(UUID customerId) { + String[] customerInfo = Validator.inputParse(SCANNER.nextLine()); + Validator.validateName(customerInfo[0]); + Validator.validateEmail(customerInfo[1]); + + return CustomerUpdateRequest.builder() + .customerId(customerId) + .customerName(customerInfo[0]) + .customerEmail(customerInfo[1]) + .customerType(CustomerType.from(customerInfo[2])) + .build(); + } + + @Override + public UUID inputUUID() { + return UUID.fromString(SCANNER.nextLine()); + } + @Override public void outputProgramGuide() { - System.out.println(PROGRAM_TITLE); - System.out.println(PROGRAM_EXIT_GUIDE); - System.out.println(PROGRAM_CREATE_GUIDE); - System.out.println(PROGRAM_LIST_GUIDE); - System.out.println(PROGRAM_BLACKLIST_GUIDE); + System.out.println("====== ๋ฐ”์šฐ์ฒ˜ ํ”„๋กœ๊ทธ๋žจ ======"); + System.out.println("customer : ๊ณ ๊ฐ ๊ด€๋ จ๋œ ์ž‘์—…"); + System.out.println("voucher : ๋ฐ”์šฐ์ฒ˜ ๊ด€๋ จ๋œ ์ž‘์—…"); + System.out.println("exit : ํ”„๋กœ๊ทธ๋žจ ์ข…๋ฃŒ"); } @Override public void outputSelectCreateVoucherGuide() { - System.out.println(VOUCHER_SELECT_GUIDE); + System.out.println("๋ฐ”์šฐ์ฒ˜ ์ข…๋ฅ˜ : ๊ณ ์ • ํ• ์ธ์€ fixed, ํผ์„ผํŠธ ํ• ์ธ์€ percent๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"); } @Override public void outputDiscountGuide() { - System.out.println(VOUCHER_DISCOUNT_GUIDE); + System.out.println("ํ• ์ธ ์–‘ : ๊ณ ์ • ํ• ์ธ์€ ์ž์œ ๋กญ๊ฒŒ, ํผ์„ผํŠธ๋Š” 1๋ถ€ํ„ฐ 100๊นŒ์ง€ ์‚ฌ์ด์˜ ์ˆซ์ž๋งŒ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); } @Override public void outputExitMessage() { - System.out.println(GAME_END_EXIT_MESSAGE); + System.out.println("ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); } @Override - public void outputGetVoucherAll(Map voucherMap) { - for (Map.Entry voucherEntry : voucherMap.entrySet()) { - System.out.println("========================================================="); - System.out.println("voucherId : " + voucherEntry.getValue().getVoucherId()); - System.out.println("discountAmount : " + voucherEntry.getValue().getVoucherAmount()); - System.out.println("voucherType : " + voucherEntry.getValue().getVoucherType()); - System.out.println("=========================================================\n"); + public void outputGetVoucherAll(VoucherListResponse voucherListResponse) { + for (VoucherResponse voucher : voucherListResponse.getVoucherList()) { + System.out.println(NEW_LINE); + System.out.println("๋ฐ”์šฐ์ฒ˜ ID : " + voucher.getVoucherId()); + System.out.println("ํ• ์ธ ์–‘ : " + voucher.getDiscountAmount()); + System.out.println("๋ฐ”์šฐ์ฒ˜ ํƒ€์ž… : " + voucher.getVoucherType()); + System.out.println(NEW_LINE + "\n"); } } @Override - public void outputGetCustomerBlackList(Map customerMap) { - for (Map.Entry customerEntry : customerMap.entrySet()) { - System.out.println("========================================================="); - System.out.println("customerId : " + customerEntry.getValue().getCustomerId()); - System.out.println("customerType : " + customerEntry.getValue().getCustomerType()); - System.out.println("=========================================================\n"); + public void outputVoucherUpdateGuide() { + System.out.println("๋ฐ”์šฐ์ฒ˜๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ์ž…๋ ฅํ•˜์‹œ๋˜ ,(์‰ผํ‘œ)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); + System.out.println("ํ• ์ธ ์–‘ : ๊ณ ์ • ํ• ์ธ์€ ์ž์œ ๋กญ๊ฒŒ, ํผ์„ผํŠธ๋Š” 1๋ถ€ํ„ฐ 100๊นŒ์ง€ ์‚ฌ์ด์˜ ์ˆซ์ž๋งŒ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); + System.out.println("๋ฐ”์šฐ์ฒ˜ ์ข…๋ฅ˜ : ๊ณ ์ • ํ• ์ธ์€ fixed, ํผ์„ผํŠธ ํ• ์ธ์€ percent๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”"); + System.out.println("์˜ˆ์‹œ) ๋ฐ”์šฐ์ฒ˜ ํ• ์ธ ์–‘,๋ฐ”์šฐ์ฒ˜ ์ข…๋ฅ˜"); + } + + @Override + public void outputGetCustomerList(CustomerListResponse customerList) { + for (CustomerResponse customer : customerList.getCustomerList()) { + System.out.println(NEW_LINE); + System.out.println("๊ณ ๊ฐ ID : " + customer.getCustomerId()); + System.out.println("๊ณ ๊ฐ ์ด๋ฆ„ : " + customer.getCustomerName()); + System.out.println("๊ณ ๊ฐ ์ด๋ฉ”์ผ : " + customer.getCustomerEmail()); + System.out.println("๊ณ ๊ฐ ํƒ€์ž… : " + customer.getCustomerType()); + System.out.println(NEW_LINE + "\n"); } } @@ -75,4 +141,46 @@ public void outputGetCustomerBlackList(Map customerMap) { public void outputErrorMessage(String errorText) { System.out.println(errorText); } + + @Override + public void outputUUIDGuide() { + System.out.println("๊ณ ๊ฐ UUID๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); + } + + @Override + public void outputCustomerUpdateGuide() { + System.out.println("๊ณ ๊ฐ์„ ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ์ž…๋ ฅํ•˜์‹œ๋˜ ,(์‰ผํ‘œ)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜์–ด๋กœ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); + System.out.println("์˜ˆ์‹œ) ๊ณ ๊ฐ ์ด๋ฆ„,๊ณ ๊ฐ ์ด๋ฉ”์ผ,๊ณ ๊ฐ ํƒ€์ž…(normal, blacklist)"); + } + + @Override + public void outputCompleteGuide() { + System.out.println("์ž‘์—…์ด ์ฒ˜๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค."); + } + + @Override + public void outputCustomerCreateGuide() { + System.out.println("๊ณ ๊ฐ์„ ์ƒ์„ฑ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์•„๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ์ž…๋ ฅํ•˜์‹œ๋˜ ,(์‰ผํ‘œ)๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜์–ด๋กœ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."); + System.out.println("์˜ˆ์‹œ) ๊ณ ๊ฐ ์ด๋ฆ„,๊ณ ๊ฐ ์ด๋ฉ”์ผ,๊ณ ๊ฐ ํƒ€์ž…(normal, blacklist)"); + } + + @Override + public void outputCustomerMenuGuide() { + System.out.println("=========== ๊ณ ๊ฐ ํ”„๋กœ๊ทธ๋žจ ==========="); + System.out.println("create : ๊ณ ๊ฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค."); + System.out.println("update : ๊ณ ๊ฐ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค."); + System.out.println("delete : ๊ณ ๊ฐ์„ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค."); + System.out.println("select : ๊ณ ๊ฐ์„ ๋ชจ๋‘ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค."); + System.out.println("blacklist : ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ณ ๊ฐ์„ ๋ชจ๋‘ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค."); + } + + @Override + public void outputVoucherMenuGuide() { + System.out.println("=========== ๋ฐ”์šฐ์ฒ˜ ํ”„๋กœ๊ทธ๋žจ ==========="); + System.out.println("create : ๋ฐ”์šฐ์ฒ˜๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค."); + System.out.println("update : ๋ฐ”์šฐ์ฒ˜๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค."); + System.out.println("delete : ๋ฐ”์šฐ์ฒ˜๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค."); + System.out.println("select : ๋ฐ”์šฐ์ฒ˜๋ฅผ ๋ชจ๋‘ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค."); + } + } diff --git a/src/main/java/com/programmers/springweekly/view/Input.java b/src/main/java/com/programmers/springweekly/view/Input.java index 621f992311..41d71e421f 100644 --- a/src/main/java/com/programmers/springweekly/view/Input.java +++ b/src/main/java/com/programmers/springweekly/view/Input.java @@ -1,6 +1,24 @@ package com.programmers.springweekly.view; +import com.programmers.springweekly.domain.voucher.VoucherType; +import com.programmers.springweekly.dto.customer.request.CustomerCreateRequest; +import com.programmers.springweekly.dto.customer.request.CustomerUpdateRequest; +import com.programmers.springweekly.dto.voucher.request.VoucherCreateRequest; +import com.programmers.springweekly.dto.voucher.request.VoucherUpdateRequest; +import java.util.UUID; + public interface Input { String inputMessage(); -} \ No newline at end of file + + VoucherCreateRequest inputVoucherCreate(VoucherType voucherType); + + VoucherUpdateRequest inputVoucherUpdate(UUID voucherId); + + CustomerCreateRequest inputCustomerCreate(); + + CustomerUpdateRequest inputCustomerUpdate(UUID customerId); + + UUID inputUUID(); + +} diff --git a/src/main/java/com/programmers/springweekly/view/Output.java b/src/main/java/com/programmers/springweekly/view/Output.java index b051ebd961..3dd0367d20 100644 --- a/src/main/java/com/programmers/springweekly/view/Output.java +++ b/src/main/java/com/programmers/springweekly/view/Output.java @@ -1,9 +1,7 @@ package com.programmers.springweekly.view; -import com.programmers.springweekly.domain.customer.Customer; -import com.programmers.springweekly.domain.voucher.Voucher; -import java.util.Map; -import java.util.UUID; +import com.programmers.springweekly.dto.customer.response.CustomerListResponse; +import com.programmers.springweekly.dto.voucher.response.VoucherListResponse; public interface Output { @@ -15,9 +13,25 @@ public interface Output { void outputExitMessage(); - void outputGetVoucherAll(Map voucherMap); + void outputGetVoucherAll(VoucherListResponse voucherListResponse); - void outputGetCustomerBlackList(Map customerMap); + + void outputVoucherUpdateGuide(); + + void outputGetCustomerList(CustomerListResponse customerList); void outputErrorMessage(String errorText); -} \ No newline at end of file + + void outputUUIDGuide(); + + void outputCustomerUpdateGuide(); + + void outputCustomerCreateGuide(); + + void outputCompleteGuide(); + + void outputCustomerMenuGuide(); + + void outputVoucherMenuGuide(); + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 14e2dcd4d7..287f127c78 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -11,6 +11,14 @@ spring: config: activate: on-profile: local + datasource: + driverClassName: org.h2.Driver + url: jdbc:h2:mem:test + username: sa + password: + sql: + init: + mode: always --- @@ -20,4 +28,4 @@ spring: on-profile: dev file: voucher: - path: ./file/voucher_list.csv \ No newline at end of file + path: ./file/voucher_list.csv diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql new file mode 100644 index 0000000000..3574b5ce50 --- /dev/null +++ b/src/main/resources/schema.sql @@ -0,0 +1,15 @@ +drop table if exists customers cascade; +create table customers +( + customer_id varchar(36) primary key, + customer_name varchar(30) not null, + customer_email varchar(50) not null, + customer_type varchar(20) not null +); + +create table vouchers +( + voucher_id varchar(36) primary key, + voucher_discount_amount int not null, + voucher_type varchar(20) not null +) diff --git a/src/test/java/com/programmers/springweekly/VoucherProgramApplicationTests.java b/src/test/java/com/programmers/springweekly/VoucherProgramApplicationTests.java deleted file mode 100644 index 5e88702555..0000000000 --- a/src/test/java/com/programmers/springweekly/VoucherProgramApplicationTests.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.programmers.springweekly; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class VoucherProgramApplicationTests { - - @Test - void contextLoads() { - } - -} diff --git a/src/test/java/com/programmers/springweekly/domain/EnumTest.java b/src/test/java/com/programmers/springweekly/domain/EnumTest.java new file mode 100644 index 0000000000..8462c988d5 --- /dev/null +++ b/src/test/java/com/programmers/springweekly/domain/EnumTest.java @@ -0,0 +1,40 @@ +package com.programmers.springweekly.domain; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.programmers.springweekly.domain.customer.CustomerType; +import com.programmers.springweekly.domain.voucher.VoucherType; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +public class EnumTest { + + @ParameterizedTest + @ValueSource(strings = {"show", "whitelist", "juice"}) + @DisplayName("ํ”„๋กœ๊ทธ๋žจ ๋ฉ”๋‰ด์— ์—†๋Š” ๋ฉ”๋‰ด๊ฐ€ ์ž…๋ ฅ๋˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.") + void programMenuTest(String input) { + assertThatThrownBy(() -> ProgramMenu.from(input)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Input: " + input + ", ์ฐพ์œผ์‹œ๋Š” ํ”„๋กœ๊ทธ๋žจ ๋ฉ”๋‰ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."); + } + + @ParameterizedTest + @ValueSource(strings = {"accVoucher", "divideVoucher"}) + @DisplayName("๋ฐ”์šฐ์ฒ˜ ํƒ€์ž…์— ์—†๋Š” ํƒ€์ž…์ด ์ž…๋ ฅ๋˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.") + void voucherTypeTest(String input) { + assertThatThrownBy(() -> VoucherType.from(input)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Input: " + input + ", ์ฐพ์œผ์‹œ๋Š” ๋ฐ”์šฐ์ฒ˜ ํƒ€์ž…์ด ์—†์Šต๋‹ˆ๋‹ค."); + } + + @ParameterizedTest + @ValueSource(strings = {"diamond", "silver", "bronze"}) + @DisplayName("๊ณ ๊ฐ ํƒ€์ž…์— ์—†๋Š” ํƒ€์ž…์ด ์ž…๋ ฅ๋˜๋ฉด ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.") + void customerTypeTest(String input) { + assertThatThrownBy(() -> CustomerType.from(input)) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("Input: " + input + ", ์ฐพ์œผ์‹œ๋Š” ๊ณ ๊ฐ ํƒ€์ž…์ด ์—†์Šต๋‹ˆ๋‹ค."); + } + +} diff --git a/src/test/java/com/programmers/springweekly/domain/customer/CustomerTest.java b/src/test/java/com/programmers/springweekly/domain/customer/CustomerTest.java new file mode 100644 index 0000000000..9e9ac29ed7 --- /dev/null +++ b/src/test/java/com/programmers/springweekly/domain/customer/CustomerTest.java @@ -0,0 +1,22 @@ +package com.programmers.springweekly.domain.customer; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.UUID; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + + +public class CustomerTest { + + @Test + @DisplayName("๊ณ ๊ฐ์„ ์ƒ์„ฑํ•œ๋‹ค.") + void createCustomer() { + // given && when + Customer customer = new Customer(UUID.randomUUID(), "changhyeonh", "changhyeon.h@kakao.com", CustomerType.BLACKLIST); + + // then + assertThat(customer).isInstanceOf(Customer.class); + } + +} diff --git a/src/test/java/com/programmers/springweekly/domain/voucher/VoucherTest.java b/src/test/java/com/programmers/springweekly/domain/voucher/VoucherTest.java new file mode 100644 index 0000000000..d5dc7edfb0 --- /dev/null +++ b/src/test/java/com/programmers/springweekly/domain/voucher/VoucherTest.java @@ -0,0 +1,62 @@ +package com.programmers.springweekly.domain.voucher; + +import static org.assertj.core.api.Assertions.assertThat; + +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; + +public class VoucherTest { + + @Test + @DisplayName("ํŒฉํ† ๋ฆฌ์—์„œ ๊ณ ์ • ํ• ์ธ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.") + void createFixedDiscountOfFactory() { + // given && when + Voucher voucher = VoucherFactory.createVoucher(UUID.randomUUID(), VoucherType.FIXED, 1000L); + + // then + assertThat(voucher).isInstanceOf(FixedAmountVoucher.class); + } + + + @ParameterizedTest + @CsvSource(value = {"1000:10000:9000", "2000:3000:1000", "10000:20000:10000"}, delimiter = ':') + @DisplayName("๊ณ ์ • ํ• ์ธ์„ ์ง„ํ–‰ํ•œ๋‹ค.") + void proceedFixedDiscount(long discountAmount, long inputPrice, long expectedDiscount) { + // given + Voucher voucher = new FixedAmountVoucher(UUID.randomUUID(), discountAmount); + + // when + long discountPrice = voucher.discount(inputPrice); + + // then + assertThat(discountPrice).isEqualTo(expectedDiscount); + } + + @Test + @DisplayName("ํŒฉํ† ๋ฆฌ์—์„œ ํผ์„ผํŠธ ํ• ์ธ ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.") + void createPercentDiscountOfFactory() { + // given && when + Voucher voucher = VoucherFactory.createVoucher(UUID.randomUUID(), VoucherType.PERCENT, 100L); + + // then + assertThat(voucher).isInstanceOf(PercentDiscountVoucher.class); + } + + @ParameterizedTest + @CsvSource(value = {"30:9000:6300", "10:10000:9000", "50:20000:10000"}, delimiter = ':') + @DisplayName("ํผ์„ผํŠธ ํ• ์ธ์„ ์ง„ํ–‰ํ•œ๋‹ค.") + void proceedPercentDiscount(long discountAmount, long inputPrice, long expectedDiscount) { + // given + Voucher voucher = new PercentDiscountVoucher(UUID.randomUUID(), discountAmount); + + // when + long discountPrice = voucher.discount(inputPrice); + + // then + assertThat(discountPrice).isEqualTo(expectedDiscount); + } + +} diff --git a/src/test/java/com/programmers/springweekly/repository/customer/FileCustomerRepositoryTest.java b/src/test/java/com/programmers/springweekly/repository/customer/FileCustomerRepositoryTest.java new file mode 100644 index 0000000000..b7d05efa25 --- /dev/null +++ b/src/test/java/com/programmers/springweekly/repository/customer/FileCustomerRepositoryTest.java @@ -0,0 +1,58 @@ +package com.programmers.springweekly.repository.customer; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.programmers.springweekly.domain.customer.Customer; +import com.programmers.springweekly.domain.customer.CustomerType; +import java.util.List; +import java.util.UUID; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +@ActiveProfiles("test") +@SpringBootTest(classes = {FileCustomerRepository.class}) +class FileCustomerRepositoryTest { + + @Autowired + private FileCustomerRepository customerRepository; + + @Test + @DisplayName("๋ธ”๋ž™ ๋ฆฌ์ŠคํŠธ ๋ช…๋‹จ์„ ์ •์ƒ์ ์œผ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.") + void getBlacklistOfFileRepository() { + // given + UUID customer1UUID = UUID.fromString("1927f6b6-55bf-4f1f-d6e2-043198833df7"); + UUID customer2UUID = UUID.fromString("80f4ef40-1a44-4ef2-9c8d-714ff0c8353e"); + UUID customer3UUID = UUID.fromString("202e65fe-bdd2-4f0b-db43-307d5c24ad4a"); + + List expectBlacklist = List.of( + Customer.builder() + .customerId(customer1UUID) + .customerName("changhyeon") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(), + Customer.builder() + .customerId(customer2UUID) + .customerName("changhyeon1") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(), + Customer.builder() + .customerId(customer3UUID) + .customerName("changhyeon2") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build() + ); + + // when + List actualBlacklist = customerRepository.getBlackList(); + + // then + assertThat(actualBlacklist).usingRecursiveFieldByFieldElementComparator().isEqualTo(expectBlacklist); + } + +} diff --git a/src/test/java/com/programmers/springweekly/repository/customer/JdbcTemplateCustomerRepositoryTest.java b/src/test/java/com/programmers/springweekly/repository/customer/JdbcTemplateCustomerRepositoryTest.java new file mode 100644 index 0000000000..0db1397370 --- /dev/null +++ b/src/test/java/com/programmers/springweekly/repository/customer/JdbcTemplateCustomerRepositoryTest.java @@ -0,0 +1,242 @@ +package com.programmers.springweekly.repository.customer; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.programmers.springweekly.domain.customer.Customer; +import com.programmers.springweekly.domain.customer.CustomerType; +import com.programmers.springweekly.dto.customer.request.CustomerUpdateRequest; +import java.util.List; +import java.util.UUID; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +@ActiveProfiles("test") +@SpringBootTest +@Transactional +class JdbcTemplateCustomerRepositoryTest { + + @Autowired + private JdbcTemplateCustomerRepository jdbcTemplateCustomerRepository; + + @Test + @DisplayName("๊ณ ๊ฐ์„ ์ƒ์„ฑํ•˜์—ฌ ์ €์žฅํ•œ๋‹ค.") + void save() { + // given + Customer customerExpect = Customer.builder() + .customerId(UUID.randomUUID()) + .customerName("changhyeon") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + // when + Customer customerActual = jdbcTemplateCustomerRepository.save(customerExpect); + + // then + assertThat(customerActual).isEqualTo(customerExpect); + } + + @Test + @DisplayName("๊ณ ๊ฐ์„ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.") + void update() { + // given + Customer customer = Customer.builder() + .customerId(UUID.randomUUID()) + .customerName("changhyeon") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + CustomerUpdateRequest customerUpdateRequest = CustomerUpdateRequest.builder() + .customerId(customer.getCustomerId()) + .customerName("hong") + .customerEmail("hong@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + Customer customerExpect = Customer.builder() + .customerId(customer.getCustomerId()) + .customerName(customerUpdateRequest.getCustomerName()) + .customerEmail(customerUpdateRequest.getCustomerEmail()) + .customerType(customerUpdateRequest.getCustomerType()) + .build(); + + // when + jdbcTemplateCustomerRepository.save(customer); + jdbcTemplateCustomerRepository.update(customerExpect); + Customer customerActual = jdbcTemplateCustomerRepository.findById(customerExpect.getCustomerId()).get(); + + // then + assertThat(customerActual).usingRecursiveComparison().isEqualTo(customerExpect); + } + + @Test + @DisplayName("ํŠน์ • ๊ณ ๊ฐ์„ ์กฐํšŒํ•œ๋‹ค.") + void findById() { + // given + Customer customerExpect = Customer.builder() + .customerId(UUID.randomUUID()) + .customerName("changhyeon") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + // when + jdbcTemplateCustomerRepository.save(customerExpect); + + Customer customerActual = jdbcTemplateCustomerRepository.findById(customerExpect.getCustomerId()).get(); + + // then + assertThat(customerActual).usingRecursiveComparison().isEqualTo(customerExpect); + } + + @Test + @DisplayName("๋ชจ๋“  ๊ณ ๊ฐ์„ ์กฐํšŒํ•œ๋‹ค.") + void findAll() { + // given + Customer customer1 = Customer.builder() + .customerId(UUID.randomUUID()) + .customerName("changhyeon") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + Customer customer2 = Customer.builder() + .customerId(UUID.randomUUID()) + .customerName("hong") + .customerEmail("hong@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + List customerListExpect = List.of( + customer1, + customer2 + ); + + // when + jdbcTemplateCustomerRepository.save(customer1); + jdbcTemplateCustomerRepository.save(customer2); + + List customerListActual = jdbcTemplateCustomerRepository.findAll(); + + // then + assertThat(customerListActual) + .usingRecursiveFieldByFieldElementComparator() + .isEqualTo(customerListExpect); + } + + @Test + @DisplayName("๊ณ ๊ฐ์ค‘ ํƒ€์ž…์ด ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ์ธ ๊ณ ๊ฐ์„ ์กฐํšŒํ•œ๋‹ค.") + void getBlackList() { + // given + Customer customer1 = Customer.builder() + .customerId(UUID.randomUUID()) + .customerName("changhyeon") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.NORMAL) + .build(); + + Customer customer2 = Customer.builder() + .customerId(UUID.randomUUID()) + .customerName("hong") + .customerEmail("hong@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + Customer customer3 = Customer.builder() + .customerId(UUID.randomUUID()) + .customerName("song") + .customerEmail("song@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + List customerListExpect = List.of( + customer2, + customer3 + ); + + // when + jdbcTemplateCustomerRepository.save(customer1); + jdbcTemplateCustomerRepository.save(customer2); + jdbcTemplateCustomerRepository.save(customer3); + + List customerListActual = jdbcTemplateCustomerRepository.getBlackList(); + + // then + assertThat(customerListActual) + .usingRecursiveFieldByFieldElementComparator() + .isEqualTo(customerListExpect); + } + + @Test + @DisplayName("๊ณ ๊ฐ์„ ์ฐพ์•„ ์ €์žฅ์†Œ์—์„œ ์‚ญ์ œํ•œ๋‹ค.") + void deleteById() { + // given + Customer customer1 = Customer.builder() + .customerId(UUID.randomUUID()) + .customerName("changhyeon") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.NORMAL) + .build(); + + Customer customer2 = Customer.builder() + .customerId(UUID.randomUUID()) + .customerName("hong") + .customerEmail("hong@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + Customer customer3 = Customer.builder() + .customerId(UUID.randomUUID()) + .customerName("song") + .customerEmail("song@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + // when + jdbcTemplateCustomerRepository.save(customer1); + jdbcTemplateCustomerRepository.save(customer2); + jdbcTemplateCustomerRepository.save(customer3); + + // then + jdbcTemplateCustomerRepository.deleteById(customer1.getCustomerId()); + } + + @Test + @DisplayName("์ €์žฅ์†Œ์—์„œ ๋ชจ๋“  ๊ณ ๊ฐ์„ ์‚ญ์ œํ•œ๋‹ค") + void deleteAll() { + // given + Customer customer1 = Customer.builder() + .customerId(UUID.randomUUID()) + .customerName("changhyeon") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.NORMAL) + .build(); + + Customer customer2 = Customer.builder() + .customerId(UUID.randomUUID()) + .customerName("hong") + .customerEmail("hong@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + Customer customer3 = Customer.builder() + .customerId(UUID.randomUUID()) + .customerName("song") + .customerEmail("song@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + // when + jdbcTemplateCustomerRepository.save(customer1); + jdbcTemplateCustomerRepository.save(customer2); + jdbcTemplateCustomerRepository.save(customer3); + + // then + jdbcTemplateCustomerRepository.deleteAll(); + } + +} diff --git a/src/test/java/com/programmers/springweekly/repository/voucher/FileVoucherRepositoryTest.java b/src/test/java/com/programmers/springweekly/repository/voucher/FileVoucherRepositoryTest.java new file mode 100644 index 0000000000..aa0b6d0c33 --- /dev/null +++ b/src/test/java/com/programmers/springweekly/repository/voucher/FileVoucherRepositoryTest.java @@ -0,0 +1,52 @@ +package com.programmers.springweekly.repository.voucher; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.programmers.springweekly.domain.voucher.FixedAmountVoucher; +import com.programmers.springweekly.domain.voucher.PercentDiscountVoucher; +import com.programmers.springweekly.domain.voucher.Voucher; +import java.util.UUID; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +@ActiveProfiles("test") +@SpringBootTest(classes = {FileVoucherRepository.class}) +public class FileVoucherRepositoryTest { + + @Autowired + private FileVoucherRepository voucherRepository; + + @Test + @DisplayName("ํŒŒ์ผ ์ €์žฅ์†Œ์— ๊ณ ์ • ํ• ์ธ ๋ฐ”์šฐ์ฒ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค.") + void saveFixedVoucherToFileRepository() { + // given + Voucher voucher = new FixedAmountVoucher(UUID.randomUUID(), 1000); + + // when + voucherRepository.save(voucher); + + // then + assertThat(voucherRepository.findAll().get(voucher.getVoucherId())) + .usingRecursiveComparison() + .isEqualTo(voucher); + } + + @Test + @DisplayName("ํŒŒ์ผ ์ €์žฅ์†Œ์— ํผ์„ผํŠธ ํ• ์ธ ๋ฐ”์šฐ์ฒ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค.") + void savePercentVoucherToFileRepository() { + // given + Voucher voucher = new PercentDiscountVoucher(UUID.randomUUID(), 100); + + // when + voucherRepository.save(voucher); + + // then + assertThat(voucherRepository.findAll().get(voucher.getVoucherId())) + .usingRecursiveComparison() + .isEqualTo(voucher); + } + +} diff --git a/src/test/java/com/programmers/springweekly/repository/voucher/JdbcTemplateVoucherRepositoryTest.java b/src/test/java/com/programmers/springweekly/repository/voucher/JdbcTemplateVoucherRepositoryTest.java new file mode 100644 index 0000000000..65e5164226 --- /dev/null +++ b/src/test/java/com/programmers/springweekly/repository/voucher/JdbcTemplateVoucherRepositoryTest.java @@ -0,0 +1,139 @@ +package com.programmers.springweekly.repository.voucher; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.programmers.springweekly.domain.voucher.FixedAmountVoucher; +import com.programmers.springweekly.domain.voucher.PercentDiscountVoucher; +import com.programmers.springweekly.domain.voucher.Voucher; +import java.util.List; +import java.util.UUID; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +@ActiveProfiles("test") +@Transactional +@SpringBootTest +class JdbcTemplateVoucherRepositoryTest { + + @Autowired + VoucherRepository voucherRepository; + + @Test + @DisplayName("๋ฐ”์šฐ์ฒ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.") + void save() { + // given + UUID voucherId1 = UUID.randomUUID(); + UUID voucherId2 = UUID.randomUUID(); + + Voucher voucherExpected1 = new FixedAmountVoucher(voucherId1, 3000); + Voucher voucherExpected2 = new PercentDiscountVoucher(voucherId2, 30); + + // when + voucherRepository.save(voucherExpected1); + voucherRepository.save(voucherExpected2); + Voucher voucherActual1 = voucherRepository.findById(voucherId1).get(); + Voucher voucherActual2 = voucherRepository.findById(voucherId2).get(); + + // then + assertThat(voucherActual1).usingRecursiveComparison().isEqualTo(voucherExpected1); + assertThat(voucherActual2).usingRecursiveComparison().isEqualTo(voucherExpected2); + } + + @Test + @DisplayName("๋ฐ”์šฐ์ฒ˜๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.") + void update() { + // given + UUID voucherId1 = UUID.randomUUID(); + Voucher voucher = new FixedAmountVoucher(voucherId1, 3000); + Voucher voucherExpected1 = new PercentDiscountVoucher(voucher.getVoucherId(), 30); + + // when + voucherRepository.save(voucher); + voucherRepository.update(voucherExpected1); + + Voucher voucherActual1 = voucherRepository.findById(voucher.getVoucherId()).get(); + + // then + assertThat(voucherActual1).usingRecursiveComparison().isEqualTo(voucherExpected1); + } + + @Test + @DisplayName("๋ฐ”์šฐ์ฒ˜ ID๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฐ”์šฐ์ฒ˜๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.") + void findById() { + // given + UUID voucherId1 = UUID.randomUUID(); + + Voucher voucherExpected1 = new FixedAmountVoucher(voucherId1, 3000); + + // when + voucherRepository.save(voucherExpected1); + Voucher voucherActual1 = voucherRepository.findById(voucherId1).get(); + + // then + assertThat(voucherActual1).usingRecursiveComparison().isEqualTo(voucherExpected1); + } + + @Test + @DisplayName("์ €์žฅ๋œ ๋ชจ๋“  ๋ฐ”์šฐ์ฒ˜๋ฅผ ์กฐํšŒํ•œ๋‹ค.") + void findAll() { + // given + UUID voucherId1 = UUID.randomUUID(); + UUID voucherId2 = UUID.randomUUID(); + + Voucher voucherExpected1 = new FixedAmountVoucher(voucherId1, 3000); + Voucher voucherExpected2 = new PercentDiscountVoucher(voucherId2, 30); + + List voucherListExpected = List.of(voucherExpected1, voucherExpected2); + + // when + voucherRepository.save(voucherExpected1); + voucherRepository.save(voucherExpected2); + + List voucherList = voucherRepository.findAll(); + + // then + assertThat(voucherList).usingRecursiveFieldByFieldElementComparator().isEqualTo(voucherListExpected); + } + + @Test + @DisplayName("๋ฐ”์šฐ์ฒ˜ ID๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฐ”์šฐ์ฒ˜๋ฅผ ์‚ญ์ œํ•œ๋‹ค.") + void deleteById() { + // given + UUID voucherId = UUID.randomUUID(); + Voucher voucher = new FixedAmountVoucher(voucherId, 3000); + + // when + voucherRepository.save(voucher); + voucherRepository.deleteById(voucherId); + + // then + assertThatThrownBy(() -> voucherRepository.findById(voucherId)) + .isInstanceOf(EmptyResultDataAccessException.class); + } + + @Test + @DisplayName("๋ฐ”์šฐ์ฒ˜๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•œ๋‹ค.") + void deleteAll() { + // given + UUID voucherId1 = UUID.randomUUID(); + UUID voucherId2 = UUID.randomUUID(); + + Voucher voucherExpected1 = new FixedAmountVoucher(voucherId1, 3000); + Voucher voucherExpected2 = new PercentDiscountVoucher(voucherId2, 30); + + // when + voucherRepository.save(voucherExpected1); + voucherRepository.save(voucherExpected2); + voucherRepository.deleteAll(); + + // then + assertThat(voucherRepository.findAll().size()).isEqualTo(0); + } + +} diff --git a/src/test/java/com/programmers/springweekly/repository/voucher/MemoryVoucherRepositoryTest.java b/src/test/java/com/programmers/springweekly/repository/voucher/MemoryVoucherRepositoryTest.java new file mode 100644 index 0000000000..c79f650499 --- /dev/null +++ b/src/test/java/com/programmers/springweekly/repository/voucher/MemoryVoucherRepositoryTest.java @@ -0,0 +1,74 @@ +package com.programmers.springweekly.repository.voucher; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.programmers.springweekly.domain.voucher.FixedAmountVoucher; +import com.programmers.springweekly.domain.voucher.PercentDiscountVoucher; +import com.programmers.springweekly.domain.voucher.Voucher; +import java.util.List; +import java.util.UUID; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +public class MemoryVoucherRepositoryTest { + + private VoucherRepository voucherRepository; + + @BeforeEach + void createVoucherRepository() { + voucherRepository = new MemoryVoucherRepository(); + } + + @Test + @DisplayName("๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ์†Œ์— ๊ณ ์ • ํ• ์ธ ๋ฐ”์šฐ์ฒ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค.") + void saveFixedVoucherToMemoryRepository() { + // given + UUID voucherId = UUID.randomUUID(); + Voucher voucher = new FixedAmountVoucher(voucherId, 1000); + + // when + voucherRepository.save(voucher); + + // then + assertThat(voucherRepository.findById(voucherId).get()) + .usingRecursiveComparison().isEqualTo(voucher); + } + + @Test + @DisplayName("๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ์†Œ์— ํผ์„ผํŠธ ํ• ์ธ ๋ฐ”์šฐ์ฒ˜๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋“ฑ๋ก๋œ๋‹ค.") + void savePercentVoucherToMemoryRepository() { + // given + UUID voucherId = UUID.randomUUID(); + Voucher voucher = new PercentDiscountVoucher(voucherId, 100); + + // when + voucherRepository.save(voucher); + + // then + assertThat(voucherRepository.findById(voucherId).get()) + .usingRecursiveComparison().isEqualTo(voucher); + } + + @Test + @DisplayName("๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ์†Œ์— ์—ฌ๋Ÿฌ ๋ฐ”์šฐ์ฒ˜๋ฅผ ๋“ฑ๋กํ–ˆ์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ๋ฐ”์šฐ์ฒ˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.") + void getVoucherList() { + // given + Voucher voucher1 = new FixedAmountVoucher(UUID.randomUUID(), 1000); + Voucher voucher2 = new FixedAmountVoucher(UUID.randomUUID(), 500); + Voucher voucher3 = new PercentDiscountVoucher(UUID.randomUUID(), 50); + Voucher voucher4 = new PercentDiscountVoucher(UUID.randomUUID(), 30); + + List vouchers = List.of(voucher1, voucher2, voucher3, voucher4); + + // when + voucherRepository.save(voucher1); + voucherRepository.save(voucher2); + voucherRepository.save(voucher3); + voucherRepository.save(voucher4); + + // then + assertThat(voucherRepository.findAll()).contains(voucher1, voucher2, voucher3, voucher4); + } + +} diff --git a/src/test/java/com/programmers/springweekly/service/customer/CustomerServiceTest.java b/src/test/java/com/programmers/springweekly/service/customer/CustomerServiceTest.java new file mode 100644 index 0000000000..cea8e7fedf --- /dev/null +++ b/src/test/java/com/programmers/springweekly/service/customer/CustomerServiceTest.java @@ -0,0 +1,189 @@ +package com.programmers.springweekly.service.customer; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.programmers.springweekly.domain.customer.CustomerType; +import com.programmers.springweekly.dto.customer.request.CustomerCreateRequest; +import com.programmers.springweekly.dto.customer.request.CustomerUpdateRequest; +import com.programmers.springweekly.dto.customer.response.CustomerListResponse; +import com.programmers.springweekly.dto.customer.response.CustomerResponse; +import com.programmers.springweekly.service.CustomerService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +@ActiveProfiles("test") +@Transactional +@SpringBootTest +public class CustomerServiceTest { + + @Autowired + private CustomerService customerService; + + @Test + void save() { + // given + CustomerCreateRequest customerCreateRequest = CustomerCreateRequest.builder() + .customerName("changhyeon") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + customerService.save(customerCreateRequest); + + // when + CustomerListResponse customerListAfter = customerService.findAll(); + + // then + assertThat(customerListAfter.getCustomerList().size()).isEqualTo(1); + } + + @Test + void update() { + // given + CustomerCreateRequest customerCreateRequest = CustomerCreateRequest.builder() + .customerName("changhyeon") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + customerService.save(customerCreateRequest); + CustomerListResponse customerList = customerService.findAll(); + CustomerResponse beforeCustomer = customerList.getCustomerList().get(0); + CustomerUpdateRequest customerUpdateRequest = CustomerUpdateRequest.builder() + .customerId(beforeCustomer.getCustomerId()) + .customerName("changhyeonh") + .customerEmail("changhyeon.h1@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + // when + customerService.update(customerUpdateRequest); + customerList = customerService.findAll(); + CustomerResponse afterCustomer = customerList.getCustomerList().get(0); + + // then + assertThat(beforeCustomer).usingRecursiveComparison().isNotEqualTo(afterCustomer); + } + + @Test + void finaAll() { + // given + CustomerCreateRequest customerCreateRequest1 = CustomerCreateRequest.builder() + .customerName("changhyeon") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + CustomerCreateRequest customerCreateRequest2 = CustomerCreateRequest.builder() + .customerName("dong") + .customerEmail("dong.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + CustomerCreateRequest customerCreateRequest3 = CustomerCreateRequest.builder() + .customerName("yang") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + customerService.save(customerCreateRequest1); + customerService.save(customerCreateRequest2); + customerService.save(customerCreateRequest3); + + // when + CustomerListResponse customerList = customerService.findAll(); + + // then + assertThat(customerList.getCustomerList().size()).isEqualTo(3); + } + + @Test + void getBlackList() { + // given + CustomerCreateRequest customerCreateRequest1 = CustomerCreateRequest.builder() + .customerName("changhyeon") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.NORMAL) + .build(); + + CustomerCreateRequest customerCreateRequest2 = CustomerCreateRequest.builder() + .customerName("dong") + .customerEmail("dong.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + CustomerCreateRequest customerCreateRequest3 = CustomerCreateRequest.builder() + .customerName("yang") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + customerService.save(customerCreateRequest1); + customerService.save(customerCreateRequest2); + customerService.save(customerCreateRequest3); + + // when + CustomerListResponse customerList = customerService.getBlackList(); + + // then + assertThat(customerList.getCustomerList().size()).isEqualTo(2); + } + + @Test + void deleteById() { + // given + CustomerCreateRequest customerCreateRequest = CustomerCreateRequest.builder() + .customerName("changhyeon") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + customerService.save(customerCreateRequest); + + CustomerListResponse customerListBefore = customerService.findAll(); + + // when + customerService.deleteById(customerListBefore.getCustomerList().get(0).getCustomerId()); + CustomerListResponse customerListAfter = customerService.findAll(); + + // then + assertThat(customerListAfter.getCustomerList().size()).isEqualTo(0); + } + + @Test + void deleteAll() { + // given + CustomerCreateRequest customerCreateRequest1 = CustomerCreateRequest.builder() + .customerName("changhyeon") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.NORMAL) + .build(); + + CustomerCreateRequest customerCreateRequest2 = CustomerCreateRequest.builder() + .customerName("dong") + .customerEmail("dong.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + CustomerCreateRequest customerCreateRequest3 = CustomerCreateRequest.builder() + .customerName("yang") + .customerEmail("changhyeon.h@kakao.com") + .customerType(CustomerType.BLACKLIST) + .build(); + + customerService.save(customerCreateRequest1); + customerService.save(customerCreateRequest2); + customerService.save(customerCreateRequest3); + + // when + customerService.deleteAll(); + CustomerListResponse customerListAfter = customerService.findAll(); + + // then + assertThat(customerListAfter.getCustomerList().size()).isEqualTo(0); + } + +} diff --git a/src/test/java/com/programmers/springweekly/service/customer/CustomerServiceUnitTest.java b/src/test/java/com/programmers/springweekly/service/customer/CustomerServiceUnitTest.java new file mode 100644 index 0000000000..7da54eb9c0 --- /dev/null +++ b/src/test/java/com/programmers/springweekly/service/customer/CustomerServiceUnitTest.java @@ -0,0 +1,113 @@ +package com.programmers.springweekly.service.customer; + +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.then; +import static org.mockito.BDDMockito.willDoNothing; +import static org.mockito.Mockito.times; + +import com.programmers.springweekly.domain.customer.Customer; +import com.programmers.springweekly.domain.customer.CustomerType; +import com.programmers.springweekly.dto.customer.request.CustomerUpdateRequest; +import com.programmers.springweekly.repository.customer.CustomerRepository; +import com.programmers.springweekly.service.CustomerService; +import java.util.List; +import java.util.Optional; +import java.util.UUID; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +@ExtendWith(MockitoExtension.class) +public class CustomerServiceUnitTest { + + @Mock + CustomerRepository customerRepository; + + @InjectMocks + CustomerService customerService; + + @Test + void update() { + // given + UUID uuid = UUID.randomUUID(); + Customer customer = new Customer(uuid, "changhyeon", "changhyeon.h@kakao.com", CustomerType.BLACKLIST); + CustomerUpdateRequest customerUpdateRequest = new CustomerUpdateRequest(uuid, "changhyeon", "changhyeon.h@kakao.com", CustomerType.BLACKLIST); + + willDoNothing().given(customerRepository).update(customer); + } + + @Test + void findById() { + // given + Customer customer = new Customer(UUID.randomUUID(), "changhyeon", "changhyeon.h@kakao.com", CustomerType.BLACKLIST); + + given(customerRepository.findById(customer.getCustomerId())) + .willReturn(Optional.of(customer)); + + // when + customerService.findById(customer.getCustomerId()); + + // then + then(customerRepository).should(times(1)).findById(customer.getCustomerId()); + } + + @Test + void finaAll() { + // given + Customer customer1 = new Customer(UUID.randomUUID(), "changhyeon1", "changhyeon.h@kakao.com", CustomerType.BLACKLIST); + Customer customer2 = new Customer(UUID.randomUUID(), "changhyeon2", "changhyeon.h@kakao.com", CustomerType.BLACKLIST); + + given(customerRepository.findAll()) + .willReturn(List.of(customer1, customer2)); + + // when + customerService.findAll(); + + // then + then(customerRepository).should(times(1)).findAll(); + } + + + @Test + void getBlackList() { + // given + Customer customer1 = new Customer(UUID.randomUUID(), "changhyeon1", "changhyeon.h@kakao.com", CustomerType.BLACKLIST); + Customer customer2 = new Customer(UUID.randomUUID(), "changhyeon2", "changhyeon.h@kakao.com", CustomerType.BLACKLIST); + + given(customerRepository.getBlackList()) + .willReturn(List.of(customer1, customer2)); + + // when + customerService.getBlackList(); + + // then + then(customerRepository).should(times(1)).getBlackList(); + } + + @Test + void deleteById() { + // given + Customer customer = new Customer(UUID.randomUUID(), "changhyeon", "changhyeon.h@kakao.com", CustomerType.BLACKLIST); + willDoNothing().given(customerRepository).deleteById(customer.getCustomerId()); + + // when + customerService.deleteById(customer.getCustomerId()); + + // then + then(customerRepository).should(times(1)).deleteById(customer.getCustomerId()); + } + + @Test + void deleteAll() { + // given + willDoNothing().given(customerRepository).deleteAll(); + + // when + customerService.deleteAll(); + + // then + then(customerRepository).should(times(1)).deleteAll(); + } +} diff --git a/src/test/java/com/programmers/springweekly/service/voucher/VoucherServiceTest.java b/src/test/java/com/programmers/springweekly/service/voucher/VoucherServiceTest.java new file mode 100644 index 0000000000..c1530514ff --- /dev/null +++ b/src/test/java/com/programmers/springweekly/service/voucher/VoucherServiceTest.java @@ -0,0 +1,123 @@ +package com.programmers.springweekly.service.voucher; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.programmers.springweekly.domain.voucher.VoucherType; +import com.programmers.springweekly.dto.voucher.request.VoucherCreateRequest; +import com.programmers.springweekly.dto.voucher.request.VoucherUpdateRequest; +import com.programmers.springweekly.dto.voucher.response.VoucherListResponse; +import com.programmers.springweekly.dto.voucher.response.VoucherResponse; +import com.programmers.springweekly.service.VoucherService; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.test.context.ActiveProfiles; +import org.springframework.transaction.annotation.Transactional; + +@ActiveProfiles("test") +@Transactional +@SpringBootTest +public class VoucherServiceTest { + + @Autowired + private VoucherService voucherService; + + @Test + @DisplayName("๋ฐ”์šฐ์ฒ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.") + void save() { + // given + VoucherCreateRequest voucherExpected = new VoucherCreateRequest(3000, VoucherType.FIXED); + + // when + voucherService.save(voucherExpected); + VoucherListResponse voucherActual = voucherService.findAll(); + + // then + assertThat(voucherActual.getVoucherList().get(0).getDiscountAmount()).isEqualTo(3000); + } + + @Test + @DisplayName("๋ฐ”์šฐ์ฒ˜๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.") + void update() { + // given + VoucherCreateRequest voucher = new VoucherCreateRequest(3000, VoucherType.FIXED); + voucherService.save(voucher); + VoucherListResponse voucherList = voucherService.findAll(); + + // when + voucherService.update(new VoucherUpdateRequest(voucherList.getVoucherList().get(0).getVoucherId(), 1000, VoucherType.PERCENT)); + VoucherListResponse voucherListUpdated = voucherService.findAll(); + + // then + assertThat(voucherListUpdated.getVoucherList().get(0).getDiscountAmount()).isEqualTo(1000); + } + + @Test + @DisplayName("๋ฐ”์šฐ์ฒ˜ ID๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฐ”์šฐ์ฒ˜๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.") + void findById() { + // given + VoucherCreateRequest voucher = new VoucherCreateRequest(3000, VoucherType.FIXED); + voucherService.save(voucher); + VoucherListResponse voucherList = voucherService.findAll(); + + // when + VoucherResponse voucherActual = voucherService.findById(voucherList.getVoucherList().get(0).getVoucherId()); + + // then + assertThat(voucherActual.getDiscountAmount()).isEqualTo(3000); + } + + @Test + @DisplayName("๋ฐ”์šฐ์ฒ˜๋ฅผ ๋ชจ๋‘ ์กฐํšŒํ•œ๋‹ค.") + void getVoucherList() { + // given + VoucherCreateRequest voucher1 = new VoucherCreateRequest(3000, VoucherType.FIXED); + VoucherCreateRequest voucher2 = new VoucherCreateRequest(2000, VoucherType.PERCENT); + voucherService.save(voucher1); + voucherService.save(voucher2); + + // when + VoucherListResponse voucherList = voucherService.findAll(); + + // then + assertThat(voucherList.getVoucherList().get(0).getDiscountAmount()).isEqualTo(3000); + assertThat(voucherList.getVoucherList().get(1).getDiscountAmount()).isEqualTo(2000); + } + + @Test + @DisplayName("๋ฐ”์šฐ์ฒ˜ ID๋ฅผ ๊ฐ€์ง€๊ณ  ๋ฐ”์šฐ์ฒ˜๋ฅผ ์‚ญ์ œํ•œ๋‹ค.") + void deleteById() { + // given + VoucherCreateRequest voucher = new VoucherCreateRequest(3000, VoucherType.FIXED); + voucherService.save(voucher); + VoucherListResponse voucherList = voucherService.findAll(); + + // when + voucherService.deleteById(voucherList.getVoucherList().get(0).getVoucherId()); + + // then + assertThatThrownBy(() -> voucherService.findById(voucherList.getVoucherList().get(0).getVoucherId())) + .isInstanceOf(EmptyResultDataAccessException.class); + } + + @Test + @DisplayName("๋ฐ”์šฐ์ฒ˜๋ฅผ ๋ชจ๋‘ ์‚ญ์ œํ•œ๋‹ค.") + void deleteAll() { + // given + VoucherCreateRequest voucher1 = new VoucherCreateRequest(3000, VoucherType.FIXED); + VoucherCreateRequest voucher2 = new VoucherCreateRequest(2000, VoucherType.PERCENT); + + voucherService.save(voucher1); + voucherService.save(voucher2); + + // when + voucherService.deleteAll(); + + // then + assertThat(voucherService.findAll().getVoucherList().size()).isEqualTo(0); + } + +} diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml new file mode 100644 index 0000000000..7ccd19cfe5 --- /dev/null +++ b/src/test/resources/application.yml @@ -0,0 +1,18 @@ +spring: + config: + activate: + on-profile: test + datasource: + driverClassName: org.h2.Driver + url: jdbc:h2:mem:test + username: sa + password: + sql: + init: + mode: always + +file: + voucher: + path: ./file/voucher_list.csv + customer: + path: ./file/customer_blacklist.csv