Skip to content
Merged
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
8f9fd3a
test: MemoryVoucherRepository 테스트 추가
Yiseull Jul 2, 2023
3200547
test: DiscountType 테스트 추가
Yiseull Jul 2, 2023
4ed44ef
test: 할인 유형에 맞는 바우처 생성 테스트 추가
Yiseull Jul 2, 2023
d200810
test: 정액 할인 바우처 테스트 추가
Yiseull Jul 2, 2023
7c8a752
test: 정률 할인 바우처 테스트 추가
Yiseull Jul 2, 2023
bcd3ab0
test: VoucherService 바우처 조회 테스트 추가
Yiseull Jul 2, 2023
663b097
test: VoucherService 바우처 생성 테스트 추가
Yiseull Jul 3, 2023
2dbdf9d
chore: JDBC, MySQL, H2 의존성 추가
Yiseull Jul 4, 2023
bf9f004
refactor: 바우처 도메인 재설계
Yiseull Jul 4, 2023
66a1724
fix: 바우처 조회 포맷 변경
Yiseull Jul 4, 2023
087dc0d
test: 테스트 실행 순서에 영향 없도록 변경, 실제 바우처 저장 검증 로직 추가
Yiseull Jul 4, 2023
29d1e45
test: DisplayName 변경
Yiseull Jul 4, 2023
3775367
refactor: 명확한 필드명으로 변경
Yiseull Jul 4, 2023
a6f5391
refactor: Voucher 에서 DiscountType 필드 제거
Yiseull Jul 6, 2023
6cc9f15
feat: VoucherRepository Update, Delete 기능 추가
Yiseull Jul 6, 2023
9d830b7
refactor: 할인 타입에 맞는 바우처 대신 할인 정책 생성
Yiseull Jul 7, 2023
9d86602
feat: 뱌우처 레포지토리 JdbcTemplate 사용 & 프로파일 추가
Yiseull Jul 7, 2023
6cb3d7b
chore: 로그백 수정
Yiseull Jul 7, 2023
396a89e
feat: 고객 CRUD 기능 추가
Yiseull Jul 7, 2023
7fe7487
test: 고객 유형 반환 테스트 추가
Yiseull Jul 8, 2023
29ccf93
refactor: 입출력 분리, Command & DiscountType 변경
Yiseull Jul 8, 2023
e065798
refactor: 바우처 DTO 요청, 응답 분리, 바우처 조회 포맷 변경
Yiseull Jul 8, 2023
0f58e74
refactor: 바우처 생성 시 정보 입력 메소드 추가
Yiseull Jul 8, 2023
cdde2c8
feat: 콘솔에서 바우처 수정 기능 추가
Yiseull Jul 8, 2023
de8fb3f
feat: 콘솔에서 바우처 삭제 기능 추가
Yiseull Jul 8, 2023
0cc589b
refactor: DiscountPolicy 추상클래스로 변경
Yiseull Jul 8, 2023
c20e8a4
refactor: 롬복 적용
Yiseull Jul 8, 2023
acfc48f
feat: 커스텀 예외 적용
Yiseull Jul 8, 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
9 changes: 9 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,15 @@ repositories {
}

dependencies {
// JDBC
implementation 'org.springframework.boot:spring-boot-starter-jdbc'

// MySQL
runtimeOnly 'com.mysql:mysql-connector-j:8.0.33'

// H2
runtimeOnly 'com.h2database:h2'

// Lombok
compileOnly 'org.projectlombok:lombok:1.18.26'
annotationProcessor 'org.projectlombok:lombok:1.18.26'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
package com.programmers.vouchermanagement;

import com.programmers.vouchermanagement.view.Command;
import com.programmers.vouchermanagement.view.Console;
import com.programmers.vouchermanagement.voucher.domain.DiscountType;
import com.programmers.vouchermanagement.voucher.dto.VoucherDto;
import com.programmers.vouchermanagement.view.InputView;
import com.programmers.vouchermanagement.view.OutputView;
import com.programmers.vouchermanagement.voucher.dto.request.VoucherCreationRequest;
import com.programmers.vouchermanagement.voucher.dto.request.VoucherUpdateRequest;
import com.programmers.vouchermanagement.voucher.dto.response.VoucherResponse;
import com.programmers.vouchermanagement.voucher.presentation.VoucherController;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Profile;
import org.springframework.stereotype.Controller;

import java.util.List;
import java.util.UUID;

@Profile("!test")
@Slf4j
@Controller
@RequiredArgsConstructor
Expand All @@ -25,29 +32,43 @@ public void run(String... args) {
try {
running = isRunning();
} catch (RuntimeException e) {
Console.outputErrorMessage(e.getMessage());
log.error(e.getMessage());
}

}
}

