Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
ada3fd2
refactor: 모든 서비스에서 컨트롤러의 dto에 의존하지 않도록 변경
young970 Jul 19, 2023
27388b3
feat: 바우처 필드값 createAt 추가, 웹으로 동작하는 바우처 전체 조회, 생성, 상세조회 구현
young970 Jul 19, 2023
1d3e520
feat: 상세 페이지에서 해당 바우처 삭제 기능 구현
young970 Jul 20, 2023
271cd64
feat: voucher 전체 조회, 바우처 추가, 바우처 삭제, 아이디로 조회 api 구현
young970 Jul 20, 2023
8dafde3
feat: 바우처 타입으로 조회 Api 구현
young970 Jul 20, 2023
3b99851
feat: ApiExceptionHandler 구현
young970 Jul 20, 2023
321583f
test: VoucherServiceTest 추가
young970 Jul 22, 2023
4ad9ed2
Merge pull request #14 from young970/part.3
young970 Jul 22, 2023
4bd9684
refactor: delete API HTTP 메서드 delete로 변경
young970 Jul 22, 2023
e8cecb6
Merge pull request #15 from young970/part.3
young970 Jul 22, 2023
033e898
tmp: pr 피드백 반영 임시 커밋
young970 Jul 26, 2023
2bc4f5a
refactor: 에러 응답 상세하게 추가, 예외 핸들링 케이스 추가
young970 Jul 29, 2023
7a15ca8
refactor: request DTO들 이름 변경
young970 Jul 29, 2023
f96ea98
refactor: id값 및 시간 Generate를 통해 주입받는 방식으로 변경
young970 Jul 29, 2023
6c54b0a
refactor: controller 이상한 uri들 수정
young970 Jul 29, 2023
8af940c
refactor: WalletRepository query용, command용 분리
young970 Jul 29, 2023
a5538e6
refactor: 동적쿼리를 통해 findAll API에 조건 검색 적용, create API 201로 응답 변경
young970 Jul 30, 2023
dbe3840
feat: 조회 페이지네이션 구현
young970 Jul 31, 2023
f14c270
refactor: pk값 순차적으로 생성되는 UUID로 변경
young970 Aug 1, 2023
d6dfbe7
refactor: 500에러 클라이언트한테 감추는 방식으로 변경
young970 Aug 1, 2023
4672f90
Merge pull request #16 from young970/part.3-pdb
young970 Aug 1, 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
10 changes: 8 additions & 2 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,18 @@ dependencies {
testImplementation "org.mockito:mockito-core:3.+"
//JdbcTemplate 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-jdbc'

//web
implementation 'org.springframework.boot:spring-boot-starter-web'

//타입리프
Copy link

Choose a reason for hiding this comment

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

오타나신거같아용

implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
//mapStruct
implementation 'org.mapstruct:mapstruct:1.5.5.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final'
//DB설정
runtimeOnly 'mysql:mysql-connector-java:8.0.32'

implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation "com.fasterxml.uuid:java-uuid-generator:4.0.1"
}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.prgrms.kdt.member.controller.mapper;

import javax.annotation.processing.Generated;
import org.prgrms.kdt.member.controller.dto.CreateMemberApiRequest;
import org.prgrms.kdt.member.domain.MemberStatus;
import org.prgrms.kdt.member.service.dto.CreateMemberRequest;
import org.springframework.stereotype.Component;

