2005년식처럼 느껴지지 않는 현대적인 POS 시스템 구축
Source: Dev.to
밤을 설레게 만든 문제
솔직히 말하자면, 나는 플립폰이 유행하던 시절에 만든 듯한 투박하고 구식인 POS 시스템에 고생하는 가게 주인들을 보는 게 지쳤다. 여러분도 알다시피: 못생긴 인터페이스, 모든 동작마다 페이지 새로고침, 그리고 인터넷이 1초라도 끊기면 큰일이다.
결정적인 순간? 2024년에 내 삼촌 전자제품 가게가 POS 시스템이 장바구니에 물건을 추가하는 데 30 seconds(30초)나 걸려서 판매를 놓치는 모습을 본 것이다. 그때 나는 더 나은 것을 만들기로 결심했다.
내가 만든 것 (그리고 왜 실제로 중요한가)
저는 이것을 NextGen Shop이라고 부릅니다. 하이브리드 아키텍처 POS로, 고대 소매 소프트웨어와 씨름하는 것보다 현대적인 웹 앱을 사용하는 느낌이 납니다. 하지만 여기서 중요한 점은, 이것이 단순히 트렌디하기 위해 “현대적”인 것이 아니라는 것입니다. 제가 내린 모든 결정은 현장에서 본 실제 문제들에 의해 추진되었습니다.
기술 스택 (네, 실제로 중요합니다)
Laravel 12 백엔드와 React + Vite 프론트엔드를 선택했습니다. 여러분이 “또 다른 React 앱이네, 얼마나 독창적인지”라고 생각하는 걸 압니다만, 들어보세요.
분리된 아키텍처 덕분에 프론트엔드는 번개처럼 빠릅니다: 즉시 UI 업데이트, Framer Motion을 이용한 부드러운 애니메이션, 페이지 리로드 없이 동작합니다. 한편 Laravel은 백엔드에서 모든 무거운 작업을 처리하고, Sanctum이 보안을 책임합니다.
기술 하이라이트
- 프론트엔드: React + Vite, Tailwind CSS, Material UI
- 백엔드: Laravel 12와 Sanctum 인증
- 데이터베이스: MySQL (관계형 데이터)
- 보너스 도구: Recharts (분석), dompdf / jspdf (청구서)
결과는? Windows XP 시대의 웹사이트가 아니라 네이티브 앱을 사용하는 듯한 POS입니다.
실제 문제를 해결하는 기능
1. 기다리지 않는 POS 콘솔
체크아웃 인터페이스는 모든 것이 일어나는 곳이기 때문에, 속도에 집착했습니다.
- 이미지가 있는 제품 그리드? ✅
- 바코드 스캐너 지원? ✅
- 실시간 장바구니 업데이트? ✅
상품을 추가할 때마다 합계, 세금, 소계가 즉시 계산됩니다—로드 스피너도 “잠시만 기다려 주세요” 메시지도 없습니다. 고객이 줄을 서 있는 상황에서는 매 초가 중요합니다.
다음 유형의 고객을 처리할 수 있습니다:
- 방문 고객
- 등록 고객
- 비회원 판매
다양한 결제 수단을 지원합니다 (현금, 카드, 은행 이체) 및 “Dues”(외상 매출) 옵션—제가 가장 좋아하는 기능이기도 합니다.
2. “Khata” 시스템 (올바른 신용 관리)
남아시아와 중동 시장에서는 신용 판매(“우다르” 또는 “카타”)가 흔한 것이 아니라 필수입니다.
저는 다음을 할 수 있는 완전한 외상 관리 시스템을 만들었습니다:
- 각 고객이 얼마나 빚지고 있는지 정확히 추적
- 미결제 잔액에 대해 부분 결제 수락
- 고객의 전체 원장(미니 회계) 보기
- 신용 한도 초과 시 알림 받기
전통적인 POS 시스템은 이 기능이 없거나 어색하게 구현됩니다. 실제 비즈니스에 필요하기 때문에 네이티브로 구현했습니다.
3. 실제로 적응하는 재고 관리
기존 솔루션은 모든 가게가 같은 종류의 물품을 판매한다는 전제에 기반합니다. 식료품점은 무게로, 의류점은 사이즈와 색상으로, 휴대폰 매장은 IMEI 번호로 관리합니다.
맞춤형 제품 필드를 구축해 비즈니스에 맞는 속성을 정의할 수 있습니다. 주요 기능:
- 재고 수준 추적 및 저재고 알림
- 단위 관리(kg, 개, 리터, 다스 등)
- 즉시 바코드 생성
4. 실제 상황을 알려주는 분석
예쁜 차트는 멋지지만, 쓸모 없는 차트는 그저 쓸모 없습니다. 비즈니스를 운영하는 데 진정으로 도움이 되는 지표에 집중했습니다:
- 판매 추세(일별, 주별, 월별)
- 베스트셀러 제품
- 실제 이익률(수익 – 비용)
- 비용 대비 판매가 추적
모든 데이터는 PDF 또는 Excel로 내보낼 수 있어 일일 마감 정산에 활용 가능하고, 대시보드는 실시간으로 업데이트됩니다—수동 새로고침이 필요 없습니다.
5. 역할 기반 접근 제어 (신뢰하지만 검증)
가게의 모든 직원이 모든 기능에 접근할 필요는 없습니다.
- 계산원은 이익 보고서를 볼 필요가 없습니다.
- 관리자는 판매 기록을 삭제할 수 없어야 합니다.
맞춤형 역할과 세밀한 권한을 제공하는 RBAC(역할 기반 접근 제어)를 구현했습니다. 활동 로그는 누가 언제 무엇을 판매했는지 추적합니다. 이는 편집증이 아니라 현명한 보안입니다.
차이를 만든 기술적 결정
왜 하이브리드 아키텍처인가?
프론트엔드와 백엔드를 분리하는 접근은 단순히 트렌드를 따르는 것이 아니라 다음을 의미합니다:
- 미래 대비: 나중에 모바일 앱이 필요하나요? 동일한 백엔드를 재사용할 수 있습니다.
- 오프라인 기능 (로드맵): React 프론트엔드는 오프라인에서도 작동하며 연결이 복구되면 동기화됩니다.
- 향상된 사용자 경험: 전체 페이지 새로고침이 더 이상 없습니다—영원히.
전통적인 단일형 POS 시스템은 마치 10년 전 소프트웨어를 사용하는 듯한 느낌을 줍니다. 왜냐하면 실제로 그렇기 때문이죠. 업그레이드가 어렵고, 확장이 더 어려우며, 현대적인 느낌을 주는 것은 불가능합니다.
실제로 직면한 도전 과제
솔직히 말하자면—이 작업을 진행하는 것이 전부 순조로웠던 것은 아닙니다.
- Thermal printer integration: 이 장치들은 웹 표준을 따르지 않습니다. 나는 작은 영수증 형식에 맞추면서도 쓰레기처럼 보이지 않는 전용 인쇄 레이아웃을 만들어야 했습니다.
- Real‑time updates across multiple sessions: 한 캐셔가 판매를 하면 재고가 모든 사람에게 즉시 업데이트되어야 합니다. 나는 Laravel의 브로드캐스팅 기능과 맞춤 최적화를 사용해 이를 해결했습니다.
- Dues calculation logic: 부분 결제, 신용 판매에 대한 반품, 선택적 이자 계산 등—이는 POS 내에서 작은 회계 시스템으로 급속히 변했습니다.
NextGen Shop은 이러한 고충을 정면으로 해결하여, 현대 소매업자를 위해 설계된 POS를 제공하는 결과물입니다.
로드맵 (다음 단계)
제가 작업 중인 내용:
- 오프라인‑우선 모드 – 인터넷이 없어도 전체 기능을 제공하고, 스마트 동기화 지원.
- 모바일 동반 앱 – 이동 중 재고 확인 및 매출 모니터링을 위한 앱.
- 다중 매장 관리 – 여러 지점을 가진 비즈니스를 위한 기능.
- 고급 공급업체 관리 – 인기 회계 소프트웨어와 연동되는 구매 주문.
왜 이걸 공유하는가
저는 소매 소프트웨어 현황에 좌절감을 느껴서 이것을 만들었습니다. 너무 많은 기업이 마치 자신들을 방해하는 듯한 도구들 때문에 발목이 잡히고 있습니다.
비슷한 일을 하고 있든—그냥 생각하고 있든—여기에 제 조언이 있습니다:
- 실제 가게 주인과 대화하세요.
- 멋지다고 생각되는 기능을 만들지 말고, 실제로 짜증나는 문제를 해결하는 기능을 만드세요.
- 화려한 애니메이션은 좋지만, 핵심 워크플로우가 빠르고 직관적이지 않다면 의미가 없습니다.
그리고 신용 관리가 매력적이지 않을 수도 있지만, 많은 시장에서 이것이 유용한 POS와 비싼 진열 장식품 사이의 차이를 만들곤 합니다.
토론하고 싶으신가요?
저는 기술적인 세부 사항, 아키텍처 결정에 대해 이야기하거나, 열 프린터 드라이버의 즐거움에 대해 함께 공감하는 것을 언제나 기쁘게 생각합니다. 아래에 댓글을 남기시거나 dev.to에서 저와 연결해 주세요.
이 프로젝트를 구축하는 것은 제가 작업한 가장 도전적이고 보람 있는 프로젝트 중 하나였습니다. 비슷한 것을 만들고 있거나 기술 결정에 대해 질문이 있다면, 언제든지 대화해요!