• Stars
    star
    317
  • Rank 127,383 (Top 3 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created over 2 years ago
  • Updated 10 days ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Korean Payment System with Mockup servers of PGs

Fake Toss Payments Server

1. Outline

GitHub license npm version Downloads Build Status

fake-toss-payments-server ๋Š” ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„์˜ API ๋ฅผ ํ‰๋‚ด๋‚ด์–ด ๋งŒ๋“ , ๊ฐ€์งœ ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„์ด๋‹ค. ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„์™€์˜ ๋ณด๋‹ค ์›ํ™œํ•œ ์—ฐ๋™ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•˜์—ฌ ๋งŒ๋“ค์—ˆ๋‹ค. ํŠนํžˆ ํ”„๋ก ํŠธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ†ตํ•œ ์ˆ˜๊ธฐ ํ…Œ์ŠคํŠธ๊ฐ€ ์•„๋‹Œ, ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ์ž์ฒด์˜ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•œ ์ƒ์‹œ ๊ฒ€์ฆ์— ์ ํ•ฉํ•˜๋‹ค.

๋˜ํ•œ, toss-payments-server-api ๋Š” ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„์™€ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๋Š” SDK ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ์จ, fake-toss-payments-server ์˜ ์†Œ์Šค์ฝ”๋“œ๋ฅผ ํ† ๋Œ€๋กœ Nestia ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋นŒ๋“œํ•˜์˜€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ํ†ตํ•˜์—ฌ ๊ฐ€์งœ ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„ ๋ฟ ์•„๋‹ˆ๋ผ, ์ง„์งœ ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„, ์–‘์ชฝ ๋ชจ๋‘์™€ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ ๋กœ Nestia ๋Š” SDK ๋ฟ ์•„๋‹ˆ๋ผ Swagger ๋˜ํ•œ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋˜ํ•œ fake-toss-payments-server ์˜ ์†Œ์Šค์ฝ”๋“œ ๋ฐ DTO ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ ์ˆ˜์ค€์—์„œ ๋ถ„์„ํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ธ์ง€๋ผ, ๊ทธ ํ€„๋ฆฌํ‹ฐ๊ฐ€ ์ƒ๋‹นํ•˜๋‹ค. ์–ด์ฉŒ๋ฉด ํ† ์Šค ํŽ˜์ด๋จผ์ธ ๊ฐ€ ๊ณต์‹ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ ๋ฌธ์„œ๋ณด๋‹ค, fake-toss-payments-server ๋กœ ์ƒ์„ฑํ•œ Swagger ๊ฐ€ ๋” ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ด๊ณ  ์ผ๋ชฉ์š”์—ฐํ• ์ง€๋„?

import btoa from "btoa";
import toss from "toss-payments-server-api";
import { ITossPayment } from "toss-payments-server-api/lib/structures/ITossPayment";
import { assert } from "typia";

export async function test_fake_card_payment_approval(): Promise<void>
{
    const connection: toss.IConnection = {
        host: "http://127.0.0.1:30771", // FAKE-SERVER
        // host: "https://api.tosspayments.com", // REAL-SERVER
        headers: {
            Authorization: `Basic ${btoa("test_ak_ZORzdMaqN3wQd5k6ygr5AkYXQGwy:")}`
        }
    };

    const payment: ITossPayment = await toss.functional.v1.payments.key_in
    (
        connection,
        {
            // CARD INFORMATION
            method: "card",
            cardNumber: "1111222233334444",
            cardExpirationYear: "24",
            cardExpirationMonth: "03",

            // ORDER INFORMATION
            orderId: "some-order-id",
            amount: 25_000,

            // FAKE PROPERTY
            __approved: false
        }
    );
    assert<ITossPayment>(payment);

    const approved: ITossPayment = await toss.functional.v1.payments.approve
    (
        connection,
        payment.paymentKey,
        {
            orderId: payment.orderId,
            amount: payment.totalAmount,
        }
    );
    assert<ITossPayment>(approved);
}

2. Installation

2.1. NodeJS

๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์€ TypeScript ๋กœ ๋งŒ๋“ค์–ด์กŒ์œผ๋ฉฐ, NodeJS ์—์„œ ๊ตฌ๋™๋œ๋‹ค.

๊ณ ๋กœ ์ œ์ผ ๋จผ์ € ํ•  ์ผ์€, NodeJS ๋ฅผ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์•„๋ž˜ ๋งํฌ๋ฅผ ์—ด์–ด, NodeJS ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์€ ํ›„ ์ฆ‰๊ฐ ์„ค์น˜ํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค. ์ฐธ๊ณ ๋กœ NodeJS ๋ฒ„์ „์€ ์–ด์ง€๊ฐ„ํžˆ ๋‚ฎ์€ ์˜› ์‹œ๋Œ€์˜ ๋ฒ„์ „๋งŒ ์•„๋‹ˆ๋ฉด ๋˜๋‹ˆ, ๊ตฌํƒœ์—ฌ Latest ๋ฒ„์ „์„ ์„ค์น˜ํ•  ํ•„์š”๋Š” ์—†์œผ๋ฉฐ, Stable ๋ฒ„์ „๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํ•˜๋‹ค.

2.2. Server

NodeJS ์˜ ์„ค์น˜๊ฐ€ ๋๋‚ฌ๋‹ค๋ฉด, ๋ฐ”๋กœ (๊ฐ€์งœ) ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„ ๊ตฌ๋™์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ œ์ผ ๋จผ์ € git clone ์„ ํ†ตํ•˜์—ฌ, ๋ฐฑ์—”๋“œ ํ”„๋กœ์ ํŠธ๋ฅผ ๋กœ์ปฌ ์ €์žฅ์†Œ์— ๋ณต์‚ฌํ•˜๋„๋ก ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ํด๋”๋กœ ์ด๋™ํ•˜์—ฌ npm install ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•จ์œผ๋กœ์จ, ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋ฅผ ๊ตฌ๋™ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ๋‹ค์šด๋กœ๋“œ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  npm run build ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์—ฌ, ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์˜ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ npm run start ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๋ฉด, (๊ฐ€์งœ) ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„๊ฐ€ ๊ตฌ๋™๋œ๋‹ค. ์ด ๊ฐ€์งœ ์„œ๋ฒ„๋ฅผ ํ†ตํ•˜์—ฌ, ๊ท€ํ•˜๊ฐ€ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๊ฐ€ ๊ฒฐ์ œ ์—ฐ๋™์— ๊ด€๋ จํ•˜์—ฌ ์ œ๋Œ€๋กœ ๊ตฌํ˜„๋˜์—ˆ๋Š” ์ง€ ์ถฉ๋ถ„ํžˆ ๊ฒ€์ฆํ•œ ํ›„, ์‹ค ์„œ๋ฒ„๋ฅผ ๋ฐฐํฌํ•  ๋•Œ ์—ฐ๋™ ๋Œ€์ƒ ์„œ๋ฒ„๋ฅผ ํ˜„์žฌ์˜ ๊ฐ€์งœ ์„œ๋ฒ„์—์„œ ์ง„์งœ ์„œ๋ฒ„๋กœ ๋ฐ”๊พธ์–ด์ฃผ๋„๋ก ํ•˜์ž. ๊ตฌ๋™ ์ค‘์ธ ๊ฐ€์งœ ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, npm run stop ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ฐธ๊ณ ๋กœ ๊ฐ€์งœ ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ํฌํŠธ ๋ฒˆํ˜ธ๋‚˜, ๊ฐ€์งœ ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๋Š” Webhook URL ๋“ฑ์€ ๋ชจ๋‘ src/FakeTossConfiguration.ts ์— ์ •์˜๋˜์–ด์žˆ์œผ๋‹ˆ, ์ด๋ฅผ ์•Œ๋งž๊ฒŒ ์ˆ˜์ •ํ•œ ํ›„ ์ปดํŒŒ์ผ ๋ฐ ๊ฐ€์งœ ์„œ๋ฒ„ ์žฌ ๊ฐ€๋™์„ ํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

# CLONE REPOSITORY
git clone https://github.com/samchon/fake-toss-payments-server
cd fake-toss-payments-server

# INSTALLATION & COMPILATION
npm install
npm run build

# START SERVER & STOP SERVER
npm run start
npm run stop

npm version Downloads

๋”ํ•˜์—ฌ fake-toss-payments-server ๋Š” npm ๋ชจ๋“ˆ๋กœ ์„ค์น˜ํ•˜์—ฌ ๊ตฌ๋™ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

๊ท€ํ•˜์˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ํ”„๋กœ๊ทธ๋žจ์ด, fake-toss-payments-server ์˜ ์„ค์ •๊ณผ ๊ฐœ์„ค ๋ฐ ํ์‡„๋ฅผ ๋ชจ๋‘ ํ†ต์ œํ•˜๊ณ ์ž ํ•  ๋•Œ๋Š”, github ์ €์žฅ์†Œ๋ฅผ clone ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค, ์ด์ฒ˜๋Ÿผ npm ๋ชจ๋“ˆ์„ ์„ค์น˜ํ•˜์—ฌ import ํ•˜๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๋” ์•Œ๋งž๋‹ค.

๋”ฐ๋ผ์„œ ๊ท€ํ•˜์˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๊ฐ€ TypeScript ๋‚ด์ง€ JavaScript ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, github ์ €์žฅ์†Œ๋ฅผ clone ํ•˜์—ฌ fake-toss-payments-server ๋ฅผ ๋ณ„๋„ ๊ตฌ๋™ํ•˜๊ธฐ๋ณด๋‹ค, ๊ท€ํ•˜์˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—์„œ fake-toss-payments-server ์˜ ๊ฐœ์„ค๊ณผ ํ์‡„๋ฅผ ์ง์ ‘ ํ†ต์ œํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

// npm install --save-dev fake-toss-payments-server
import FakeToss from "fake-toss-payments-server";

async function main(): Promise<void>
{
    FakeToss.FakeTossConfiguration.WEBHOOK_URL = "your-backend-webhook-api-url";
    FakeToss.FakeTossConfiguration.authorize = token => 
    {
        return token === "test_ak_ZORzdMaqN3wQd5k6ygr5AkYXQGwy";
    };

    const fake: FakeToss.FakeTossBackend = new FakeToss.FakeTossBackend();
    await fake.open();
    await fake.close();
}

2.3. SDK

npm version Downloads

๋ณธ ๋ฐฑ์—”๋“œ ํ”„๋กœ์ ํŠธ fake-toss-payments-server ๋Š” ๋น„๋ก ํ† ์Šค ํŽ˜์ด๋จผ์ธ ์˜ API ๋ฅผ ํ‰๋‚ด๋‚ด์–ด ๋งŒ๋“  ๊ฐ€์งœ์ด์ง€๋งŒ, ์ด๊ฒƒ์„ ํ†ตํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง€๋Š” SDK (Software Development Kit) ๋งŒํผ์€ ์ง„์งœ์ด๋‹ค. ์ด SDK ๋ฅผ ์ด์šฉํ•˜๋ฉด, fake-toss-payments-server ๋ฟ ์•„๋‹ˆ๋ผ ์ง„์งœ ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„์™€๋„ ์›ํ™œํžˆ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ณ ๋กœ ํ† ์Šค ํŽ˜์ด๋จผ์ธ ์™€ ์—ฐ๋™ํ•˜๋Š” TypeScript ๊ธฐ๋ฐ˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•จ์— ์žˆ์–ด, ๊ฐ€์งœ ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„ fake-toss-payments-server ๋Š” ์ง์ ‘ ์ด์šฉ์น˜ ์•Š๋”๋ผ๋„, ์‹ค์ œ ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„์™€์˜ ์—ฐ๋™์„ ์œ„ํ•˜์—ฌ, SDK ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋งŒํผ์€ ๋ฐ˜๋“œ์‹œ ์„ค์น˜ํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•˜๋Š” ๋ฐ”์ด๋‹ค.

npm install --save toss-payments-server-api

๋จผ์ € ์œ„ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•˜์—ฌ, ๊ท€ํ•˜์˜ TypeScript ๊ธฐ๋ฐ˜ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—, ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„์™€์˜ ์—ฐ๋™์„ ์œ„ํ•œ SDK ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ฐ€์งœ ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„ fake-toss-payments-server ๋ฅผ ๊ตฌ๋™ํ•˜์—ฌ, ์ด ๊ฒƒ๊ณผ์˜ ๊ฒฐ์ œ ์—ฐ๋™์ด ์ œ๋Œ€๋กœ ์ด๋ฃจ์–ด์ง€๋Š” ์ง€ ์ถฉ๋ถ„ํ•  ๋งŒํผ์˜ ๊ฒ€์ฆ์„ ํ•œ๋‹ค. ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ํ”„๋กœ๊ทธ๋žจ์„ ์ œ์ž‘, ์ด ์•ˆ์ •์„ฑ์ด ์ƒ์‹œ ๊ฒ€์ฆ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋”๋”์šฑ ์ข‹๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์‹ค ์„œ๋ฒ„๋ฅผ ๋ฐฐํฌํ•˜๋ฉฐ, ์—ฐ๋™ ๋Œ€์ƒ ์„œ๋ฒ„๋ฅผ ๊ฐ€์งœ์—์„œ ์ง„์งœ๋กœ ๊ต์ฒดํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ฐธ๊ณ ๋กœ Nestia ๋Š” SDK ๋ฟ ์•„๋‹ˆ๋ผ Swagger ๋˜ํ•œ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด ๋˜ํ•œ fake-toss-payments-server ์˜ ์†Œ์Šค์ฝ”๋“œ ๋ฐ DTO ๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ ์ˆ˜์ค€์—์„œ ๋ถ„์„ํ•˜์—ฌ ๋งŒ๋“ค์–ด์ง€๋Š” ๊ฒƒ์ธ์ง€๋ผ, ๊ทธ ํ€„๋ฆฌํ‹ฐ๊ฐ€ ์ƒ๋‹นํ•˜๋‹ค. ์–ด์ฉŒ๋ฉด ํ† ์Šค ํŽ˜์ด๋จผ์ธ ๊ฐ€ ๊ณต์‹ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ๊ฐ€์ด๋“œ ๋ฌธ์„œ๋ณด๋‹ค, fake-toss-payments-server ๋กœ ์ƒ์„ฑํ•œ Swagger ๊ฐ€ ๋” ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ด๊ณ  ์ผ๋ชฉ์š”์—ฐํ• ์ง€๋„?

import btoa from "btoa";
import toss from "toss-payments-server-api";
import { ITossBilling } from "toss-payments-server-api/lib/structures/ITossBilling";
import { ITossPayment } from "toss-payments-server-api/lib/structures/ITossPayment";
import { assert } from "typia";

export async function test_fake_payment_billing_payment(): Promise<void>
{
    const connection: toss.IConnection = {
        host: "http://127.0.0.1:30771", // FAKE-SERVER
        // host: "https://api.tosspayments.com", // REAL-SERVER
        headers: {
            Authorization: `Basic ${btoa("test_ak_ZORzdMaqN3wQd5k6ygr5AkYXQGwy:")}`
        }
    };

    const billing: ITossBilling = await toss.functional.v1.billing.authorizations.card.store
    (
        connection,
        {
            customerKey: "some-consumer-key",
            cardNumber: "1111222233334444",
            cardExpirationYear: "28",
            cardExpirationMonth: "03",
            cardPassword: "99",
            customerBirthday: "880311",
            consumerName: "๋‚จ์ •ํ˜ธ"
        }
    );
    assert<ITossBilling>(billing);

    const payment: ITossPayment = await toss.functional.v1.billing.pay
    (
        connection,
        billing.billingKey,
        {
            method: "billing",
            billingKey: billing.billingKey,
            customerKey: "some-consumer-key",
            orderId: "some-order-id",
            amount: 10_000
        }
    );
    assert<ITossPayment>(payment);
}

3. Development

3.1. API Interface Definition

๋ฐฑ์—”๋“œ ์„œ๋ฒ„์— ์ƒˆ API ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ๊ธฐ๋Šฅ์„ ๋ณ€๊ฒฝํ•˜๋Š” ์ผ ๋”ฐ์œ„๋Š” ๋ฌผ๋ก , API ์ปจํŠธ๋กค๋Ÿฌ, ์ฆ‰ src/controllers ์˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•จ์œผ๋กœ์จ ์ด๋ฃจ์–ด์ง„๋‹ค. ํ•˜์ง€๋งŒ fake-toss-payments-server ๋Š” ์‹ ๊ทœ API ๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ํ˜น์€ ๊ธฐ์กด API ์˜ ๋ณ€๊ฒฝ ํ•„์š”ํ•  ๋•Œ, ๋Œ€๋œธ Main Program ์˜ ์ฝ”๋“œ๋ถ€ํ„ฐ ์ž‘์„ฑํ•˜๊ณ  ๋ณด๋Š” ๊ฒƒ์„ ๋งค์šฐ ์ง€์–‘ํ•œ๋‹ค. ๊ทธ ๋Œ€์‹  fake-toss-payments-server ๋Š” API ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์„ ๋จผ์ € ์ •์˜ํ•˜๊ณ , Main Program ์˜ ๊ตฌํ˜„์€ ๋‚˜์ค‘์œผ๋กœ ๋ฏธ๋ฃจ๋Š” ๊ฒƒ์„ ์ง€ํ–ฅํ•œ๋‹ค.

๋”ฐ๋ผ์„œ fake-toss-payments-server ์— ์ƒˆ API ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๊ฑฐ๋“ , src/controllers ์— ์ƒˆ API ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋งŒ์„ ๋จผ์ € ์ •์˜ํ•ด์ค€๋‹ค. ๊ณง์ด์–ด npm run sdk ๋‚˜ npm run api ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•˜์—ฌ, API Library ๋ฅผ ๋นŒ๋“œํ•œ๋‹ค. ๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ๋Š” ํ”„๋ก ํŠธ ํ”„๋กœ์ ํŠธ์™€์˜ ๋™์‹œ ๊ฐœ๋ฐœ์„ ์œ„ํ•˜์—ฌ, ์ƒˆ๋กœ์ด ๋นŒ๋“œ๋œ SDK ๋ฅผ ๊ทธ๋Œ€๋กœ npm publish ํ•ด ๋ฒ„๋ ค๋„ ์ข‹๋‹ค.

์ดํ›„ ๋กœ์ปฌ์—์„œ ์ƒˆ๋กœ์ด ์ƒ์„ฑ๋œ SDK ์™€ ํ•ด๋‹น API ๋ฅผ ์ด์šฉ, ์œ ์ฆˆ์ผ€์ด์Šค ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Main Program ์„ ์ œ์ž‘ํ•˜๋ฉฐ, ์•ž์„œ ์ž‘์„ฑํ•ด ๋‘” ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ƒ์‹œ ๊ฒ€์ฆํ•œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ Main Program ๊นŒ์ง€ ์™„์„ฑ๋˜๋ฉด ์ด๋ฅผ ๋ฐฐํฌํ•˜๋ฉด ๋œ๋‹ค.

์ดํ•˜ fake-toss-payments-server ์˜ ๊ฐœ๋žต์ ์ธ ๊ฐœ๋ฐœ ์ˆœ์„œ๋ฅผ ์š”์•ฝํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • API Interface Definition
  • API Library (SDK) ๋นŒ๋“œ
  • Test Automation Program ์ œ์ž‘
  • Main Program ์ œ์ž‘ ๋ฐ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ํ”„๋กœ๊ทธ๋žจ์„ ์ด์šฉํ•œ ์ƒ์‹œ ๊ฒ€์ฆ
  • DEV ๋ฐ REAL ์„œ๋ฒ„์— ๋ฐฐํฌ

3.2. Test Automation Program

npm run test

์ƒˆ๋กœ์ด ๊ฐœ๋ฐœํ•  API ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜๋ฅผ ๋งˆ์ณค๋‹ค๋ฉด, ๊ทธ ๋‹ค์Œ์— ํ•  ์ผ์€ ๋ฐ”๋กœ ํ•ด๋‹น API ์— ๋Œ€ํ•œ ์œ ์ฆˆ์ผ€์ด์Šค ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์„ธ์šฐ๊ณ  ์ด๋ฅผ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค์–ด, ํ–ฅํ›„ Main Program ์ œ์ž‘์‹œ ์ด๋ฅผ ์ƒ์‹œ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š” ์ˆ˜๋‹จ์„ ๊ตฌ๋น„ํ•ด๋‘๋Š” ๊ฒƒ์ด๋‹ค - TDD (Test Driven Development).

๊ทธ๋ฆฌ๊ณ  ๋ณธ ํ”„๋กœ์ ํŠธ๋Š” npm run test ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•˜์—ฌ, ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์˜ ์ผ์ฒด ๊ธฐ๋Šฅ ๋ฐ ์ •์ฑ… ๋“ฑ์— ๋Œ€ํ•˜์—ฌ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋Š”, ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌ๋™ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, test/features ํด๋”์˜ ์ ๋‹นํ•œ ์œ„์น˜์— ์ƒˆ ts ํŒŒ์ผ์„ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ , test_ ๋กœ ์‹œ์ž‘ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด ๊ทธ ์•ˆ์— ํ…Œ์ŠคํŠธ ๋กœ์ง์„ ์ž‘์„ฑํ•œ ํ›„, ์ด๋ฅผ export ์‹ฌ๋ฒŒ์„ ์ด์šฉํ•˜์—ฌ ๋ฐฐ์ถœํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ test/features ํด๋”์— ๋“ค์–ด์žˆ๋Š” ๋ชจ๋“  ts ํŒŒ์ผ ํ•˜๋‚˜ ํ•˜๋‚˜๊ฐ€ ๋‹ค ์ข‹์€ ์˜ˆ์ œ ๊ฒฉ์ด๋‹ˆ, ์ด๋ฅผ ์ฐธ๊ณ ํ•˜๋„๋ก ํ•œ๋‹ค.

์ฐธ๊ณ ๋กœ npm run test ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค, test/features ํด๋” ๋‚ด์— ๋“ฑ๋ก๋œ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ์‹์˜ entire level test ๊ฐ€ ๋งค๋ฒˆ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ ๊ฒƒ์ด๋‹ค. ์ƒˆ๋กœ ๊ฐœ๋ฐœํ•œ ๊ธฐ๋Šฅ์ด ๊ทนํžˆ ์ผ๋ถ€ ์š”์†Œ์— ๊ตญํ•œ๋˜์–ด ๋ถ€๋ถ„ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, ์•„๋ž˜ ์˜ต์…˜๊ฐ’์„ ์ฐธ์กฐ, --include ๋‚˜ --exclude ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ๊ฐ„์„ ์ ˆ์•ฝํ•˜๋„๋ก ํ•˜์ž.

  • options
    • include: ํŠน์ • ๋‹จ์–ด๊ฐ€ ํฌํ•จ๋œ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋งŒ ์‹คํ–‰
    • exclude: ํŠน์ • ๋‹จ์–ด๊ฐ€ ํฌํ•จ๋œ ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜ ์ œ์™ธ

3.3. Main Program

API ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ๊ทธ์— ๊ด€๋ จ๋œ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ํ”„๋กœ๊ทธ๋žจ์„ ์ œ์ž‘ํ•˜์˜€๋‹ค๋ฉด, ๋งˆ์ง€๋ง‰์œผ๋กœ ๋‚จ์€ ์ผ์€ ๋ฐ”๋กœ ์„œ๋ฒ„์˜ ๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑ, ํ•ด๋‹น API ๋ฅผ ์™„์„ฑํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์•ž์„œ ์ •์˜ํ•œ API ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ ๋‚ด์—, ์ƒ์„ธ ๊ตฌํ˜„ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์ด๋ฅผ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ํ”„๋กœ๊ทธ๋žจ์„ ํ†ตํ•˜์—ฌ ์ƒ์‹œ ๊ฒ€์ฆํ•˜๋„๋ก ํ•˜์ž.

๋‹จ, ๋ชจ๋“  ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ „๋ถ€ API ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋ฉ”์„œ๋“œ์— ์ž‘์„ฑํ•˜๋Š” ์šฐ๋Š” ๋ฒ”ํ•˜์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž€๋‹ค. API ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋‹จ์ง€ ๋งค๊ฐœ์ฒด + a ์˜ ์—ญํ• ๋งŒ์„ ํ•ด์•ผ ํ•  ๋ฟ์ด๋ฉฐ, ์ฃผ ์†Œ์Šค ์ฝ”๋“œ๋Š” src ํด๋” ๋‚ด ๊ฐ ํด๋”์˜ ๋ถ„๋ฅ˜์— ๋”ฐ๋ผ ์•Œ๋งž๊ฒŒ ๋‚˜๋‰˜์–ด ์ž‘์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค.

4. Appendix

4.1. Expiration

fake-toss-payments-server ๋Š” ๊ฒฐ์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ž„์‹œ ๊ธฐ๋กํ•œ๋‹ค.

์™œ๋ƒํ•˜๋ฉด fake-toss-payments-server ๋Š” ํ† ์Šค ํŽ˜์ด๋จผ์ธ  ์„œ๋ฒ„์˜ API ๋ฅผ ํ‰๋‚ด๋‚ด์–ด ๋งŒ๋“  ๊ฐ€์งœ ์„œ๋ฒ„๋กœ์จ, ๊ฐœ๋ฐœ ๋‹จ๊ณ„์—์„œ ์“ฐ์ด๋Š” ์ž„์‹œ ์‹œ์Šคํ…œ์— ๋ถˆ๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋”ฐ๋ผ์„œ fake-toss-payments-server ์— ์ƒ์„ฑ๋œ ๊ฒฐ์ œ ๋‚ด์ง€ ์นด๋“œ ์ •๋ณด๋“ค์€ ๋ชจ๋‘ ํ…Œ์ŠคํŠธ ์šฉ๋„๋กœ ์ƒ์„ฑ๋œ ์ž„์‹œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋ถˆ๊ณผํ•˜๊ธฐ์—, ๊ตฌํƒœ์—ฌ ์ด๋ฅผ DB ๋‚˜ ๋กœ์ปฌ ๋””์Šคํฌ์— ์ €์žฅํ•˜์—ฌ ์˜๊ตฌ ๋ณด์กดํ•  ์ด์œ ๊ฐ€ ์—†๋‹ค.

์ด์— fake-toss-payments-server ๋Š” ๊ฒฐ์ œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ž„์‹œ๋กœ ๊ธฐ๋กํ•˜๋ฉฐ, ํ•œ ํŽธ์œผ๋กœ ๊ทธ ์ˆ˜๋Ÿ‰ ๋ฐ ๋ณด์กด ๊ธฐํ•œ์— ํ•œ๋„๋ฅผ ๋‘์–ด, ์‰ฌ์ด ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ํ˜„์ƒ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก ํ•˜๊ณ  ์žˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ž„์‹œ ๋ฐ์ดํ„ฐ ๋งŒ๋ฃŒ ์ •๋ณด๋Š” src/FakeTossConfiguration.ts ํŒŒ์ผ์˜ EXPIRATION ๋ณ€์ˆ˜์— ์ •์˜๋˜์–ด์žˆ์œผ๋ฉฐ, ๊ฒฐ์ œ ๋ฐ ๊ฐ„ํŽธ ์นด๋“œ ๊ฒฐ์ œ ๋“ฑ๋ก ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ src/providers/FakeTossStorage.ts ์—์„œ ๊ด€๋ฆฌ๋œ๋‹ค.

ํ˜น์—ฌ fake-toss-payments-server ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์ด ์ œ๋ฒ• ํฌ๊ณ  ๊ทธ ๋„คํŠธ์›Œํฌ ํ™˜๊ฒฝ ๊ตฌ์„ฑ์ด ๋งค์šฐ ๋ณต์žกํ•˜์—ฌ, fake-toss-payments-server ๋ฅผ ๋…๋ฆฝ ์„œ๋ฒ„๋กœ ๋ฐฐํฌํ•˜๊ณ , ๊ฐ€์ƒ์˜ ๊ฒฐ์ œ ๋ ˆ์ฝ”๋“œ ๋˜ํ•œ DB ์— ์ €์žฅํ•ด์•ผ ํ•˜๋ฉฐ, ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ์‹œ์Šคํ…œ ๋˜ํ•œ ํ•„์š”ํ•˜์ง€ ์•Š์„๊นŒ?

์„ค๋งˆ ์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์–ด๋ด์•ผ ์–ผ๋งˆ๋‚˜ ์žˆ๊ฒ ๋‚˜ ์‹ถ์–ด ๊ณต๊ฐœ ์ €์žฅ์†Œ์— ์˜ฌ๋ ค๋‘์ง€๋Š” ์•Š์•˜์œผ๋‚˜, fake-toss-payments-server ๊ฐ€ ๊ฒฐ์ œ ๋ฐ์ดํ„ฐ๋ฅผ VolatileMap ์ด ์•„๋‹Œ DB ์— ์ €์žฅํ•˜๊ณ , ํ์‡„๋ง์—์„œ์กฐ์ฐจ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌด์ค‘๋‹จ ์—…๋ฐ์ดํŠธ ๋ฐ ๋ฐฐํฌ ์‹œ์Šคํ…œ์„ ๋”ฐ๋กœ ๊ตฌ๋น„ํ•ด ๋‘” ๊ฒƒ์ด ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์œ„์™€ ๊ฐ™์€ ํ˜•ํƒœ์˜ fake-toss-payments-server ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด, ์–ผ๋งˆ๋“ ์ง€ ์—ฐ๋ฝํ•˜๊ธฐ ๋ฐ”๋ž€๋‹ค. ์ฆ‰์‹œ ์œ„ ์š”์†Œ๋ฅผ ์ถฉ๋‹นํ•˜๋Š” ์†”๋ฃจ์…˜์„ ๊ณต๊ธ‰ํ•ด ์ค„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋งŒ์ผ ์ด๋Ÿฌํ•œ ์š”์ฒญ์ด ์ œ๋ฒ• ๋งŽ์€ ๊ฒฝ์šฐ, ๋ณ„๋„์˜ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด ๋ฐฐํฌํ•ด ๋ณผ ์š”๋Ÿ‰๋„ ์žˆ๋‹ค.

# WHEN STARTING THE MASTE SERVER
npm run start:updator:master
npm run start

# WHEN STARTING A SLAVE SERVER
npm run start:updator:slave
npm run start

# WHEN RUN UPDATE COMMAND IN THE CLIENT SIDE
npm run update

4.2. Typia

Typia Logo

GitHub license npm version Downloads Build Status Guide Documents

// RUNTIME VALIDATORS
export function is<T>(input: unknown): input is T; // returns boolean
export function assert<T>(input: unknown): T; // throws TypeGuardError
export function validate<T>(input: unknown): IValidation<T>; // detailed
export const customValidators: CustomValidatorMap; // can add custom validators

// JSON
export function application<T>(): IJsonApplication; // JSON schema
export function assertParse<T>(input: string): T; // type safe parser
export function assertStringify<T>(input: T): string; // safe and faster
    // +) isParse, validateParse 
    // +) stringify, isStringify, validateStringify

// MISC
export function random<T>(g?: Partial<IRandomGenerator>): Primitive<T>;

Typia is a transformer library supporting below features:

  • Super-fast Runtime Validators
  • Safe JSON parse and fast stringify functions
  • JSON schema generator
  • Random data generator

Note

  • Only one line required, with pure TypeScript type
  • Runtime validator is 20,000x faster than class-validator
  • JSON serialization is 200x faster than class-transformer

4.3. Nestia

Nestia Logo

GitHub license npm version Downloads Build Status Guide Documents

Nestia is a set of helper libraries for NestJS, supporting below features:

  • @nestia/core: super-fast decorators
  • @nestia/sdk:
    • SDK generator for clients
    • Swagger generator evolved than ever
    • Automatic E2E test functions generator
  • nestia: just CLI (command line interface) tool

Note

  • Only one line required, with pure TypeScript type
  • Runtime validator is 20,000x faster than class-validator
  • JSON serialization is 200x faster than class-transformer
  • SDK is similar with tRPC, but much advanced

More Repositories

1

typia

Super-fast/easy runtime validations and serializations through transformation
TypeScript
4,050
star
2

nestia

Make NestJS much faster and easier
TypeScript
1,612
star
3

backend

A template repository for TypeScript backend server
TypeScript
609
star
4

tstl

TypeScript-STL (Standard Template Library, migrated from C++)
TypeScript
585
star
5

prisma-markdown

Markdown generator of Prisma, including ERD and descriptions
TypeScript
284
star
6

safe-typeorm

TypeORM helper library enhancing safety in the compilation level
TypeScript
227
star
7

tgrid

TypeScript Grid Computing Framework supporting RFC (Remote Function Call)
TypeScript
119
star
8

fake-iamport-server

Fake Iamport Server with Real SDK
95
star
9

framework

Deprecated, use TGrid instead
C++
71
star
10

resume

CSS
46
star
11

astl

Standard Template Library for AssemblyScript
TypeScript
36
star
12

nestia-helper

NestJS helper with Type level
TypeScript
34
star
13

mutex

Mutex Server using WebSocket
TypeScript
29
star
14

bbs-backend

Simple Bullet-in Board System Backend
TypeScript
19
star
15

sxml

Simple XML Library for TypeScript (JavaScript)
TypeScript
16
star
16

fast-object

Fast object creator, via JSON.parse(), but type safe
TypeScript
16
star
17

nestia-start

Nestia template project installed by "npx nestia start"
TypeScript
15
star
18

websocket-polyfill

WebSocket class from Browser to NodeJS
TypeScript
11
star
19

ecol

Event Collections
TypeScript
9
star
20

samchon

8
star
21

cagen

Number of Case Generator
TypeScript
5
star
22

schedules

Open source development schedule of Samchon
5
star
23

openapi

Type safe OpenAPI definitions
TypeScript
5
star
24

big-associative

Big associative containers who can store over 14M elements.
TypeScript
5
star
25

encrypted-fetcher

Rest API Fetcher with AES Encryption
TypeScript
4
star
26

typedoc-plugin-exclude-references

temporary plug-in
TypeScript
4
star
27

environments

My development environments
4
star
28

import2

lazy import function who can prevent transpiled to require
JavaScript
4
star
29

safeorm

Ultimate Safe ORM for the TypeScript
TypeScript
4
star
30

tgrid.projects.chat

Demo Project - Chat Application
TypeScript
3
star
31

nestia-fetcher

Fetcher library for the Nestia
TypeScript
3
star
32

oss-2019

๊ณต๊ฐœ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์ž๋Œ€ํšŒ 2019
CSS
2
star
33

URLVariables

URLVariables class for TypeScript
TypeScript
2
star
34

nestjs-custom-decorator-exception-filter

2
star
35

nestia-auto-crud-example

For https://github.com/samchon/nestia/issues/670
TypeScript
1
star
36

nestjs-study-router-module

To support RouterModule in Nestia
TypeScript
1
star
37

prisma-bug-report-postgres-timestampz

A prisma bug reproduction repo for reporting about `timestampz` type in Postgres
1
star
38

tgrid.com

Guide Documents for TGrid
HTML
1
star
39

tgrid.projects.market

Demo Project - Grid Market
TypeScript
1
star
40

gitbook-plugin-hide-navigation-buttons

Gitbook Plugin: Hide Navigation Buttons
CSS
1
star
41

tgrid.examples

Example Source Codes for TGrid
TypeScript
1
star
42

timetable

Hansung Timetable
ActionScript
1
star
43

samchon.github.io

My homepage
HTML
1
star
44

gitbook-plugin-scroll-to-top

JavaScript
1
star
45

ts-patch-typescript-v5.3-test

JavaScript
1
star
46

www.typeorm.io

Repository for typeorm documentation website.
JavaScript
1
star
47

nestia-sdk-template

Nestia SDK Template Repository for `@nestia/migrate`
TypeScript
1
star