๊ณตํต ์ฃผ๋ฌธยท์ด์ฉ๊ถ ์ฒ๋ฆฌ๋ ์ต์ domain.ticket๊ณผ domain.admin์ ์ฌ์ฉํฉ๋๋ค.
domain.funding์ ํ
๋ธ๋ฒ
XLSX, ์๋ณธ ํ ๋ณด๊ด, ์์ธ ๊ฒ์๊ณผ ๊ฐ์ฌ ๋ก๊ทธ๋ฅผ ํ์ฅํฉ๋๋ค.
๋ชจ๋ ์๋ ๊ฒฝ๋ก์ ์ ๋์ฌ๋ /api/v1์
๋๋ค.
| ๊ธฐ๋ฅ | Method / ๊ฒฝ๋ก |
|---|---|
| CSV ์ฃผ๋ฌธ ๋ฑ๋กยท๊ฐฑ์ | POST /admin/funding/imports |
| ์ฃผ๋ฌธยท์ด์ฉ๊ถ ๋ชฉ๋ก ๋ฐ ํ ๋ธ๋ฒ ์๋ณธ ์ ๋ณด | GET /admin/funding/orders |
| ์บ ํ์ธ๋ณ ํ์์ ๋ชฉ๋ก | GET /admin/funding/orders?campaignId=... |
| ํ ๋ธ๋ฒ ์บ ํ์ธ ๋์๋ณด๋ ์์ฝ | GET /admin/funding/orders/tumblbug/dashboard?campaignId=... |
| ํ๋ฉ ํํฉ | GET /admin/funding/summary |
| ์ฝ๋ ๋ฐ๊ธ | POST /admin/funding/tickets/issue |
| ๊ด๋ฆฌ์ ์ฝ๋ ์กฐํยท๋ณต์ฌ | GET /admin/funding/tickets/{ticketId}/code |
| ์ ๋ฌ ๊ธฐ๋ก | POST /admin/funding/tickets/{ticketId}/deliveries |
| ๋ฏธ๋ฑ๋ก ์ฝ๋ ์ฌ๋ฐ๊ธ | POST /admin/funding/tickets/{ticketId}/reissue |
| ์ฃผ๋ฌธ ํ๋ถยท์ด์ฉ๊ถ ์ทจ์ | POST /admin/funding/refunds |
| ์ฌ์ฉ์ ์ฝ๋ ํ์ธ | GET /class-tickets/preview?code=... |
| ์ฌ์ฉ์ ์ฝ๋ ๋ฑ๋ก | POST /class-tickets/register |
| ๋ด ์ด์ฉ๊ถ | GET /class-tickets/me |
| XLSX ์ํธยท์ดยท์ํ ๊ฒ์ฌ | POST /admin/funding-orders/tumblbug/inspect |
| ์ ํ ์ํธ ๊ฒํ | POST /admin/funding-orders/tumblbug/preview |
| StartยทRun ๊ณตํต ์์ ๋ฑ๋ก ๋ฐ ๋ฐ๊ธ | POST /admin/funding-orders/tumblbug/import |
| StartยทRun ๊ณตํต ๊ตฌ๋งค์ ์๋ ๋ฑ๋ก | POST /admin/funding-orders/tumblbug/manual |
| ์ฃผ๋ฌธ ์ ์ฅยท๋ฐ๊ธยท๋์งํธ ์ ๋ฌผ XLSX ์์ฑ | POST /admin/funding-orders/tumblbug/digital-gifts |
| ํ ๋ธ๋ฒ ์ ๋ฌ ๊ฒฐ๊ณผ ๊ธฐ๋ก | PATCH /admin/funding-orders/tumblbug/digital-gifts/delivery |
| ์ด์ฉ๊ถยท๋ฑ๋ก์ยท๋ฑ๋ก์ผ ๊ฒ์ | GET /admin/tickets |
๊ด๋ฆฌ์ API๋ ROLE_ADMIN์ด ํ์ํฉ๋๋ค. ๊ฒ์ฌ๋ multipart file, ๋ฏธ๋ฆฌ๋ณด๊ธฐ์ ๋ฐ๊ธ์ file๊ณผ JSON options ํํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํ์ผ์ XLSX 10MB ์ดํ, ์ต๋ 5,000๊ฐ ๋ฐ์ดํฐ ํ์
๋๋ค. ์ ๋ฌผ ์๋์ 1~7์ด๋ฉฐ ์ฝ๋๋ ์๋๋งํผ ๋ฐ๊ธํฉ๋๋ค.
{
"campaignId": "picke-class-2026",
"campaignName": "ํฝ์ผ ํด๋์ค ํ๋ฉ",
"sheetName": "15์ธ ์ด์ฉ๊ถ",
"rewardLineId": "class-ticket-15",
"capacity": 15,
"sourceVersion": "export-20261021",
"plan": "START"
}campaignId๋ 50์ ์ดํ์ด๋ฉฐ rewardLineId๋ฅผ ์๋ตํ๋ฉด ์ํธ๋ช
์ ์ฌ์ฉํฉ๋๋ค. plan์ START ๋๋ RUN์ด๋ฉฐ ์๋ต ์ ๊ธฐ์กด API์์ ํธํ์ ์ํด RUN์ผ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ์บ ํ์ธ์ ์ฒ์ ๋ฑ๋กํ ๋ ์ ํํ ์๊ธ์ ๋ ๊ณ ์ ๋ฉ๋๋ค.
ํ์ ์ด์ ํ์๋ฒํธ, ์ด๋ฆ, ์ ๋ฌผ, ์ถ๊ฐ ํ์๊ธ, ์ด ํ์ ๊ธ์ก, ํ์ ์ผ์, ์๋ฆผ ์ ์ฒญ, ๊ฒฐ์ ์ํ, ์ ๋ฌผ ์ ๋ฌ์
๋๋ค.
๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ ์ ์ฅํ์ง ์์ต๋๋ค. ์ค๋ณต ๋๋ ์๋ชป๋ ํ์ด ์์ผ๋ฉด ๋ฐ๊ธ ์์ฒญ ์ ์ฒด๋ฅผ ๊ฑฐ๋ถํฉ๋๋ค.
๊ฒฐ์ ์๋ฃยทํ์์ผ์ ์กด์ฌ์ธ ์ฃผ๋ฌธ์ ๊ตฌ๋งค ์๋๋งํผ ์ฝ๋๋ฅผ ๋ฐ๊ธํฉ๋๋ค.
๊ฒฐ์ ์์ฝ ์ํ๋ ์ ์ฅ๋ง ํ๊ณ ์ฝ๋๋ฅผ ๋ฐ๊ธํ์ง ์์ต๋๋ค. codeEligibleRows๋ ๊ฒฐ์ ์๋ฃ๋ ํ ์์
๋๋ค.
๋ฑ๋ก๊ธฐํ์ ๊ฒฐ์ ์ผ + 1๋
, ์ด์ฉ๊ธฐ๊ฐ์ ๋ฑ๋ก์ผ + 6๊ฐ์์
๋๋ค.
์ฌ๋ฐ๊ธ์ ๊ธฐ์กด ์ด์ฉ๊ถ์ ๋ฌดํจํํ๊ณ ๊ฐ์ ๋ฑ๋ก๊ธฐํ์ผ๋ก ์ ํ์ ์์ฑํฉ๋๋ค.
์ฝ๋ ํ์์ XXXXXX-XXXXX-XXXXX-XXXXX-XXXXX์
๋๋ค. SHA-256 ํด์๋ก ์ฝ๋๋ฅผ ๊ฒ์ฆํ๊ณ AES-GCM ์ํธ๋ฌธ์ผ๋ก ๊ด๋ฆฌ์ ์ฝ๋ ๋ณด๊ธฐ๋ฅผ ์ง์ํฉ๋๋ค.
๋ฐ๊ธ ์ฃผ๋ฌธ์ ์ต์ FundingOrder์ ์ ์ฅํ๊ณ AdminFundingService๋ก ClassTicket์ ๋ฐ๊ธํฉ๋๋ค.
ํ์๋ฒํธยท๋ฆฌ์๋ ํคยท๊ธ์กยท์๋ฆผยท์๋ณธ ์ ๋ฌ ์ํยท์๋ณธ ํ JSON์ TumblbugImportRecord์ ๋ณด๊ดํฉ๋๋ค.
๋ด๋ถ ์ฃผ๋ฌธ๋ฒํธ๋ ์บ ํ์ธยทํ์๋ฒํธยท๋ฆฌ์๋ ํค์ SHA-256์ผ๋ก ๋ง๋ 50์ ์๋ณ์ TB-...์
๋๋ค.
๊ธฐ์กด CSV์ ๋์ผ ํ์๋ฒํธ์ ์ฃผ๋ฌธ์ด ์๋ ๊ฒฝ์ฐ์๋ ์ค๋ณต์ผ๋ก ์ทจ๊ธํฉ๋๋ค.
์ ๋ฌ ๊ฒฐ๊ณผ ์์ฒญ ํ๋๋ campaignId, rewardLineId, supporterNumbers, status(SENT/FAILED), failedReason์
๋๋ค.
์คํจ์๋ ์ฌ์ ๊ฐ ํ์ํฉ๋๋ค. ๊ณตํต ์ด๋ ฅ์๋ TUMBLBUG_DIGITAL_GIFT ์ฑ๋ ๋ฐ SUCCESS/FAILED ์ํ๋ก ๊ธฐ๋กํฉ๋๋ค.
์ด๋ฏธ ๋ฑ๋กยท์ทจ์๋์๊ฑฐ๋ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋กํ ์ฝ๋๋ ๊ฑด๋๋ฐ๊ณ , ์ฌ๋ฐ๊ธ ์ฝ๋๋ ์ ์ด์ฉ๊ถ ID๋ก ๊ตฌ๋ถํฉ๋๋ค.
Start๋ ๊ณตํต import ๋๋ manual ๊ฒฝ๋ก๋ก ๋ฑ๋กํ๊ณ 1:1 ๋ฉ์์ง๋ก ์ง์ ์ ๋ฌํฉ๋๋ค. Run์ ๊ฐ์ ๊ฒฝ๋ก์ ๋ํด digital-gifts XLSX ๊ฒฝ๋ก๋ฅผ ์ธ ์ ์์ต๋๋ค. ์ค์ ํ
๋ธ๋ฒ
์ ๋ฌ์ ๊ด๋ฆฌ์๊ฐ ์ํํฉ๋๋ค.
์ฃผ๋ฌธ ๊ฒ์์ ๊ธฐ์กด /admin/funding/orders ํ ๊ณณ์์ campaignId, keyword, capacity, paymentStatus, deliveryStatus, ticketStatus, codeStatus, page, size๋ฅผ ์ง์ํฉ๋๋ค. ์บ ํ์ธ ๋์๋ณด๋๋ ํ์ ์ฃผ๋ฌธ ์ยท๊ฒฐ์ ์๋ฃยท์ ๋ฌ ์๋ฃยท๋ฏธ์ ๋ฌ ์๋ฅผ ์บ ํ์ธ ๋จ์๋ก ์ง๊ณํฉ๋๋ค.
๊ธฐ์กด ์ฃผ๋ฌธ ์๋ต ํ๋๋ฅผ ์ ์งํ๊ณ tumblbug์ ์๊ธ์ ยทํ์์ผ์ยท์ํยท๊ธ์กยทํ์๋ฒํธ ๋ฑ์, tickets์ ๋ฐ๊ธ๋ ํฐ์ผ ๋ชฉ๋ก๊ณผ ์ ๋ฌ ์ํ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ๋์๋ณด๋๋ ๊ด๋ฆฌ์ ์ ์ฉ GET /admin/funding/tickets/{ticketId}/code๋ฅผ ์ฝ๋ ์ ์ฒด ๋ณด๊ธฐยท๋ณต์ฌ ์ ํธ์ถํฉ๋๋ค. ์ฝ๋ ์กฐํ๋ ๊ฐ์ฌ ๋ก๊ทธ์ ๊ธฐ๋ก๋๊ณ ์๋ต์ ์บ์๋์ง ์์ต๋๋ค.
์ฝ๋ ์ํธํ๋ฅผ ์ํด TICKET_CODE_ENCRYPTION_KEY์ Base64 ์ธ์ฝ๋ฉํ 32๋ฐ์ดํธ ํค๋ฅผ ์ค์ ํด์ผ ํฉ๋๋ค. ๊ธฐ์กด ์ฝ๋ ํ์ ํด์๋ง ์ ์ฅ๋์ด ์์ด ์ฝ๋ ์๋ฌธ์ ๋ณต๊ตฌํ ์ ์์ต๋๋ค. ๋ฏธ๋ฑ๋ก ๊ธฐ์กด ์ฝ๋๋ ์ฌ๋ฐ๊ธ ํ ์ ์ฝ๋ ์กฐํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์ด์ฉ๊ถ ๊ฒ์์ keyword, capacity, status, registeredFrom, registeredTo, page, size๋ฅผ ์ง์ํฉ๋๋ค.
์ด์ฉ๊ถ ๊ฒ์ ์๋ต์ ์ฐ๋ฝ์ฒยท์ฝ๋๋ฅผ ๋ง์คํนํ๋ฉฐ ์ ์ฒด ์ฝ๋ ๊ฒ์์ ํด์๋ก ๋น๊ตํฉ๋๋ค.
๋ 4์๋ฆฌ ๊ฒ์์ ํตํฉ ์ดํ ๋ฐ๊ธยท์ฌ๋ฐ๊ธํ ์ฝ๋์์ ์ง์ํฉ๋๋ค. ๊ธฐ์กด ํด์๋ก ์ ๋ฏธ์ฌ๋ฅผ ๋ณต์ํ ์๋ ์์ต๋๋ค.
ํด๋์ค๋ ๊ธฐ์กด class_tickets์ ๊ธฐ์กด ์ด์ฉ๊ถ ํ์ธ ๋ก์ง์ ๊ณ์ ์ฌ์ฉํฉ๋๋ค.
์คํ
์ด์ง๋ FundingTicketAccess, FundingTicketPolicy๋ ๊ณ์ฝ ํ์ผ๋ก๋ง ์ ์งํฉ๋๋ค.
ํ์ฌ ํธ์ถ์๊ฐ ์๋ ๋ณ๋ ์ ์ฑ
๊ตฌํ์ ์ ๊ณตํ์ง ์์ต๋๋ค.
V20261021_02__tumblbug_import_extensions.sql๊ณผ V20261025_01__funding_plan_and_ticket_code_vault.sql์ ๊ธฐ์กด ํด๋์ค ์คํค๋ง ์ดํ ์ ์ฉํฉ๋๋ค.
funding_campaigns, tumblbug_import_records, funding_admin_audit_logs, ์ฝ๋ ์ ๋ฏธ์ฌ,
์ ๋ฌ ์ฑ๋ ๊ธธ์ด ํ์ฅ, ์๊ธ์ , ์ํธํ ์ฝ๋ ๋ณด๊ด, ์ฃผ๋ฌธ ์๋๋น ๋ณต์ ์ฝ๋ ์ ์ฝ ๋ณ๊ฒฝ์ ํฌํจํฉ๋๋ค. ๋ณ๋ Funding ์ฃผ๋ฌธยท์ด์ฉ๊ถยท์ฝ๋ยท์ ๋ฌ ํ
์ด๋ธ์ ์์ฑํ์ง ์์ต๋๋ค.
์ด ์ ์ฅ์์๋ Flyway ์์กด์ฑ์ด ์์ผ๋ฏ๋ก ๊ธฐ์กด DB ๋ฐ์ ์ ์ฐจ์์ SQL์ ์ ์ฉํด์ผ ํฉ๋๋ค.