@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2023-08-01T21:55:33+0900",
comments = "version: 1.5.5.Final, compiler: javac, environment: Java 17.0.7 (Oracle Corporation)"
)
@Component
public class ControllerMemberMapperImpl implements ControllerMemberMapper {

@Override
public CreateMemberRequest convertRequest(CreateMemberApiRequest request) {
if ( request == null ) {
return null;
}

String name = null;
MemberStatus status = null;

name = request.name();
status = request.status();

CreateMemberRequest createMemberRequest = new CreateMemberRequest( name, status );

return createMemberRequest;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package org.prgrms.kdt.voucher.controller.mapper;

import javax.annotation.processing.Generated;
import org.prgrms.kdt.voucher.controller.dto.CreateVoucherApiRequest;
import org.prgrms.kdt.voucher.controller.dto.SearchApiRequest;
import org.prgrms.kdt.voucher.domain.VoucherType;
import org.prgrms.kdt.voucher.service.dto.CreateVoucherRequest;
import org.prgrms.kdt.voucher.service.dto.SearchRequest;
import org.springframework.stereotype.Component;

@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2023-08-01T21:55:34+0900",
comments = "version: 1.5.5.Final, compiler: javac, environment: Java 17.0.7 (Oracle Corporation)"
)
@Component
public class ControllerVoucherMapperImpl implements ControllerVoucherMapper {

@Override
public CreateVoucherRequest convertRequest(CreateVoucherApiRequest createVoucherApiRequest) {
if ( createVoucherApiRequest == null ) {
return null;
}

VoucherType voucherType = null;
double discountAmount = 0.0d;

voucherType = createVoucherApiRequest.voucherType();
discountAmount = createVoucherApiRequest.discountAmount();

CreateVoucherRequest createVoucherRequest = new CreateVoucherRequest( voucherType, discountAmount );

return createVoucherRequest;
}

@Override
public SearchRequest convertRequest(SearchApiRequest searchApiRequest) {
if ( searchApiRequest == null ) {
return null;
}

long page = 0L;
long recordSize = 0L;
VoucherType voucherType = null;

page = searchApiRequest.getPage();
recordSize = searchApiRequest.getRecordSize();
voucherType = searchApiRequest.getVoucherType();

SearchRequest searchRequest = new SearchRequest( page, recordSize, voucherType );

return searchRequest;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package org.prgrms.kdt.wallet.controller.mapper;

import java.util.UUID;
import javax.annotation.processing.Generated;
import org.prgrms.kdt.wallet.controller.dto.CreateWalletApiRequest;
import org.prgrms.kdt.wallet.service.dto.CreateWalletRequest;
import org.springframework.stereotype.Component;

@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2023-08-01T21:55:34+0900",
comments = "version: 1.5.5.Final, compiler: javac, environment: Java 17.0.7 (Oracle Corporation)"
)
@Component
public class ControllerWalletMapperImpl implements ControllerWalletMapper {

@Override
public CreateWalletRequest convertRequest(CreateWalletApiRequest request) {
if ( request == null ) {
return null;
}

UUID memberId = null;
UUID voucherId = null;

memberId = request.memberId();
voucherId = request.voucherId();

CreateWalletRequest createWalletRequest = new CreateWalletRequest( memberId, voucherId );

return createWalletRequest;
}
}
11 changes: 5 additions & 6 deletions src/main/java/org/prgrms/kdt/CommendLineRunner.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package org.prgrms.kdt;

import org.prgrms.kdt.commendLine.Console;
import org.prgrms.kdt.exception.InvalidInputException;
import org.prgrms.kdt.util.Menu;
import org.prgrms.kdt.global.exception.InvalidInputException;
import org.prgrms.kdt.global.Menu;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
Expand All @@ -12,7 +12,7 @@
import java.io.IOException;


@Profile("!test")
@Profile("console")
@Component
public class CommendLineRunner implements CommandLineRunner {
private static final Logger logger = LoggerFactory.getLogger(CommendLineRunner.class);
Expand All @@ -27,13 +27,12 @@ public CommendLineRunner(ViewManager viewManager, Console console) {

@Override
public void run(String... args) {
boolean isRunning = true;
while (isRunning) {
while (true) {
try {
console.printMenu();
int getUserMenu = Integer.parseInt(console.getUserMenu());
Menu menu = Menu.getMenu(getUserMenu);
isRunning = menu.isNotExit();
if (menu.isExit()) break;
executeAction(menu);

} catch (InvalidInputException e) {
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/org/prgrms/kdt/HomeController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.prgrms.kdt;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

@GetMapping("/")
public String home(){
return "home";
}
}
14 changes: 7 additions & 7 deletions src/main/java/org/prgrms/kdt/ViewManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
import org.prgrms.kdt.commendLine.Console;
import org.prgrms.kdt.member.controller.MemberController;
import org.prgrms.kdt.member.domain.MemberStatus;
import org.prgrms.kdt.member.dto.CreateMemberRequest;
import org.prgrms.kdt.member.controller.dto.CreateMemberApiRequest;
import org.prgrms.kdt.voucher.controller.VoucherController;
import org.prgrms.kdt.voucher.controller.dto.CreateVoucherApiRequest;
import org.prgrms.kdt.voucher.domain.VoucherType;
import org.prgrms.kdt.voucher.dto.CreateVoucherRequest;
import org.prgrms.kdt.wallet.controller.WalletController;
import org.prgrms.kdt.wallet.dto.request.CreateWalletRequest;
import org.prgrms.kdt.wallet.dto.response.JoinedWalletResponses;
import org.prgrms.kdt.wallet.controller.dto.CreateWalletApiRequest;
import org.prgrms.kdt.wallet.service.dto.JoinedWalletResponses;
import org.springframework.stereotype.Component;

import java.io.IOException;
Expand All @@ -32,7 +32,7 @@ public ViewManager(VoucherController voucherController, MemberController memberC
public void createVoucher() throws IOException {
VoucherType voucherType = VoucherType.getTypeByNum(console.getVoucherTypes());
double discountAmount = Double.parseDouble(console.getDiscountAmount());
voucherController.create(new CreateVoucherRequest(voucherType, discountAmount));
voucherController.create(new CreateVoucherApiRequest(voucherType, discountAmount));
}

public void findAllVoucher() {
Expand All @@ -45,7 +45,7 @@ public void findAllBlackMember() {

public void createMember() throws IOException {
String memberName = console.getMemberName();
memberController.createMember(new CreateMemberRequest(memberName, MemberStatus.COMMON));
memberController.createMember(new CreateMemberApiRequest(memberName, MemberStatus.COMMON));
}

public void findAllMember() {
Expand All @@ -55,7 +55,7 @@ public void findAllMember() {
public void assignVoucher() throws IOException {
UUID memberUuid = console.getMemberId();
UUID voucherUuid = console.getVoucherId();
walletController.createWallet(new CreateWalletRequest(memberUuid, voucherUuid));
walletController.createWallet(new CreateWalletApiRequest(memberUuid, voucherUuid));
}

public void findVouchersByMember() throws IOException {
Expand Down
6 changes: 3 additions & 3 deletions src/main/java/org/prgrms/kdt/commendLine/Console.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package org.prgrms.kdt.commendLine;

import org.prgrms.kdt.member.dto.MemberResponses;
import org.prgrms.kdt.voucher.dto.VoucherResponses;
import org.prgrms.kdt.wallet.dto.response.JoinedWalletResponses;
import org.prgrms.kdt.member.service.dto.MemberResponses;
import org.prgrms.kdt.voucher.service.dto.VoucherResponses;
import org.prgrms.kdt.wallet.service.dto.JoinedWalletResponses;
import org.springframework.stereotype.Component;

import java.io.BufferedReader;
Expand Down
10 changes: 0 additions & 10 deletions src/main/java/org/prgrms/kdt/exception/FileAccessException.java

This file was deleted.

63 changes: 63 additions & 0 deletions src/main/java/org/prgrms/kdt/global/ApiExceptionHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package org.prgrms.kdt.global;

import org.prgrms.kdt.global.exception.EntityNotFoundException;
import org.prgrms.kdt.global.exception.InvalidInputException;
import org.prgrms.kdt.voucher.exception.InvalidDiscountException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MissingRequestHeaderException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.client.HttpClientErrorException;
import org.springframework.web.servlet.NoHandlerFoundException;

import javax.servlet.http.HttpServletRequest;

@RestControllerAdvice
public class ApiExceptionHandler {
private static final Logger logger = LoggerFactory.getLogger(ApiExceptionHandler.class);

@ExceptionHandler(BindException.class)
public ResponseEntity<ErrorResponse> handleBindException(HttpServletRequest request, BindException e) {
BindingResult bindingResult = e.getBindingResult();
StringBuilder stringBuilder = new StringBuilder();

for (FieldError fieldError : bindingResult.getFieldErrors()) {
stringBuilder.append(fieldError.getField()).append(":");
stringBuilder.append(fieldError.getDefaultMessage());
stringBuilder.append(", ");
}
int statusCode = HttpStatus.BAD_REQUEST.value();
Comment on lines +30 to +36
Copy link

Choose a reason for hiding this comment

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

메서드로 뺄 수 있을것 같습니다

return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(getErrorResponse(statusCode, stringBuilder.toString(), request.getRequestURI()));
}

@ExceptionHandler({NullPointerException.class, InvalidInputException.class, InvalidDiscountException.class, MissingRequestHeaderException.class, HttpMessageNotReadableException.class,
Copy link

Choose a reason for hiding this comment

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

NPE는 서버측 잘못일수도 있다고 생각해요

HttpClientErrorException.BadRequest.class, NoHandlerFoundException.class})
public ResponseEntity<ErrorResponse> handleBadRequestException(HttpServletRequest request, Exception e) {
int statusCode = HttpStatus.BAD_REQUEST.value();
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(getErrorResponse(statusCode, e.getMessage(), request.getRequestURI()));
}

@ExceptionHandler(EntityNotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFoundException(HttpServletRequest request, EntityNotFoundException e) {
int statusCode = HttpStatus.NOT_FOUND.value();
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(getErrorResponse(statusCode, e.getMessage(), request.getRequestURI()));
}

@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleException(HttpServletRequest request, Exception e) {
logger.error("Sever Exception: ", e.getMessage());
int statusCode = HttpStatus.OK.value();
return ResponseEntity.ok(getErrorResponse(statusCode, e.getMessage(), request.getRequestURI()));
}

private static ErrorResponse getErrorResponse(int status, String masesage, String requestURI) {
return new ErrorResponse(status, masesage, requestURI);
}
}
9 changes: 9 additions & 0 deletions src/main/java/org/prgrms/kdt/global/ErrorResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package org.prgrms.kdt.global;

import java.time.LocalDateTime;

public record ErrorResponse(int statusCode, String detail, String instance, String time) {
Copy link

Choose a reason for hiding this comment

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

필드가 많아지니 개행할 위치가 애매해지죠.

가독성을 위해

public record ErrorResponse(
    int statusCode, 
    String detail, 
    String instance, 
    String time
) { }

로 둬도 좋을것 같아요.

instance라는 필드는 애매모호해보입니다. 명확하게 바꾸는건 어떨까요?

public ErrorResponse(int statusCode, String detail, String instance) {
this(statusCode, detail, instance, LocalDateTime.now().toString());
}
}
10 changes: 10 additions & 0 deletions src/main/java/org/prgrms/kdt/global/Generator.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package org.prgrms.kdt.global;

import java.time.LocalDateTime;
import java.util.UUID;

public interface Generator {
UUID generateId();

LocalDateTime generateTime();
}
25 changes: 25 additions & 0 deletions src/main/java/org/prgrms/kdt/global/GeneratorImp.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.prgrms.kdt.global;

import com.fasterxml.uuid.Generators;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.UUID;

@Component
public class GeneratorImp implements Generator{
Copy link

Choose a reason for hiding this comment

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

Imp는 무엇인가용

private GeneratorImp() {
}

@Override
public UUID generateId() {
UUID generateId = Generators.timeBasedGenerator().generate();
String[] idArr = generateId.toString().split("-");
return UUID.fromString(idArr[2]+"-"+idArr[1]+"-"+idArr[0]+"-"+idArr[3]+"-"+idArr[4]);
}

@Override
public LocalDateTime generateTime() {
return LocalDateTime.now();
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package org.prgrms.kdt.util;
package org.prgrms.kdt.global;

import org.prgrms.kdt.exception.InvalidInputException;
import org.prgrms.kdt.global.exception.InvalidInputException;

import java.util.Arrays;

Expand Down Expand Up @@ -30,7 +30,7 @@ public static Menu getMenu(int num) {
.orElseThrow(() -> new InvalidInputException("잘못된 입력입니다."));
}

public boolean isNotExit() {
return this != EXIT;
public boolean isExit() {
return this == EXIT;
}
}
Loading