몬그로이

팀프로젝트 20일차 본문

카테고리 없음

팀프로젝트 20일차

Mon Groy 2024. 8. 7. 22:13

카카오 페이기능 넣기


결제요청 -> 결제 Ready ->  (PC일 경우 결제 수단 전환)

-> 인증(테스트의 경우 생략) -> 인증완료 Redirect

-> 결제 approve


카카오 페이 API 흐름

결제 준비(ready)  단계 : Secret key를 헤더에 담아 POST 로 요청

-> 요청 성공시 응답 바디에 JSON 객체로 다음단계 진행을 위한 값을 받음

-> Server 에서 tid 저장, 클라이언트를 리다이렉트하


카카오페이 API

 

1. 사용자 로그인을 이용한 API

OAuth2.0 인증방식을 이용한 사용자 로그인 -> Access Token 발급 -> API 호출

[애플리케이션 > 카카오페이 로그인]에서 Redirect URL을 반드시 등록

 

 

 

2. 앱 시크릿 키를 이용한 API

Secret key -> API 호출

 

구성

 

header 에 넣을 값

호스트

POST 방식  https://kapi.kakao.com + /v1/payment/approve

=>  https://open-api.kakaopay.com/online/v1/payment/ready 로 변경

 

Authorization, Content-Type

 

 

body 에 넣을 값

키, 설명, 타입, 필수

 

*Authorization

KakaoDevelopers -> 내 애플리케이션 -> 개요 -> 앱정보 -> 앱키 표시 -> admin키 = 권한키

=> admin 키 에서 secret key 로 변경

 

cid 코드 = 가맹점 코드 (실이용시 필요)

-> Test 코드인 경우 TC0ONETIME

 


 

Api 호출에 필요한 값

 

Client Id

Client Secret

Secret key


PC 와 모바일 결제의 동작방식은 다르지만 결국 사용자가 결제수단을 선택하여 결제하는 부분은 모바일입니다.

  1. 가맹점의 구매페이지에서 카카오페이 결제진행
  2. 가맹점->카카오페이 ready api 호출
  3. 3개의 url응답 받아, 각 환경에 따라 url을 오픈
    → pc : 팝업으로 오픈한면 QR/tms 호출창이 노출됨.
    : 모바일기기로 QR을 찍이면 해당 모바일기기에서 카카오페이 결제수단선택으로 전환
    → 모바일 : mobile, app url을 오픈하면 해당 모바일기기에서 바로 카카오페이 결제수단선택으로 전환
  4. 결제수단 선택 및 인증(비밀번호, 지문, 페이스)
  5. 인증완료후 2번에서 ready 요청시 보냈던 approval_url로 응답.
  6. approval_url은 가맹점의 서버이며, 해당 응답을 받았은후, 가맹점->카카오페이로 approve api 요청
    → 이때 최종 승인처리 되게 됩니다.

approval_url에 localhost로 하시는경우가 있는데, 이경우 해당 서버만 localhost가 호출이 가능하기때문에, 모바일기기에서 응답이되지 않습니다. 정확한 환경을 만드셔서 외부나 wifi이 환경에서 접속이 가능하셔야합니다.


진행 절차만 제대로 파악하면 그리 어렵지 않을 것 같다는 생각이 들었다

대신 이해해야하는 새로운 용어라던가 지정된 필드값, 각 단계에 지정된 절차들이 굉장히 많아서

그것들에 빨리 익숙해질수록 빠른 코딩이 가능하지 싶다

 

결국 각 단계에서 카카오페이에서 원하는 정보들을 넘겨주고 메서드들을 작성해야 하는 것과,

넘겨받은 정보들을 결제한 사람에게 넘겨주는 메서드들을 작성해야 하는 것으로 보인다

 


조사를 이렇게 하다가

배포가 몇 시간 후인 내일인데 프론트도 생성해야하기도 하고

생각보다 실력에 비해 규모가 큰 작업이어서

팀원들과 함께 다른 곳에 집중을 하기로 정했다


기타 오늘 있던 일

 