private boolean isRunning() {
Command command = Command.from(Console.selectCommand());
OutputView.showCommand();
Command command = InputView.inputCommand();
switch (command) {
case CREATE -> {
DiscountType discountType = DiscountType.from(Console.selectDiscountType());
int discountAmount = Console.inputDiscountAmount();
VoucherDto.Request request = new VoucherDto.Request(discountType, discountAmount);
OutputView.showDiscountType();
VoucherCreationRequest request = InputView.inputVoucherInfo();
voucherController.createVoucher(request);
}
case LIST-> {
VoucherDto.Response vouchers = voucherController.getVouchers();
Console.outputVouchers(vouchers);
List<VoucherResponse> vouchers = voucherController.getVouchers();
OutputView.showVouchers(vouchers);
}
case EXIT -> {
return false;
}
case UPDATE -> {
List<VoucherResponse> vouchers = voucherController.getVouchers();
OutputView.showVoucherUpdate(vouchers);
UUID id = InputView.inputVoucherUpdate(vouchers);
OutputView.showDiscountType();
VoucherCreationRequest updateVoucherInfo = InputView.inputVoucherInfo();
VoucherUpdateRequest request = new VoucherUpdateRequest(id, updateVoucherInfo.type(), updateVoucherInfo.amount());
voucherController.updateVoucher(request);
}
case DELETE -> {
List<VoucherResponse> vouchers = voucherController.getVouchers();
OutputView.showVoucherDelete(vouchers);
UUID id = InputView.inputVoucherDelete(vouchers);
voucherController.deleteVoucher(id);
}
}
return true;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.programmers.vouchermanagement.customer.domain;

import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
import lombok.Getter;

import java.util.UUID;

@Getter
@EqualsAndHashCode
@AllArgsConstructor
public class Customer {

private final UUID id;
private final String name;
private CustomerType type;

public Customer(String name, CustomerType type) {
this.id = UUID.randomUUID();
this.name = name;
this.type = type;
}

public void changeType(CustomerType type) {
this.type = type;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.programmers.vouchermanagement.customer.domain;

import java.util.List;
import java.util.Optional;
import java.util.UUID;

public interface CustomerRepository {

Customer save(Customer customer);

Optional<Customer> findById(UUID id);

List<Customer> findAll();

void update(Customer customer);

void deleteById(UUID id);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.programmers.vouchermanagement.customer.domain;

import com.programmers.vouchermanagement.customer.exception.InvalidCustomerTypeException;

public enum CustomerType {
BLACK, WHITE;

public static CustomerType from(String type) {
try {
return valueOf(type.toUpperCase());
} catch (IllegalArgumentException e) {
throw new InvalidCustomerTypeException("잘못된 고객 타입입니다.");
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.programmers.vouchermanagement.customer.exception;

public class InvalidCustomerTypeException extends RuntimeException {
public InvalidCustomerTypeException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package com.programmers.vouchermanagement.customer.infrastructure;

import com.programmers.vouchermanagement.customer.domain.Customer;
import com.programmers.vouchermanagement.customer.domain.CustomerRepository;
import com.programmers.vouchermanagement.customer.domain.CustomerType;
import org.springframework.context.annotation.Primary;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;

import javax.sql.DataSource;
import java.util.List;
import java.util.Optional;
import java.util.UUID;

@Primary
@Repository
public class JdbcTemplateCustomerRepository implements CustomerRepository {

private final JdbcTemplate jdbcTemplate;

public JdbcTemplateCustomerRepository(DataSource dataSource) {
this.jdbcTemplate = new JdbcTemplate(dataSource);
}

@Override
public Customer save(Customer customer) {
String sql = "insert into customer (id, name, type) values (?, ?, ?)";
jdbcTemplate.update(sql,
customer.getId().toString(),
customer.getName(),
customer.getType().toString());
return customer;
}

@Override
public Optional<Customer> findById(UUID id) {
String sql = "select * from customer where id = ?";
try {
Customer customer = jdbcTemplate.queryForObject(sql, customerRowMapper(), id.toString());
return Optional.of(customer);
} catch (EmptyResultDataAccessException e) {
return Optional.empty();
}
}

@Override
public List<Customer> findAll() {
String sql = "select * from customer";
return jdbcTemplate.query(sql, customerRowMapper());
}

@Override
public void update(Customer customer) {
String sql = "update customer set type = ? where id = ?";
jdbcTemplate.update(sql,
customer.getType().toString(),
customer.getId().toString());
}

@Override
public void deleteById(UUID id) {
String sql = "delete from customer where id = ?";
jdbcTemplate.update(sql, id.toString());
}

private RowMapper<Customer> customerRowMapper() {
return (rs, rowNum) -> {
UUID id = UUID.fromString(rs.getString("id"));
String name = rs.getString("name");
CustomerType type = CustomerType.valueOf(rs.getString("type"));
return new Customer(id, name, type);
};
}
}
33 changes: 18 additions & 15 deletions src/main/java/com/programmers/vouchermanagement/view/Command.java
Original file line number Diff line number Diff line change
@@ -1,37 +1,40 @@
package com.programmers.vouchermanagement.view;

import lombok.Getter;

import java.util.Collections;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Getter
public enum Command {

CREATE("create"),
LIST("list"),
EXIT("exit");
EXIT("1", "프로그램 종료"),
CREATE("2", "바우처 생성"),
LIST("3", "바우처 조회"),
UPDATE("4", "바우처 수정"),
DELETE("5", "바우처 삭제");

private final String name;
private final String number;
private final String description;
private static final Map<String, Command> COMMAND_MAP;

static {
COMMAND_MAP = Collections.unmodifiableMap(Stream.of(values())
.collect(Collectors.toMap(Command::getName, Function.identity())));
}

Command(String name) {
this.name = name;
.collect(Collectors.toMap(Command::getNumber, Function.identity())));
}

public String getName() {
return name;
Command(String number, String description) {
this.number = number;
this.description = description;
}

public static Command from(String name) {
if (COMMAND_MAP.containsKey(name)) {
return COMMAND_MAP.get(name);
public static Command from(String number) {
if (COMMAND_MAP.containsKey(number)) {
return COMMAND_MAP.get(number);
}
throw new IllegalArgumentException("This command does not exist.");
throw new IllegalArgumentException("존재하지 않는 명령어 입니다.");
}
}
62 changes: 0 additions & 62 deletions src/main/java/com/programmers/vouchermanagement/view/Console.java

This file was deleted.

Loading