인도 프리랜서들을 위한 무료 인보이스 생성기를 만들며 (원치 않게) GST에 대해 더 많이 배우게 된 과정
요약
인도 프리랜서를 위한 GST 대응 인보이스 생성기 개발 과정을 다룹니다. 세무 규칙(CGST, IGST, TDS 등)을 반영한 로직 설계와 Next.js 및 @react-pdf/renderer를 활용한 클라이언트 사이드 구현 경험을 공유합니다.
핵심 포인트
- 인도 GST 체계(CGST, SGST, IGST) 및 TDS 규정 반영
- 프라이버시를 위해 백엔드 없이 로컬 스토리지 기반으로 설계
- PDF 생성 시 유니코드 기호(₹) 깨짐 문제를 폰트 임베딩으로 해결
프리랜서로서 발행한 나의 첫 인보이스는 청구한 작업 내용보다 그것을 파악하는 데 더 오랜 시간이 걸렸습니다.
나는 SAC 코드가 무엇인지 몰랐습니다. GST(Goods and Services Tax, 물품 및 서비스세) 등록이 필요한지도 몰랐습니다. 그리고 마침내 결제가 이루어졌을 때, 금액은 내 인보이스에 적힌 숫자보다 적었습니다 — 아무도 나에게 TDS(Tax Deducted at Source, 원천징수)에 대해 말해주지 않았기 때문입니다.
도움을 줄 도구를 찾아보았습니다. 내가 찾은 모든 인보이스 생성기는 미국이나 영국 시장을 위해 만들어져 있었고, 실제 GST가 작동하는 방식과는 전혀 상관없는 일반적인 "세금 (tax)" 필드만 있었습니다. 등록되지 않은 경우 GST를 건너뛸 수 있게 해주는 도구는 없었습니다. CGST(Central GST, 중앙 물품 및 서비스세)와 IGST(Integrated GST, 통합 물품 및 서비스세)의 차이를 이해하는 도구도 없었습니다. LUT(Letter of Undertaking, 이행보증서) 하에서의 수출 인보이스가 무엇인지 아는 도구도 없었습니다.
그래서 직접 하나를 만들었습니다. 세무 측면과 엔지니어링 측면 모두에서 이를 진행하며 배운 점들을 소개합니다.
세무 규칙 요약
몇 가지 사항은 나를 충분히 놀라게 하여 별도의 연구 페이지를 작성할 정도였습니다 (CBIC, GST 위원회 및 GST 포털 인용). 요약하자면 다음과 같습니다:
- 매출액이 20라크(₹20 lakh) 미만인 경우 GSTIN(GST 등록 번호)이 필요하지 않습니다 (특별 카테고리 주의 경우 10라크). 그 미만일 때는 GST를 전혀 부과해서는 안 되지만, 많은 도구들이 은연중에 그렇지 않다고 가정합니다.
- CGST+SGST vs IGST는 본인과 클라이언트가 같은 주(state)에 있는지 여부에 따라 달라집니다. 같은 주인 경우: 18%를 9% CGST + 9% SGST로 나눕니다. 다른 주인 경우: 18% IGST를 적용합니다. 이는 등록 후 CGST 규칙 제46조에 따른 의무 사항입니다.
- 해외 클라이언트에게 서비스를 수출하는 경우는 LUT(Letter of Undertaking) 하에서 영세율(zero-rated) 적용이 가능하지만, 인보이스에 특정 선언 문구가 포함되어 있지 않으면 유효하지 않습니다.
- Section 194J에 따른 TDS는 클라이언트가 대금을 지급하기 전 법적으로 약 10%를 공제할 수 있음을 의미합니다. 아무도 프리랜서에게 이를 사전에 알려주지 않기 때문에, 첫 결제는 항상 돈이 빠져나간 것처럼 느껴집니다.
빌드 과정
이것은 클라이언트 사이드 (client-side) Next.js 앱입니다. 백엔드도, 데이터베이스도 없습니다. 모든 것은 브라우저의 로컬 스토리지 (localStorage)에 저장됩니다. 이는 의도적인 선택이었습니다. 인보이스 생성기는 작동하기 위해 사용자의 데이터를 볼 필요가 없으며, "사용자의 데이터는 절대 브라우저를 떠나지 않습니다"라는 문구는 마케팅 문구가 아닌 실제적인 프라이버시 속성입니다.
PDF 생성은 제가 과소평가했던 부분이었습니다. 저는 실제 벡터 (vector) PDF(이미지로 렌더링된 스크린샷이 아닌, 텍스트 선택이 가능한 형태)를 생성하기 위해 @react-pdf/renderer를 사용했는데, 예상치 못한 버그에 직면했습니다. 바로 ₹ 기호가 2010년이 되어서야 유니코드 (Unicode)에 추가되었다는 점입니다. 이는 표준 PDF 글꼴(Helvetica, Courier 등 — 해당 기호보다 수십 년이나 더 오래된 것들)에 이 기호를 위한 글리프 (glyph)가 전혀 없음을 의미합니다. 모든 인보이스의 모든 금액이 ₹ 대신 깨진 문자로 렌더링되었습니다. PDF 기본 글꼴에 의존하는 대신, 해당 글리프를 실제로 지원하는 글꼴인 Noto Sans를 임베딩 (embedding)하여 문제를 해결했습니다.
현재 기능
- GSTIN 보유 여부와 상관없이 작동
- 주 (state)에 따른 CGST/SGST와 IGST의 자동 분리
- 올바른 선언 문구가 포함된 LUT 하의 인보이스 내보내기
- 지급액이 당황스럽지 않도록 예상 TDS 메모 제공
- 실제 PDF 및 PNG 내보내기
- 회원가입 없음, 워터마크 없음, 계정 없음
이 서비스는 무료이며, 앞으로도 무료로 유지될 것입니다. 또한 GST 로직이 어떻게 작동하는지 확인하고 싶거나, 제가 예외 케이스 (edge case)를 잘못 처리했을 경우 PR (Pull Request)을 보내고 싶다면 오픈 소스 (open source)로 이용하실 수 있습니다.
직접 사용해 보세요: invoice.karanchoudhary.dev
코드: github.com/karan5772/InvoiceGenerator
전체 세무 조사 내용: invoice.karanchoudhary.dev/research
만약 당신이 인도의 프리랜서라면, 제가 놓친 부분이 무엇인지 진심으로 알고 싶습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기