Ver código fonte

Phase C: rebrand dpot -> antooza / antooza.com / brand ANTOOZA

- Domains dpot.live -> antooza.com (CORS, PubSub callback, configs)
- Jenkins secret IDs DEV/PROD-ANTOOZA-*, IIS/WinSW/deploy path renames
- JWT audience antooza-*, PG order prefix ANTOOZA-, postman collections renamed
- Build 0 errors, tests 15/15. Infra cutover steps in .claude/plan/antooza-rebrand-ops-checklist.md

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
KIM-JINO5 3 semanas atrás
pai
commit
cfeb436953
36 arquivos alterados com 103 adições e 103 exclusões
  1. 1 1
      Admin/Areas/Identity/Pages/Account/ForgotPassword.cshtml
  2. 1 1
      Admin/Areas/Identity/Pages/Account/Login.cshtml
  3. 1 1
      Admin/Areas/Identity/Pages/Account/Register.cshtml
  4. 1 1
      Admin/Areas/Identity/Pages/Account/ResendEmailConfirmation.cshtml
  5. 1 1
      Admin/Pages/Channel/List/Edit.cshtml
  6. 1 1
      Admin/Pages/Channel/List/Write.cshtml
  7. 2 2
      Admin/Pages/Shared/_Layout.cshtml
  8. 1 1
      Admin/Pages/Shared/_Sub.cshtml
  9. 1 1
      Admin/Pages/Store/Order/Detail.cshtml
  10. 1 1
      Admin/Pages/Store/Order/Index.cshtml
  11. 1 1
      Admin/Pages/Store/Settlement/Detail.cshtml
  12. 2 2
      Admin/package-lock.json
  13. 2 2
      Admin/package.json
  14. 1 1
      Application/Features/Api/Payment/CreateOrder/Handler.cs
  15. 1 1
      Application/Features/Api/YouTube/PubSubNotify/Handler.cs
  16. 4 4
      CLAUDE.md
  17. 2 2
      Domain/Entities/Members/Channel.cs
  18. 1 1
      Domain/Entities/Store/Game.cs
  19. 3 3
      Domain/Entities/Store/Order.cs
  20. 1 1
      Domain/Entities/Store/ProductLimitConfig.cs
  21. 1 1
      Domain/Entities/Store/ValueObject/LimitPeriodType.cs
  22. 1 1
      Infrastructure/Authentication/JwtTokenProvider.cs
  23. 19 19
      Jenkinsfile
  24. 13 13
      Jenkinsfile.prod
  25. 1 1
      MailWorker/Program.cs
  26. 1 1
      SharedKernel/Helpers/CsvHelper.cs
  27. 1 1
      SharedKernel/Storage/StorageOptions.cs
  28. 2 2
      Web.Api/DependencyInjection.cs
  29. 1 1
      Web.Api/Program.cs
  30. 3 3
      Web.Api/postman/ANTOOZA-Dev.postman_environment.json
  31. 2 2
      Web.Api/postman/ANTOOZA-Local.postman_environment.json
  32. 3 3
      Web.Api/postman/ANTOOZA-Prod.postman_environment.json
  33. 14 14
      Web.Api/postman/README.md
  34. 3 3
      Web.Api/postman/_legacy/Payment.postman_collection.json
  35. 1 1
      Web.Api/postman/collections/ANTOOZA-Internal-API.postman_collection.json
  36. 8 8
      Web.Api/postman/update.ps1

+ 1 - 1
Admin/Areas/Identity/Pages/Account/ForgotPassword.cshtml

@@ -28,7 +28,7 @@
     <div class="col">
         <div class="text-center ps-3 pe-3">
             <hr />
-            <small>ⓒ DPOT. All Rights Reserved</small>
+            <small>ⓒ ANTOOZA. All Rights Reserved</small>
         </div>
     </div>
 </div>

+ 1 - 1
Admin/Areas/Identity/Pages/Account/Login.cshtml

@@ -50,7 +50,7 @@
     <div class="col">
         <div class="text-center ps-3 pe-3">
             <hr />
-            <small>ⓒ DPOT. All Rights Reserved</small>
+            <small>ⓒ ANTOOZA. All Rights Reserved</small>
         </div>
 
         @*

+ 1 - 1
Admin/Areas/Identity/Pages/Account/Register.cshtml

@@ -37,7 +37,7 @@
     <div class="col">
         <div class="text-center ps-3 pe-3">
             <hr />
-            <small>ⓒ DPOT. All Rights Reserved</small>
+            <small>ⓒ ANTOOZA. All Rights Reserved</small>
         </div>
 
         @*

+ 1 - 1
Admin/Areas/Identity/Pages/Account/ResendEmailConfirmation.cshtml

@@ -28,7 +28,7 @@
     <div class="col">
         <div class="text-center ps-3 pe-3">
             <hr />
-            <small>ⓒ DPOT. All Rights Reserved</small>
+            <small>ⓒ ANTOOZA. All Rights Reserved</small>
         </div>
     </div>
 </div>

+ 1 - 1
Admin/Pages/Channel/List/Edit.cshtml

@@ -80,7 +80,7 @@
                         </div>
                     </div>
                 </div>
-                <small class="form-text text-muted">후원 받은 금액 중 dpot 이 가져가는 비율 (채널주는 100-PlatformFee% 보유)</small>
+                <small class="form-text text-muted">후원 받은 금액 중 antooza 가 가져가는 비율 (채널주는 100-PlatformFee% 보유)</small>
                 <span asp-validation-for="Input.PlatformFeeRate" class="text-danger"></span>
             </div>
         </div>

+ 1 - 1
Admin/Pages/Channel/List/Write.cshtml

@@ -93,7 +93,7 @@
                         </div>
                     </div>
                 </div>
