-
Notifications
You must be signed in to change notification settings - Fork 112
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
전남대 BE_김보민 5주차 과제 (2단계) #373
base: kbm05haruin30
Are you sure you want to change the base?
전남대 BE_김보민 5주차 과제 (2단계) #373
Conversation
로그인 시 발급받은 accessToken을 활용하여 email 추출합니다. 추출한 email을 가지고 Member에 저장하고, jwtTokne을 발급받습니다. 그 후 localStorage에 저장하기 위해 redirectAttributes를 사용하여 보내줍니다.
KakaoLoginController에서 넘긴 값들을 저장하기 위해 수정
Order를 통해 수량을 감소시키므로 불필요하다 생각하여 제거했습니다.
주문을 하면 해당 상품 옵션의 수량이 차감되고 위시 리스트에 있는 경우 위시 리스트에서 삭제됩니다.
버튼을 누르면 주문 폼으로 이동합니다.
주문 버튼을 누르면 jwt토큰을 이용하여 누구의 주문인지 알 수 있습니다. localStorage에 있는 accessToken을 같이 넘겨 카카오톡 메시지 보내기에 대비합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
안녕하세요 보민님
미션 구현하느라 수고많으셨습니다!
코멘트 남겨놓았으니 확인 한번 해주세요!
OrderResponseDTO orderResponseDTO = orderService.createOrder(orderRequestDTO, | ||
member.getEmail()); | ||
String accessToken = orderRequestDTO.accessToken(); | ||
kakaoService.sendKakaoMessage(accessToken, orderResponseDTO); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
카카오톡 메시지 전송 로직에서 에러가 발생하게 된다면 정상 응답이 안내려갈 것 같아요. 주문은 정상적으로 완료되었으나, 카카오톡 전송 로직이 실패했다고 해서 사용자가 실패응답을 받는게 맞을까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
맞지 않은 것 같습니다. 이것도 마찬가지로 예외가 발생하면 로그를 남기는 형식으로 처리해보도록 하겠습니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
처음에는 model.addAttribute를 사용하여 "message"를 만들고 에러를 처리하려고 했었습니다. 하지만 생각대로 출력이 되지 않아서 로그를 남기는 형식으로 처리했습니다.
Order order = new Order(null, option, quantity, LocalDateTime.now(), | ||
orderRequestDTO.message(), member); | ||
orderRepository.save(order); | ||
wishlistService.removeWishlist(member.getEmail(), option.getProduct().getId()); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
장바구니에서 상품삭제 로직에서 에러가 발생한다면 주문까지 실패하게 될것 같은데요. 어떻게 생각하실까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
장바구니에서 삭제 로직에서 에러가 발생하더라도 주문은 생성되어야 합니다. 하나의 트랜잭션에서 작성을 해서 수량 차감 후 상품 삭제 로직에서 에러가 발생하면 롤백되어 주문까지 실패하게 된다고 생각합니다. 이를 해결하기 위해 트랜잭션을 분리하려고 합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
트랜잭션을 분리하기 위해서는 @Transactional(propagation = Propagation.REQUIRES_NEW)
를 사용하여 분리하면 되는 것 같습니다.
그래서 새로운 메서드를 만들고 그 위에 트랜잭션을 붙여주려고 합니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
트랜잭션을 분리했습니다. 에러가 발생했을 때 어떻게 처리해주어야 할 지 고민하다가 log를 남기기로 했습니다.
+ "\"text\":\"주문 정보:\\n주문 ID: " + id + "\\n옵션 ID: " + optionId + "\\n수량: " + quantity | ||
+ "\\n주문 시간: " + orderDateTime + "\\n메시지: " + message + "\"," | ||
+ "\"link\":{\"web_url\":\"http://localhost:8080/admin/products\",\"mobile_web_url\":\"http://localhost:8080/admin/products\"}" | ||
+ "}"; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
이렇게 문자열로 다 입력하게 된다면, 관리하기 힘들지 않을까요? 전송할 내용이 많아진다면 문자열을 일일히 수정해야 될 것 같아요
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
확실히 전송할 내용이 많아지게 되면 문자열을 일일히 수정해야 한다는 불편한 점이 생길 것 같습니다. 하나의 TemplateObject DTO 클래스를 만들어 관리할 수 있도록 수정하겠습니다!
int rightLimit = 122; | ||
int targetStringLength = 20; | ||
Random random = new Random(); | ||
String generatedPassword = random.ints(leftLimit, rightLimit + 1) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
범위를 이렇게 잡은 이유가 어떻게 될까요?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
비밀 번호를 생성할 때 랜덤하게 만들고 싶었습니다. 그 중 영어 대문자, 소문자, 숫자를 사용해서 만들고 싶었습니다. 숫자 0은 아스키 코드에서 48이고 소문자 z는 아스키 코드에서 122이므로 범위를 위와 같이 잡았습니다. 비밀 번호의 길이는 몇 자가 적당할까 하다가 20자로 정했습니다.
.limit(targetStringLength) | ||
.collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) | ||
.toString(); | ||
return generatedPassword; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
작성하신 알고리즘의 원리가 궁금합니다
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
random을 사용하여 48에서 122까지의 난수를 생성합니다.
filter를 통해 숫자와 알파벳만 포함하도록 합니다.
limit를 통해 제가 원하는 길이만큼만 생성되도록 제한합니다.
collect를 통해 필터링된 난수를 문자열로 반환하여 StringBuilder에 저장합니다.
toString을 통해 StringBuilder를 문자열로 반환하여 generatedPasseord에 저장합니다.
StringBuilder에 관한 설명
StringBuilder::new는 새로운 StringBuilder 객체를 생성합니다.
StringBuilder::appendCodePoint는 주어진 숫자에 해당하는 아스키 코드를 StringBuilder에 추가합니다.
StringBuilder::append는 두 StringBuilder 객체를 병합합니다. 결과를 하나의 StringBuilder로 결합하는 역할을 합니다.
TemplateObjectDTO를 사용하고 ObjectMapper를 이용해 변환시켜줍니다.
2단계
코드 작성하면서 어려줬던 점
String accessToken
작성한 후 html에서 localStorage의 accessToken을 RequestDTO에 같이 넣어 보내주면 된다고 알려주었습니다. 이 방식대로 하니 accessToken도 같이 넘어오는 것을 확인할 수 있었습니다.궁금한 점