Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[4기 - 박세연] SpringBoot Part3 2차 Weekly Mission 제출합니다. #863

Open
wants to merge 28 commits into
base: parksey
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
5460df5
feat: 회원 생성 및 조회에 대한 매핑 추가 및 웹 페이지 추가
parksey Jul 11, 2023
6243aca
feat: 메인 페이지 및 회원 페이지 추가
parksey Jul 11, 2023
f2c490a
feat: 회원 조회 web기능 추가
parksey Jul 13, 2023
a908e82
feat: 회원 삭제 및 전체 삭제 controller 추가
parksey Jul 13, 2023
8e3e18c
feat: 회원 이메일 업데이트 controller 추가
parksey Jul 13, 2023
ac70f27
feat: 회원 생성 api 생성 및 getResult메서드명 javaBeans에 맞지 않게 변경
parksey Jul 13, 2023
c7a949e
feat: 회원에 대한 CRUD API 추가
parksey Jul 13, 2023
0a9e25d
feat: Voucher web controller 기능 추가
parksey Jul 13, 2023
c9db3f9
feat: Voucher webcontroller 예외 기능 추가
parksey Jul 14, 2023
cff3b44
refactor: 불필요한 공백 및 메서드 순서 변경
parksey Jul 14, 2023
e154848
feat: voucher API 기능 추가
parksey Jul 14, 2023
072cd33
refactor: test의 순서 의존성 삭제
parksey Jul 14, 2023
aca8a39
refactor: voucherManagementController에서 if문을 swtich로 변경
parksey Jul 14, 2023
9c78b83
feat: 오해의 여지가 있는 response 인터페이스 삭제
parksey Jul 14, 2023
e33500e
refactor: 불필요한 코드 공백 제거
parksey Jul 14, 2023
e4c42e8
feat: SystemWriter implement 추가
parksey Jul 14, 2023
a14465a
feat: 객체 생성 및 예외처리 하는 of메서드 -> 생성자 내부에서 예외 처리 하도록 변경
parksey Jul 14, 2023
3ebef70
feat: JDBC customer 저장소 row값들 지우는 메서드 변경
parksey Jul 14, 2023
4a0f1be
refactor: db schema위치 변경 및 docker-compose추가
parksey Jul 14, 2023
e5b4db1
feat: docker-compose 스키마 파일과 데이터 파일 병합
parksey Jul 14, 2023
065a19b
feat: ExceptionMessage enum 클래스 -> ExceptionCode로 클래스명 변경 및 상태코드 추가, …
parksey Jul 14, 2023
26ab28d
refactor: ApiAdvisor -> APIExceptionHandler로 클래스명 변경, 잘못된 메서드명 변경, 반환…
parksey Jul 14, 2023
b202949
refactor: 클래스 컨벤션 추가
parksey Jul 15, 2023
0422b7e
refactor: 메서드명 오타 변경
parksey Jul 20, 2023
28a3116
refactor: api, web 및 util의 패키지 구조 변경
parksey Jul 24, 2023
e3a8a72
feat: Restful한 현식에 맞는 URL 및 메서드 변환
parksey Jul 24, 2023
0aa932a
test: Voucher 및 Customer에 대한 service 테스트 코드 작성 및 테스트 오류 수정
parksey Jul 24, 2023
1b51c5d
fix: static과 final의 위치 변경
parksey Jul 25, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -135,3 +135,5 @@ buildNumber.properties
.classpath

# End of https://www.toptal.com/developers/gitignore/api/java,intellij+all,maven

docker/database
31 changes: 31 additions & 0 deletions docker/db-init/schema.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
DROP TABLE IF EXISTS customers;
CREATE TABLE customers
(
customer_id BINARY(16) PRIMARY KEY,
name varchar(20) NOT NULL,
email varchar(50) NOT NULL,
create_at datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP (6),
CONSTRAINT unq_user_email UNIQUE (email)
);

INSERT INTO customers(customer_id, name, email)
VALUES (uuid_to_bin(UUID()), 'tester00', 'test00@gmail.com'),
(uuid_to_bin(UUID()), 'tester01', 'test01@gmail.com'),
(uuid_to_bin(UUID()), 'tester02', 'test02@gmail.com');



DROP TABLE IF EXISTS vouchers;
CREATE TABLE vouchers
(
voucher_id BINARY(16) PRIMARY KEY,
amount bigint NOT NULL,
discount enum('FIXED', 'PERCENT') NOT NULL,
registration_date datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP (6),
expiration_date datetime(6) NOT NULL
);

INSERT INTO vouchers (voucher_id, amount, discount, expiration_date)
VALUES (uuid_to_bin(UUID()), 50, 'PERCENT', DATE_ADD(CURRENT_TIMESTAMP(6), INTERVAL 7 DAY)),
(uuid_to_bin(UUID()), 100000, 'FIXED', DATE_ADD(CURRENT_TIMESTAMP(6), INTERVAL 7 DAY)),
(uuid_to_bin(UUID()), 80, 'PERCENT', DATE_ADD(CURRENT_TIMESTAMP(6), INTERVAL 7 DAY));
21 changes: 21 additions & 0 deletions docker/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
version: "3.7"

