GitHub - rkdalsdl98/sirenorder-server: 사이렌 오더 서버
해당 레포지토리에 기타 연관된 레포지토리로 이동하는 주소가 있습니다.
📌 Summary
<aside>
💡 사이렌 오더 기능을 구현하고, 서비스를 사용자의 관점에서 생각하고 개발해보자!
</aside>
🔧 Stack & Library
Server
Clients
📱 Main Features
- 실시간 알림 서비스 기능
- 포트원 API를 이용한 PG사 결제 방식
(테스트 결제만 가능하며 카카오 페이만 가능합니다)
- 구매한 상품을 선물하는 기능
- 상품 구매 시 포인트 적립 및 결제 시 포인트 사용 기능
- API 요청 중 발생한 오류, 인증 내용, 결과 로그 시스템
✍🏻 Contribute
🤓 Problem & Solved
- 매장에 주문을 요청하고 실시간으로 주문 정보를 확인 할 수 있는 알림 서비스를 모바일에 개발해야 하는 상황에서 어떤 기술 스택을 사용하여 개발하면 좋을지 고민을 했습니다. 구현 방법엔 Polling, Socket, SSE 3가지가 존재 했으며 이 중 SSE 방식을 채택했습니다. Sever-Sent-Event의 약자로 이름에서 알 수 있듯 서버에서 보내는 단 방향 이벤트 입니다. 한 쪽에서만 이벤트를 발생 할 수 있어 불필요한 트래픽이 감소하고, 모바일에서 배터리 소모가 적은 방식이기 때문에 사용하게 되었습니다. SSE는 클라이언트에서 서버의 이벤트를 구독하고 데이터를 스트림 형식으로 받아옵니다. 이때 앱에서 스트림 데이터를 정확하게 읽지 못하는 현상이 발생했습니다. 이벤트를 구독하는 부분을 모두 print로 로그를 띄운 결과 수신하는 데이터가 String 타입으로 “key: data”으로 오는 것을 확인했습니다. 문제를 인지하고 넘어온 데이터를 “:”를 기준으로 split하여 데이터를 추출 하니 정상적으로 작동하는 것을 확인했습니다.
이 경험은 Json이 표준이라 생각하고 안일하게 코드를 작성하던 자신을 되돌아 볼 수 있는 계기가 되었습니다.
- 쿠폰 기능을 개발하면서 유저에게 할당 된 쿠폰의 기한을 어떤식으로 관리 해야 할 지 고민을 했었습니다. 우선 서버 로드 시 유저 정보를 DB에서 모두 탐색하며 기한이 만료된 쿠폰을 지우는 방법을 떠올렸습니다. 하지만 이 방식은 만료된 쿠폰을 조회할 가능성이 존재 했으며, cron job으로 올리게 되어도 동일한 문제를 유발하게 될 뿐더러 유저 정보를 Full scan하는 부하가 걱정 되었습니다. 개선 방법을 고민 중 Redis의 메모리 관리 기법인 Lazy expiration을 떠올리게 되었고, 쿠폰 조회시에 만료가 되었다면 DB에서 제거하는 방식으로 처리하였습니다.