짝꿍조에 피드백을 요청한 건이 있는데

현재 파일을 업데이트 하는 경우

피치못할 에러나 기타 예외상황으로 DB 와 S3 상의 데이터상의 파일의 존재가 다르게 나타날 수 있는 것을

고려하며 코드를 작성하였는데, 혹시 더 개선할 점이 있다면 피드백을 받아보고 싶다고 남겼었다

 

그랬더니 우리팀으로 직접 찾아와 주셨다

작성된 코드를 어떻게 이해했는지 쭉 읊어봐 주셨고

맞다고 말씀드리자

 

이미 업로드된 파일에 대해서

특정 이미지만 삭제하고 기존에 가지고 있던 파일을 그대로 남긴다면

현재 짜여진 수정 메서드는 적합하지 않을 것이라고 생각되지만

 

만약 기존 파일들은 모두 날리고 새로 받은 파일만을 업로드하는 경우를 염두하고 작성한 거라면

적합하게 짜여진 코드라고 보여진다고 하셨다

 

List<String> foundFeedImageUrls = feed.getImageUrls();
List<String> imageUrls = new ArrayList<>();

코드상에 두 가지의 컬렉션이 모두 작성되어 있는데,

위의 컬렉션은 다 날려버릴 기존의 파일컬렉션이고

아래의 컬렉션은 새로들어온 파일들을 모아 담아 선택한 게시글에 새롭게 올릴 컬렉션이다

 

염두해 두었던 프론트의 절차는

이미 이미지가 로드되어있는 게시물의 경우 수정을할 경우에,

이미 업로드 했던 이미지 리스트가 뜰 것이다

그 리스트 중에서 몇 가지 삭제하고 새로운 것을 추가했다고 했을 경우,

백엔드로 들어오는 정보는 삭제되지 않은 기존 이미지와 새롭게 추가한 이미지에 대한 것일 것이다

였다

 

그래서 위와같이 작성을 했다고 설명을 드렸고,

이후 그 짝꿍조 일원 모두에게서 값진 코드리뷰를 들을 수 있었다

 

A. 작성하신 코드에서 말씀하신 문제점 없이 전부 예외처리를 잘 해주고 있는 것으로 확인됩니다. - 현재 이미지 삭제하는 부분에서 해당 데이터가 없으면 db에서도 반영을 해주고 있는 것으로 확인이되는데, (127~139라인) 반드시 해당 파일을 모두 delete를 하고 있는 것으로 보입니다. 이 업데이트하는 파일들은 전부 업데이트를 해야하는 파일들만 있나요? 그렇지 않다면 업데이트를 다건 처리하는 이유를 잘 모르겠습니다.. 단건으로 처리를 한다면 어떨까요? - 하지만 152번 라인에서 updateCommunityFeedImageUrls() 이 메소드 안에서 다시 데이터베이스에서 feed의 정보를 꺼내오는데, 위에 이미 해당 정보를 불러오는 것으로 확인됩니다. 그렇다면 그에 대한 update만 진행을 해주면 되는게 아닐까? 해서 남겨봅니다.

B. 업로드 후 삭제하는 방식으로 어떠신가요 옛날에 aws 관련 블로그를 보다가 이미지 업로드 중 네트워크 문제나 S3 서비스의 일시적인 장애로 인해 업로드가 실패하면 디비에는 url이 저장되지만 s3에는 이미지가 존재하지 않게 된다는 이야기를 들었습니다

C. s3에 새로운 이미지를 업로드하는 것, DB에 URL을 업데이트 하는 것, 그리고 기존 이미지를 삭제하는 것 모두 하나의 try-catch문으로 관리하는 방식은 어떨까요? 대신에 순서를 위와 같이 지키고 새로운 이미지를 업로드할 때 임시 URL 리스트에 저장해서, 만약 예외처리가 발생하면 catch문에서 임시 URL 리스트에 저장되었던 이미지들을 다시 s3에서 삭제하는 방식으로 진행하시면 일관성을 유지할 수 있을 것 같습니다.

