Skip to content

[FEATURE] : 토스페이먼츠 결제 API를 구현합니다.#62

Merged
polyglot-k merged 29 commits intoTaskSprints:developfrom
na0th:auction_product
Dec 18, 2024
Merged

[FEATURE] : 토스페이먼츠 결제 API를 구현합니다.#62
polyglot-k merged 29 commits intoTaskSprints:developfrom
na0th:auction_product

Conversation

@na0th
Copy link
Copy Markdown
Contributor

@na0th na0th commented Oct 16, 2024


TODO

  • 세션 값 임시 저장되는지 검증

  • 토스페이먼츠 결제 요청 성공, 실패

  • PaymentResponse DTO에 토스페이먼츠 Response 저장

  • UserId 통해서 wallet를 찾기 (paidUser.getWallet)

  • wallet < - > payment 연관 관계 편의 메서드로 객체 참조 맺기

  • payment 저장 -> cascade.ALL로 지갑도 자동 저장

  • 결제 정보 저장 성공 시, 지갑 충전 로직

  • 결제 정보 저장 실패 시, 토스페이먼츠로 결제 취소 요청

  • 토스 결제 실패 시, 클라이언트로 실패 객체 리턴

  • 결제 실패 시, 트랜잭션에 의해서 충전 금액, 결제 내역 롤백

  • 결제 시나리오 검증

  • 결제 api 리팩토링

  • 결제 api 테스트 코드 작성


🆕 기능 추가 / 🔧 버그 수정

  • 기능 추가: 기능의 간략한 설명을 작성합니다.
    토스 페이먼츠 결제 API를 구현합니다.

📋 변경 사항

🔍 테스트 사항

📄 관련 문서

  • 변경 사항과 관련된 문서나 링크가 있다면 여기에 추가해주세요.

📝 추가 사항

  • PR과 관련된 다른 중요한 정보나 주의 사항을 기입합니다.

na0th added 4 commits October 16, 2024 13:12
- 변경 내용 1 : PrePersist 함수 삭제
- 변경 내용 2 : viewCount null 체크 삭제
- 변경 내용 3 : viewCount Long -> long

이유 : Long을 쓰면 null을 고려해야 하지만, long을 쓰면 null을 고려할 필요가 없어짐
-변경 사항 1 : 페이징 카운트 처리에서 생겼던 전체 size를 잘못 계산하던 에러 수정
- 추가한 내용 :
1. Payment 엔티티 구성
2. payment 관련 enum Type 구성
- payStatus, payType
3. payment DTO 구성
4. Payment 관련 api 메세지 구성
- 추가한 내용
:
1. controller, service, repository 레이어 구성
2. orderId, amount를 세션에 임시 저장하는 엔드포인트 구성
@CreatorDodo
Copy link
Copy Markdown
Member

👏👏👏

na0th added 2 commits October 16, 2024 15:20
- 추가한 내용 :
1. wallet 엔티티 구성
2. wallet 컨트롤러, 서비스, 레포지터리 레이어 구성
3. user 엔티티와 wallet 엔티티간 양방향 관계 설정 및 연관관계 편의 메서드 구현
-> 연관 관계 주인 쪽 user에서 처리
4. wallet 엔티티와 payment 엔티티간 양방향 관계 설정 및 연관관계 편의 메서드 구현
-> 연관 관계 주인 쪽 payment에서 처리

미완 :
1. user 엔티티 create 시에 wallet도 생성되게 처리 해야 한다.
2. wallet 의 식별자를 uuid로 해야 할지 고민해야 함.
-추가된 내용 :
1. 세션에 orderId, amount 값을 임시 저장한 것이 제대로 저장되었는지 테스트
이유 : 결제 최종 승인 요청 전에 값이 변조되지 않았는지 검증하기 위함

미흡 :
결제 요청 받았을 때, 세션에 값이 저장되지 않았을 경우에 대한 예외 처리 미완
테스트 코드에 대한 부족함이 느껴져 찜찜함이 있다.
@na0th na0th changed the title Feature : 토스페이먼츠 결제 API를 구현합니다. [FEATURE] : 토스페이먼츠 결제 API를 구현합니다. Oct 16, 2024
na0th added 17 commits October 19, 2024 11:22
.
.
변경한 내용 :
1. 트랜잭션 단위로 User 생성과 Wallet 생성을 묶어서 처리
2, 연관 관계 편의 메서드로 User와 Wallet 간 객체 참조 연결
3. User의 영속성이 Wallet으로 전파되도록
cascade.ALL 설정
추가한 내용 :
1. wallet 충전 메서드
2. wallet 생성 예외 메시지
이유 :
git이 paymentController -> PaymentController로 바꾼 것을 인식하지 못함
임시 이름에서 다시 변경
변경한 내용
1. Controller 로직 -> Service 레이어로 옮김
2. PayType, PayStatus 같은 Enum Type의 메서드명, 변수명을 변경
3. PaymentRequest, Response 토스 페이먼츠 변수명에 맞게 변경
3. paymentConfig url 변수명 변경