-                <small class="form-text text-muted">후원 받은 금액 중 dpot 이 가져가는 비율 (채널주는 100-PlatformFee% 보유)</small>
+                <small class="form-text text-muted">후원 받은 금액 중 antooza 가 가져가는 비율 (채널주는 100-PlatformFee% 보유)</small>
                 <span asp-validation-for="Input.PlatformFeeRate" class="text-danger"></span>
             </div>
         </div>

+ 2 - 2
Admin/Pages/Shared/_Layout.cshtml

@@ -10,7 +10,7 @@
 	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
 	<title>@ViewData["Title"] - Admin</title>
 
-	<meta name="description" content="DPOT 관리자 페이지입니다." />
+	<meta name="description" content="ANTOOZA 관리자 페이지입니다." />
 	<meta name="author" content="https://dpot.dev" />
 	<meta name="copyright" content="playr" />
 	<meta name="referrer" content="no-referrer">
@@ -43,7 +43,7 @@
 				}
 			}
 		</ul>
-		<footer>ⓒ <a href="https://dpot.dev" target="_blank" rel="external">DPOT</a>. All Rights Reserved</footer>
+		<footer>ⓒ <a href="https://dpot.dev" target="_blank" rel="external">ANTOOZA</a>. All Rights Reserved</footer>
 	</aside>
 
 	<main id="main">

+ 1 - 1
Admin/Pages/Shared/_Sub.cshtml

@@ -10,7 +10,7 @@
 	<meta name="viewport" content="width=device-width, initial-scale=1.0" />
 	<title>@ViewData["Title"] - Admin</title>
 
-	<meta name="description" content="DPOT 관리자 페이지입니다." />
+	<meta name="description" content="ANTOOZA 관리자 페이지입니다." />
 	<meta name="author" content="https://dpot.dev" />
 	<meta name="copyright" content="playr" />
 	<meta name="referrer" content="no-referrer">

+ 1 - 1
Admin/Pages/Store/Order/Detail.cshtml

@@ -190,7 +190,7 @@
             </summary>
             <div class="row g-0">
                 <div class="col-4 order-share__cell">
-                    <div class="order-share__label">DPOT 몫</div>
+                    <div class="order-share__label">ANTOOZA 몫</div>
                     <div class="order-share__value">@d.PlatformFeeAmount.ToString("N0")</div>
                 </div>
                 <div class="col-4 order-share__cell">

+ 1 - 1
Admin/Pages/Store/Order/Index.cshtml

@@ -132,7 +132,7 @@
                     <th>구매자</th>
                     <th>후원 채널</th>
                     <th style="width:10%" class="text-end">총액</th>
-                    <th style="width:10%" class="text-end">DPOT</th>
+                    <th style="width:10%" class="text-end">ANTOOZA</th>
                     <th style="width:10%" class="text-end">게임사</th>
                     <th style="width:10%" class="text-end">채널</th>
                     <th style="width:8%">상태</th>

+ 1 - 1
Admin/Pages/Store/Settlement/Detail.cshtml

@@ -36,7 +36,7 @@
                     <dt class="col-sm-2">주문 건수</dt>
                     <dd class="col-sm-4">@d.OrderCount.ToString("N0")건</dd>
 
-                    <dt class="col-sm-2">수익률(게임사/dpot)</dt>
+                    <dt class="col-sm-2">수익률(게임사/antooza)</dt>
                     <dd class="col-sm-4">
                         @d.GameCommissionRate.ToString("0.##")% / @platformRate.ToString("0.##")%
                         <br /><small class="text-muted">* 채널 보상률은 주문별 채널 선택에 따라 다름 (Channel.StoreCommissionRate)</small>

+ 2 - 2
Admin/package-lock.json