services:
vacation-db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: "qwe123"
MYSQL_DATABASE: "voucher_mgmt"
MYSQL_USER: "test"
MYSQL_PASSWORD: "test"
TZ: Asia/Seoul
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- ./db-init:/docker-entrypoint-initdb.d
- ./database/datadir/:/var/lib/mysql
platform: linux/x86_64
ports:
- 3306:3306
29 changes: 26 additions & 3 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@
<groupId>org.weekly</groupId>
<artifactId>weekly</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>weekly</name>
<name>weekly</name>21
<packaging>war</packaging>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
</properties>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
Expand All @@ -35,7 +35,23 @@
</dependency>

<dependency>
<groupId>mysql</groupId>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
` <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
Expand All @@ -58,6 +74,13 @@
<version>1.18.3</version>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
</dependency>


</dependencies>


Expand Down
10 changes: 5 additions & 5 deletions src/main/java/org/weekly/weekly/VoucherManageApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@

@SpringBootApplication
public class VoucherManageApplication {
public static void main(String[] args) {

ApplicationContext context = SpringApplication.run(VoucherManageApplication.class, args);
context.getBean(VoucherManagementController.class).start();
}
}
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(VoucherManageApplication.class, args);
context.getBean(VoucherManagementController.class).start();
}
}
114 changes: 39 additions & 75 deletions src/main/java/org/weekly/weekly/VoucherManagementController.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@
import org.weekly.weekly.customer.dto.request.CustomerUpdateRequest;
import org.weekly.weekly.customer.dto.response.CustomerResponse;
import org.weekly.weekly.customer.dto.response.CustomersResponse;
import org.weekly.weekly.global.util.CustomerMenu;
import org.weekly.weekly.global.util.ManageMenu;
import org.weekly.weekly.global.util.PrintMessageType;
import org.weekly.weekly.global.util.VoucherMenu;
import org.weekly.weekly.ui.CommandLineApplication;
import org.weekly.weekly.util.CustomerMenu;
import org.weekly.weekly.util.ManageMenu;
import org.weekly.weekly.util.PrintMessageType;
import org.weekly.weekly.util.VoucherMenu;
import org.weekly.weekly.voucher.controller.VoucherController;
import org.weekly.weekly.voucher.dto.Response;
import org.weekly.weekly.voucher.dto.request.VoucherCreationRequest;

import java.util.List;
import org.weekly.weekly.voucher.dto.response.VoucherCreationResponse;
import org.weekly.weekly.voucher.dto.response.VouchersResponse;

@Component
public class VoucherManagementController {

private final Logger logger = LoggerFactory.getLogger(VoucherManagementController.class);
private final CommandLineApplication commandLineApplication;
private final VoucherController voucherController;
Expand All @@ -33,98 +33,63 @@ public VoucherManagementController(CommandLineApplication commandLineApplication
}

public void start() {
boolean isExit = false;
boolean isRunning = true;

while(!isExit) {
while (isRunning) {
try {
ManageMenu manageMenu = commandLineApplication.readManageMenu();
isExit = processManageMenuSelection(manageMenu);
isRunning = processManageMenuSelection(manageMenu);
} catch (RuntimeException runtimeException) {
commandLineApplication.printErrorMsg(runtimeException.getMessage());
}
}
}

private boolean processManageMenuSelection(ManageMenu manageMenu) {
if (ManageMenu.EXIT.equals(manageMenu)) {
return true;
}

if (ManageMenu.VOUCHER.equals(manageMenu)) {
VoucherMenu voucherMenu = commandLineApplication.readVoucherMenu();
processVoucherMenuSelection(voucherMenu);
return false;
}

if (ManageMenu.CUSTOMER.equals(manageMenu)){
CustomerMenu customerMenu = commandLineApplication.readCustomerMenu();
processCustomerMenuSelection(customerMenu);
return false;
}

return true;
return switch (manageMenu) {
case VOUCHER -> {
VoucherMenu voucherMenu = commandLineApplication.readVoucherMenu();
processVoucherMenuSelection(voucherMenu);
yield false;
}
case CUSTOMER -> {
CustomerMenu customerMenu = commandLineApplication.readCustomerMenu();
processCustomerMenuSelection(customerMenu);
yield false;
}
default -> true;
};
}

private boolean processVoucherMenuSelection(VoucherMenu selectMenu) {
if (VoucherMenu.CREATE.equals(selectMenu)) {
handleVoucherCreation();
return false;
}

if (VoucherMenu.LIST.equals(selectMenu)) {
handleVoucherSearch();
return false;
private void processVoucherMenuSelection(VoucherMenu selectMenu) {
switch (selectMenu) {
case CREATE -> handleVoucherCreation();
case LIST -> handleVoucherSearch();
}


return true;
}

private void handleVoucherCreation() {
VoucherCreationRequest voucherCreationRequest = commandLineApplication.createVoucherFromInput();
Response response = voucherController.createVoucher(voucherCreationRequest);
logger.info("{}{}", PrintMessageType.CREATE_VOUCHER_SUCCESS.getMessage(),response.getResult());
VoucherCreationResponse response = voucherController.createVoucher(voucherCreationRequest);
logger.info("{}{}", PrintMessageType.CREATE_VOUCHER_SUCCESS.getMessage(), response.result());
commandLineApplication.printResult(response);
}

private void handleVoucherSearch() {
Response response = voucherController.getVouchers();
logger.info("{}{}", PrintMessageType.FIND_ALL_VOUCHER_SUCCESS.getMessage(), response.getResult());
VouchersResponse response = voucherController.getVouchers();
logger.info("{}{}", PrintMessageType.FIND_ALL_VOUCHER_SUCCESS.getMessage(), response.result());
commandLineApplication.printResult(response);
}

private boolean processCustomerMenuSelection(CustomerMenu selectMenu) {
if (CustomerMenu.CREATE.equals(selectMenu)) {
handleCustomerCreation();
return false;
private void processCustomerMenuSelection(CustomerMenu selectMenu) {
switch (selectMenu) {
case CREATE -> handleCustomerCreation();
case DELETE -> handleCustomerDelete();
case DELETE_ALL -> handleCustomerDeleteAll();
case FIND_ALL -> handleCustomerFindAll();
case FIND_DETAIL -> handleFindDetail();
case UPDATE -> handleUpdateCustomer();
}

if (CustomerMenu.DELETE.equals(selectMenu)) {
handleCustomerDelete();
return false;
}

if (CustomerMenu.DELETE_ALL.equals(selectMenu)) {
handleCustomerDeleteAll();
return false;
}

if (CustomerMenu.FIND_ALL.equals(selectMenu)) {
handleCustomerFindAll();
return false;
}

if (CustomerMenu.FIND_DETAIL.equals(selectMenu)) {
handleFindDetail();
return false;
}

if (CustomerMenu.UPDATE.equals(selectMenu)) {
handleUpdateCustomer();
return false;
}

return true;
}

private void handleCustomerCreation() {
Expand Down Expand Up @@ -160,5 +125,4 @@ private void handleUpdateCustomer() {
CustomerResponse customerResponse = customerController.updateCustomer(customerUpdateRequest);
commandLineApplication.printResult(customerResponse);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
import org.weekly.weekly.customer.dto.response.CustomersResponse;
import org.weekly.weekly.customer.service.CustomerService;

import java.util.List;

@Controller
public class CustomerController {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package org.weekly.weekly.customer.controller.api;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.weekly.weekly.customer.dto.request.CustomerCreationRequest;
import org.weekly.weekly.customer.dto.request.CustomerUpdateRequest;
import org.weekly.weekly.customer.dto.response.CustomerResponse;
import org.weekly.weekly.customer.dto.response.CustomersResponse;
import org.weekly.weekly.customer.service.CustomerService;

import java.util.List;

@RestController
@RequestMapping("/api/v1/customers")
public class CustomerAPIController {

private final CustomerService customerService;

public CustomerAPIController(CustomerService customerService) {
this.customerService = customerService;
}

@PostMapping
public ResponseEntity<CustomerResponse> create(@RequestBody CustomerCreationRequest creationRequest) {
CustomerResponse customerResponse = customerService.createCustomer(creationRequest);
return new ResponseEntity<>(customerResponse, HttpStatus.CREATED);
}

@GetMapping
public ResponseEntity<List<CustomerResponse>> customers() {
CustomersResponse customersResponse = customerService.findAllCustomer();
return new ResponseEntity<>(customersResponse.getCustomerResponses(), HttpStatus.OK);
}

@GetMapping("/{customerEmail}")
public ResponseEntity<CustomerResponse> findCustomer(@PathVariable String customerEmail) {
CustomerResponse customerResponse = customerService.findDetailCustomer(customerEmail);
return new ResponseEntity<>(customerResponse, HttpStatus.OK);
}

@PatchMapping
public ResponseEntity<CustomerResponse> updateCustomer(@RequestBody CustomerUpdateRequest customerUpdateRequest) {
CustomerResponse customerResponse = customerService.updateCustomer(customerUpdateRequest);
return new ResponseEntity<>(customerResponse, HttpStatus.OK);
}

@DeleteMapping("/{customerEmail}")
public ResponseEntity<Void> deleteCustomer(@PathVariable String customerEmail) {
customerService.deleteCustomer(customerEmail);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}

@DeleteMapping("/delete-all")
public ResponseEntity<Void> deleteAll() {
customerService.deleteAllCustomers();
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}