++
4. chargeMoney에서 save()까지 책임 옮김
추가한 내용 :
1. Payment 엔티티에 create 메서드 추가
2. Payment 관련 Api 메세지 추가
3. Payment 관련 예외 메세지 추가
4. Http Client를 Config에서 Bean 등록
변경한 내용 :
필요없는 인자를 커밋해서
빌드시 오류가 나던 것을 해결
변경한 내용 :
1. User.create 메서드를 createWithWallet 메서드로 변경하면서 Wallet 생성 부분까지 한 번에 User를 생성하면서 맡도록 했음
2. Service 레이어에서 Wallet 생성 책임을 User에 넘겼음
3. 그로인해 AuctionInitializer 코드 변경(지갑 생성 부분)
4. UserDetailsResponse walletId 필드 추가
변경한 내용 :
1. wallet을 User쪽에서 한 번에 생성하면서 테스트 코드를 조금 변경함
2. UserDetailsResponse에 walletId 필드를 추가해서 테스트코드의 생성자의 파라미터로 walletId 필드 추가해줌
변경 및 추가한 내용 :
1.  인터페이스로 HttpClient 같은 의존성에 간접 의존하도록 바꿈
-> 변경에 유연하도록
2. 토스페이로부터 온 응답을 HttpResponse에서 직접 만든 Response(Object)로 변환해서 처리
-> 테스트 시 객체 생성이 쉬워지도록
3. userId를 통해 Wallet 반환받는 메서드를 쿼리로 변경
-> user.getWallet() 에서 JPQL 쿼리로 변경

미완 :
테스트 추가 필요
추가한 내용 :
paymentKey 세션 임시 저장 확인 테스트
결제 상태에 따른 메서드 처리 확인 테스트
Wallet 조회, 충전 관련 테스트 추가 등등

미완 :
컨트롤러 테스트 추가 필
추가한 내용 :
1. 컨트롤러 테스트 추가
2. ExceptionHandler에 Invalid Session, PaymentDataMismatch 예외 추가 400번 반환
3. Service 테스트 삭제
-> 안 쓰이던 테스트
변경한 내용 :
토스 api 버전에 따라 response 형식이 달라서
맞추기 위함.
@JsonAlias를 통해 error object의 루트 레벨을 평탄화하여 code, message를 필드로 추가
수정한 내용 :
1) Mocking을 실수로 잘못해서 성공할 수 밖에 없는 테스트를 작성함
-> HttpResponse를 Response로 변환해서 성공적으로 반환하는지 검증하게 수정
1) 주석 처리된 부분 삭제
2) 사용되지 않은 클래스 삭제
@polyglot-k
Copy link
Copy Markdown
Member

DDD 로 변경하게 되면 infrastructure 라인에서 third-party 진행할건데, 이를 event 기반의 통신으로 pub/sub 화 해서 리팩토링 할 것 같습니다.

현재 third-party 와의 의존성이 강한 것 같아서, 이 부분 어느정도 완료 되신거면, 댓글로 남겨주시면 pull 받아서 진행해볼게요~

Comment thread src/main/java/com/tasksprints/auction/domain/payment/client/PaymentClient.java Outdated
Comment thread src/main/java/com/tasksprints/auction/common/config/PaymentConfig.java Outdated
바뀐 내용 :
1)PaymentClient -> PaymentApiSerializer
API 직렬화, 역직렬화만 담당하는 클래스라는 인터페이스명

2)PaymentConfig -> PaymentProperites로 변경
config보다는 Properties 성격
@na0th
Copy link
Copy Markdown
Contributor Author

na0th commented Dec 14, 2024

DDD 로 변경하게 되면 infrastructure 라인에서 third-party 진행할건데, 이를 event 기반의 통신으로 pub/sub 화 해서 리팩토링 할 것 같습니다.

현재 third-party 와의 의존성이 강한 것 같아서, 이 부분 어느정도 완료 되신거면, 댓글로 남겨주시면 pull 받아서 진행해볼게요~

피드백 해주신 부분 변경했습니다. 결제쪽에서 추상화를 멋모르고 많이 해놓은 불필요한 추상화 같긴 하지만
일단은 pull해서 event 기반으로 리팩토링 약간 해주시면 공부해와서 더 고쳐보겟습니다!

@polyglot-k
Copy link
Copy Markdown
Member

👍🏿 수고하셨습니다.

@polyglot-k polyglot-k merged commit 6ed2c35 into TaskSprints:develop Dec 18, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

Status: 완료

Development

Successfully merging this pull request may close these issues.

3 participants