@@ -1,11 +1,11 @@
 {
-    "name": "DPOT",
+    "name": "ANTOOZA",
     "version": "1.0.0",
     "lockfileVersion": 3,
     "requires": true,
     "packages": {
         "": {
-            "name": "DPOT",
+            "name": "ANTOOZA",
             "version": "1.0.0",
             "license": "ISC",
             "dependencies": {

+ 2 - 2
Admin/package.json

@@ -11,9 +11,9 @@
         "npm-run-all": "^4.1.5",
         "sass": "^1.97.3"
     },
-    "name": "DPOT",
+    "name": "ANTOOZA",
     "version": "1.0.0",
-    "description": "DPOT Admin",
+    "description": "ANTOOZA Admin",
     "main": "tailwind.config.js",
     "scripts": {
         "dev": "npm-run-all --parallel dev:site dev:account dev:admin",

+ 1 - 1
Application/Features/Api/Payment/CreateOrder/Handler.cs

@@ -19,7 +19,7 @@ internal sealed class Handler(
         var baseUrl = settings.App.FrontURL?.TrimEnd('/') ?? settings.App.BaseURL?.TrimEnd('/') ?? "https://localhost:3000";
 
         // 주문번호 생성
-        var orderID = $"DPOT-{DateTime.UtcNow:yyyyMMddHHmmss}-{r.MemberID}-{Random.Shared.Next(1000, 9999)}";
+        var orderID = $"ANTOOZA-{DateTime.UtcNow:yyyyMMddHHmmss}-{r.MemberID}-{Random.Shared.Next(1000, 9999)}";
 
         // 다날 클라이언트 설정 (CPID 획득)
         var config = await danalPay.GetClientConfigAsync(ct);

+ 1 - 1
Application/Features/Api/YouTube/PubSubNotify/Handler.cs

@@ -91,7 +91,7 @@ internal sealed class Handler(
         await statusBroadcaster.BroadcastAsync(channel.SID, isLive: true, viewerCount: 0, videoId: request.VideoID, ct);
 
         // ⚠️ liveChatMessages.list = 5 unit/call (가장 비싼 일반 read). 5초 폴링 시 시간당 3,600 unit → 라이브 3시간이면 일일 quota 10K 다 소모.
-        // dpot 채팅은 YouTube iframe 으로 대체되어 backend 채팅 메시지 수집 불필요.
+        // antooza 채팅은 YouTube iframe 으로 대체되어 backend 채팅 메시지 수집 불필요.
         // quota 증액 승인 후 재활성화 (memory: plan_dpot_chat_reactivate_after_quota.md).
         // 강제 활성화하려면 환경변수 등으로 toggle 추가 필요.
         // await liveChatService.StartAsync(request.VideoID, ct);

+ 4 - 4
CLAUDE.md

@@ -2,7 +2,7 @@
 
 ## Project Overview
 
-DPOT - Clean Architecture 기반 Creators Support and donate platform (.NET 10.0)
+ANTOOZA(개미투자) - Clean Architecture 기반 커머스·커뮤니티 플랫폼 (.NET 10.0)
 
 - **Framework**: .NET 10.0, ASP.NET Core
 - **CQRS**: 사내 디스패처 (ISender/IMediator) — 2026-07 MediatR 제거 (라이선스 회피, 순수 C#)
@@ -124,9 +124,9 @@ dotnet ef database update --project Infrastructure --startup-project Admin --con
 - Feature 구조: `Application/Features/{Domain}/{Action}/Command.cs, Handler.cs, Response.cs`
 
 ## 사용 Domain
-- https://dpot.live -> 사용자 단 사용 URL
-- https://admin.dpot.live -> 관리자 단 사용 URL
-- https://api.dpot.live -> 사용자 단 통신 API URL
+- https://antooza.com -> 사용자 단 사용 URL
+- https://admin.antooza.com -> 관리자 단 사용 URL
+- https://api.antooza.com -> 사용자 단 통신 API URL
 
 ## Code Style Rules (추가)
 

+ 2 - 2
Domain/Entities/Members/Channel.cs

@@ -47,10 +47,10 @@ public class Channel
     /// </summary>
     public DateTime? YouTubeLastSyncedAt { get; private set; }
 
-    /// <summary>후원(Donation) 수수료(%) — dpot 이 가져가는 비율. PlatformFeeRate=20% 이면 채널주는 80% 보유.</summary>
+    /// <summary>후원(Donation) 수수료(%) — antooza 가 가져가는 비율. PlatformFeeRate=20% 이면 채널주는 80% 보유.</summary>
     public decimal PlatformFeeRate { get; private set; } = 0;
 
-    /// <summary>상점 매출 보상률(%) — 채널이 가져가는 비율. StoreCommissionRate=20% 이면 채널주에게 20% 입금, dpot이 80% 보유.</summary>
+    /// <summary>상점 매출 보상률(%) — 채널이 가져가는 비율. StoreCommissionRate=20% 이면 채널주에게 20% 입금, antooza가 80% 보유.</summary>
     public decimal StoreCommissionRate { get; private set; } = 0;
 
     public bool IsVerified { get; private set; } = false;

+ 1 - 1
Domain/Entities/Store/Game.cs

@@ -5,7 +5,7 @@ namespace Domain.Entities.Store;
 /// <summary>
 /// 게임사 제휴 마스터. 상품/쿠폰의 필수 FK.
 /// CommissionRate(게임사 몫) % 만 정의. 채널 보상률은 Channel.StoreCommissionRate 에서 채널별로 동적으로 결정.
-/// dpot 몫 = 100 - Game.CommissionRate (채널 미선택) 또는 100 - Game.CommissionRate - Channel.StoreCommissionRate (채널 선택).
+/// antooza 몫 = 100 - Game.CommissionRate (채널 미선택) 또는 100 - Game.CommissionRate - Channel.StoreCommissionRate (채널 선택).
 /// </summary>
 public class Game
 {

+ 3 - 3
Domain/Entities/Store/Order.cs

@@ -8,7 +8,7 @@ namespace Domain.Entities.Store;
 /// <summary>
 /// 상점 주문 헤더. 단일 결제 = 단일 Order.
 /// 결제 시점에 수익 배분 (PlatformFee/GameRevenue/ChannelReward) 동결.
-/// 채널 미선택 주문은 ChannelRewardAmount=0, ChannelID=null. ChannelReward 만큼 PlatformFee 가 증가 (dpot 100%).
+/// 채널 미선택 주문은 ChannelRewardAmount=0, ChannelID=null. ChannelReward 만큼 PlatformFee 가 증가 (antooza 100%).
 /// </summary>
 public class Order
 {
@@ -32,12 +32,12 @@ public class Order
 
     public int MemberID { get; private set; }
 
-    /// <summary>후원 채널 (선택). null 이면 dpot 100% 수익.</summary>
+    /// <summary>후원 채널 (선택). null 이면 antooza 100% 수익.</summary>
     public int? ChannelID { get; private set; }
 
     public int TotalAmount { get; private set; }
 
-    /// <summary>dpot 몫 (= TotalAmount - GameRevenueAmount - ChannelRewardAmount).</summary>
+    /// <summary>antooza 몫 (= TotalAmount - GameRevenueAmount - ChannelRewardAmount).</summary>
     public int PlatformFeeAmount { get; private set; }
 
     /// <summary>게임사 정산 큐 적재 금액 (= TotalAmount × Game.CommissionRate / 100).</summary>

+ 1 - 1
Domain/Entities/Store/ProductLimitConfig.cs

@@ -5,7 +5,7 @@ using Domain.Entities.Store.ValueObject;
 namespace Domain.Entities.Store;
 
 /// <summary>
-/// 상품별 판매 정책 (1:1 with Product). fdmbox `tb_box_limit_config` 의 dpot 차용.
+/// 상품별 판매 정책 (1:1 with Product). fdmbox `tb_box_limit_config` 의 antooza 차용.
 /// 미설정 상품은 row 없음 (정책 미적용).
 ///
 /// 정책 동작:

+ 1 - 1
Domain/Entities/Store/ValueObject/LimitPeriodType.cs

@@ -3,7 +3,7 @@ namespace Domain.Entities.Store.ValueObject;
 /// <summary>
 /// 상품 판매 정책 — 누적 구매 윈도우 단위.
 /// fdmbox tb_box_limit_config.period_type 의 의미를 그대로 차용.
-/// dpot 정책: Rolling window (now - 환산시간 기준 누적 합산).
+/// antooza 정책: Rolling window (now - 환산시간 기준 누적 합산).
 /// </summary>
 public enum LimitPeriodType
 {

+ 1 - 1
Infrastructure/Authentication/JwtTokenProvider.cs

@@ -77,7 +77,7 @@ internal sealed class JwtTokenProvider(IOptions<AppSettings> options) : IJwtToke
             Expires = DateTime.UtcNow.Add(ttl),
             SigningCredentials = credentials,
             Issuer = _jwt.Issuer,
-            Audience = "dpot-public-api"
+            Audience = "antooza-public-api"
         };
 
         var handler = new JsonWebTokenHandler();

+ 19 - 19
Jenkinsfile

@@ -1,9 +1,9 @@
 // =====================================================================
-// DPOT Backend Jenkinsfile (IIS In-Process + WinSW Worker)
+// ANTOOZA Backend Jenkinsfile (IIS In-Process + WinSW Worker)
 //   - Solution:        Admin/Admin.slnx (.NET 10)
-//   - Components:      Web.Api (IIS DPOT-API), Admin (IIS DPOT-Admin), MailWorker (WinSW dpot-mail)
+//   - Components:      Web.Api (IIS ANTOOZA-API), Admin (IIS ANTOOZA-Admin), MailWorker (WinSW antooza-mail)
 //   - Agent:           CTL-Window-Server (Jenkins inbound agent on 10.10.0.100)
-//   - Branches:        main / dev  -> deploy to dev environment (dev-*.dpot.live)
+//   - Branches:        main / dev  -> deploy to dev environment (dev-*.antooza.com)
 //                      others      -> build/test only
 //   - Selective:       AUTO_DETECT (default) via git diff, or manual checkboxes
 // =====================================================================
@@ -31,10 +31,10 @@ pipeline {
     JAVA_TOOL_OPTIONS           = '-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8'
 
     // Deployment roots (CTL-Window-Server, F: drive)
-    IIS_ROOT                    = 'F:\\IIS\\DPOT'
-    IIS_RELEASES                = 'F:\\IIS\\DPOT\\_releases'
-    WORKER_ROOT                 = 'F:\\workspace\\DPOT'
-    WORKER_RELEASES             = 'F:\\workspace\\DPOT\\_releases'
+    IIS_ROOT                    = 'F:\\IIS\\ANTOOZA'
+    IIS_RELEASES                = 'F:\\IIS\\ANTOOZA\\_releases'
+    WORKER_ROOT                 = 'F:\\workspace\\ANTOOZA'
+    WORKER_RELEASES             = 'F:\\workspace\\ANTOOZA\\_releases'
 
     // Project paths (relative to Backend/ working dir on agent)
     SLN_FILE     = 'Admin\\Admin.slnx'
@@ -53,8 +53,8 @@ pipeline {
     MAIL_PATHS   = 'MailWorker/'
 
     // Health check (loopback + Host header to hit the right IIS site binding)
-    // IIS HTTP binding은 dev-api.dpot.live (HTTPS는 .dev). 내부 health check는 HTTP라 .live 사용.
-    API_HEALTH_HOST = 'dev-api.dpot.live'
+    // IIS HTTP binding은 dev-api.antooza.com (HTTPS는 .dev). 내부 health check는 HTTP라 .live 사용.
+    API_HEALTH_HOST = 'dev-api.antooza.com'
   }
 
   stages {
@@ -190,7 +190,7 @@ pipeline {
       }
       steps {
         dir(env.WORK_SUBDIR) {
-          withCredentials([string(credentialsId: 'dpot-db-connection-dev', variable: 'CONN')]) {
+          withCredentials([string(credentialsId: 'antooza-db-connection-dev', variable: 'CONN')]) {
             bat 'chcp 65001 >NUL && dotnet tool restore --tool-manifest dotnet-tools.json'
             withEnv([
               "ConnectionStrings__DefaultConnection=${CONN}",
@@ -211,17 +211,17 @@ pipeline {
         dir(env.WORK_SUBDIR) {
           script {
             if (env.DO_API == 'true') {
-              withCredentials([file(credentialsId: 'DEV-DPOT-API', variable: 'CFG')]) {
+              withCredentials([file(credentialsId: 'DEV-ANTOOZA-API', variable: 'CFG')]) {
                 bat 'copy /Y "%CFG%" publish\\api\\appsettings.Production.json'
               }
             }
             if (env.DO_ADMIN == 'true') {
-              withCredentials([file(credentialsId: 'DEV-DPOT-ADMIN', variable: 'CFG')]) {
+              withCredentials([file(credentialsId: 'DEV-ANTOOZA-ADMIN', variable: 'CFG')]) {
                 bat 'copy /Y "%CFG%" publish\\admin\\appsettings.Production.json'
               }
             }
             if (env.DO_MAIL == 'true') {
-              withCredentials([file(credentialsId: 'DEV-DPOT-MAIL', variable: 'CFG')]) {
+              withCredentials([file(credentialsId: 'DEV-ANTOOZA-MAIL', variable: 'CFG')]) {
                 bat 'copy /Y "%CFG%" publish\\mail\\appsettings.Production.json'
               }
             }
@@ -237,7 +237,7 @@ pipeline {
           when { expression { env.DO_API == 'true' } }
           steps {
             dir(env.WORK_SUBDIR) {
-              script { deployIIS('DPOT-API', 'DPOT-API', 'api', 'API', env.API_HEALTH_HOST, true) }
+              script { deployIIS('ANTOOZA-API', 'ANTOOZA-API', 'api', 'API', env.API_HEALTH_HOST, true) }
             }
           }
         }
@@ -246,7 +246,7 @@ pipeline {
           steps {
             dir(env.WORK_SUBDIR) {
               // Admin은 /health 엔드포인트가 없어서 AppPool Started 만 검증
-              script { deployIIS('DPOT-Admin', 'DPOT-Admin', 'admin', 'Admin', null, false) }
+              script { deployIIS('ANTOOZA-Admin', 'ANTOOZA-Admin', 'admin', 'Admin', null, false) }
             }
           }
         }
@@ -254,7 +254,7 @@ pipeline {
           when { expression { env.DO_MAIL == 'true' } }
           steps {
             dir(env.WORK_SUBDIR) {
-              script { deployWinSWWorker('dpot-mail', 'mail') }
+              script { deployWinSWWorker('antooza-mail', 'mail') }
             }
           }
         }
@@ -271,10 +271,10 @@ pipeline {
 // ==== Helpers =================================================================
 
 // IIS In-Process 배포.
-//   siteName    : Jenkins 로그용 라벨 (예: DPOT-API)
-//   appPoolName : IIS AppPool 이름 (예: DPOT-API) — Stop-WebAppPool / Start-WebAppPool 대상
+//   siteName    : Jenkins 로그용 라벨 (예: ANTOOZA-API)
+//   appPoolName : IIS AppPool 이름 (예: ANTOOZA-API) — Stop-WebAppPool / Start-WebAppPool 대상
 //   srcSubdir   : publish 하위 디렉토리 (예: api, admin) — `publish\<srcSubdir>` 에서 복사
-//   destFolder  : F:\IIS\DPOT\<destFolder> (대소문자: API, Admin)
+//   destFolder  : F:\IIS\ANTOOZA\<destFolder> (대소문자: API, Admin)
 //   healthHost  : Host 헤더로 보낼 도메인 (null이면 health 생략)
 //   checkHealth : true면 /health 200 확인, false면 AppPool Started 만 확인
 def deployIIS(siteName, appPoolName, srcSubdir, destFolder, healthHost, checkHealth) {

+ 13 - 13
Jenkinsfile.prod

@@ -1,7 +1,7 @@
 // =====================================================================
-// DPOT Backend Jenkinsfile (PROD)
+// ANTOOZA Backend Jenkinsfile (PROD)
 //   - Solution:        Admin/Admin.slnx (.NET 10)
-//   - Components:      Web.Api (IIS DPOT-API), Admin (IIS DPOT-Admin), MailWorker (WinSW dpot-mail)
+//   - Components:      Web.Api (IIS ANTOOZA-API), Admin (IIS ANTOOZA-Admin), MailWorker (WinSW antooza-mail)
 //   - Agent:           PROD-Window-Server (Jenkins inbound agent on 10.1.0.100)
 //   - Branches:        main only (dev 는 Backend/Jenkinsfile 사용)
 // =====================================================================
@@ -31,8 +31,8 @@ pipeline {
     // Deployment roots (PROD-Window-Server)
     IIS_ROOT                    = 'C:\\workspace\\IIS'
     IIS_RELEASES                = 'C:\\workspace\\IIS\\_releases'
-    WORKER_ROOT                 = 'C:\\workspace\\DPOT'
-    WORKER_RELEASES             = 'C:\\workspace\\DPOT\\_releases'
+    WORKER_ROOT                 = 'C:\\workspace\\ANTOOZA'
+    WORKER_RELEASES             = 'C:\\workspace\\ANTOOZA\\_releases'
 
     // Project paths (relative to Backend/ working dir on agent)
     SLN_FILE     = 'Admin\\Admin.slnx'
@@ -48,8 +48,8 @@ pipeline {
     ADMIN_PATHS  = 'Admin/'
     MAIL_PATHS   = 'MailWorker/'
 
-    // PROD IIS HTTP binding 은 api.dpot.live
-    API_HEALTH_HOST = 'api.dpot.live'
+    // PROD IIS HTTP binding 은 api.antooza.com
+    API_HEALTH_HOST = 'api.antooza.com'
   }
 
   stages {
@@ -180,7 +180,7 @@ pipeline {
       }
       steps {
         dir(env.WORK_SUBDIR) {
-          withCredentials([string(credentialsId: 'dpot-db-connection-prod', variable: 'CONN')]) {
+          withCredentials([string(credentialsId: 'antooza-db-connection-prod', variable: 'CONN')]) {
             bat 'chcp 65001 >NUL && dotnet tool restore --tool-manifest dotnet-tools.json'
             withEnv([
               "ConnectionStrings__DefaultConnection=${CONN}",
@@ -199,17 +199,17 @@ pipeline {
         dir(env.WORK_SUBDIR) {
           script {
             if (env.DO_API == 'true') {
-              withCredentials([file(credentialsId: 'PROD-DPOT-API', variable: 'CFG')]) {
+              withCredentials([file(credentialsId: 'PROD-ANTOOZA-API', variable: 'CFG')]) {
                 bat 'copy /Y "%CFG%" publish\\api\\appsettings.Production.json'
               }
             }
             if (env.DO_ADMIN == 'true') {
-              withCredentials([file(credentialsId: 'PROD-DPOT-ADMIN', variable: 'CFG')]) {
+              withCredentials([file(credentialsId: 'PROD-ANTOOZA-ADMIN', variable: 'CFG')]) {
                 bat 'copy /Y "%CFG%" publish\\admin\\appsettings.Production.json'
               }
             }
             if (env.DO_MAIL == 'true') {
-              withCredentials([file(credentialsId: 'PROD-DPOT-MAIL', variable: 'CFG')]) {
+              withCredentials([file(credentialsId: 'PROD-ANTOOZA-MAIL', variable: 'CFG')]) {
                 bat 'copy /Y "%CFG%" publish\\mail\\appsettings.Production.json'
               }
             }
@@ -224,7 +224,7 @@ pipeline {
           when { expression { env.DO_API == 'true' } }
           steps {
             dir(env.WORK_SUBDIR) {
-              script { deployIIS('DPOT-API', 'DPOT-API', 'api', 'API', env.API_HEALTH_HOST, true) }
+              script { deployIIS('ANTOOZA-API', 'ANTOOZA-API', 'api', 'API', env.API_HEALTH_HOST, true) }
             }
           }
         }
@@ -232,7 +232,7 @@ pipeline {
           when { expression { env.DO_ADMIN == 'true' } }
           steps {
             dir(env.WORK_SUBDIR) {
-              script { deployIIS('DPOT-Admin', 'DPOT-Admin', 'admin', 'Admin', null, false) }
+              script { deployIIS('ANTOOZA-Admin', 'ANTOOZA-Admin', 'admin', 'Admin', null, false) }
             }
           }
         }
@@ -240,7 +240,7 @@ pipeline {
           when { expression { env.DO_MAIL == 'true' } }
           steps {
             dir(env.WORK_SUBDIR) {
-              script { deployWinSWWorker('dpot-mail', 'mail') }
+              script { deployWinSWWorker('antooza-mail', 'mail') }
             }
           }
         }

+ 1 - 1
MailWorker/Program.cs

@@ -21,7 +21,7 @@ var settings = builder.Configuration.Get<AppSettings>()!;
 
 if (!WindowsServiceHelpers.IsWindowsService())
 {
-    Console.Title = "DPOT MailWorker";
+    Console.Title = "ANTOOZA MailWorker";
 }
 Console.WriteLine($"ENV={builder.Environment.EnvironmentName}");
 Console.WriteLine($"현재 시간: {DateTime.Now} / {TimeZoneInfo.Local.Id}");

+ 1 - 1
SharedKernel/Helpers/CsvHelper.cs

@@ -3,7 +3,7 @@ using System.Text;
 namespace SharedKernel.Helpers;
 
 /// <summary>
-/// RFC 4180 호환 CSV 직렬화/역직렬화. 외부 라이브러리 미사용 (dpot 코드 컨벤션).
+/// RFC 4180 호환 CSV 직렬화/역직렬화. 외부 라이브러리 미사용 (antooza 코드 컨벤션).
 /// 직렬화는 UTF-8 BOM 포함 (Excel 호환).
 /// </summary>
 public static class CsvHelper

+ 1 - 1
SharedKernel/Storage/StorageOptions.cs

@@ -5,7 +5,7 @@ namespace SharedKernel.Storage;
 /// appsettings 의 "Storage" 섹션에서 바인딩.
 /// BasePath 가 비어있으면 WebHostEnvironment.WebRootPath 로 폴백.
 ///
-/// 권장: deploy 영향을 받지 않는 외부 경로 사용 (예: F:\dpot-storage).
+/// 권장: deploy 영향을 받지 않는 외부 경로 사용 (예: F:\antooza-storage).
 /// 그래야 Jenkins 가 배포 폴더를 갈아엎어도 업로드 파일이 보존됨.
 /// </summary>
 public sealed class StorageOptions

+ 2 - 2
Web.Api/DependencyInjection.cs

@@ -21,7 +21,7 @@ public static class DependencyInjection
             // internal: 기존 /api/* (대시보드 전용)
             options.SwaggerDoc("internal", new OpenApiInfo
             {
-                Title = "DPOT Internal API",
+                Title = "ANTOOZA Internal API",
                 Version = "v1",
                 Description = "사용자/관리자 페이지 전용. 외부 노출 안 됨."
             });
@@ -43,7 +43,7 @@ public static class DependencyInjection
             options.AddSecurityRequirement(document => new() { [new OpenApiSecuritySchemeReference("Bearer", document)] = [] });
 
             // OpenAPI 3.x servers field — Scalar / Swagger UI 의 server selector + "Try it out" base URL.
-            // 환경별 (PROD=api.dpot.live / DEV=dev-api.dpot.live / LOCAL=localhost:4000) 로 자동 채워짐.
+            // 환경별 (PROD=api.antooza.com / DEV=dev-api.antooza.com / LOCAL=localhost:4000) 로 자동 채워짐.
             options.AddServer(new OpenApiServer
             {
                 Url = settings.App.ApiURL,

+ 1 - 1
Web.Api/Program.cs

@@ -152,7 +152,7 @@ if (app.Environment.IsDevelopment())
 {
     app.UseSwaggerUI(c =>
     {
-        c.SwaggerEndpoint("/swagger/internal/swagger.json", "DPOT Internal API");
+        c.SwaggerEndpoint("/swagger/internal/swagger.json", "ANTOOZA Internal API");
     });
 }
 

+ 3 - 3
Web.Api/postman/DPOT-Dev.postman_environment.json → Web.Api/postman/ANTOOZA-Dev.postman_environment.json

@@ -1,10 +1,10 @@
 {
   "id": "0b3a8c10-1f5c-4f0b-9e7c-1c0d0e1f2a02",
-  "name": "DPOT — Dev",
+  "name": "ANTOOZA — Dev",
   "values": [
     {
       "key": "baseUrl",
-      "value": "https://dev-api.dpot.live",
+      "value": "https://dev-api.antooza.com",
       "type": "default",
       "enabled": true
     },
@@ -59,5 +59,5 @@
   ],
   "_postman_variable_scope": "environment",
   "_postman_exported_at": "2026-06-08T00:00:00.000Z",
-  "_postman_exported_using": "DPOT/update.ps1"
+  "_postman_exported_using": "ANTOOZA/update.ps1"
 }

+ 2 - 2
Web.Api/postman/DPOT-Local.postman_environment.json → Web.Api/postman/ANTOOZA-Local.postman_environment.json

@@ -1,6 +1,6 @@
 {
   "id": "0b3a8c10-1f5c-4f0b-9e7c-1c0d0e1f2a01",
-  "name": "DPOT — Local",
+  "name": "ANTOOZA — Local",
   "values": [
     {
       "key": "baseUrl",
@@ -59,5 +59,5 @@
   ],
   "_postman_variable_scope": "environment",
   "_postman_exported_at": "2026-06-08T00:00:00.000Z",
-  "_postman_exported_using": "DPOT/update.ps1"
+  "_postman_exported_using": "ANTOOZA/update.ps1"
 }

+ 3 - 3
Web.Api/postman/DPOT-Prod.postman_environment.json → Web.Api/postman/ANTOOZA-Prod.postman_environment.json

@@ -1,10 +1,10 @@
 {
   "id": "0b3a8c10-1f5c-4f0b-9e7c-1c0d0e1f2a03",
-  "name": "DPOT — Prod",
+  "name": "ANTOOZA — Prod",
   "values": [
     {
       "key": "baseUrl",
-      "value": "https://api.dpot.live",
+      "value": "https://api.antooza.com",
       "type": "default",
       "enabled": true
     },
@@ -59,5 +59,5 @@
   ],
   "_postman_variable_scope": "environment",
   "_postman_exported_at": "2026-06-08T00:00:00.000Z",
-  "_postman_exported_using": "DPOT/update.ps1"
+  "_postman_exported_using": "ANTOOZA/update.ps1"
 }

+ 14 - 14
Web.Api/postman/README.md

@@ -1,4 +1,4 @@
-# DPOT Postman Collection
+# ANTOOZA Postman Collection
 
 Backend 의 모든 API 를 Postman 에서 테스트할 수 있는 import 파일 모음입니다.
 
@@ -10,11 +10,11 @@ postman/
 ├── update.ps1                                      ← 갱신 스크립트
 ├── collections/
-│   └── DPOT-Internal-API.postman_collection.json   ← /api/* (내부/관리자)
+│   └── ANTOOZA-Internal-API.postman_collection.json   ← /api/* (내부/관리자)
-├── DPOT-Local.postman_environment.json             ← https://localhost:4000
-├── DPOT-Dev.postman_environment.json               ← https://dev-api.dpot.live
-├── DPOT-Prod.postman_environment.json              ← https://api.dpot.live
+├── ANTOOZA-Local.postman_environment.json             ← https://localhost:4000
+├── ANTOOZA-Dev.postman_environment.json               ← https://dev-api.antooza.com
+├── ANTOOZA-Prod.postman_environment.json              ← https://api.antooza.com
 └── _legacy/                                        ← 이전 수동 작성 11개 collection (보관용)
     ├── Account.postman_collection.json
@@ -23,7 +23,7 @@ postman/
 ```
 
 > 개발자 포털 공개 API(/v1/*, /oauth/token) 는 2026-07-03 제거되었습니다.
-> DPOT-Public-API collection 도 함께 삭제됐습니다.
+> ANTOOZA-Public-API collection 도 함께 삭제됐습니다.
 
 Internal Collection 의 주요 그룹:
 
@@ -41,14 +41,14 @@ Internal Collection 의 주요 그룹:
 
 ### 1-1. Collection import
 1. Postman → 좌측 **Collections** 패널 상단 **Import** 클릭
-2. `collections/DPOT-Internal-API.postman_collection.json` 드래그
+2. `collections/ANTOOZA-Internal-API.postman_collection.json` 드래그
 
 ### 1-2. Environment import
 1. Postman → 좌측 **Environments** 패널 상단 **Import** 클릭
 2. 사용할 환경 파일을 import (필요한 개수만큼):
-   - `DPOT-Local.postman_environment.json` (로컬 개발)
-   - `DPOT-Dev.postman_environment.json` (DEV 서버)
-   - `DPOT-Prod.postman_environment.json` (PROD 서버)
+   - `ANTOOZA-Local.postman_environment.json` (로컬 개발)
+   - `ANTOOZA-Dev.postman_environment.json` (DEV 서버)
+   - `ANTOOZA-Prod.postman_environment.json` (PROD 서버)
 3. 우측 상단 environment selector 에서 사용할 환경 선택
 
 > Collection 안의 모든 request 가 `{{baseUrl}}/...` 형식이라 environment 만 바꾸면 호출 대상이 전환됩니다.
@@ -106,7 +106,7 @@ pwsh ./update.ps1
 1. `$ApiBase/health` 응답 확인
 2. `$ApiBase/swagger/internal/swagger.json` fetch
 3. `npx openapi-to-postmanv2@5` 로 Postman Collection v2.1 변환
-4. `collections/DPOT-Internal-API.postman_collection.json` 덮어쓰기
+4. `collections/ANTOOZA-Internal-API.postman_collection.json` 덮어쓰기
 
 ### 3-3. Postman 에 재import
 
@@ -121,8 +121,8 @@ pwsh ./update.ps1
 ### Internal swagger 는 Production 에 차단됨
 
 ```
-https://api.dpot.live/swagger/internal/swagger.json     → 404 (보안 차단)
-https://dev-api.dpot.live/swagger/internal/swagger.json → 404 (보안 차단)
+https://api.antooza.com/swagger/internal/swagger.json     → 404 (보안 차단)
+https://dev-api.antooza.com/swagger/internal/swagger.json → 404 (보안 차단)
 https://localhost:4000/swagger/internal/swagger.json    → 200 ← 변환은 여기서만
 ```
 
@@ -134,7 +134,7 @@ https://localhost:4000/swagger/internal/swagger.json    → 200 ← 변환은 
 
 Postman → Settings → General → **SSL certificate verification** OFF (로컬 호출 시에만)
 
-PROD/DEV 호출 시에는 정상 와일드카드 인증서 (`*.dpot.live`) 라 ON 으로 유지해도 됩니다.
+PROD/DEV 호출 시에는 정상 와일드카드 인증서 (`*.antooza.com`) 라 ON 으로 유지해도 됩니다.
 
 ### `_legacy/` 폴더
 

+ 3 - 3
Web.Api/postman/_legacy/Payment.postman_collection.json

@@ -1,7 +1,7 @@
 {
   "info": {
-    "_postman_id": "dpot-payment-danal-v1",
-    "name": "DPOT Payment API (Danal PG)",
+    "_postman_id": "antooza-payment-danal-v1",
+    "name": "ANTOOZA Payment API (Danal PG)",
     "description": "다날 PG 결제 연동 API\n\n## 결제 흐름\n1. **주문 생성** → `POST /api/payment/order`\n2. **다날 SDK 결제창 호출** (프론트엔드)\n3. **결제 승인** → `POST /api/payment/confirm`\n4. (선택) **결제 취소** → `POST /api/payment/cancel`\n\n## 사용법\n1. `baseUrl` 변수 설정 (기본값: `https://localhost:4000`)\n2. 로그인 후 `accessToken` 변수에 JWT Bearer 토큰 입력",
     "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
   },
@@ -10,7 +10,7 @@
       "key": "baseUrl",
       "value": "https://localhost:4000",
       "type": "string",
-      "description": "API 서버 URL (개발: https://localhost:4000 / 운영: https://api.dpot.live)"
+      "description": "API 서버 URL (개발: https://localhost:4000 / 운영: https://api.antooza.com)"
     },
     {
       "key": "accessToken",

+ 1 - 1
Web.Api/postman/collections/DPOT-Internal-API.postman_collection.json → Web.Api/postman/collections/ANTOOZA-Internal-API.postman_collection.json

@@ -21946,7 +21946,7 @@
 	],
 	"info": {
 		"_postman_id": "0014f903-2c84-424f-b2e2-bae6dda2c44c",
-		"name": "DPOT Internal API",
+		"name": "ANTOOZA Internal API",
 		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
 		"description": {
 			"content": "사용자/관리자 페이지 전용. 외부 노출 안 됨.",

+ 8 - 8
Web.Api/postman/update.ps1

@@ -1,13 +1,13 @@
 # ============================================================================
-# DPOT Postman Collection 갱신 스크립트
+# ANTOOZA Postman Collection 갱신 스크립트
 #
 # 사용법:
 #   1. 백엔드 실행 (다른 터미널)
-#      cd D:\dpot\Backend
+#      cd E:\workspace\antooza\Backend
 #      dotnet run --project Web.Api
 #
 #   2. 이 스크립트 실행
-#      cd D:\dpot\Backend\Web.Api\postman
+#      cd E:\workspace\antooza\Backend\Web.Api\postman
 #      pwsh ./update.ps1
 #
 # 옵션:
@@ -15,7 +15,7 @@
 #   -SkipInternal      internal swagger 변환 생략
 #
 # 결과:
-#   collections/DPOT-Internal-API.postman_collection.json (내부 /api/*)
+#   collections/ANTOOZA-Internal-API.postman_collection.json (내부 /api/*)
 #
 # 요구사항:
 #   - Node.js (npx 포함) — openapi-to-postmanv2 를 npx 로 1회성 실행
@@ -48,7 +48,7 @@ try {
 } catch {
     Write-Fail "백엔드 접근 실패: $($_.Exception.Message)"
     Write-Host "    먼저 다른 터미널에서 다음 명령을 실행하세요:" -ForegroundColor Yellow
-    Write-Host "      cd D:\dpot\Backend; dotnet run --project Web.Api" -ForegroundColor Yellow
+    Write-Host "      cd E:\workspace\antooza\Backend; dotnet run --project Web.Api" -ForegroundColor Yellow
     exit 1
 }
 
@@ -71,13 +71,13 @@ if (-not (Test-Path $colDir)) {
 function Convert-Swagger {
     param(
         [string]$DocName,    # internal
-        [string]$OutName     # DPOT-Internal-API
+        [string]$OutName     # ANTOOZA-Internal-API
     )
 
     Write-Step "$DocName swagger 변환"
 
     $swaggerUrl = "$ApiBase/swagger/$DocName/swagger.json"
-    $tmpFile = Join-Path $env:TEMP "dpot-$DocName.json"
+    $tmpFile = Join-Path $env:TEMP "antooza-$DocName.json"
     $outFile = Join-Path $colDir "$OutName.postman_collection.json"
 
     # fetch
@@ -117,7 +117,7 @@ function Convert-Swagger {
     }
 }
 
-if (-not $SkipInternal) { Convert-Swagger -DocName "internal" -OutName "DPOT-Internal-API" }
+if (-not $SkipInternal) { Convert-Swagger -DocName "internal" -OutName "ANTOOZA-Internal-API" }
 
 Write-Host ""
 Write-Step "완료 — Postman 에서 collections/*.postman_collection.json 을 import 하세요"