D. 지금 현재 기존이미지 삭제후 , 새로운이미지 업데이트 하신다음 DB에 업데이트 하시는데 , 이 방법 보다는 새로운 이미지를 S3에 업로드 후 , 그 URL을 임시 저장해서 DB에 업데이트 후 기존 이미지를 삭제하면은 , 업로드중에 문제가 발생해도 기존 이미지는 유지 되기 때문에 더 괜찮을거 같습니다.

E. 1. DB에 저장된 Feed에서 사진의 URL 컬렉션를 확보한다. 2. 확보된 URL 컬렉션를 가지고 S3를 순회하면서 존재하는 이미지를 삭제한다. 2-1. 삭제 중 S3에서 URL를 찾지 못하는 경우 URL 컬렉션에서 해당 URL를 삭제한다. 2-2. 수정된 URL를 Feed에 업데이트 한다. 2-3. 업데이트된 Feed를 DB에 저장한다. 2-4. 위 과정을 URL의 컬렉션의 배열 크기만큼 반복한다. 3. 새로운 이미지 URL 컬렉션을 생성한다. 3-1. 요청된 File 컬렉션을 순회하며 S3에 저장하고, 새로운 URL 컬렉션에 저장한다. 3-2. 저장 간 오류가 발생하면 저장을 시도한 이미지를 S3에서 삭제한다. 3-3. 위 과정을 File 컬렉션의 배열 크기만큼 반복한다. 4. S3에 저장된 이미지 컬렉션을 Feed의 ID와 함께 사용하여 ImageCarrier 객체를 생성한다. 5. updateCommunityFeedImageUrls 메서드를 통해 캐리어에 포함된 ID를 통해 DB에서 Feed를 조회하고, Feed의 Url을 업데이트 한 후 DB에 저장한다. 의문점 왜 기존 사진을 모두 삭제하는가? 이후 새로운 사진만 Feed에 저장하는가? 궁금증 해결 - 최종적으로 수정한 상태의 Feed 결과(마지막으로 등록한 사진)만 반환하는 것이 목적이었다. S3를 안써봐서... 잘 모르겠지만 지금의 코드 상태라면 S3와 DB와의 일관성은 유지할 수 있을 것 같습니다.

 

 


https://developers.kakaopay.com/docs/payment/online/common

 

카카오페이 | 개발자센터

새로운 기회와 가치를 함께 만들어봐요

developers.kakaopay.com

https://developers.kakaopay.com/forum/

 

포럼

카카오페이 개발자센터 이용 관련 질문 및 답변을 공유하는 커뮤니티입니다.

developers.kakaopay.com

 

https://ko.wikipedia.org/wiki/%ED%8E%98%EC%9D%B4%EB%A1%9C%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85)

 

페이로드 (컴퓨팅) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 페이로드(영어: payload)는 전송되는 '순수한 데이터'를 뜻한다. 페이로드는 전송의 근본적인 목적이 되는 데이터의 일부분으로 그 데이터와 함께 전송되는 헤더,

ko.wikipedia.org

https://dorothy-yang.tistory.com/203

 

[90일차] 카카오페이 결제시스템 적용 / 카카오페이 클릭 후 작업 / 결제승인요청 / 주문하기 기능

20221130(수) 목차 - 카카오페이 결제시스템 적용 - 카카오페이 클릭 후 작업 - 결제승인 요청 - 주문하기 기능 안에서 일어나는 작업 < 카카오페이 결제시스템 적용 > API : 요청과 응답의 기능을 제

dorothy-yang.tistory.com

https://velog.io/@hyoreal51/Main-project-Spring-Boot-%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%8E%98%EC%9D%B4-API-%EC%97%B0%EB%8F%99

 

[Main project] Spring Boot 카카오페이 API 연동

그동안 프로젝트하느라 너무 바빠서 블로그를 하나도 못썼다..이제서야 널널해졌으니 프로젝트를 진행하며 공부하게된 것들에 대해 블로깅 몰아치기를 해보려 한다.결제 프로세스요청 1 : 백엔

velog.io