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

[5기 - 김현우] Spring Boot Part3 Weekly Mission 제출합니다. #972

Open
wants to merge 73 commits into
base: ASak1104-hwkim-week3
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 62 commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
7494782
fix : ddl wallet 테이블에 cascade 추가
ASak1104 Oct 30, 2023
080148d
refactor : Jdbc 빈 설정과 repository 빈 설정 분리
ASak1104 Oct 30, 2023
ed2c696
test : 조회한 Voucher 정보를 테스트할 때 순서가 상관 없도록 수정
ASak1104 Oct 30, 2023
c8a2b1c
test : save 메서드 테스트에 대한 검증 부분 추가
ASak1104 Oct 30, 2023
9d617ab
test : 테스트 예외에 대한 검증 부분 추가
ASak1104 Oct 30, 2023
408969d
test : 블랙리스트 유저 테스트 강화
ASak1104 Oct 30, 2023
c0ef95a
test : Voucher 모델에 대한 테스트 강화
ASak1104 Oct 30, 2023
5fda05f
fix : 데이터베이스 커넥션이 없을 때의 버그 수정
ASak1104 Oct 30, 2023
1b029d4
fix : 존재하지 않는 고객을 조회할 때 빈 Optional 객체를 반환하도록 수정
ASak1104 Oct 30, 2023
0c3f516
test : JdbcCustomerRepository test 코드 추가
ASak1104 Oct 30, 2023
555b815
test : JdbcWalletRepository 테스트 코드 추가
ASak1104 Oct 30, 2023
40e001a
refactor : console 애플리케이션 페키지 분리
ASak1104 Nov 5, 2023
383b178
fix : 잘못된 uuid가 입력 됐을 때의 예외처리 추가
ASak1104 Nov 5, 2023
2065a1e
logging : 로깅 포인트 컷 수정
ASak1104 Nov 5, 2023
641def9
chore : spring web 의존성 추가
ASak1104 Nov 5, 2023
ae21ab6
style : 메서드 이름 변경
ASak1104 Nov 5, 2023
4921225
feat : voucher 생성 필드 일자 추가
ASak1104 Nov 5, 2023
3ac74b5
feat : voucherRepository 조회 추가
ASak1104 Nov 5, 2023
8ee85f0
test : voucher 모델 테스트 추가
ASak1104 Nov 5, 2023
737411b
test : id, type 조회 테스트 추가
ASak1104 Nov 5, 2023
fb0987b
refactor : string uuid 인자를 UUID 타입으로 변경
ASak1104 Nov 5, 2023
57984a2
chore : javafaker 의존성 추가
ASak1104 Nov 5, 2023
76a4da7
refactor : voucher 조회 로직 수정
ASak1104 Nov 5, 2023
9a62852
test : VoucherCCustomerFacade 테스트 코드 추가
ASak1104 Nov 5, 2023
2e34c07
test : 이름과 이메일 생성을 faker 클래스로 변경
ASak1104 Nov 5, 2023
eb891a9
refactor : 필요 없는 생성자 제거
ASak1104 Nov 5, 2023
c716997
feat : Console 유틸 close 메서드 추가
ASak1104 Nov 5, 2023
6dd746f
test : Console 유틸 테스트 코드 추가
ASak1104 Nov 5, 2023
5ca617d
fix : 문자열을 변환 방법 수정
ASak1104 Nov 5, 2023
f4a2123
test : UUIDConverter 테스트 코드 추가
ASak1104 Nov 5, 2023
a1b92b5
refactor : 메서드 분리
ASak1104 Nov 5, 2023
174d918
fix : 불필요한 예외 처리 제거
ASak1104 Nov 5, 2023
e931e55
feat : VoucherRepository 기능 추가
ASak1104 Nov 5, 2023
34cb118
test : 삭제 & 생성 일자 조회 기능 테스트 추가
ASak1104 Nov 5, 2023
882020a
refactor : 불필요한 예외 제거
ASak1104 Nov 5, 2023
3341f39
test : 바우처 생성 데이터를 랜덤으로 변경
ASak1104 Nov 5, 2023
efa55f0
test : 생성 기간 조회 테스트 추가
ASak1104 Nov 5, 2023
fc7fbd1
feat : 바우처 api 추가
ASak1104 Nov 5, 2023
98b5430
chore : xml dataformat 의존성 추가
ASak1104 Nov 5, 2023
8c7aada
feat : xml response 기능 추가
ASak1104 Nov 5, 2023
f262beb
feat : 애플리케이션 선택 기능 추가
ASak1104 Nov 5, 2023
9d2b545
refactor : 애플리케이션들의 패키지를 분리
ASak1104 Nov 6, 2023
3a7976b
refactor : 패키지 구조 변경
ASak1104 Nov 6, 2023
39b416d
test : 필요없는 테스트 부분 제거
ASak1104 Nov 6, 2023
dbeddfa
logging : repository pointcut 변경
ASak1104 Nov 6, 2023
c970983
style : api 공통 path 추출
ASak1104 Nov 6, 2023
15215a6
chore : thymeleaf 의존성 추가
ASak1104 Nov 6, 2023
db5c341
feat : 간단한 고객 페이지 추가
ASak1104 Nov 6, 2023
028286d
refactor : Voucher createAt을 불변으로 변경
ASak1104 Nov 7, 2023
3b66145
view : 고객 관리 html 파일 추가
ASak1104 Nov 7, 2023
3b77085
feat : 고객 view 기능 추가
ASak1104 Nov 7, 2023
b930567
feat : 고객 관리 ControllerAdvice 추가
ASak1104 Nov 7, 2023
d5efde3
feat : 고객 수정 기능 추가
ASak1104 Nov 7, 2023
6ec6b67
view : 뷰 파일 위치 변경
ASak1104 Nov 7, 2023
7a1de11
view : 에러 페이지 추가
ASak1104 Nov 7, 2023
73686fb
feat : 고객 삭제 기능 추가
ASak1104 Nov 7, 2023
894720c
test : 고객 테스트 코드 추가
ASak1104 Nov 7, 2023
750e944
view : 고객 삭제 버튼 추가
ASak1104 Nov 7, 2023
7215e16
view : 상세 페이지로 가는 링크 추가
ASak1104 Nov 7, 2023
9a01773
test : 콘솔 테스트 기능을 추상 클래스로 분리
ASak1104 Nov 7, 2023
fc515f7
test : 메인 클래스 테스트 코드 추가
ASak1104 Nov 7, 2023
948b2a1
refactor : 콘솔 초기화 메서드를 불변으로 변경
ASak1104 Nov 10, 2023
81d6f1e
style : 불필요한 중괄호 제거
ASak1104 Nov 14, 2023
70a79d9
style : 확실한 의미를 내포하도록 메서드 명을 수정
ASak1104 Nov 14, 2023
649f7ff
style : 불필요한 param 지정 부분 제거
ASak1104 Nov 14, 2023
1332c72
chore : spring validation 의존성 추가
ASak1104 Nov 14, 2023
f870b5b
feat : 바우처 생성 dto 데이터 검증 기능 추가
ASak1104 Nov 14, 2023
ce79ec0
feat : 고객 추가 dto 검증 기능 추가
ASak1104 Nov 14, 2023
f077d7d
refactor : 존재하지 않는 바우처를 삭제할 때 예외가 발생하도록 수정
ASak1104 Nov 14, 2023
51bfeea
refactor : 바우처 생성 api의 status 코드 수정
ASak1104 Nov 14, 2023
7412a89
refactor : 실행할 애플리케이션을 이넘으로 관리
ASak1104 Nov 14, 2023
f949bd9
refactor : 필터링 api를 origin에 대한 쿼리스트링으로 통일
ASak1104 Nov 14, 2023
d3c86e4
docs: fix typo
ASak1104 Nov 24, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,15 @@ repositories {

dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'
implementation 'org.springframework.boot:spring-boot-starter-aop'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.2'
implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.15.2'
implementation 'com.mysql:mysql-connector-j:8.1.0'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'com.github.javafaker:javafaker:1.0.2'
}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,28 +1,38 @@
package team.marco.voucher_management_system;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.context.ApplicationContext;
import org.springframework.core.env.Environment;
import team.marco.voucher_management_system.application.CommandMainApplication;
import org.springframework.context.annotation.ComponentScan;
import team.marco.voucher_management_system.console_app.ConsoleApplication;
import team.marco.voucher_management_system.util.Console;
import team.marco.voucher_management_system.web_app.WebApplication;

