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

전남대 BE_김보민 5주차 과제 (2단계) #373

Open
wants to merge 33 commits into
base: kbm05haruin30
Choose a base branch
from

Conversation

KBM05haruin30
Copy link

2단계

코드 작성하면서 어려줬던 점

  1. 카카오 로그인과 기존의 로그인을 합치고 싶어 액세스 토큰을 이용해 이메일을 추출했습니다. 그 후 Member DB에 저장한 다음 jwtToken을 생성하여 이걸 사용했습니다. 주문을 통한 상품 수량 차감은 원활하게 되었지만 주문 버튼을 누를 때 카카오톡 메시지를 보내는 것이 어려웠습니다. 액세스 토큰도 같이 넘겨주어야 하는데 처음에는 jwt 토큰처럼 post가 발생하면 같이 보내는 형식으로 하다가 실패했습니다. 이것에 관하여 팀원에게 조언을 구했었습니다. 팀원이 Order에 관한 DTO를 Request와 Response로 나누고 Request에 String accessToken 작성한 후 html에서 localStorage의 accessToken을 RequestDTO에 같이 넣어 보내주면 된다고 알려주었습니다. 이 방식대로 하니 accessToken도 같이 넘어오는 것을 확인할 수 있었습니다.

궁금한 점

  1. 카카오 액세스 토큰을 발급 받을 때 refresh_token과 refresh_token_expires_in도 함께 있었습니다. 이것에 관하여 1단계 리뷰에서 찾아보면 도움이 될 것 같다고 하셨는데 아직 어떻게 써야 하는지 감을 못 잡아서 사용하지 못했습니다. 대신 기존 로그인과 연동하면서 jwtToken을 사용했습니다. 이 때 jwtToken에도 만료 시간이 존재하는데 이것으로 refresh_token이 대체가 되는지 궁금합니다.
  2. jwtToken으로 만들기 전에 accessToken에서 email을 추출해 온 뒤 Member로 저장을 했습니다. 이 때 password를 숫자, 영어를 랜덤하게 만들어 저장을 했습니다. 이렇게 해도 되는지 궁금합니다.

로그인 시 발급받은 accessToken을 활용하여 email 추출합니다. 추출한 email을 가지고 Member에 저장하고, jwtTokne을 발급받습니다. 그 후 localStorage에 저장하기 위해 redirectAttributes를 사용하여 보내줍니다.
KakaoLoginController에서 넘긴 값들을 저장하기 위해 수정
Order를 통해 수량을 감소시키므로 불필요하다 생각하여 제거했습니다.
주문을 하면 해당 상품 옵션의 수량이 차감되고 위시 리스트에 있는 경우 위시 리스트에서 삭제됩니다.
버튼을 누르면 주문 폼으로 이동합니다.
주문 버튼을 누르면 jwt토큰을 이용하여 누구의 주문인지 알 수 있습니다. localStorage에 있는 accessToken을 같이 넘겨 카카오톡 메시지 보내기에 대비합니다.
Copy link

@Hongdonggeon Hongdonggeon left a 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);

Choose a reason for hiding this comment

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

카카오톡 메시지 전송 로직에서 에러가 발생하게 된다면 정상 응답이 안내려갈 것 같아요. 주문은 정상적으로 완료되었으나, 카카오톡 전송 로직이 실패했다고 해서 사용자가 실패응답을 받는게 맞을까요?

Copy link
Author

Choose a reason for hiding this comment

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

맞지 않은 것 같습니다. 이것도 마찬가지로 예외가 발생하면 로그를 남기는 형식으로 처리해보도록 하겠습니다.

Copy link
Author

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());

Choose a reason for hiding this comment

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

장바구니에서 상품삭제 로직에서 에러가 발생한다면 주문까지 실패하게 될것 같은데요. 어떻게 생각하실까요?

Copy link
Author

Choose a reason for hiding this comment

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

장바구니에서 삭제 로직에서 에러가 발생하더라도 주문은 생성되어야 합니다. 하나의 트랜잭션에서 작성을 해서 수량 차감 후 상품 삭제 로직에서 에러가 발생하면 롤백되어 주문까지 실패하게 된다고 생각합니다. 이를 해결하기 위해 트랜잭션을 분리하려고 합니다.

Copy link
Author

@KBM05haruin30 KBM05haruin30 Jul 30, 2024

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)를 사용하여 분리하면 되는 것 같습니다.
그래서 새로운 메서드를 만들고 그 위에 트랜잭션을 붙여주려고 합니다.

Copy link
Author

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\"}"
+ "}";

Choose a reason for hiding this comment

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

이렇게 문자열로 다 입력하게 된다면, 관리하기 힘들지 않을까요? 전송할 내용이 많아진다면 문자열을 일일히 수정해야 될 것 같아요

Copy link
Author

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)

Choose a reason for hiding this comment

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

범위를 이렇게 잡은 이유가 어떻게 될까요?

Copy link
Author

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;

Choose a reason for hiding this comment

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

작성하신 알고리즘의 원리가 궁금합니다

Copy link
Author

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로 결합하는 역할을 합니다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants