이번 글에서는 2022.08.01 ~ 2022.08.25 동안 진행 한 기업협업 프로젝트에 대한 회고를 해보려고 합니다.
사이트 및 프로젝트는 크게 V1 과 V2 로 나누어져 있었습니다.
V2 서비스는 프리랜서와 창업자를 연결하고 모임을 생성하고 해당 모임을 예약하고 결제할 수 있도록 도와주고, 모임이 종료 된 후에도 지속적인 교류를 할 수 있도록 도와주는 플랫폼 서비스입니다.
NodeJS, ExpressJS, Sequelize, MySQL, SQLite
- 링크페이
- 소셜로그인 및 회원가입(카카오)
- 토스페이먼츠 결제 API 연동
- 카카오페이 결제 API 연동
- 마이페이지 - 결제내역 관리
이 서비스는 기업을 갔을때 막 개발을 시작하려는 단계의 서비스였는데 그래서 프로젝트 초기세팅 및 DB 모델링 등 완전 처음부터 프로젝트를 시작해 볼 수 있었습니다.
첫 주에는 회의에 참석하면서 어떤 서비스인지, 티켓 분배 등을 하면서 CTO 님과의 미팅을 통해 어떤 기술스택을 이용하여 개발할 것인지 등을 지속적으로 이야기 하였습니다.
링크페이의 경우에는 당장 금요일까지 완료를 목표로하는 기능이였습니다. 아직 사이트를 운영하기 전 이였지만 서포티 內 B2B 기업 고객 대상으로 토스페이먼츠 결제를 연동하고 별도 결제 링크를 전달하여 따로 먼저 결제 할 수 있도록 하고 관리하기 위함이였습니다.
아직 DB가 구축이 되지 않은 상황이여서 CTO님이 그래도 자체적으로 로그는 남길 수 있도록 하라고 하여서 SQLite를 임시로 연결하여 결제로그를 남길 수 있도록 하였습니다.
소셜로그인은 아래와 같은 흐름으로 진행된다.
- 클라이언트에서 입력한 로그인 정보가 맞으면 카카오 서버에서 Redirect URI(서버)로 인가 코드 보내준다.
- 받은 인가 코드와 Client_id, Redirect_URI 값을 포함하여 카카오서버에 다시 요청을 하여 토큰 값을 받는다.
- 받아 온 토큰 값으로 다시 카카오 서버에 요청을 하여 사용자 정보를 받아온다.
- User 테이블에서 회원 여부를 조회하여 회원 등록이 되어있지 않으면 회원가입을 시켜주고 액세스 토큰과 리프레쉬 토큰을 발급하여 클라이언트에 리다이렉트 해준다.
또한, 액세스토큰 만료시에는 리프레쉬 토큰을 확인하여 재발급해줄 수 있도록 하였으며 회원탈퇴의 경우에는 새로운 테이블을 만들어서 거기에 탈퇴한 유저의 정보를 저장해두고 기존 User 테이블의 정보들은 마스킹 처리하여 Soft Delete 방식으로 구현해 볼 수 있었습니다.
토스페이먼츠의 경우에는 카드,계좌이체,가상계좌 이 세가지 결제 방식을 사용할 수 있도록 연동하였습니다.
카드나 계좌이체의 경우
위와 같이 클라이언트에서 결제 요청을 하고 성공 시 서버에서 클라이언트로 전달받은 paymentKey, orderId, amount 값을 담아 결제 승인요청을 하게 된다. 결제 승인이 완료가 되면 결제내역을 보내주게 되는데 결제방식에 맞춰서 클라이언트에 결제 정보를 정리해서 보내주도록 하였습니다.
가상계좌의 경우에는 앞에 두 방식과 조금 다른데
승인요청 결과로 가상계좌에 대한 정보가 오고 DB에는 결제대기 상태로 저장하고 이 정보(은행명, 가상계좌번호, 만료시간 등)를 클라이언트에 보내주게 된다. 그 후 사용자가 입금을 완료하게 되면 토스페이먼츠에 미리 등록해둔 가상계좌 웹훅 URL로 입금 완료 데이터를 전달해주고 DB에 결제완료 상태로 업데이트해주도록 하였습니다.
카카오페이 결제의 경우에는 아래와 같은 흐름으로 진행하였습니다.
- 결제준비 : 카카오페이 결제를 시작하기 위해 상세 정보를 카카오페이 서버에 전달하고 결제고유번호(TID)를 받는 단계, 이 TID 값은 DB에 저장해두고 카카오톡으로 결제 요청 메시지(TMS)를 보내기 위한 사용자 정보 입력 화면 Redirect URL 을 클라이언트에 전달
- 결제요청 : 전달받은 Redirect URL로 리다이렉트하여 사용자가 카카오톡 결제화면에서 결제 진행.
사용자가 결제를 취소 한 경우, 사용자가 결제를 실패 한 경우(Timeout : 15분) 에는 각각 해당화면으로 리다이렉트
사용자가 카카오톡 결제 화면에서 결제수단을 선택하고 비밀번호 인증까지 마치면, 결제 대기 화면은 결제 준비 API 요청 시 전달 받은 approval_url 에 pg_token 을 붙여서 리다이렉트.- 결제승인 : 결제승인 요청은 위에서 받은 pg_token 값과 결제준비 요청 때 전달 받은 TID 값을 보내주어야 하는데, 이 TID 값을 특정지어서 DB에서 가져오기 위해서 approval_url 을 보낼때 http://기존url?partner_order_id=partner_order_id 처럼 설정을 하면 리다이렉트 될때에 partner_order_id 를 그대로 사용하여 DB에서 TID 값을 특정지어서 가져올 수 있도록 하여 해결할 수 있었습니다.
- 결제완료 : 결제승인에 대한 Response 값을 DB에 저장하고 전달
마이페이지 결제내역의 경우에는 관리자 권한일 경우에는 모든 사용자의 결제 내역을 다 볼 수 있도록 하였으며, 일반 사용자의 경우에는 본인의 결제 내역만 볼 수 있도록 하였습니다.
필터의 경우에는 결제상태 및 날짜로 결제내역을 조회 할 수 있도록 구현하였습니다.
현재 개발 중인 Suppor-T(V2) 로 타켓을 바꾸기 전 운영하던 서비스로 프리랜서 강사가 본인의 강의와 학생들, 결제 및 정산 관련 부분을 관리할 수 있는 서비스를 제공하는 사이트 입니다.
NodeJS, ExpressJS, Sequelize, MySQL
V2 서비스 개발이 완료가 되면 기존의 V1 서비스도 추가하여 운영할 예정이라고 하여 프리랜서 강사가 학생을 관리하는 ERP 대시보드를 기존 기술스택에서 NodeJS 로 컨버팅 작업하면서 유지보수 및 개발을 진행할 수 있었습니다.
모든 기능들을 다 완료할 정도로 시간이 충분하지는 않아 사이트를 직접 보면서 해당 기간동안 할 수 있는 분량을 정하여 진행하였습니다.
또한, 작업 시작전 테이블의 구조를 파악하고 그 관계에 대해서 이해하는게 아주 중요한 부분이라고 느꼈습니다.
- 학생 리스트 관리
강사가 본인의 강의에 학생을 이름 및 날짜로 검색하여 등록- 학생 관리
프로필, 성적, 일정, 상담내역 등을 관리- 학습 자료실
학습 자료 업로드, 삭제, 검색, 다운로드 기능
위의 부분들을 우선적으로 선택하여 개발을 진행하였고 정해진 분량에 대해서는 기업협업이 끝나기 전 완료 할 수 있도록 하였습니다.
이번 기업협업은 CTO님 한분, 프론트 개발자분 두분, PM 한분이 계신 스타트업이였는데 완전 초기 스타트업에서의 역동적인(?) 개발 프로세스를 경험해 볼 수 있었던 경험이였고, 개발자가 아닌 기획자와도 소통하는 경험도 해볼 수 있었던 경험이였습니다.
또한,
- [v2] 기획의 요구사항과 서비스의 프로세스를 잘 파악하고 있어야 DB 모델링 및 개발 방향을 제대로 잡을 수 있다는 것을 느꼈습니다.
- [v1] 기존에 사용하던 v1 사이트에 대한 마이그레이션 작업 시 테이블 간 관계와 같은 DB 구조 파악 및 전체적인 서비스에 대한 이해가 필요하다는 것을 느꼈습니다.
위와 같이 v1, v2를 하면서 기술적인 면도 중요하지만 개발에 앞선 회사 비즈니스 파악의 중요성을 느낄 수 있었던 중요한 경험이였습니다.