@SpringBootApplication
@ComponentScan
@ConfigurationPropertiesScan
public class VoucherManagementSystemApplication {
private static final Logger logger = LoggerFactory.getLogger(VoucherManagementSystemApplication.class);

public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(VoucherManagementSystemApplication.class, args);
Environment environment = context.getEnvironment();
Console.print("""
=== 실행할 애플리케이션을 선택해주세요. ===
0. Console Application
1. Web Application""");

selectApplication(args);

Console.close();
}

private static void selectApplication(String[] args) {
String input = Console.readString();

logger.info("Program start (profile: {})", environment.getActiveProfiles()[0]);
switch (input) {
case "0" -> ConsoleApplication.main(args);
case "1" -> WebApplication.main(args);

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

상수화로 enum같은걸로 해두면 클린코드 적으로 좋을거 같습니다.

Copy link
Author

@ASak1104 ASak1104 Nov 14, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

실행할 스프링 애플리케이션의 main 메서드를 enum에서 Consumer로 관리하는 방향으로 수정해봤습니다!

commit 7412a89

default -> reselect(args);
}
}

CommandMainApplication application = context.getBean(CommandMainApplication.class);
application.run();
private static void reselect(String[] args) {
Console.print("사용할 수 없는 애플리케이션 입니다.");

logger.info("Program exit");
selectApplication(args);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ public final class LoggingPointCut {
private LoggingPointCut() {
}

@Pointcut("execution(* team.marco.voucher_management_system.controller..*(..))")
@Pointcut("execution(* team.marco.voucher_management_system..controller..*(..))")
public static void controllerMethodPointcut() {
}

@Pointcut("execution(* team.marco.voucher_management_system.service..*(..))")
public static void serviceMethodPointcut() {
}

@Pointcut("execution(* team.marco.voucher_management_system.repository..*(..))")
@Pointcut("execution(* team.marco.voucher_management_system..repository..*(..))")
public static void repositorySavePointcut() {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package team.marco.voucher_management_system.console_app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Import;
import team.marco.voucher_management_system.VoucherManagementSystemApplication;
import team.marco.voucher_management_system.console_app.application.CommandMainApplication;

@Import(VoucherManagementSystemApplication.class)
@SpringBootApplication
public class ConsoleApplication {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(ConsoleApplication.class);
springApplication.setWebApplicationType(WebApplicationType.NONE);

ConfigurableApplicationContext context = springApplication.run(args);
CommandMainApplication application = context.getBean(CommandMainApplication.class);

application.run();
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package team.marco.voucher_management_system.application;
package team.marco.voucher_management_system.console_app.application;

import java.util.NoSuchElementException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.jdbc.datasource.lookup.DataSourceLookupFailureException;
import org.springframework.stereotype.Component;
import team.marco.voucher_management_system.controller.ConsoleCustomerController;
import team.marco.voucher_management_system.type_enum.CustomerCommandType;
import team.marco.voucher_management_system.console_app.command_enum.CustomerCommandType;
import team.marco.voucher_management_system.console_app.controller.ConsoleCustomerController;
import team.marco.voucher_management_system.util.Console;

@Component
Expand Down Expand Up @@ -48,12 +48,15 @@ private void executeCommand(int userInput) {
} catch (IllegalArgumentException e) {
logger.warn(e.toString());
Console.print(e.getMessage());
} catch (EmptyResultDataAccessException | NoSuchElementException e) {
logger.error(e.toString());
Console.print("존재하지 않는 ID 입니다.");
} catch (DataAccessResourceFailureException e) {
} catch (DataSourceLookupFailureException e) {
logger.error(e.toString());
Console.print(e.getMessage());
} catch (DuplicateKeyException e) {
logger.error(e.toString());
Console.print("이미 존재하는 이메일 입니다.");
} catch (NoSuchElementException e) {
logger.error(e.toString());
Console.print("존재하지 않는 ID 입니다.");
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package team.marco.voucher_management_system.application;
package team.marco.voucher_management_system.console_app.application;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.CannotGetJdbcConnectionException;
import org.springframework.stereotype.Component;
import team.marco.voucher_management_system.controller.ConsoleBlacklistController;
import team.marco.voucher_management_system.controller.ConsoleVoucherController;
import team.marco.voucher_management_system.type_enum.MainCommandType;
import team.marco.voucher_management_system.console_app.command_enum.MainCommandType;
import team.marco.voucher_management_system.console_app.controller.ConsoleBlacklistController;
import team.marco.voucher_management_system.console_app.controller.ConsoleVoucherController;
import team.marco.voucher_management_system.util.Console;

@Component
Expand All @@ -31,11 +32,10 @@ public CommandMainApplication(ConsoleVoucherController voucherController,
protected void start() {
try {
selectCommand();
} catch (CannotGetJdbcConnectionException e) {
errorHandler(e, "데이터베이스에 연결할 수 없습니다.");
} catch (Exception e) {
logger.error(e.toString());
Console.print("프로그램에 에러가 발생했습니다.");

runningFlag = false;
errorHandler(e, "프로그램에 에러가 발생했습니다.");
}
}

Expand Down Expand Up @@ -79,6 +79,13 @@ private void switchCommand(MainCommandType commandType) {
}
}

private void errorHandler(Exception e, String message) {
logger.error(e.toString());
Console.print(message);

runningFlag = false;
}

@Override
protected void close() {
Console.print("프로그램이 종료되었습니다.");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,12 @@
package team.marco.voucher_management_system.application;
package team.marco.voucher_management_system.console_app.application;

import java.util.NoSuchElementException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessResourceFailureException;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.UncategorizedSQLException;
import org.springframework.stereotype.Component;
import team.marco.voucher_management_system.controller.ConsoleWalletController;
import team.marco.voucher_management_system.type_enum.WalletCommandType;
import team.marco.voucher_management_system.console_app.command_enum.WalletCommandType;
import team.marco.voucher_management_system.console_app.controller.ConsoleWalletController;
import team.marco.voucher_management_system.util.Console;

@Component
Expand Down Expand Up @@ -48,13 +45,10 @@ private void executeCommand(int userInput) {
} catch (IllegalArgumentException e) {
logger.warn(e.toString());
Console.print(e.getMessage());
} catch (DataAccessResourceFailureException e) {
logger.error(e.toString());
Console.print(e.getMessage());
} catch (DuplicateKeyException e) {
logger.error(e.toString());
Console.print("이미 존재하는 쿠폰입니다.");
} catch (EmptyResultDataAccessException | NoSuchElementException | UncategorizedSQLException e) {
} catch (NoSuchElementException e) {
logger.error(e.toString());
Console.print("존재하지 않는 ID 입니다.");
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package team.marco.voucher_management_system.application;
package team.marco.voucher_management_system.console_app.application;

public abstract class RunnableCommandApplication {
protected boolean runningFlag;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package team.marco.voucher_management_system.type_enum;
package team.marco.voucher_management_system.console_app.command_enum;

public enum CustomerCommandType {
EXIT, CREATE, LIST, UPDATE, FIND_BY_ID, FIND_BY_NAME, FIND_BY_EMAIL;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package team.marco.voucher_management_system.type_enum;
package team.marco.voucher_management_system.console_app.command_enum;

import static java.text.MessageFormat.format;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package team.marco.voucher_management_system.type_enum;
package team.marco.voucher_management_system.console_app.command_enum;

public enum WalletCommandType {
EXIT, SUPPLY, VOUCHER_LIST, RETURN, CUSTOMER_LIST;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package team.marco.voucher_management_system.controller;
package team.marco.voucher_management_system.console_app.controller;

import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Component;
import team.marco.voucher_management_system.model.BlacklistUser;
import team.marco.voucher_management_system.service.BlacklistService;
import team.marco.voucher_management_system.util.Console;

@Controller
@Component
public class ConsoleBlacklistController {
private static final String INFO_DELIMINATOR = "\n";

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,15 @@
package team.marco.voucher_management_system.controller;
package team.marco.voucher_management_system.console_app.controller;

import java.text.MessageFormat;
import java.util.List;
import org.springframework.stereotype.Controller;
import java.util.UUID;
import org.springframework.stereotype.Component;
import team.marco.voucher_management_system.model.Customer;
import team.marco.voucher_management_system.service.CustomerService;
import team.marco.voucher_management_system.util.Console;
import team.marco.voucher_management_system.util.UUIDConverter;

@Controller
@Component
public class ConsoleCustomerController {
private static final String INFO_DELIMINATOR = MessageFormat.format("\n{0}\n", "-".repeat(42));

Expand Down Expand Up @@ -37,7 +39,8 @@ public void customerList() {

public void updateCustomer() {
Console.print("수정할 고객의 ID를 입력해 주세요.");
String id = Console.readString();
String input = Console.readString();
UUID id = UUIDConverter.convert(input);

customerService.findById(id);

Expand All @@ -51,7 +54,8 @@ public void updateCustomer() {

public void findCustomerById() {
Console.print("조회할 고객의 ID를 입력해 주세요.");
String id = Console.readString();
String input = Console.readString();
UUID id = UUIDConverter.convert(input);

Customer customer = customerService.findById(id);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package team.marco.voucher_management_system.controller;
package team.marco.voucher_management_system.console_app.controller;

import java.text.MessageFormat;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Component;
import team.marco.voucher_management_system.model.Voucher;
import team.marco.voucher_management_system.service.VoucherService;
import team.marco.voucher_management_system.util.Console;

@Controller
@Component
public class ConsoleVoucherController {
private static final String INFO_DELIMINATOR = MessageFormat.format("\n{0}\n", "-".repeat(42));

Expand All @@ -32,7 +32,7 @@ public void selectVoucher() {
}

public void voucherList() {
List<String> vouchers = voucherService.getVouchersInfo()
List<String> vouchers = voucherService.getVouchers()
.stream()
.map(Voucher::getInfo)
.toList();
Expand Down
Loading