فهرست منبع

feat(market): SEIBro OpenAPI Wave 0+1 — 기반·조인키·배당/권리

예탁결제원 SEIBro 연동 (DB-first, 배치만 호출·조회는 DB).

Wave 0 (기반+조인키):
- SeibroHttp(https→http fallback·charset 감지·key 마스킹) + SeibroXml(vector@result, value 속성, 래퍼 대소문자 무시) + SeibroFieldParse
- SeibroRollingSweep(per-키 rolling helper) + SeibroQuota(카테고리 일일 예산: 기업5만/주식1만/채권1만/파생1만/외화2만)
- Stock 확장 5컬럼(IssucoCustno·FaceValue·VotingRights·IsElectronicSecurity·TotalIssuedShares) + SeibroIssuerCode(K-OTC 포함)
- SeibroIssuerSyncService: getShotnByMart×4 → 회사번호 매핑 → getStkStatInfo rolling 보강

Wave 1 (배당·권리 P0):
- DividendSchedule(getDivSchedulInfo 전 캘린더일 스윕 — 권리기준일 주말 존재) + Dividend(getDivInfo rolling) + RightsBaseDate(getStddtInfo, Wave3 이벤트 소스)
- 조회 API: GetDividendCalendar(/api/market/dividend-calendar), GetStockDividends(/api/stocks/{code}/dividends)

- 교차배선: IAppDbContext/AppDbContext DbSet, DependencyInjection(Seibro:*Sync 게이트), AppSetting SeibroSection, ModelSnapshot
- 마이그레이션 2개(AddSeibroIssuerAndStockExtension, AddSeibroDividend) — 미적용
- 테스트: 샘플 37종 fixture + 파서/Quota/RollingSweep/Sync/Query (신규 44)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
KIM-JINO5 2 هفته پیش
والد
کامیت
0187f5b6c5
93فایلهای تغییر یافته به همراه38637 افزوده شده و 12 حذف شده
  1. 8 0
      Application/Abstractions/Data/IAppDbContext.cs
  2. 55 0
      Application/Features/Api/Stocks/GetDividendCalendar/Handler.cs
  3. 12 0
      Application/Features/Api/Stocks/GetDividendCalendar/Query.cs
  4. 28 0
      Application/Features/Api/Stocks/GetDividendCalendar/Response.cs
  5. 97 0
      Application/Features/Api/Stocks/GetStockDividends/Handler.cs
  6. 11 0
      Application/Features/Api/Stocks/GetStockDividends/Query.cs
  7. 36 0
      Application/Features/Api/Stocks/GetStockDividends/Response.cs
  8. 113 0
      Application/Helpers/SeibroQuota.cs
  9. 55 0
      Application/Helpers/SeibroRollingSweep.cs
  10. 238 0
      Domain/Entities/Stocks/Dividend.cs
  11. 173 0
      Domain/Entities/Stocks/DividendSchedule.cs
  12. 95 0
      Domain/Entities/Stocks/RightsBaseDate.cs
  13. 81 0
      Domain/Entities/Stocks/SeibroIssuerCode.cs
  14. 68 0
      Domain/Entities/Stocks/Stock.cs
  15. 31 0
      Infrastructure/DependencyInjection.cs
  16. 8 0
      Infrastructure/Persistence/AppDbContext.cs
  17. 36 0
      Infrastructure/Persistence/Configurations/Stocks/DividendConfiguration.cs
  18. 30 0
      Infrastructure/Persistence/Configurations/Stocks/DividendScheduleConfiguration.cs
  19. 24 0
      Infrastructure/Persistence/Configurations/Stocks/RightsBaseDateConfiguration.cs
  20. 21 0
      Infrastructure/Persistence/Configurations/Stocks/SeibroIssuerCodeConfiguration.cs
  21. 6 0
      Infrastructure/Persistence/Configurations/Stocks/StockConfiguration.cs
  22. 12490 0
      Infrastructure/Persistence/Migrations/20260707093947_AddSeibroIssuerAndStockExtension.Designer.cs
  23. 119 0
      Infrastructure/Persistence/Migrations/20260707093947_AddSeibroIssuerAndStockExtension.cs
  24. 12736 0
      Infrastructure/Persistence/Migrations/20260707100929_AddSeibroDividend.Designer.cs
  25. 148 0
      Infrastructure/Persistence/Migrations/20260707100929_AddSeibroDividend.cs
  26. 384 6
      Infrastructure/Persistence/Migrations/AppDbContextModelSnapshot.cs
  27. 69 0
      Infrastructure/StockData/SeibroDivInfoParser.cs
  28. 59 0
      Infrastructure/StockData/SeibroDivSchedulParser.cs
  29. 140 0
      Infrastructure/StockData/SeibroDividendImport.cs
  30. 221 0
      Infrastructure/StockData/SeibroDividendSyncService.cs
  31. 55 0
      Infrastructure/StockData/SeibroFieldParse.cs
  32. 99 0
      Infrastructure/StockData/SeibroHttp.cs
  33. 31 0
      Infrastructure/StockData/SeibroIssucoCustnoParser.cs
  34. 71 0
      Infrastructure/StockData/SeibroIssuerImport.cs
  35. 154 0
      Infrastructure/StockData/SeibroIssuerSyncService.cs
  36. 35 0
      Infrastructure/StockData/SeibroShotnByMartParser.cs
  37. 48 0
      Infrastructure/StockData/SeibroStddtParser.cs
  38. 69 0
      Infrastructure/StockData/SeibroStkStatParser.cs
  39. 76 0
      Infrastructure/StockData/SeibroXml.cs
  40. 82 6
      SharedKernel/AppSetting.cs
  41. 5 0
      Tests/Application.Tests/Application.Tests.csproj
  42. 1366 0
      Tests/Application.Tests/Fixtures/Seibro/기업/getCostPaySchedul.xml
  43. 380 0
      Tests/Application.Tests/Fixtures/Seibro/기업/getDivInfo.xml
  44. 146 0
      Tests/Application.Tests/Fixtures/Seibro/기업/getDivSchedulInfo.xml
  45. 15 0
      Tests/Application.Tests/Fixtures/Seibro/기업/getFmnmAltInfo.xml
  46. 24 0
      Tests/Application.Tests/Fixtures/Seibro/기업/getGmeetInfo.xml
  47. 222 0
      Tests/Application.Tests/Fixtures/Seibro/기업/getGmeetMeasureInfo.xml
  48. 8 0
      Tests/Application.Tests/Fixtures/Seibro/기업/getIssucoCustnoByIsin.xml
  49. 16 0
      Tests/Application.Tests/Fixtures/Seibro/기업/getOddLotInfo.xml
  50. 32 0
      Tests/Application.Tests/Fixtures/Seibro/기업/getStddtInfo.xml
  51. 26 0
      Tests/Application.Tests/Fixtures/Seibro/외화 증권 정보/getNationFrsecCusInfo.xml
  52. 58 0
      Tests/Application.Tests/Fixtures/Seibro/외화 증권 정보/getNationFrsecSetlInfo.xml
  53. 18 0
      Tests/Application.Tests/Fixtures/Seibro/외화 증권 정보/getSecnFrsecCusInfo.xml
  54. 20 0
      Tests/Application.Tests/Fixtures/Seibro/외화 증권 정보/getSecnFrsecSetlInfo.xml
  55. 18 0
      Tests/Application.Tests/Fixtures/Seibro/주식/getSafeDpDutyDepoStatus.xml
  56. 884 0
      Tests/Application.Tests/Fixtures/Seibro/주식/getShotnByMart.xml
  57. 19 0
      Tests/Application.Tests/Fixtures/Seibro/주식/getSlbDealingByIsin.xml
  58. 44 0
      Tests/Application.Tests/Fixtures/Seibro/주식/getStkIncdecDetails.xml
  59. 2774 0
      Tests/Application.Tests/Fixtures/Seibro/주식/getStkListInfo.xml
  60. 20 0
      Tests/Application.Tests/Fixtures/Seibro/주식/getStkStatInfo.xml
  61. 14 0
      Tests/Application.Tests/Fixtures/Seibro/주식/getUnlistCirclInfo.xml
  62. 2 0
      Tests/Application.Tests/Fixtures/Seibro/주식/getXrcStkOptionXrcInfo.xml
  63. 2 0
      Tests/Application.Tests/Fixtures/Seibro/주식/getXrcStkStatInfo.xml
  64. 11 0
      Tests/Application.Tests/Fixtures/Seibro/채권/getBondIssuInfo.xml
  65. 17 0
      Tests/Application.Tests/Fixtures/Seibro/채권/getBondOptionXrcInfo.xml
  66. 42 0
      Tests/Application.Tests/Fixtures/Seibro/채권/getBondStatInfo.xml
  67. 2 0
      Tests/Application.Tests/Fixtures/Seibro/채권/getCDInfo.xml
  68. 26 0
      Tests/Application.Tests/Fixtures/Seibro/채권/getCPInfo.xml
  69. 21 0
      Tests/Application.Tests/Fixtures/Seibro/채권/getESTBInfo.xml
  70. 2 0
      Tests/Application.Tests/Fixtures/Seibro/채권/getIntPayInfo.xml
  71. 2322 0
      Tests/Application.Tests/Fixtures/Seibro/채권/getShortmIssuInfo.xml
  72. 62 0
      Tests/Application.Tests/Fixtures/Seibro/파생 결합 증권/getAssetInfo.xml
  73. 66 0
      Tests/Application.Tests/Fixtures/Seibro/파생 결합 증권/getAssetXrcInfo.xml
  74. 9 0
      Tests/Application.Tests/Fixtures/Seibro/파생 결합 증권/getBassetUnredScale.xml
  75. 26 0
      Tests/Application.Tests/Fixtures/Seibro/파생 결합 증권/getDerivCombiIsinInfo.xml
  76. 380 0
      Tests/Application.Tests/Fixtures/Seibro/파생 결합 증권/getDerivCombiIssuInfo.xml
  77. 112 0
      Tests/Application.Tests/Fixtures/Seibro/파생 결합 증권/getRedCondiInfo.xml
  78. 86 0
      Tests/Application.Tests/Fixtures/Seibro/파생 결합 증권/getRedIsinInfo.xml
  79. 64 0
      Tests/Application.Tests/SeibroDivInfoParserTests.cs
  80. 59 0
      Tests/Application.Tests/SeibroDivSchedulParserTests.cs
  81. 89 0
      Tests/Application.Tests/SeibroDividendQueryHandlerTests.cs
  82. 110 0
      Tests/Application.Tests/SeibroDividendSyncTests.cs
  83. 18 0
      Tests/Application.Tests/SeibroFixtures.cs
  84. 39 0
      Tests/Application.Tests/SeibroIssucoCustnoParserTests.cs
  85. 138 0
      Tests/Application.Tests/SeibroIssuerSyncTests.cs
  86. 66 0
      Tests/Application.Tests/SeibroQuotaTests.cs
  87. 107 0
      Tests/Application.Tests/SeibroRollingSweepTests.cs
  88. 50 0
      Tests/Application.Tests/SeibroShotnByMartParserTests.cs
  89. 52 0
      Tests/Application.Tests/SeibroStddtParserTests.cs
  90. 49 0
      Tests/Application.Tests/SeibroStkStatParserTests.cs
  91. 128 0
      Tests/Application.Tests/SeibroXmlTests.cs
  92. 30 0
      Web.Api/Endpoints/Market/DividendCalendar.cs
  93. 29 0
      Web.Api/Endpoints/Stocks/Dividends.cs

+ 8 - 0
Application/Abstractions/Data/IAppDbContext.cs

@@ -7,6 +7,7 @@ using Domain.Entities.Page.Banner;
 using Domain.Entities.Members.Logs;
 using Domain.Entities.Wallets;
 using Domain.Entities.Forum.Boards;
+using Domain.Entities.Forum.Briefings;
 using Domain.Entities.Forum.Posts;
 using Domain.Entities.Forum.Comments;
 using Domain.Entities.Director;
@@ -127,6 +128,9 @@ public interface IAppDbContext : IAsyncDisposable
     DbSet<FeedPostMedia> FeedPostMedia { get; set; }
     DbSet<FeedPostMention> FeedPostMention { get; set; }
 
+    // 장전 브리핑 발행 기록 (d2 M3)
+    DbSet<DailyBriefing> DailyBriefing { get; set; }
+
     // 쪽지
     DbSet<Note> Note { get; set; }
 
@@ -181,6 +185,10 @@ public interface IAppDbContext : IAsyncDisposable
     DbSet<InterestRate> InterestRate { get; set; }
     DbSet<MarketHoliday> MarketHoliday { get; set; }
     DbSet<StockBoardStats> StockBoardStats { get; set; }
+    DbSet<SeibroIssuerCode> SeibroIssuerCode { get; set; }
+    DbSet<DividendSchedule> DividendSchedule { get; set; }
+    DbSet<Dividend> Dividend { get; set; }
+    DbSet<RightsBaseDate> RightsBaseDate { get; set; }
 
     // 채팅 (Chat — 개미투자 D2)
     DbSet<ChatRoomConfig> ChatRoomConfig { get; set; }

+ 55 - 0
Application/Features/Api/Stocks/GetDividendCalendar/Handler.cs

@@ -0,0 +1,55 @@
+using Application.Abstractions.Data;
+using Application.Abstractions.Messaging;
+using Microsoft.EntityFrameworkCore;
+using SharedKernel.Results;
+
+namespace Application.Features.Api.Stocks.GetDividendCalendar;
+
+internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
+{
+    private const ushort MaxPerPage = 200;
+
+    public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
+    {
+        var page = request.Page < 1 ? 1 : request.Page;
+        var perPage = request.PerPage is 0 or > MaxPerPage ? (ushort)30 : request.PerPage;
+
+        var query = db.DividendSchedule.AsNoTracking();
+
+        if (request.From.HasValue)
+        {
+            query = query.Where(c => c.RgtStdDt >= request.From.Value);
+        }
+
+        if (request.To.HasValue)
+        {
+            query = query.Where(c => c.RgtStdDt <= request.To.Value);
+        }
+
+        var total = await query.CountAsync(ct);
+
+        var list = await query
+            .OrderByDescending(c => c.RgtStdDt)
+            .ThenBy(c => c.IssucoCustno)
+            .ThenBy(c => c.RgtRsnDetailSortCd)
+            .Skip((page - 1) * perPage)
+            .Take(perPage)
+            .Select(c => new Response.Row
+            {
+                IssucoCustno = c.IssucoCustno,
+                Name = c.RepSecnNm,
+                RgtStdDt = c.RgtStdDt,
+                XrgtDt = c.XrgtDt,
+                SortCode = c.RgtRsnDetailSortCd,
+                FixType = c.FixTpcd,
+                SettleType = c.SetaccTpcd
+            })
+            .ToListAsync(ct);
+
+        return new Response
+        {
+            Total = total,
+            List = list
+        };
+    }
+}

+ 12 - 0
Application/Features/Api/Stocks/GetDividendCalendar/Query.cs

@@ -0,0 +1,12 @@
+using Application.Abstractions.Messaging;
+using SharedKernel.Results;
+
+namespace Application.Features.Api.Stocks.GetDividendCalendar;
+
+/// <summary>기간(권리기준일 from~to) 배당 일정 목록 — DividendSchedule 기반. from/to 미지정 시 기본 범위 없이 최신순.</summary>
+public sealed record Query(
+    DateOnly? From,
+    DateOnly? To,
+    int Page,
+    ushort PerPage
+) : IQuery<Result<Response>>;

+ 28 - 0
Application/Features/Api/Stocks/GetDividendCalendar/Response.cs

@@ -0,0 +1,28 @@
+namespace Application.Features.Api.Stocks.GetDividendCalendar;
+
+public sealed class Response
+{
+    public int Total { get; init; }
+    public required IReadOnlyList<Row> List { get; init; }
+
+    public sealed class Row
+    {
+        public int IssucoCustno { get; init; }
+        public required string Name { get; init; }
+
+        /// <summary>권리기준일 (RGT_STD_DT)</summary>
+        public DateOnly RgtStdDt { get; init; }
+
+        /// <summary>권리락일 (XRGT_DT)</summary>
+        public DateOnly? XrgtDt { get; init; }
+
+        /// <summary>배당 세부유형 (01주식 02현금 03동시 04무배당)</summary>
+        public required string SortCode { get; init; }
+
+        /// <summary>확정구분 (1확정 2예고 3미정)</summary>
+        public string? FixType { get; init; }
+
+        /// <summary>결산구분 (1결산 2반기 3분기)</summary>
+        public string? SettleType { get; init; }
+    }
+}

+ 97 - 0
Application/Features/Api/Stocks/GetStockDividends/Handler.cs

@@ -0,0 +1,97 @@
+using Application.Abstractions.Data;
+using Application.Abstractions.Messaging;
+using Microsoft.EntityFrameworkCore;
+using SharedKernel.Results;
+
+namespace Application.Features.Api.Stocks.GetStockDividends;
+
+internal sealed class Handler(IAppDbContext db) : IQueryHandler<Query, Result<Response>>
+{
+    private const ushort MaxPerPage = 200;
+
+    public async Task<Result<Response>> Handle(Query request, CancellationToken ct)
+    {
+        var input = request.CodeOrIsin?.Trim();
+        if (string.IsNullOrEmpty(input))
+        {
+            return Result.Failure<Response>(Error.Problem("Stock.CodeRequired", "종목 코드가 필요합니다."));
+        }
+
+        // 단축코드(6자리) 우선 → Stock 조인으로 ISIN·IssucoCustno 확보. 미매칭이면 입력을 ISIN 으로 간주.
+        var stock = await db.Stock.AsNoTracking()
+            .Where(c => c.Code == input || c.ISIN == input)
+            .Select(c => new { c.ISIN, c.IssucoCustno })
+            .FirstOrDefaultAsync(ct);
+
+        var isin = stock?.ISIN ?? input;
+        var issucoCustno = stock?.IssucoCustno;
+
+        var page = request.Page < 1 ? 1 : request.Page;
+        var perPage = request.PerPage is 0 or > MaxPerPage ? (ushort)30 : request.PerPage;
+
+        var query = db.Dividend.AsNoTracking().Where(c => c.Isin == isin);
+        var total = await query.CountAsync(ct);
+
+        var dividends = await query
+            .OrderByDescending(c => c.RgtStdDt)
+            .Skip((page - 1) * perPage)
+            .Take(perPage)
+            .Select(c => new
+            {
+                c.RgtStdDt,
+                c.KorSecnNm,
+                c.SecnKacdNm,
+                c.Pval,
+                c.CashAllocAmt,
+                c.StkAllocRatio,
+                c.MartpDivRate,
+                c.Th1PayTermBeginDt
+            })
+            .ToListAsync(ct);
+
+        // 권리락일·확정구분 결합 — DividendSchedule (IssucoCustno + 페이지 내 RgtStdDt). 세부유형별 여러 행이면 권리락일 있는 행 우선.
+        var scheduleByDate = new Dictionary<DateOnly, (DateOnly? XrgtDt, string? FixType)>();
+
+        if (issucoCustno is not null && dividends.Count > 0)
+        {
+            var dates = dividends.Select(c => c.RgtStdDt).Distinct().ToList();
+            var schedules = await db.DividendSchedule.AsNoTracking()
+                .Where(c => c.IssucoCustno == issucoCustno.Value && dates.Contains(c.RgtStdDt))
+                .Select(c => new { c.RgtStdDt, c.XrgtDt, c.FixTpcd })
+                .ToListAsync(ct);
+
+            foreach (var s in schedules)
+            {
+                if (!scheduleByDate.TryGetValue(s.RgtStdDt, out var existing) || (existing.XrgtDt is null && s.XrgtDt is not null))
+                {
+                    scheduleByDate[s.RgtStdDt] = (s.XrgtDt, s.FixTpcd);
+                }
+            }
+        }
+
+        var list = dividends.Select(c =>
+        {
+            scheduleByDate.TryGetValue(c.RgtStdDt, out var sched);
+            return new Response.Row
+            {
+                RgtStdDt = c.RgtStdDt,
+                Name = c.KorSecnNm,
+                SecurityKind = c.SecnKacdNm,
+                FaceValue = c.Pval,
+                CashPerShare = c.CashAllocAmt,
+                StockAllocRatio = c.StkAllocRatio,
+                MarketDividendRate = c.MartpDivRate,
+                CashPayDate = c.Th1PayTermBeginDt,
+                XrgtDt = sched.XrgtDt,
+                FixType = sched.FixType
+            };
+        }).ToList();
+
+        return new Response
+        {
+            Isin = isin,
+            Total = total,
+            List = list
+        };
+    }
+}

+ 11 - 0
Application/Features/Api/Stocks/GetStockDividends/Query.cs

@@ -0,0 +1,11 @@
+using Application.Abstractions.Messaging;
+using SharedKernel.Results;
+
+namespace Application.Features.Api.Stocks.GetStockDividends;
+
+/// <summary>종목(단축코드 or ISIN) 배당 이력 — Dividend 를 Isin 으로, DividendSchedule 의 권리락일·확정구분 결합. 종목 상세 배당탭용.</summary>
+public sealed record Query(
+    string CodeOrIsin,
+    int Page,
+    ushort PerPage
+) : IQuery<Result<Response>>;

+ 36 - 0
Application/Features/Api/Stocks/GetStockDividends/Response.cs

@@ -0,0 +1,36 @@
+namespace Application.Features.Api.Stocks.GetStockDividends;
+
+public sealed class Response
+{
+    public required string Isin { get; init; }
+    public int Total { get; init; }
+    public required IReadOnlyList<Row> List { get; init; }
+
+    public sealed class Row
+    {
+        public DateOnly RgtStdDt { get; init; }
+        public required string Name { get; init; }
+        public string? SecurityKind { get; init; }
+
+        /// <summary>액면가 (PVAL)</summary>
+        public decimal? FaceValue { get; init; }
+
+        /// <summary>1주당 현금배당금 (CASH_ALOC_AMT)</summary>
+        public decimal? CashPerShare { get; init; }
+
+        /// <summary>주식배정비율 (STK_ALOC_RATIO)</summary>
+        public decimal? StockAllocRatio { get; init; }
+
+        /// <summary>시가배당율 % (MARTP_DIV_RATE)</summary>
+        public decimal? MarketDividendRate { get; init; }
+
+        /// <summary>배당지급일 (현금 1차, TH1_PAY_TERM_BEGIN_DT)</summary>
+        public DateOnly? CashPayDate { get; init; }
+
+        /// <summary>권리락일 (DividendSchedule.XRGT_DT 결합, 없으면 null)</summary>
+        public DateOnly? XrgtDt { get; init; }
+
+        /// <summary>확정구분 (DividendSchedule.FIX_TPCD 결합, 1확정 2예고 3미정)</summary>
+        public string? FixType { get; init; }
+    }
+}

+ 113 - 0
Application/Helpers/SeibroQuota.cs

@@ -0,0 +1,113 @@
+namespace Application.Helpers;
+
+/// <summary>SEIBro 일일 호출 한도의 관리 단위 — API 카테고리 (docs/SEIBro/readme.md §1, getXrcStk* 는 Stock 소속)</summary>
+public enum SeibroCategory
+{
+    Corp = 1,
+    Stock = 2,
+    Bond = 3,
+    Deriv = 4,
+    Foreign = 5
+}
+
+/// <summary>
+/// SEIBro 카테고리별 일일 호출 예산 트래커 (DI 싱글턴) — 같은 카테고리에 속한 여러 수집 배치가 하나의 카운터를 공유한다.
+/// KST 날짜가 바뀌면 카운터가 자동 리셋된다 (SEIBro 한도가 일 단위이므로).
+/// 예산 상한(dailyBudget)은 호출자가 설정(Seibro:*Budget)에서 주입한다 — 트래커는 소비량만 기억한다.
+/// ⚠️ in-memory 카운터라 프로세스 재시작 시 리셋되는 한계가 있다 — 예산이 실한도의 80% 라 재시작 후 재소비분은
+/// 20% 헤드룸이 흡수한다 (허용된 설계 트레이드오프, DB 카운터로의 승격은 운영 관찰 후 결정).
+/// </summary>
+public sealed class SeibroQuota
+{
+    private readonly Lock _lock = new();
+    private readonly Func<DateOnly> _todayKst;
+    private readonly Dictionary<SeibroCategory, int> _used = [];
+    private DateOnly _date;
+
+    public SeibroQuota() : this(TodayKst) { }
+
+    /// <summary>테스트용 — KST 오늘 날짜 공급자 주입 (날짜 롤오버 검증)</summary>
+    public SeibroQuota(Func<DateOnly> todayKstProvider)
+    {
+        _todayKst = todayKstProvider;
+        _date = _todayKst();
+    }
+
+    /// <summary>count 만큼 소비 시도 — 예산 내면 소비 후 true, 초과면 소비 없이 false. count 가 0 이하면 항상 true.</summary>
+    public bool TryConsume(SeibroCategory category, int count, int dailyBudget)
+    {
+        if (count <= 0)
+        {
+            return true;
+        }
+
+        lock (_lock)
+        {
+            RolloverIfNeeded();
+
+            var used = _used.GetValueOrDefault(category);
+            if (used + count > dailyBudget)
+            {
+                return false;
+            }
+
+            _used[category] = used + count;
+            return true;
+        }
+    }
+
+    /// <summary>오늘 남은 예산 (음수 없음) — rolling sweep 의 maxPerRun 산정용</summary>
+    public int Remaining(SeibroCategory category, int dailyBudget)
+    {
+        lock (_lock)
+        {
+            RolloverIfNeeded();
+            return Math.Max(0, dailyBudget - _used.GetValueOrDefault(category));
+        }
+    }
+
+    /// <summary>오늘 소비량 (로그·모니터링용)</summary>
+    public int Used(SeibroCategory category)
+    {
+        lock (_lock)
+        {
+            RolloverIfNeeded();
+            return _used.GetValueOrDefault(category);
+        }
+    }
+
+    private void RolloverIfNeeded()
+    {
+        var today = _todayKst();
+        if (today == _date)
+        {
+            return;
+        }
+
+        _date = today;
+        _used.Clear();
+    }
+
+    private static DateOnly TodayKst()
+    {
+        return DateOnly.FromDateTime(TimeZoneInfo.ConvertTimeFromUtc(DateTime.UtcNow, Kst));
+    }
+
+    // KST 는 DST 없음 — 시스템에 타임존 데이터가 없으면 고정 +9 fallback (DailyScheduledService 와 동일 규칙)
+    private static readonly TimeZoneInfo Kst = ResolveKst();
+
+    private static TimeZoneInfo ResolveKst()
+    {
+        if (TimeZoneInfo.TryFindSystemTimeZoneById("Asia/Seoul", out var tz))
+        {
+            return tz;
+        }
+
+        if (TimeZoneInfo.TryFindSystemTimeZoneById("Korea Standard Time", out tz))
+        {
+            return tz;
+        }
+
+        return TimeZoneInfo.CreateCustomTimeZone("KST", TimeSpan.FromHours(9), "KST", "KST");
+    }
+}

+ 55 - 0
Application/Helpers/SeibroRollingSweep.cs

@@ -0,0 +1,55 @@
+namespace Application.Helpers;
+
+/// <summary>
+/// SEIBro per-키 rolling 수집의 공용 오케스트레이션 (순수 로직, DB 비의존 — 테스트 가능). KrxBackfill 의 자매 헬퍼 —
+/// KrxBackfill 이 "날짜 스윕"(기간 파라미터, 전시장 반환)이라면 이쪽은 "키 스윕"(ISIN/발행회사번호별 개별 호출)이다:
+///   • 대상 = (키, 마지막 갱신시각) 목록. 미처리(LastUpdatedAt == null) 를 먼저, 그다음 오래된(stale) 순으로 처리한다
+///     → 여러 날에 걸친 실행으로 전체 유니버스가 자동 보강·순환 갱신된다 (resumable).
+///   • fetch 횟수가 maxPerRun 에 도달하면 즉시 멈춘다 → 하루 배치가 카테고리 quota(SeibroQuota) 상한 안에서 조금씩 채운다.
+///   • quota 보호를 위해 호출 사이에 delayMs 만큼 쉰다 (첫 호출 전에는 쉬지 않는다 — KrxBackfill 동일).
+///   • 동률(같은 LastUpdatedAt·둘 다 null)은 입력 순서를 보존한다 (stable sort).
+/// 반환값은 이번 실행에서 실제 fetch 한 키 수.
+/// </summary>
+public static class SeibroRollingSweep
+{
+    /// <param name="targets">대상 키 + 마지막 갱신시각 (null = 미처리 → 최우선)</param>
+    /// <param name="fetchAndUpsert">해당 키를 수집·upsert (부작용 담당)</param>
+    /// <param name="maxPerRun">이번 실행 최대 fetch 수 (quota 상한). 0 이하면 fetch 안 함</param>
+    /// <param name="delayMs">fetch 호출 사이 지연(ms). 0 이하면 지연 없음</param>
+    public static async Task<int> RunAsync<TKey>(
+        IReadOnlyList<(TKey Key, DateTime? LastUpdatedAt)> targets,
+        Func<TKey, CancellationToken, Task> fetchAndUpsert,
+        int maxPerRun,
+        int delayMs,
+        CancellationToken ct)
+    {
+        if (maxPerRun <= 0)
+        {
+            return 0;
+        }
+
+        // 미처리(null) 우선, 그다음 오래된 순 — OrderBy 는 stable 이라 동률은 입력 순서 유지
+        var ordered = targets.OrderBy(c => c.LastUpdatedAt.HasValue ? 1 : 0).ThenBy(c => c.LastUpdatedAt ?? DateTime.MinValue);
+        var fetched = 0;
+
+        foreach (var (key, _) in ordered)
+        {
+            ct.ThrowIfCancellationRequested();
+
+            if (fetched > 0 && delayMs > 0)
+            {
+                await Task.Delay(delayMs, ct);
+            }
+
+            await fetchAndUpsert(key, ct);
+            fetched++;
+
+            if (fetched >= maxPerRun)
+            {
+                break;
+            }
+        }
+
+        return fetched;
+    }
+}

+ 238 - 0
Domain/Entities/Stocks/Dividend.cs

@@ -0,0 +1,238 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace Domain.Entities.Stocks;
+
+/// <summary>
+/// SEIBro 배당분배금내역 (getDivInfo) — 종목별 배정비율·금액·시가배당율·차등배당 (Wave 1 ★P0).
+/// 자연키 UNIQUE (Isin, RgtStdDt) — 한 종목·권리기준일당 1행.
+/// ⚠️ getDivInfo 응답엔 ISSUCO_CUSTNO 가 없다(샘플 확인) — 종목 조인은 Isin 으로 Stock.ISIN 을 맞춘다.
+/// 소수 precision 은 스펙(NUMBER(30,20)/(23,18)) 을 SQL Server decimal 최대(38,x) 안에서 decimal(28,10) 로 안전 설정.
+/// </summary>
+public class Dividend
+{
+    [Key]
+    public int ID { get; private set; }
+
+    /// <summary>종목번호 (ISIN)</summary>
+    public string Isin { get; private set; } = default!;
+
+    /// <summary>한글종목명 (KOR_SECN_NM)</summary>
+    public string KorSecnNm { get; private set; } = default!;
+
+    /// <summary>종목종류 (SECN_KACD_NM) — 보통주/우선주/2우선주… 문자열</summary>
+    public string? SecnKacdNm { get; private set; }
+
+    /// <summary>권리기준일자 (RGT_STD_DT)</summary>
+    public DateOnly RgtStdDt { get; private set; }
+
+    /// <summary>액면가 (PVAL)</summary>
+    public decimal? Pval { get; private set; }
+
+    /// <summary>주식배정비율 (STK_ALOC_RATIO)</summary>
+    public decimal? StkAllocRatio { get; private set; }
+
+    /// <summary>현금배정비율 (CASH_ALOC_RATIO)</summary>
+    public decimal? CashAllocRatio { get; private set; }
+
+    /// <summary>현금배정금액 (CASH_ALOC_AMT) — 1주당 현금배당(원)</summary>
+    public decimal? CashAllocAmt { get; private set; }
+
+    /// <summary>시가배당율 (MARTP_DIV_RATE)</summary>
+    public decimal? MartpDivRate { get; private set; }
+
+    /// <summary>배당지급일(현금 1차지급시작일, TH1_PAY_TERM_BEGIN_DT)</summary>
+    public DateOnly? Th1PayTermBeginDt { get; private set; }
+
+    /// <summary>교부일자(주식, DELI_DT)</summary>
+    public DateOnly? DeliDt { get; private set; }
+
+    /// <summary>대주주기타차등배정여부 (MAJSHR_ETC_DIFF_ALOC_YN, Y/N) — 미제공 null</summary>
+    public bool? MajshrEtcDiffAllocYn { get; private set; }
+
+    /// <summary>자사주무배정여부 (TSTK_NOAGN_YN, Y/N) — 미제공 null</summary>
+    public bool? TstkNoagnYn { get; private set; }
+
+    /// <summary>현금차등배당금액 (CASH_DIFF_DIVIAMT_VAL)</summary>
+    public decimal? CashDiffDiviAmt { get; private set; }
+
+    /// <summary>현금차등배당율 (CASH_DIFF_DIVI_RATE)</summary>
+    public decimal? CashDiffDiviRate { get; private set; }
+
+    /// <summary>주식차등배당율 (STK_DIFF_DIVI_RATE)</summary>
+    public decimal? StkDiffDiviRate { get; private set; }
+
+    /// <summary>시가차등배당율 (MARTP_DIFF_DIVI_RATE)</summary>
+    public decimal? MartpDiffDiviRate { get; private set; }
+
+    public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
+
+    private Dividend() { }
+
+    public static Dividend Create(
+        string isin,
+        string korSecnNm,
+        string? secnKacdNm,
+        DateOnly rgtStdDt,
+        decimal? pval,
+        decimal? stkAllocRatio,
+        decimal? cashAllocRatio,
+        decimal? cashAllocAmt,
+        decimal? martpDivRate,
+        DateOnly? th1PayTermBeginDt,
+        DateOnly? deliDt,
+        bool? majshrEtcDiffAllocYn,
+        bool? tstkNoagnYn,
+        decimal? cashDiffDiviAmt,
+        decimal? cashDiffDiviRate,
+        decimal? stkDiffDiviRate,
+        decimal? martpDiffDiviRate)
+    {
+        if (string.IsNullOrWhiteSpace(isin))
+        {
+            throw new ArgumentException("isin required", nameof(isin));
+        }
+
+        if (string.IsNullOrWhiteSpace(korSecnNm))
+        {
+            throw new ArgumentException("korSecnNm required", nameof(korSecnNm));
+        }
+
+        return new Dividend
+        {
+            Isin = isin.Trim(),
+            KorSecnNm = korSecnNm.Trim(),
+            SecnKacdNm = string.IsNullOrWhiteSpace(secnKacdNm) ? null : secnKacdNm.Trim(),
+            RgtStdDt = rgtStdDt,
+            Pval = pval,
+            StkAllocRatio = stkAllocRatio,
+            CashAllocRatio = cashAllocRatio,
+            CashAllocAmt = cashAllocAmt,
+            MartpDivRate = martpDivRate,
+            Th1PayTermBeginDt = th1PayTermBeginDt,
+            DeliDt = deliDt,
+            MajshrEtcDiffAllocYn = majshrEtcDiffAllocYn,
+            TstkNoagnYn = tstkNoagnYn,
+            CashDiffDiviAmt = cashDiffDiviAmt,
+            CashDiffDiviRate = cashDiffDiviRate,
+            StkDiffDiviRate = stkDiffDiviRate,
+            MartpDiffDiviRate = martpDiffDiviRate
+        };
+    }
+
+    /// <summary>재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (무변경 upsert 는 no-op)</summary>
+    public void Update(
+        string korSecnNm,
+        string? secnKacdNm,
+        decimal? pval,
+        decimal? stkAllocRatio,
+        decimal? cashAllocRatio,
+        decimal? cashAllocAmt,
+        decimal? martpDivRate,
+        DateOnly? th1PayTermBeginDt,
+        DateOnly? deliDt,
+        bool? majshrEtcDiffAllocYn,
+        bool? tstkNoagnYn,
+        decimal? cashDiffDiviAmt,
+        decimal? cashDiffDiviRate,
+        decimal? stkDiffDiviRate,
+        decimal? martpDiffDiviRate)
+    {
+        var changed = false;
+
+        if (!string.IsNullOrWhiteSpace(korSecnNm) && KorSecnNm != korSecnNm.Trim())
+        {
+            KorSecnNm = korSecnNm.Trim();
+            changed = true;
+        }
+
+        var normalizedSecnKacdNm = string.IsNullOrWhiteSpace(secnKacdNm) ? null : secnKacdNm.Trim();
+        if (SecnKacdNm != normalizedSecnKacdNm)
+        {
+            SecnKacdNm = normalizedSecnKacdNm;
+            changed = true;
+        }
+
+        if (Pval != pval)
+        {
+            Pval = pval;
+            changed = true;
+        }
+
+        if (StkAllocRatio != stkAllocRatio)
+        {
+            StkAllocRatio = stkAllocRatio;
+            changed = true;
+        }
+
+        if (CashAllocRatio != cashAllocRatio)
+        {
+            CashAllocRatio = cashAllocRatio;
+            changed = true;
+        }
+
+        if (CashAllocAmt != cashAllocAmt)
+        {
+            CashAllocAmt = cashAllocAmt;
+            changed = true;
+        }
+
+        if (MartpDivRate != martpDivRate)
+        {
+            MartpDivRate = martpDivRate;
+            changed = true;
+        }
+
+        if (Th1PayTermBeginDt != th1PayTermBeginDt)
+        {
+            Th1PayTermBeginDt = th1PayTermBeginDt;
+            changed = true;
+        }
+
+        if (DeliDt != deliDt)
+        {
+            DeliDt = deliDt;
+            changed = true;
+        }
+
+        if (MajshrEtcDiffAllocYn != majshrEtcDiffAllocYn)
+        {
+            MajshrEtcDiffAllocYn = majshrEtcDiffAllocYn;
+            changed = true;
+        }
+
+        if (TstkNoagnYn != tstkNoagnYn)
+        {
+            TstkNoagnYn = tstkNoagnYn;
+            changed = true;
+        }
+
+        if (CashDiffDiviAmt != cashDiffDiviAmt)
+        {
+            CashDiffDiviAmt = cashDiffDiviAmt;
+            changed = true;
+        }
+
+        if (CashDiffDiviRate != cashDiffDiviRate)
+        {
+            CashDiffDiviRate = cashDiffDiviRate;
+            changed = true;
+        }
+
+        if (StkDiffDiviRate != stkDiffDiviRate)
+        {
+            StkDiffDiviRate = stkDiffDiviRate;
+            changed = true;
+        }
+
+        if (MartpDiffDiviRate != martpDiffDiviRate)
+        {
+            MartpDiffDiviRate = martpDiffDiviRate;
+            changed = true;
+        }
+
+        if (changed)
+        {
+            UpdatedAt = DateTime.UtcNow;
+        }
+    }
+}

+ 173 - 0
Domain/Entities/Stocks/DividendSchedule.cs

@@ -0,0 +1,173 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace Domain.Entities.Stocks;
+
+/// <summary>
+/// SEIBro 배당일정 (getDivSchedulInfo) — 현금/주식/동시/무배당 일정·명부폐쇄·권리락일 (Wave 1 ★P0).
+/// 자연키 UNIQUE (IssucoCustno, RgtStdDt, RgtRsnDetailSortCd) — 한 회사·기준일에 배당 세부유형이 여럿(주식+현금 동시 등) 존재할 수 있다.
+/// 날짜 스윕(getDivSchedulInfo, custno 미지정 → 그날 전체 회사)으로 수집한다.
+/// </summary>
+public class DividendSchedule
+{
+    [Key]
+    public int ID { get; private set; }
+
+    /// <summary>발행회사 고객번호 (ISSUCO_CUSTNO)</summary>
+    public int IssucoCustno { get; private set; }
+
+    /// <summary>대표종목명 (REP_SECN_NM)</summary>
+    public string RepSecnNm { get; private set; } = default!;
+
+    /// <summary>권리사유코드 (RGT_RACD) — 103 배당/분배</summary>
+    public string? RgtRacd { get; private set; }
+
+    /// <summary>권리사유세부유형코드 (RGT_RSN_DTAIL_SORT_CD) — 01주식 02현금 03동시 04무배당</summary>
+    public string RgtRsnDetailSortCd { get; private set; } = default!;
+
+    /// <summary>권리기준일자 (RGT_STD_DT)</summary>
+    public DateOnly RgtStdDt { get; private set; }
+
+    /// <summary>배정방법코드 (ALOC_WHCD) — 1정율 2정액 3정율+정액</summary>
+    public string? AllocWhcd { get; private set; }
+
+    /// <summary>결산구분코드 (SETACC_TPCD) — 1결산 2반기 3분기</summary>
+    public string? SetaccTpcd { get; private set; }
+
+    /// <summary>확정구분코드 (FIX_TPCD) — 1확정 2예고 3미정</summary>
+    public string? FixTpcd { get; private set; }
+
+    /// <summary>명부폐쇄시작일자 (ROST_CLOSE_BEGIN_DT)</summary>
+    public DateOnly? RostCloseBeginDt { get; private set; }
+
+    /// <summary>명부폐쇄종료일자 (ROST_CLOSE_EXPRY_DT)</summary>
+    public DateOnly? RostCloseExpryDt { get; private set; }
+
+    /// <summary>권리락일자 (XRGT_DT)</summary>
+    public DateOnly? XrgtDt { get; private set; }
+
+    /// <summary>전자증권 여부 (ELTSC_YN, Y=전자/N=예탁) — 미제공 null</summary>
+    public bool? IsElectronicSecurity { get; private set; }
+
+    public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
+
+    private DividendSchedule() { }
+
+    public static DividendSchedule Create(
+        int issucoCustno,
+        string repSecnNm,
+        string? rgtRacd,
+        string rgtRsnDetailSortCd,
+        DateOnly rgtStdDt,
+        string? allocWhcd,
+        string? setaccTpcd,
+        string? fixTpcd,
+        DateOnly? rostCloseBeginDt,
+        DateOnly? rostCloseExpryDt,
+        DateOnly? xrgtDt,
+        bool? isElectronicSecurity)
+    {
+        if (string.IsNullOrWhiteSpace(repSecnNm))
+        {
+            throw new ArgumentException("repSecnNm required", nameof(repSecnNm));
+        }
+
+        if (string.IsNullOrWhiteSpace(rgtRsnDetailSortCd))
+        {
+            throw new ArgumentException("rgtRsnDetailSortCd required", nameof(rgtRsnDetailSortCd));
+        }
+
+        return new DividendSchedule
+        {
+            IssucoCustno = issucoCustno,
+            RepSecnNm = repSecnNm.Trim(),
+            RgtRacd = string.IsNullOrWhiteSpace(rgtRacd) ? null : rgtRacd.Trim(),
+            RgtRsnDetailSortCd = rgtRsnDetailSortCd.Trim(),
+            RgtStdDt = rgtStdDt,
+            AllocWhcd = string.IsNullOrWhiteSpace(allocWhcd) ? null : allocWhcd.Trim(),
+            SetaccTpcd = string.IsNullOrWhiteSpace(setaccTpcd) ? null : setaccTpcd.Trim(),
+            FixTpcd = string.IsNullOrWhiteSpace(fixTpcd) ? null : fixTpcd.Trim(),
+            RostCloseBeginDt = rostCloseBeginDt,
+            RostCloseExpryDt = rostCloseExpryDt,
+            XrgtDt = xrgtDt,
+            IsElectronicSecurity = isElectronicSecurity
+        };
+    }
+
+    /// <summary>재수집 반영 — 변경 필드가 있을 때만 UpdatedAt 갱신 (무변경 upsert 는 no-op)</summary>
+    public void Update(
+        string repSecnNm,
+        string? rgtRacd,
+        string? allocWhcd,
+        string? setaccTpcd,
+        string? fixTpcd,
+        DateOnly? rostCloseBeginDt,
+        DateOnly? rostCloseExpryDt,
+        DateOnly? xrgtDt,
+        bool? isElectronicSecurity)
+    {
+        var changed = false;
+
+        if (!string.IsNullOrWhiteSpace(repSecnNm) && RepSecnNm != repSecnNm.Trim())
+        {
+            RepSecnNm = repSecnNm.Trim();
+            changed = true;
+        }
+
+        var normalizedRacd = string.IsNullOrWhiteSpace(rgtRacd) ? null : rgtRacd.Trim();
+        if (RgtRacd != normalizedRacd)
+        {
+            RgtRacd = normalizedRacd;
+            changed = true;
+        }
+
+        var normalizedAllocWhcd = string.IsNullOrWhiteSpace(allocWhcd) ? null : allocWhcd.Trim();
+        if (AllocWhcd != normalizedAllocWhcd)
+        {
+            AllocWhcd = normalizedAllocWhcd;
+            changed = true;
+        }
+
+        var normalizedSetaccTpcd = string.IsNullOrWhiteSpace(setaccTpcd) ? null : setaccTpcd.Trim();
+        if (SetaccTpcd != normalizedSetaccTpcd)
+        {
+            SetaccTpcd = normalizedSetaccTpcd;
+            changed = true;
+        }
+
+        var normalizedFixTpcd = string.IsNullOrWhiteSpace(fixTpcd) ? null : fixTpcd.Trim();
+        if (FixTpcd != normalizedFixTpcd)
+        {
+            FixTpcd = normalizedFixTpcd;
+            changed = true;
+        }
+
+        if (RostCloseBeginDt != rostCloseBeginDt)
+        {
+            RostCloseBeginDt = rostCloseBeginDt;
+            changed = true;
+        }
+
+        if (RostCloseExpryDt != rostCloseExpryDt)
+        {
+            RostCloseExpryDt = rostCloseExpryDt;
+            changed = true;
+        }
+
+        if (XrgtDt != xrgtDt)
+        {
+            XrgtDt = xrgtDt;
+            changed = true;
+        }
+
+        if (IsElectronicSecurity != isElectronicSecurity)
+        {
+            IsElectronicSecurity = isElectronicSecurity;
+            changed = true;
+        }
+
+        if (changed)
+        {
+            UpdatedAt = DateTime.UtcNow;
+        }
+    }
+}

+ 95 - 0
Domain/Entities/Stocks/RightsBaseDate.cs

@@ -0,0 +1,95 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace Domain.Entities.Stocks;
+
+/// <summary>
+/// SEIBro 권리기준일 (getStddtInfo) — 발행회사별 권리 발생 기준일·사유 (Wave 1).
+/// 자연키 UNIQUE (IssucoCustno, RgtStdDt, RgtRacd, RgtRsnDetailSortCd).
+/// Wave 3(총회·상호변경·단주 등)의 이벤트 발견 소스 — RGT_RACD 로 후속 기업행위 API 호출 대상을 판별한다.
+/// (예: 001/002/003/009 → 총회, 204 → 상호변경)
+/// </summary>
+public class RightsBaseDate
+{
+    [Key]
+    public int ID { get; private set; }
+
+    /// <summary>발행회사 고객번호 (ISSUCO_CUSTNO)</summary>
+    public int IssucoCustno { get; private set; }
+
+    /// <summary>대표종목명 (REP_SECN_NM)</summary>
+    public string RepSecnNm { get; private set; } = default!;
+
+    /// <summary>권리기준일자 (RGT_STD_DT)</summary>
+    public DateOnly RgtStdDt { get; private set; }
+
+    /// <summary>권리사유코드 (RGT_RACD) — 001정기총회 … 907이익소각</summary>
+    public string RgtRacd { get; private set; } = default!;
+
+    /// <summary>권리사유명 (RGT_RACD_NM)</summary>
+    public string? RgtRacdNm { get; private set; }
+
+    /// <summary>권리사유세부유형코드 (RGT_RSN_DTAIL_SORT_CD)</summary>
+    public string RgtRsnDetailSortCd { get; private set; } = default!;
+
+    public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
+
+    private RightsBaseDate() { }
+
+    public static RightsBaseDate Create(
+        int issucoCustno,
+        string repSecnNm,
+        DateOnly rgtStdDt,
+        string rgtRacd,
+        string? rgtRacdNm,
+        string rgtRsnDetailSortCd)
+    {
+        if (string.IsNullOrWhiteSpace(repSecnNm))
+        {
+            throw new ArgumentException("repSecnNm required", nameof(repSecnNm));
+        }
+
+        if (string.IsNullOrWhiteSpace(rgtRacd))
+        {
+            throw new ArgumentException("rgtRacd required", nameof(rgtRacd));
+        }
+
+        if (string.IsNullOrWhiteSpace(rgtRsnDetailSortCd))
+        {
+            throw new ArgumentException("rgtRsnDetailSortCd required", nameof(rgtRsnDetailSortCd));
+        }
+
+        return new RightsBaseDate
+        {
+            IssucoCustno = issucoCustno,
+            RepSecnNm = repSecnNm.Trim(),
+            RgtStdDt = rgtStdDt,
+            RgtRacd = rgtRacd.Trim(),
+            RgtRacdNm = string.IsNullOrWhiteSpace(rgtRacdNm) ? null : rgtRacdNm.Trim(),
+            RgtRsnDetailSortCd = rgtRsnDetailSortCd.Trim()
+        };
+    }
+
+    /// <summary>재수집 반영 — 이름/사유명 변경 시에만 UpdatedAt 갱신 (자연키는 불변)</summary>
+    public void Update(string repSecnNm, string? rgtRacdNm)
+    {
+        var changed = false;
+
+        if (!string.IsNullOrWhiteSpace(repSecnNm) && RepSecnNm != repSecnNm.Trim())
+        {
+            RepSecnNm = repSecnNm.Trim();
+            changed = true;
+        }
+
+        var normalizedRacdNm = string.IsNullOrWhiteSpace(rgtRacdNm) ? null : rgtRacdNm.Trim();
+        if (RgtRacdNm != normalizedRacdNm)
+        {
+            RgtRacdNm = normalizedRacdNm;
+            changed = true;
+        }
+
+        if (changed)
+        {
+            UpdatedAt = DateTime.UtcNow;
+        }
+    }
+}

+ 81 - 0
Domain/Entities/Stocks/SeibroIssuerCode.cs

@@ -0,0 +1,81 @@
+using System.ComponentModel.DataAnnotations;
+
+namespace Domain.Entities.Stocks;
+
+/// <summary>
+/// SEIBro 시장별 단축코드 ↔ 발행회사번호 매핑 (getShotnByMart) — (Market, ShortCode) UNIQUE.
+/// ISSUCO_CUSTNO 는 SEIBro 기업정보 API 전체의 조인키라 Wave 0 에서 가장 먼저 구축한다.
+/// K-OTC(13)·기타(50) 등 KRX Stock 이 커버하지 않는 시장의 유일한 종목 마스터이기도 하다
+/// (KOSPI/KOSDAQ/KONEX 는 Stock.IssucoCustno 로도 스탬핑되지만 이 테이블이 원본 스냅샷).
+/// </summary>
+public class SeibroIssuerCode
+{
+    [Key]
+    public int ID { get; private set; }
+
+    /// <summary>시장구분 (MART_TPCD, char 2) — [11]유가 [12]코스닥 [13]K-OTC [14]코넥스 [50]기타</summary>
+    public string Market { get; private set; } = default!;
+
+    /// <summary>단축코드 (SHOTN_ISIN)</summary>
+    public string ShortCode { get; private set; } = default!;
+
+    /// <summary>종목명 (KOR_SECN_NM)</summary>
+    public string Name { get; private set; } = default!;
+
+    /// <summary>발행회사 고객번호 (ISSUCO_CUSTNO) — 예탁결제원 부여</summary>
+    public int IssucoCustno { get; private set; }
+
+    /// <summary>마지막 동기화 시각 (UTC)</summary>
+    public DateTime UpdatedAt { get; private set; } = DateTime.UtcNow;
+
+    private SeibroIssuerCode() { }
+
+    public static SeibroIssuerCode Create(string market, string shortCode, string name, int issucoCustno)
+    {
+        if (market is not { Length: 2 } || market.Any(c => !char.IsAsciiDigit(c)))
+        {
+            throw new ArgumentException("market must be 2 digits (MART_TPCD)", nameof(market));
+        }
+
+        if (string.IsNullOrWhiteSpace(shortCode) || shortCode.Trim().Length > 12)
+        {
+            throw new ArgumentException("shortCode required (max 12)", nameof(shortCode));
+        }
+
+        if (string.IsNullOrWhiteSpace(name))
+        {
+            throw new ArgumentException("name required", nameof(name));
+        }
+
+        return new SeibroIssuerCode
+        {
+            Market = market,
+            ShortCode = shortCode.Trim(),
+            Name = name.Trim(),
+            IssucoCustno = issucoCustno
+        };
+    }
+
+    /// <summary>재동기화 반영 — 이름/회사번호 변경 시에만 UpdatedAt 갱신 (무변경 upsert 는 no-op)</summary>
+    public void Update(string name, int issucoCustno)
+    {
+        var changed = false;
+
+        if (!string.IsNullOrWhiteSpace(name) && Name != name.Trim())
+        {
+            Name = name.Trim();
+            changed = true;
+        }
+
+        if (IssucoCustno != issucoCustno)
+        {
+            IssucoCustno = issucoCustno;
+            changed = true;
+        }
+
+        if (changed)
+        {
+            UpdatedAt = DateTime.UtcNow;
+        }
+    }
+}

+ 68 - 0
Domain/Entities/Stocks/Stock.cs

@@ -58,6 +58,21 @@ public class Stock
     /// <summary>시가총액 (denorm)</summary>
     public long? MarketCap { get; private set; }
 
+    /// <summary>SEIBro 발행회사 고객번호 (ISSUCO_CUSTNO) — 기업정보 API 전체의 조인키. 미매핑 null (getShotnByMart 스탬핑)</summary>
+    public int? IssucoCustno { get; private set; }
+
+    /// <summary>액면가 (SEIBro getStkStatInfo PVAL) — 미보강 null</summary>
+    public decimal? FaceValue { get; private set; }
+
+    /// <summary>1주당 의결권수 (SEIBro getStkStatInfo VOTRNO) — 미보강 null</summary>
+    public decimal? VotingRights { get; private set; }
+
+    /// <summary>전자증권 여부 (SEIBro getStkStatInfo ELTSC_YN, Y=전자/N=예탁) — 미보강 null</summary>
+    public bool? IsElectronicSecurity { get; private set; }
+
+    /// <summary>총발행주식수 (SEIBro getStkStatInfo TOTAL_STK_CNT) — 미보강 null</summary>
+    public long? TotalIssuedShares { get; private set; }
+
     public DateTime CreatedAt { get; private set; } = DateTime.UtcNow;
 
     public DateTime? UpdatedAt { get; private set; }
@@ -182,6 +197,59 @@ public class Stock
         UpdatedAt = DateTime.UtcNow;
     }
 
+    /// <summary>SEIBro 발행회사번호 스탬핑 (getShotnByMart Code=ShortCode 조인) — null 전달·동일 값이면 무변경</summary>
+    public void SetIssucoCustno(int? issucoCustno)
+    {
+        if (issucoCustno is null || IssucoCustno == issucoCustno)
+        {
+            return;
+        }
+
+        IssucoCustno = issucoCustno;
+        UpdatedAt = DateTime.UtcNow;
+    }
+
+    /// <summary>SEIBro 종목 정보(getStkStatInfo) 보강 — 액면가/의결권/총발행주식수/전자증권 여부(+발행회사번호). null 전달 필드는 미변경.</summary>
+    public void EnrichFromSeibro(int? issucoCustno, decimal? faceValue, decimal? votingRights, long? totalIssuedShares, bool? isElectronicSecurity)
+    {
+        var changed = false;
+
+        if (issucoCustno is not null && IssucoCustno != issucoCustno)
+        {
+            IssucoCustno = issucoCustno;
+            changed = true;
+        }
+
+        if (faceValue is not null && FaceValue != faceValue)
+        {
+            FaceValue = faceValue;
+            changed = true;
+        }
+
+        if (votingRights is not null && VotingRights != votingRights)
+        {
+            VotingRights = votingRights;
+            changed = true;
+        }
+
+        if (totalIssuedShares is not null && TotalIssuedShares != totalIssuedShares)
+        {
+            TotalIssuedShares = totalIssuedShares;
+            changed = true;
+        }
+
+        if (isElectronicSecurity is not null && IsElectronicSecurity != isElectronicSecurity)
+        {
+            IsElectronicSecurity = isElectronicSecurity;
+            changed = true;
+        }
+
+        if (changed)
+        {
+            UpdatedAt = DateTime.UtcNow;
+        }
+    }
+
     /// <summary>일별 시세 배치가 최근 시세 denorm 을 갱신. 과거 일자 재수집은 무시.</summary>
     public void UpdateLastPrice(DateOnly tradingDate, int closePrice, decimal changeRate, long? marketCap)
     {

+ 31 - 0
Infrastructure/DependencyInjection.cs

@@ -10,6 +10,7 @@ using Application.Abstractions.Messaging.Email;
 using Application.Abstractions.Notification;
 using Application.Abstractions.Payment;
 using Application.Abstractions.YouTube;
+using Application.Helpers;
 using Infrastructure.Authentication;
 using Infrastructure.Crypto;
 using Infrastructure.Payment;
@@ -273,6 +274,16 @@ public static class DependencyInjection
             client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
         });
 
+        // SEIBro OpenAPI(seibro.or.kr) 수집 클라이언트 — 인증은 URL query param key (요청 단위, SeibroHttp). 응답은 XML
+        services.AddHttpClient(SeibroHttp.ClientName, client =>
+        {
+            client.Timeout = TimeSpan.FromSeconds(30);
+            client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/xml"));
+        });
+
+        // SEIBro 카테고리별 일일 호출 예산 트래커 — 같은 카테고리 배치들이 하나의 카운터를 공유 (in-memory, KST 자정 롤오버)
+        services.AddSingleton(_ => new SeibroQuota());
+
         var stockData = configuration.GetSection("StockData").Get<AppSettings.StockDataSection>() ?? new AppSettings.StockDataSection();
 
         if (stockData.MasterSync)
@@ -357,6 +368,20 @@ public static class DependencyInjection
             services.AddHostedService<MacroDataSyncService>();
         }
 
+        // SEIBro 발행회사번호(조인키) 부트스트랩 + 종목 보강 (getShotnByMart/getStkStatInfo) — Seibro:IssuerSync 플래그 (기본 false). Seibro HttpClient + SeibroQuota 사용
+        var seibro = configuration.GetSection("Seibro").Get<AppSettings.SeibroSection>() ?? new AppSettings.SeibroSection();
+
+        if (seibro.IssuerSync)
+        {
+            services.AddHostedService<SeibroIssuerSyncService>();
+        }
+
+        // SEIBro 배당·권리 수집 (getDivSchedulInfo/getDivInfo/getStddtInfo) — Seibro:DividendSync 플래그 (기본 false). Corp 카테고리 예산 공유
+        if (seibro.DividendSync)
+        {
+            services.AddHostedService<SeibroDividendSyncService>();
+        }
+
         // 모의투자 체결·스냅샷 배치 (d4 M2) — BackgroundJobs:PaperFill 플래그 (기본 false). Web.Api 전용.
         var bg = configuration.GetSection("BackgroundJobs").Get<AppSettings.BackgroundJobsSection>() ?? new AppSettings.BackgroundJobsSection();
 
@@ -371,6 +396,12 @@ public static class DependencyInjection
             services.AddHostedService<PredictionSettlementService>();
         }
 
+        // 장전 브리핑 자동 발행 배치 (d2 M3) — BackgroundJobs:DailyBriefing 플래그 (기본 false, 07:30 KST). Web.Api 전용.
+        if (bg.DailyBriefing)
+        {
+            services.AddHostedService<DailyBriefingPublisher>();
+        }
+
         return services;
     }
 

+ 8 - 0
Infrastructure/Persistence/AppDbContext.cs

@@ -7,6 +7,7 @@ using Domain.Entities.Page.Banner;
 using Domain.Entities.Page.Faq;
 using Domain.Entities.Wallets;
 using Domain.Entities.Forum.Boards;
+using Domain.Entities.Forum.Briefings;
 using Domain.Entities.Forum.Posts;
 using Domain.Entities.Forum.Comments;
 using Domain.Entities.Director;
@@ -132,6 +133,9 @@ public sealed class AppDbContext : DbContext, IAppDbContext
     public DbSet<FeedPostMedia> FeedPostMedia { get; set; }
     public DbSet<FeedPostMention> FeedPostMention { get; set; }
 
+    // 장전 브리핑 발행 기록 (d2 M3)
+    public DbSet<DailyBriefing> DailyBriefing { get; set; }
+
     // 쪽지
     public DbSet<Note> Note { get; set; }
 
@@ -186,6 +190,10 @@ public sealed class AppDbContext : DbContext, IAppDbContext
     public DbSet<InterestRate> InterestRate { get; set; }
     public DbSet<MarketHoliday> MarketHoliday { get; set; }
     public DbSet<StockBoardStats> StockBoardStats { get; set; }
+    public DbSet<SeibroIssuerCode> SeibroIssuerCode { get; set; }
+    public DbSet<DividendSchedule> DividendSchedule { get; set; }
+    public DbSet<Dividend> Dividend { get; set; }
+    public DbSet<RightsBaseDate> RightsBaseDate { get; set; }
 
     // 채팅 (Chat — 개미투자 D2)
     public DbSet<ChatRoomConfig> ChatRoomConfig { get; set; }

+ 36 - 0
Infrastructure/Persistence/Configurations/Stocks/DividendConfiguration.cs

@@ -0,0 +1,36 @@
+using Domain.Entities.Stocks;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace Infrastructure.Persistence.Configurations.Stocks;
+
+public sealed class DividendConfiguration : IEntityTypeConfiguration<Dividend>
+{
+    public void Configure(EntityTypeBuilder<Dividend> builder)
+    {
+        builder.ToTable(nameof(Dividend), t => t.HasComment("SEIBro 배당분배금내역 (getDivInfo) — 종목별 배정비율·금액·시가배당율. Isin 으로 Stock 조인"));
+        builder.HasKey(x => x.ID);
+        builder.HasIndex(x => new { x.Isin, x.RgtStdDt }).IsUnique();
+        builder.HasIndex(x => x.RgtStdDt);
+
+        builder.Property(x => x.Isin).HasMaxLength(12).IsFixedLength().IsRequired().HasComment("종목번호 (ISIN)");
+        builder.Property(x => x.KorSecnNm).HasMaxLength(100).IsRequired().HasComment("한글종목명 (KOR_SECN_NM)");
+        builder.Property(x => x.SecnKacdNm).HasMaxLength(20).HasComment("종목종류 (SECN_KACD_NM) — 보통주/우선주…");
+        builder.Property(x => x.RgtStdDt).IsRequired().HasComment("권리기준일자 (RGT_STD_DT)");
+
+        // 스펙 NUMBER(30,20)/(23,18) — SQL Server decimal 최대(38,x) 안에서 decimal(28,10) 로 안전 설정
+        builder.Property(x => x.Pval).HasPrecision(28, 10).HasComment("액면가 (PVAL)");
+        builder.Property(x => x.StkAllocRatio).HasPrecision(28, 10).HasComment("주식배정비율 (STK_ALOC_RATIO)");
+        builder.Property(x => x.CashAllocRatio).HasPrecision(28, 10).HasComment("현금배정비율 (CASH_ALOC_RATIO)");
+        builder.Property(x => x.CashAllocAmt).HasPrecision(28, 10).HasComment("현금배정금액 (CASH_ALOC_AMT) — 1주당 현금배당");
+        builder.Property(x => x.MartpDivRate).HasPrecision(28, 10).HasComment("시가배당율 (MARTP_DIV_RATE)");
+        builder.Property(x => x.Th1PayTermBeginDt).HasComment("배당지급일(현금, TH1_PAY_TERM_BEGIN_DT)");
+        builder.Property(x => x.DeliDt).HasComment("교부일자(주식, DELI_DT)");
+        builder.Property(x => x.MajshrEtcDiffAllocYn).HasComment("대주주기타차등배정여부 (MAJSHR_ETC_DIFF_ALOC_YN)");
+        builder.Property(x => x.TstkNoagnYn).HasComment("자사주무배정여부 (TSTK_NOAGN_YN)");
+        builder.Property(x => x.CashDiffDiviAmt).HasPrecision(28, 10).HasComment("현금차등배당금액 (CASH_DIFF_DIVIAMT_VAL)");
+        builder.Property(x => x.CashDiffDiviRate).HasPrecision(28, 10).HasComment("현금차등배당율 (CASH_DIFF_DIVI_RATE)");
+        builder.Property(x => x.StkDiffDiviRate).HasPrecision(28, 10).HasComment("주식차등배당율 (STK_DIFF_DIVI_RATE)");
+        builder.Property(x => x.MartpDiffDiviRate).HasPrecision(28, 10).HasComment("시가차등배당율 (MARTP_DIFF_DIVI_RATE)");
+    }
+}

+ 30 - 0
Infrastructure/Persistence/Configurations/Stocks/DividendScheduleConfiguration.cs

@@ -0,0 +1,30 @@
+using Domain.Entities.Stocks;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace Infrastructure.Persistence.Configurations.Stocks;
+
+public sealed class DividendScheduleConfiguration : IEntityTypeConfiguration<DividendSchedule>
+{
+    public void Configure(EntityTypeBuilder<DividendSchedule> builder)
+    {
+        builder.ToTable(nameof(DividendSchedule), t => t.HasComment("SEIBro 배당일정 (getDivSchedulInfo) — 현금/주식/동시/무배당 일정·권리락일"));
+        builder.HasKey(x => x.ID);
+        builder.HasIndex(x => new { x.IssucoCustno, x.RgtStdDt, x.RgtRsnDetailSortCd }).IsUnique();
+        builder.HasIndex(x => x.RgtStdDt);
+        builder.HasIndex(x => x.XrgtDt);
+
+        builder.Property(x => x.IssucoCustno).IsRequired().HasComment("발행회사 고객번호 (ISSUCO_CUSTNO)");
+        builder.Property(x => x.RepSecnNm).HasMaxLength(100).IsRequired().HasComment("대표종목명 (REP_SECN_NM)");
+        builder.Property(x => x.RgtRacd).HasMaxLength(3).HasComment("권리사유코드 (RGT_RACD) — 103 배당/분배");
+        builder.Property(x => x.RgtRsnDetailSortCd).HasMaxLength(2).IsRequired().HasComment("권리사유세부유형코드 — 01주식 02현금 03동시 04무배당");
+        builder.Property(x => x.RgtStdDt).IsRequired().HasComment("권리기준일자 (RGT_STD_DT)");
+        builder.Property(x => x.AllocWhcd).HasMaxLength(1).HasComment("배정방법코드 (ALOC_WHCD)");
+        builder.Property(x => x.SetaccTpcd).HasMaxLength(1).HasComment("결산구분코드 (SETACC_TPCD)");
+        builder.Property(x => x.FixTpcd).HasMaxLength(1).HasComment("확정구분코드 (FIX_TPCD)");
+        builder.Property(x => x.RostCloseBeginDt).HasComment("명부폐쇄시작일자 (ROST_CLOSE_BEGIN_DT)");
+        builder.Property(x => x.RostCloseExpryDt).HasComment("명부폐쇄종료일자 (ROST_CLOSE_EXPRY_DT)");
+        builder.Property(x => x.XrgtDt).HasComment("권리락일자 (XRGT_DT)");
+        builder.Property(x => x.IsElectronicSecurity).HasComment("전자증권 여부 (ELTSC_YN)");
+    }
+}

+ 24 - 0
Infrastructure/Persistence/Configurations/Stocks/RightsBaseDateConfiguration.cs

@@ -0,0 +1,24 @@
+using Domain.Entities.Stocks;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace Infrastructure.Persistence.Configurations.Stocks;
+
+public sealed class RightsBaseDateConfiguration : IEntityTypeConfiguration<RightsBaseDate>
+{
+    public void Configure(EntityTypeBuilder<RightsBaseDate> builder)
+    {
+        builder.ToTable(nameof(RightsBaseDate), t => t.HasComment("SEIBro 권리기준일 (getStddtInfo) — Wave 3 기업행위 이벤트 발견 소스"));
+        builder.HasKey(x => x.ID);
+        builder.HasIndex(x => new { x.IssucoCustno, x.RgtStdDt, x.RgtRacd, x.RgtRsnDetailSortCd }).IsUnique();
+        builder.HasIndex(x => x.RgtStdDt);
+        builder.HasIndex(x => x.RgtRacd);
+
+        builder.Property(x => x.IssucoCustno).IsRequired().HasComment("발행회사 고객번호 (ISSUCO_CUSTNO)");
+        builder.Property(x => x.RepSecnNm).HasMaxLength(100).IsRequired().HasComment("대표종목명 (REP_SECN_NM)");
+        builder.Property(x => x.RgtStdDt).IsRequired().HasComment("권리기준일자 (RGT_STD_DT)");
+        builder.Property(x => x.RgtRacd).HasMaxLength(3).IsRequired().HasComment("권리사유코드 (RGT_RACD)");
+        builder.Property(x => x.RgtRacdNm).HasMaxLength(100).HasComment("권리사유명 (RGT_RACD_NM)");
+        builder.Property(x => x.RgtRsnDetailSortCd).HasMaxLength(2).IsRequired().HasComment("권리사유세부유형코드 (RGT_RSN_DTAIL_SORT_CD)");
+    }
+}

+ 21 - 0
Infrastructure/Persistence/Configurations/Stocks/SeibroIssuerCodeConfiguration.cs

@@ -0,0 +1,21 @@
+using Domain.Entities.Stocks;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Metadata.Builders;
+
+namespace Infrastructure.Persistence.Configurations.Stocks;
+
+public sealed class SeibroIssuerCodeConfiguration : IEntityTypeConfiguration<SeibroIssuerCode>
+{
+    public void Configure(EntityTypeBuilder<SeibroIssuerCode> builder)
+    {
+        builder.ToTable(nameof(SeibroIssuerCode), t => t.HasComment("SEIBro 시장별 단축코드↔발행회사번호 매핑 (getShotnByMart)"));
+        builder.HasKey(x => x.ID);
+        builder.HasIndex(x => new { x.Market, x.ShortCode }).IsUnique();
+        builder.HasIndex(x => x.IssucoCustno);
+
+        builder.Property(x => x.Market).HasMaxLength(2).IsFixedLength().IsRequired().HasComment("시장구분 (MART_TPCD) — 11유가/12코스닥/13K-OTC/14코넥스/50기타");
+        builder.Property(x => x.ShortCode).HasMaxLength(12).IsRequired().HasComment("단축코드 (SHOTN_ISIN)");
+        builder.Property(x => x.Name).HasMaxLength(100).IsRequired().HasComment("종목명 (KOR_SECN_NM)");
+        builder.Property(x => x.IssucoCustno).IsRequired().HasComment("발행회사 고객번호 (ISSUCO_CUSTNO)");
+    }
+}

+ 6 - 0
Infrastructure/Persistence/Configurations/Stocks/StockConfiguration.cs

@@ -13,6 +13,7 @@ public sealed class StockConfiguration : IEntityTypeConfiguration<Stock>
         builder.HasIndex(x => new { x.Market, x.IsActive });
         builder.HasIndex(x => x.Name);
         builder.HasIndex(x => x.CorpCode);
+        builder.HasIndex(x => x.IssucoCustno);
 
         builder.ToTable(nameof(Stock), t => t.HasComment("종목 마스터 (KRX 상장종목)"));
         builder.HasKey(x => x.ID);
@@ -25,5 +26,10 @@ public sealed class StockConfiguration : IEntityTypeConfiguration<Stock>
         builder.Property(x => x.CorpCode).HasMaxLength(8).IsFixedLength().HasComment("DART 고유번호");
         builder.Property(x => x.SectorName).HasMaxLength(100);
         builder.Property(x => x.LastChangeRate).HasPrecision(7, 2);
+        builder.Property(x => x.IssucoCustno).HasComment("SEIBro 발행회사 고객번호 (ISSUCO_CUSTNO) — 기업정보 API 조인키");
+        builder.Property(x => x.FaceValue).HasPrecision(15, 4).HasComment("액면가 (SEIBro PVAL)");
+        builder.Property(x => x.VotingRights).HasPrecision(5, 2).HasComment("1주당 의결권수 (SEIBro VOTRNO)");
+        builder.Property(x => x.IsElectronicSecurity).HasComment("전자증권 여부 (SEIBro ELTSC_YN)");
+        builder.Property(x => x.TotalIssuedShares).HasComment("총발행주식수 (SEIBro TOTAL_STK_CNT)");
     }
 }

+ 12490 - 0
Infrastructure/Persistence/Migrations/20260707093947_AddSeibroIssuerAndStockExtension.Designer.cs

@@ -0,0 +1,12490 @@
+// <auto-generated />
+using System;
+using Infrastructure.Persistence;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace Infrastructure.Migrations.AppDb
+{
+    [DbContext(typeof(AppDbContext))]
+    [Migration("20260707093947_AddSeibroIssuerAndStockExtension")]
+    partial class AddSeibroIssuerAndStockExtension
+    {
+        /// <inheritdoc />
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "10.0.7")
+                .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+            SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+            modelBuilder.Entity("Domain.Entities.Chat.ChatBan", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("CreatedBy")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("제재 등록자");
+
+                    b.Property<DateTime?>("ExpiresAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("제재 대상 회원 ID");
+
+                    b.Property<string>("Reason")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("제재 사유");
+
+                    b.Property<string>("RoomKey")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("제재 룸 키 (NULL=전체)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID", "ExpiresAt");
+
+                    b.ToTable("ChatBan", null, t =>
+                        {
+                            t.HasComment("채팅 제재 (RoomKey NULL=전체, ExpiresAt NULL=무기한)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Chat.ChatRoomConfig", b =>
+                {
+                    b.Property<string>("RoomKey")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("룸 키");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("활성 여부 (종목방 단계 오픈 게이트)");
+
+                    b.Property<string>("Notice")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("상단 고정 공지");
+
+                    b.Property<short>("SlowModeSeconds")
+                        .HasColumnType("smallint")
+                        .HasComment("슬로우 모드 (초)");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("RoomKey");
+
+                    b.ToTable("ChatRoomConfig", null, t =>
+                        {
+                            t.HasComment("채팅방 설정 (main | stock:{code})");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Common.Config", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("LastUpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 수정일시");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion")
+                        .HasComment("동시성 제어용");
+
+                    b.HasKey("ID");
+
+                    b.ToTable("Config", null, t =>
+                        {
+                            t.HasComment("운영 정보 설정 값");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Common.EmailLog", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<string>("Category")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("카테고리 (auth.register, forum.post.notify 등)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("datetime2")
+                        .HasDefaultValueSql("GETUTCDATE()")
+                        .HasComment("등록 시각 (UTC)");
+
+                    b.Property<DateTime?>("FailedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("실패 확정 시각 (UTC)");
+
+                    b.Property<string>("LastError")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("마지막 오류 메시지");
+
+                    b.Property<int>("MaxRetryCount")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(3)
+                        .HasComment("최대 재시도 횟수");
+
+                    b.Property<string>("MessageHtml")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("HTML 본문");
+
+                    b.Property<string>("MessageText")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("텍스트 본문 (선택)");
+
+                    b.Property<DateTime>("NextRetryAt")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("datetime2")
+                        .HasDefaultValueSql("GETUTCDATE()")
+                        .HasComment("다음 시도 시각 (UTC)");
+
+                    b.Property<DateTime?>("ProcessedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("처리 완료 시각 (UTC)");
+
+                    b.Property<int>("RetryCount")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(0)
+                        .HasComment("재시도 횟수");
+
+                    b.Property<byte>("Status")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("tinyint")
+                        .HasDefaultValue((byte)0)
+                        .HasComment("상태 (0=Pending, 1=Processing, 2=Sent, 3=Failed)");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("제목");
+
+                    b.Property<string>("ToAddress")
+                        .IsRequired()
+                        .HasMaxLength(256)
+                        .HasColumnType("nvarchar(256)")
+                        .HasComment("수신자 이메일");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt")
+                        .HasDatabaseName("IX_EmailLog_CreatedAt");
+
+                    b.HasIndex("Status", "NextRetryAt")
+                        .HasDatabaseName("IX_EmailLog_Status_NextRetryAt");
+
+                    b.ToTable("EmailLog", null, t =>
+                        {
+                            t.HasComment("이메일 발송 큐");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Director.AdminAccessLog", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("생성 일시");
+
+                    b.Property<long>("ElapsedMs")
+                        .HasColumnType("bigint")
+                        .HasComment("처리 시간 (밀리초)");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP 주소");
+
+                    b.Property<string>("MenuName")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("메뉴 이름");
+
+                    b.Property<string>("Method")
+                        .IsRequired()
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)")
+                        .HasComment("HTTP Method");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasMaxLength(2048)
+                        .HasColumnType("nvarchar(2048)")
+                        .HasComment("요청 경로");
+
+                    b.Property<string>("QueryString")
+                        .HasMaxLength(2048)
+                        .HasColumnType("nvarchar(2048)")
+                        .HasComment("쿼리 스트링");
+
+                    b.Property<int>("StatusCode")
+                        .HasColumnType("int")
+                        .HasComment("응답 상태 코드");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.Property<string>("UserID")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)")
+                        .HasComment("관리자 사용자 ID");
+
+                    b.Property<string>("UserName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("관리자 사용자 이름");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("UserID");
+
+                    b.ToTable("AdminAccessLog", null, t =>
+                        {
+                            t.HasComment("관리자 접근 기록");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Director.AdminLoginLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Account")
+                        .IsRequired()
+                        .HasMaxLength(120)
+                        .HasColumnType("nvarchar(120)")
+                        .HasComment("로그인 시도 계정");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("생성 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP 주소");
+
+                    b.Property<string>("Reason")
+                        .HasMaxLength(225)
+                        .HasColumnType("nvarchar(225)")
+                        .HasComment("실패 사유");
+
+                    b.Property<bool>("Success")
+                        .HasColumnType("bit")
+                        .HasComment("로그인 성공 여부");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Account");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.ToTable("AdminLoginLog", null, t =>
+                        {
+                            t.HasComment("관리자 로그인 기록");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.EmailVerification.EmailVerifyNumber", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)")
+                        .HasComment("Code");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasMaxLength(60)
+                        .HasColumnType("nvarchar(60)")
+                        .HasComment("이메일");
+
+                    b.Property<DateTime>("Expiration")
+                        .HasColumnType("datetime2")
+                        .HasComment("만료 일시");
+
+                    b.Property<bool>("IsVerified")
+                        .HasColumnType("bit")
+                        .HasComment("인증 여부");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int")
+                        .HasComment("인증 유형 (이메일 인증 / 비밀번호 재설정)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code");
+
+                    b.HasIndex("Email");
+
+                    b.HasIndex("Expiration");
+
+                    b.HasIndex("IsVerified");
+
+                    b.HasIndex("Type");
+
+                    b.HasIndex("Type", "Code");
+
+                    b.HasIndex("Type", "Code", "IsVerified");
+
+                    b.ToTable("EmailVerifyNumber", null, t =>
+                        {
+                            t.HasComment("이메일 인증 번호들");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.EmailVerification.EmailVerifyToken", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Additional")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("추가 정보(JSON)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasMaxLength(60)
+                        .HasColumnType("nvarchar(60)")
+                        .HasComment("이메일");
+
+                    b.Property<DateTime>("Expiration")
+                        .HasColumnType("datetime2")
+                        .HasComment("만료 일시");
+
+                    b.Property<bool>("IsVerified")
+                        .HasColumnType("bit")
+                        .HasComment("인증 여부");
+
+                    b.Property<string>("Token")
+                        .IsRequired()
+                        .HasMaxLength(256)
+                        .HasColumnType("nvarchar(256)")
+                        .HasComment("Token");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int")
+                        .HasComment("인증 유형 (이메일 인증 / 비밀번호 재설정)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Email");
+
+                    b.HasIndex("Expiration");
+
+                    b.HasIndex("IsVerified");
+
+                    b.HasIndex("Token");
+
+                    b.HasIndex("Type");
+
+                    b.HasIndex("Type", "Email", "Token");
+
+                    b.HasIndex("Type", "Email", "Token", "IsVerified");
+
+                    b.ToTable("EmailVerifyToken", null, t =>
+                        {
+                            t.HasComment("이메일 인증 토큰들");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedBookmark", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("FeedPostID", "MemberID")
+                        .IsUnique();
+
+                    b.HasIndex("MemberID", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("FeedBookmark", null, t =>
+                        {
+                            t.HasComment("피드 포스트 북마크");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedComment", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Content")
+                        .IsRequired()
+                        .HasMaxLength(2000)
+                        .HasColumnType("nvarchar(2000)")
+                        .HasComment("댓글 내용");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<DateTime?>("DeletedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("삭제 일시");
+
+                    b.Property<short>("Depth")
+                        .HasColumnType("smallint")
+                        .HasComment("중첩 깊이 (0 = 루트)");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int")
+                        .HasComment("FeedPost ID");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("삭제 여부");
+
+                    b.Property<int>("Likes")
+                        .HasColumnType("int")
+                        .HasComment("좋아요 수");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("작성 회원 ID");
+
+                    b.Property<int?>("ParentID")
+                        .HasColumnType("int")
+                        .HasComment("부모 댓글 ID (대댓글용)");
+
+                    b.Property<int>("Replies")
+                        .HasColumnType("int")
+                        .HasComment("자식 댓글 수");
+
+                    b.Property<int>("Reports")
+                        .HasColumnType("int")
+                        .HasComment("신고 수");
+
+                    b.Property<int>("Score")
+                        .HasColumnType("int")
+                        .HasComment("랭킹 스코어");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("ParentID");
+
+                    b.HasIndex("FeedPostID", "IsDeleted", "ParentID", "CreatedAt")
+                        .IsDescending(false, false, false, true);
+
+                    b.HasIndex("FeedPostID", "IsDeleted", "ParentID", "Score", "ID")
+                        .IsDescending(false, false, false, true, true);
+
+                    b.HasIndex("FeedPostID", "MemberID", "IsDeleted", "ParentID", "CreatedAt")
+                        .IsDescending(false, false, false, false, true);
+
+                    b.ToTable("FeedComment", null, t =>
+                        {
+                            t.HasComment("피드 댓글 (Reddit식 계층형)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedCommentLike", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FeedCommentID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedCommentID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("FeedCommentID", "MemberID")
+                        .IsUnique();
+
+                    b.ToTable("FeedCommentLike", null, t =>
+                        {
+                            t.HasComment("피드 댓글 좋아요");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedLike", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("FeedPostID", "MemberID")
+                        .IsUnique();
+
+                    b.ToTable("FeedLike", null, t =>
+                        {
+                            t.HasComment("피드 포스트 좋아요");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPost", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("Bookmarks")
+                        .HasColumnType("int")
+                        .HasComment("북마크 수");
+
+                    b.Property<int>("Comments")
+                        .HasColumnType("int")
+                        .HasComment("댓글 수");
+
+                    b.Property<string>("Content")
+                        .IsRequired()
+                        .HasMaxLength(5000)
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("본문");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<DateTime?>("DeletedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("삭제 일시");
+
+                    b.Property<byte>("Images")
+                        .HasColumnType("tinyint")
+                        .HasComment("이미지 개수");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("작성자 IP");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("삭제 여부");
+
+                    b.Property<int>("Likes")
+                        .HasColumnType("int")
+                        .HasComment("좋아요 수");
+
+                    b.Property<byte>("Medias")
+                        .HasColumnType("tinyint")
+                        .HasComment("미디어 개수");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("작성 회원 ID");
+
+                    b.Property<int>("Reports")
+                        .HasColumnType("int")
+                        .HasComment("신고 수");
+
+                    b.Property<byte>("Tags")
+                        .HasColumnType("tinyint")
+                        .HasComment("태그 개수");
+
+                    b.Property<string>("Thumbnail")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("썸네일 URL");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("작성자 User-Agent");
+
+                    b.Property<int>("Views")
+                        .HasColumnType("int")
+                        .HasComment("조회수");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("IsDeleted");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("IsDeleted", "CreatedAt");
+
+                    b.HasIndex("MemberID", "IsDeleted", "CreatedAt");
+
+                    b.HasIndex("IsDeleted", "Likes", "Comments", "Views");
+
+                    b.ToTable("FeedPost", null, t =>
+                        {
+                            t.HasComment("피드 포스트");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostImage", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("ContentType")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("MIME");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("비활성 일시");
+
+                    b.Property<string>("Extension")
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)")
+                        .HasComment("확장자");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("FileName")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("원본 파일명");
+
+                    b.Property<string>("HashedName")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("저장 파일명(해시)");
+
+                    b.Property<short?>("Height")
+                        .HasColumnType("smallint")
+                        .HasComment("세로 픽셀");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit")
+                        .HasComment("비활성 여부");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("상대 경로");
+
+                    b.Property<long?>("Size")
+                        .HasColumnType("bigint")
+                        .HasComment("바이트 크기");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("UUID");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("접근 URL");
+
+                    b.Property<short?>("Width")
+                        .HasColumnType("smallint")
+                        .HasComment("가로 픽셀");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.HasIndex("UUID")
+                        .IsUnique();
+
+                    b.HasIndex("FeedPostID", "HashedName");
+
+                    b.HasIndex("FeedPostID", "IsDisabled");
+
+                    b.ToTable("FeedPostImage", null, t =>
+                        {
+                            t.HasComment("피드 포스트 이미지");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostMedia", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("미디어 URL");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.ToTable("FeedPostMedia", null, t =>
+                        {
+                            t.HasComment("피드 포스트 미디어 링크");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostMention", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Length")
+                        .HasColumnType("int")
+                        .HasComment("길이");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("RawHandle")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)")
+                        .HasComment("원문 @handle");
+
+                    b.Property<int>("Start")
+                        .HasColumnType("int")
+                        .HasComment("본문 내 시작 인덱스");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("FeedPostID", "MemberID")
+                        .IsUnique();
+
+                    b.HasIndex("MemberID", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("FeedPostMention", null, t =>
+                        {
+                            t.HasComment("피드 포스트 멘션");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostTag", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("FeedTagID")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.HasIndex("FeedTagID");
+
+                    b.HasIndex("FeedPostID", "FeedTagID")
+                        .IsUnique();
+
+                    b.HasIndex("FeedTagID", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("FeedPostTag", null, t =>
+                        {
+                            t.HasComment("피드 포스트-태그 조인");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedTag", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("태그 이름");
+
+                    b.Property<string>("Slug")
+                        .IsRequired()
+                        .HasMaxLength(120)
+                        .HasColumnType("nvarchar(120)")
+                        .HasComment("태그 슬러그 (URL용)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<long>("UsageCount")
+                        .HasColumnType("bigint")
+                        .HasComment("사용 횟수");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Name")
+                        .IsUnique();
+
+                    b.HasIndex("Slug")
+                        .IsUnique();
+
+                    b.HasIndex("UsageCount")
+                        .IsDescending();
+
+                    b.ToTable("FeedTag", null, t =>
+                        {
+                            t.HasComment("피드 태그 마스터");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.Board", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardGroupID")
+                        .HasColumnType("int")
+                        .HasComment("분류 ID");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("게시판 주소");
+
+                    b.Property<int>("Comments")
+                        .HasColumnType("int")
+                        .HasComment("댓글 수");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<bool>("IsSearch")
+                        .HasColumnType("bit")
+                        .HasComment("검색 여부");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(70)
+                        .HasColumnType("nvarchar(70)")
+                        .HasComment("게시판 이름");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("순서");
+
+                    b.Property<int>("Posts")
+                        .HasColumnType("int")
+                        .HasComment("게시글 수");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardGroupID");
+
+                    b.HasIndex("Code")
+                        .IsUnique();
+
+                    b.HasIndex("Comments");
+
+                    b.HasIndex("IsActive");
+
+                    b.HasIndex("IsSearch");
+
+                    b.HasIndex("Name");
+
+                    b.HasIndex("Order");
+
+                    b.HasIndex("Posts");
+
+                    b.HasIndex("Code", "IsActive");
+
+                    b.HasIndex("Code", "IsSearch");
+
+                    b.HasIndex("IsSearch", "IsActive");
+
+                    b.ToTable("Board", null, t =>
+                        {
+                            t.HasComment("게시판");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardGroup", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<short>("Boards")
+                        .HasColumnType("smallint")
+                        .HasComment("게시판 수");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("게시판 분류 주소");
+
+                    b.Property<int>("Comments")
+                        .HasColumnType("int")
+                        .HasComment("댓글 수");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(70)
+                        .HasColumnType("nvarchar(70)")
+                        .HasComment("게시판 분류 명");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("순서");
+
+                    b.Property<int>("Posts")
+                        .HasColumnType("int")
+                        .HasComment("게시글 수");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code")
+                        .IsUnique();
+
+                    b.HasIndex("Order");
+
+                    b.HasIndex("Order", "CreatedAt");
+
+                    b.HasIndex("Code", "Order", "CreatedAt");
+
+                    b.ToTable("BoardGroup", null, t =>
+                        {
+                            t.HasComment("게시판 분류");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardManager", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<bool>("CanDelete")
+                        .HasColumnType("bit")
+                        .HasComment("삭제 권한");
+
+                    b.Property<bool>("CanEdit")
+                        .HasColumnType("bit")
+                        .HasComment("수정 권한");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("관리자 ID");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("BoardID", "MemberID");
+
+                    b.ToTable("BoardManager", null, t =>
+                        {
+                            t.HasComment("게시판 관리자");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardMeta", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID")
+                        .IsUnique();
+
+                    b.ToTable("BoardMeta", null, t =>
+                        {
+                            t.HasComment("게시판 설정");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardPrefix", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<string>("Color")
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)")
+                        .HasComment("색상");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("말머리");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("정렬 순서");
+
+                    b.Property<int>("Posts")
+                        .HasColumnType("int")
+                        .HasComment("사용 게시글 수");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID", "IsActive", "Order", "CreatedAt");
+
+                    b.ToTable("BoardPrefix", null, t =>
+                        {
+                            t.HasComment("게시판 말머리");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Briefings.DailyBriefing", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateOnly>("BriefingDate")
+                        .HasColumnType("date")
+                        .HasComment("브리핑 대상 일자 (KST, UNIQUE)");
+
+                    b.Property<DateTime>("GeneratedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("생성 일시");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("발행된 게시글 ID (FK Post)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BriefingDate")
+                        .IsUnique();
+
+                    b.HasIndex("PostID");
+
+                    b.ToTable("DailyBriefing", null, t =>
+                        {
+                            t.HasComment("장전 브리핑 발행 기록 (중복 발행 방지)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.Comment", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<string>("Content")
+                        .IsRequired()
+                        .HasMaxLength(4000)
+                        .HasColumnType("nvarchar(4000)")
+                        .HasComment("댓글 내용");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<DateTime?>("DeletedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<short>("Depth")
+                        .HasColumnType("smallint")
+                        .HasComment("댓글 깊이");
+
+                    b.Property<int>("Dislikes")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<byte>("Files")
+                        .HasColumnType("tinyint");
+
+                    b.Property<int>("Images")
+                        .HasColumnType("int");
+
+                    b.Property<string>("IpAddress")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("삭제 여부");
+
+                    b.Property<bool>("IsReply")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsSecret")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Likes")
+                        .HasColumnType("int");
+
+                    b.Property<byte>("Medias")
+                        .HasColumnType("tinyint");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<int?>("MentionMemberID")
+                        .HasColumnType("int")
+                        .HasComment("언급 대상 회원 ID");
+
+                    b.Property<string>("Name")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int?>("ParentID")
+                        .HasColumnType("int")
+                        .HasComment("부모 댓글 ID");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<int>("Replies")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Reports")
+                        .HasColumnType("int");
+
+                    b.Property<string>("SID")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Score")
+                        .HasColumnType("int")
+                        .HasComment("점수");
+
+                    b.Property<byte>("Status")
+                        .HasColumnType("tinyint")
+                        .HasComment("댓글 상태");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("UserAgent")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("MentionMemberID");
+
+                    b.HasIndex("ParentID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("PostID", "IsDeleted", "ParentID", "CreatedAt")
+                        .IsDescending(false, false, false, true);
+
+                    b.HasIndex("PostID", "IsDeleted", "ParentID", "Score", "ID")
+                        .IsDescending(false, false, false, true, true);
+
+                    b.HasIndex("PostID", "MemberID", "IsDeleted", "ParentID", "CreatedAt")
+                        .IsDescending(false, false, false, false, true);
+
+                    b.HasIndex("PostID", "MemberID", "IsDeleted", "ParentID", "Score", "ID")
+                        .IsDescending(false, false, false, false, true, true);
+
+                    b.ToTable("Comment", null, t =>
+                        {
+                            t.HasComment("댓글");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentFile", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("ContentType")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Downloads")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Extension")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("FileName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("HashedName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<long?>("Size")
+                        .HasColumnType("bigint");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("UUID")
+                        .IsUnique();
+
+                    b.ToTable("CommentFile", null, t =>
+                        {
+                            t.HasComment("댓글 파일");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentImage", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("ContentType")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Extension")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("FileName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("HashedName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<short?>("Height")
+                        .HasColumnType("smallint");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<long?>("Size")
+                        .HasColumnType("bigint");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<short?>("Width")
+                        .HasColumnType("smallint");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("UUID")
+                        .IsUnique();
+
+                    b.ToTable("CommentImage", null, t =>
+                        {
+                            t.HasComment("댓글 이미지");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentLink", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Clicks")
+                        .HasColumnType("int");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("PostID");
+
+                    b.ToTable("CommentLink", null, t =>
+                        {
+                            t.HasComment("댓글 링크");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentMedia", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("PostID");
+
+                    b.ToTable("CommentMedia", null, t =>
+                        {
+                            t.HasComment("댓글 미디어");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentMention", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<int>("Length")
+                        .HasColumnType("int")
+                        .HasComment("길이");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("언급된 회원 ID");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<string>("RawHandle")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)")
+                        .HasComment("원문 회원 언급값");
+
+                    b.Property<int>("Start")
+                        .HasColumnType("int")
+                        .HasComment("본문 내 시작 인덱스");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("CommentID")
+                        .IsUnique();
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("CommentID", "ID");
+
+                    b.HasIndex("CommentID", "MemberID", "ID");
+
+                    b.HasIndex("CommentID", "MemberID", "Start");
+
+                    b.ToTable("CommentMention", null, t =>
+                        {
+                            t.HasComment("댓글 멘션");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentReaction", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<byte>("Reaction")
+                        .HasColumnType("tinyint")
+                        .HasComment("반응 구분");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("Reaction");
+
+                    b.HasIndex("CommentID", "ID");
+
+                    b.HasIndex("CommentID", "MemberID")
+                        .IsUnique();
+
+                    b.ToTable("CommentReaction", null, t =>
+                        {
+                            t.HasComment("댓글 반응");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentReport", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Memo")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("처리 내용");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<string>("Reason")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("신고 내용");
+
+                    b.Property<byte>("Status")
+                        .HasColumnType("tinyint")
+                        .HasComment("처리 상태");
+
+                    b.Property<byte>("Type")
+                        .HasColumnType("tinyint")
+                        .HasComment("신고 사유");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("Status");
+
+                    b.HasIndex("Type");
+
+                    b.HasIndex("CommentID", "ID");
+
+                    b.HasIndex("CommentID", "MemberID")
+                        .IsUnique();
+
+                    b.ToTable("CommentReport", null, t =>
+                        {
+                            t.HasComment("댓글 신고");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentFileDownLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("CommentFileID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 파일 ID");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CommentFileID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("CommentID", "CommentFileID");
+
+                    b.HasIndex("CommentID", "CommentFileID", "MemberID");
+
+                    b.ToTable("CommentFileDownLog", null, t =>
+                        {
+                            t.HasComment("댓글 파일 다운로드 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentLinkClickLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 ID");
+
+                    b.Property<int>("CommentLinkID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 링크 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("CommentLinkID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("CommentID", "CommentLinkID");
+
+                    b.HasIndex("CommentID", "CommentLinkID", "MemberID");
+
+                    b.ToTable("CommentLinkClickLog", null, t =>
+                        {
+                            t.HasComment("댓글 링크 클릭 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentUpdateLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 ID");
+
+                    b.Property<string>("ContentDiff")
+                        .HasMaxLength(4000)
+                        .HasColumnType("nvarchar(4000)")
+                        .HasComment("변경 내용");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Note")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("비고");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("ContentDiff");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("CommentID", "ID");
+
+                    b.HasIndex("CommentID", "MemberID");
+
+                    b.HasIndex("CommentID", "MemberID", "ID");
+
+                    b.ToTable("CommentUpdateLog", null, t =>
+                        {
+                            t.HasComment("댓글 수정 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostFileDownLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<int>("PostFileID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 파일 ID");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostFileID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("PostID", "PostFileID");
+
+                    b.HasIndex("PostID", "PostFileID", "MemberID");
+
+                    b.ToTable("PostFileDownLog", null, t =>
+                        {
+                            t.HasComment("게시글 파일 다운로드 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostLinkClickLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<int>("PostLinkID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 파일 ID");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("PostLinkID");
+
+                    b.HasIndex("PostID", "PostLinkID");
+
+                    b.HasIndex("PostID", "PostLinkID", "MemberID");
+
+                    b.ToTable("PostLinkClickLog", null, t =>
+                        {
+                            t.HasComment("게시글 링크 클릭 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostUpdateLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("ContentDiff")
+                        .HasMaxLength(4000)
+                        .HasColumnType("nvarchar(4000)")
+                        .HasComment("변경 내용");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Note")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("비고");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<string>("SubjectDiff")
+                        .HasMaxLength(4000)
+                        .HasColumnType("nvarchar(4000)")
+                        .HasComment("변경 제목");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("ContentDiff");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("SubjectDiff");
+
+                    b.HasIndex("PostID", "ID");
+
+                    b.HasIndex("PostID", "MemberID");
+
+                    b.HasIndex("PostID", "MemberID", "ID");
+
+                    b.ToTable("PostUpdateLog", null, t =>
+                        {
+                            t.HasComment("게시글 수정 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostViewLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("IpAddress")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("UserAgent")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.ToTable("PostViewLog");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.Post", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<int?>("BoardPrefixID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 말머리 ID");
+
+                    b.Property<int>("Bookmarks")
+                        .HasColumnType("int")
+                        .HasComment("즐겨찾기 수");
+
+                    b.Property<int>("Comments")
+                        .HasColumnType("int")
+                        .HasComment("댓글 수");
+
+                    b.Property<string>("Content")
+                        .IsRequired()
+                        .HasMaxLength(8000)
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("내용");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<DateTime?>("DeletedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("삭제 일시");
+
+                    b.Property<int>("Dislikes")
+                        .HasColumnType("int")
+                        .HasComment("싫어요");
+
+                    b.Property<string>("Email")
+                        .HasMaxLength(60)
+                        .HasColumnType("nvarchar(60)")
+                        .HasComment("회원 이메일");
+
+                    b.Property<byte>("Files")
+                        .HasColumnType("tinyint")
+                        .HasComment("파일 수");
+
+                    b.Property<byte>("Images")
+                        .HasColumnType("tinyint")
+                        .HasComment("이미지 수");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP");
+
+                    b.Property<bool>("IsAnonymous")
+                        .HasColumnType("bit")
+                        .HasComment("익명 글 여부");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("삭제 여부");
+
+                    b.Property<bool>("IsNotice")
+                        .HasColumnType("bit")
+                        .HasComment("일반 공지 여부");
+
+                    b.Property<bool>("IsReply")
+                        .HasColumnType("bit")
+                        .HasComment("답변 여부");
+
+                    b.Property<bool>("IsSecret")
+                        .HasColumnType("bit")
+                        .HasComment("비밀글 여부");
+
+                    b.Property<bool>("IsSpeaker")
+                        .HasColumnType("bit")
+                        .HasComment("전체 공지 여부");
+
+                    b.Property<DateTime?>("LastCommentUpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 댓글 일시");
+
+                    b.Property<DateTime?>("LastReplyUpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 답변 일시");
+
+                    b.Property<int>("Likes")
+                        .HasColumnType("int")
+                        .HasComment("좋아요");
+
+                    b.Property<byte>("Medias")
+                        .HasColumnType("tinyint")
+                        .HasComment("미디어 수");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Name")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("회원 이름");
+
+                    b.Property<int>("Reports")
+                        .HasColumnType("int")
+                        .HasComment("신고 수");
+
+                    b.Property<string>("SID")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("회원 SID");
+
+                    b.Property<string>("StockCode")
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("종목 가상보드 파티션 코드 (stock 보드 전용)");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("제목");
+
+                    b.Property<byte>("Tags")
+                        .HasColumnType("tinyint")
+                        .HasComment("Tag 수");
+
+                    b.Property<string>("Thumbnail")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("대표 이미지");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-Agent");
+
+                    b.Property<int>("Views")
+                        .HasColumnType("int")
+                        .HasComment("조회 수");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("BoardPrefixID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("ID", "BoardID");
+
+                    b.HasIndex("StockCode", "CreatedAt")
+                        .IsDescending(false, true)
+                        .HasDatabaseName("IX_Post_StockCode_CreatedAt")
+                        .HasFilter("[StockCode] IS NOT NULL AND [IsDeleted] = 0");
+
+                    b.HasIndex("ID", "BoardID", "IsDeleted");
+
+                    b.HasIndex("MemberID", "IsDeleted", "CreatedAt")
+                        .IsDescending(false, false, true);
+
+                    b.HasIndex("ID", "BoardID", "BoardPrefixID", "IsDeleted", "Comments");
+
+                    b.HasIndex("ID", "BoardID", "BoardPrefixID", "IsDeleted", "CreatedAt");
+
+                    b.HasIndex("ID", "BoardID", "BoardPrefixID", "IsDeleted", "Likes");
+
+                    b.HasIndex("ID", "BoardID", "BoardPrefixID", "IsDeleted", "Views");
+
+                    b.ToTable("Post", null, t =>
+                        {
+                            t.HasComment("게시글");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostBookmark", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("IpAddress")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("UserAgent")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("PostID", "MemberID")
+                        .IsUnique();
+
+                    b.ToTable("PostBookmark", null, t =>
+                        {
+                            t.HasComment("게시글 즐겨찾기");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostCheer", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("Amount")
+                        .HasColumnType("int")
+                        .HasComment("총 응원 금액");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("응원 일시");
+
+                    b.Property<int>("FeeAmount")
+                        .HasColumnType("int")
+                        .HasComment("플랫폼 수수료(소각분)");
+
+                    b.Property<int>("FromMemberID")
+                        .HasColumnType("int")
+                        .HasComment("응원 발신자 회원 ID");
+
+                    b.Property<string>("Message")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("응원 한마디");
+
+                    b.Property<int>("NetAmount")
+                        .HasColumnType("int")
+                        .HasComment("작성자 수령 순액(Reward 적립)");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("응원 대상 게시글 ID");
+
+                    b.Property<int>("ToMemberID")
+                        .HasColumnType("int")
+                        .HasComment("응원 수신자(글 작성자) 회원 ID");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("FromMemberID", "CreatedAt");
+
+                    b.HasIndex("ToMemberID", "CreatedAt");
+
+                    b.ToTable("PostCheer", null, t =>
+                        {
+                            t.HasComment("분석글 응원(Cheer) — D3 M4");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostFile", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("ContentType")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Downloads")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Extension")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("FileName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("HashedName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<long?>("Size")
+                        .HasColumnType("bigint");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("UUID")
+                        .IsUnique();
+
+                    b.ToTable("PostFile", null, t =>
+                        {
+                            t.HasComment("게시글 파일");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostImage", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<string>("ContentType")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("MIME 타입");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("비활성 일시");
+
+                    b.Property<string>("Extension")
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)")
+                        .HasComment("확장자");
+
+                    b.Property<string>("FileName")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("원본 파일명");
+
+                    b.Property<string>("HashedName")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("저장 파일명");
+
+                    b.Property<short?>("Height")
+                        .HasColumnType("smallint")
+                        .HasComment("세로 해상도(px)");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit")
+                        .HasComment("비활성 여부");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("저장 경로");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<long?>("Size")
+                        .HasColumnType("bigint")
+                        .HasComment("용량(byte)");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("이미지 ID");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("URL");
+
+                    b.Property<short?>("Width")
+                        .HasColumnType("smallint")
+                        .HasComment("가로 해상도(px)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("UUID")
+                        .IsUnique();
+
+                    b.HasIndex("PostID", "HashedName");
+
+                    b.HasIndex("PostID", "HashedName", "IsDisabled");
+
+                    b.ToTable("PostImage", null, t =>
+                        {
+                            t.HasComment("게시글 이미지");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostLink", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Clicks")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("PostID");
+
+                    b.ToTable("PostLink", null, t =>
+                        {
+                            t.HasComment("게시글 링크");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostMedia", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("PostID");
+
+                    b.ToTable("PostMedia", null, t =>
+                        {
+                            t.HasComment("게시글 미디어");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostPrediction", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<decimal>("BasePrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("작성 시점 기준가");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<byte>("Direction")
+                        .HasColumnType("tinyint")
+                        .HasComment("예측 방향 (1=상승, 2=하락)");
+
+                    b.Property<DateOnly>("DueDate")
+                        .HasColumnType("date")
+                        .HasComment("채점 예정일");
+
+                    b.Property<short>("HorizonDays")
+                        .HasColumnType("smallint")
+                        .HasComment("예측 기간 (영업일 수)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("작성 회원 ID");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID (1:1)");
+
+                    b.Property<DateTime?>("SettledAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("채점 일시");
+
+                    b.Property<decimal?>("SettledPrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("채점 시점 종가");
+
+                    b.Property<byte>("Status")
+                        .HasColumnType("tinyint")
+                        .HasComment("상태 (0=Pending/1=Hit/2=Miss/3=Void)");
+
+                    b.Property<string>("StockCode")
+                        .IsRequired()
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("예측 종목 단축코드");
+
+                    b.Property<decimal?>("TargetPrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("목표가 (선택)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("PostID")
+                        .IsUnique();
+
+                    b.HasIndex("MemberID", "Status");
+
+                    b.HasIndex("Status", "DueDate");
+
+                    b.ToTable("PostPrediction", null, t =>
+                        {
+                            t.HasComment("예측글 (방향/기간 예측 + 채점)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostReaction", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<byte>("Reaction")
+                        .HasColumnType("tinyint")
+                        .HasComment("반응 구분");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("Reaction");
+
+                    b.HasIndex("PostID", "MemberID")
+                        .IsUnique();
+
+                    b.ToTable("PostReaction", null, t =>
+                        {
+                            t.HasComment("게시글 반응");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostReport", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(15)
+                        .HasColumnType("nvarchar(15)")
+                        .HasComment("IP Address");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Memo")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("처리 내용");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<string>("Reason")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("신고 내용");
+
+                    b.Property<byte>("Status")
+                        .HasColumnType("tinyint")
+                        .HasComment("처리 상태");
+
+                    b.Property<byte>("Type")
+                        .HasColumnType("tinyint")
+                        .HasComment("신고 사유");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("Status");
+
+                    b.HasIndex("Type");
+
+                    b.HasIndex("PostID", "MemberID")
+                        .IsUnique();
+
+                    b.ToTable("PostReport", null, t =>
+                        {
+                            t.HasComment("게시글 신고");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostStockTag", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<string>("StockCode")
+                        .IsRequired()
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("종목 단축코드");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("PostID", "StockCode")
+                        .IsUnique();
+
+                    b.HasIndex("StockCode", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("PostStockTag", null, t =>
+                        {
+                            t.HasComment("글 본문 $종목 태그 (언급량 랭킹 원천)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostTag", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("TagID")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("TagID");
+
+                    b.ToTable("PostTag", null, t =>
+                        {
+                            t.HasComment("게시글 태그 연결");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.Tag", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(450)");
+
+                    b.Property<string>("Slug")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(450)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<long>("UsageCount")
+                        .HasColumnType("bigint");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Name")
+                        .IsUnique();
+
+                    b.HasIndex("Slug")
+                        .IsUnique();
+
+                    b.HasIndex("UsageCount");
+
+                    b.ToTable("Tag", null, t =>
+                        {
+                            t.HasComment("태그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Attendance", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("ConsecutiveDays")
+                        .HasColumnType("int")
+                        .HasComment("연속 출석 일수");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("출석 일시");
+
+                    b.Property<int>("ExpRewarded")
+                        .HasColumnType("int")
+                        .HasComment("지급 경험치");
+
+                    b.Property<string>("Greeting")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("출석 인사");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<int>("PointRewarded")
+                        .HasColumnType("int")
+                        .HasComment("지급 포인트");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt")
+                        .IsDescending();
+
+                    b.HasIndex("MemberID", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("Attendance", null, t =>
+                        {
+                            t.HasComment("출석 기록");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.BroadcastSession", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("ChannelID")
+                        .HasColumnType("int")
+                        .HasComment("채널 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("생성 일시");
+
+                    b.Property<int>("DurationSec")
+                        .HasColumnType("int")
+                        .HasComment("방송 시간 (초)");
+
+                    b.Property<DateTime?>("EndAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("방송 종료 시각");
+
+                    b.Property<long>("FinalLikes")
+                        .HasColumnType("bigint")
+                        .HasComment("최종 좋아요");
+
+                    b.Property<long>("FinalViews")
+                        .HasColumnType("bigint")
+                        .HasComment("최종 조회수");
+
+                    b.Property<bool>("IsFinalized")
+                        .HasColumnType("bit")
+                        .HasComment("최종 확정 여부 (End + 24h 경과)");
+
+                    b.Property<int>("Platform")
+                        .HasColumnType("int")
+                        .HasComment("플랫폼 (YouTube=1)");
+
+                    b.Property<DateTime?>("StartAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("방송 시작 시각");
+
+                    b.Property<string>("Title")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("방송 제목");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("VideoID")
+                        .IsRequired()
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("플랫폼 비디오 ID");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("IsFinalized");
+
+                    b.HasIndex("ChannelID", "EndAt")
+                        .IsDescending(false, true);
+
+                    b.HasIndex("Platform", "VideoID")
+                        .IsUnique();
+
+                    b.ToTable("BroadcastSession", null, t =>
+                        {
+                            t.HasComment("방송 세션 (라이브 1회 단위)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Channel", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("BannerUrl")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("DonationCode")
+                        .HasMaxLength(7)
+                        .HasColumnType("nvarchar(7)")
+                        .HasComment("후원 코드(4~7자 영문+숫자, 대문자). 1회성 발급, 변경 불가");
+
+                    b.Property<string>("Email")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Handle")
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("핸들");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("활성 여부");
+
+                    b.Property<bool>("IsVerified")
+                        .HasColumnType("bit")
+                        .HasComment("인증 여부");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("채널 이름");
+
+                    b.Property<decimal>("PlatformFeeRate")
+                        .HasPrecision(10, 7)
+                        .HasColumnType("decimal(10,7)")
+                        .HasComment("후원 수수료(%) — dpot 몫, 0~100, 소수점 7자리");
+
+                    b.Property<string>("SID")
+                        .IsRequired()
+                        .HasMaxLength(24)
+                        .HasColumnType("nvarchar(24)")
+                        .HasComment("채널 ID");
+
+                    b.Property<decimal>("StoreCommissionRate")
+                        .ValueGeneratedOnAdd()
+                        .HasPrecision(10, 7)
+                        .HasColumnType("decimal(10,7)")
+                        .HasDefaultValue(0m)
+                        .HasComment("상점 매출 보상률(%) — 채널 몫, 0~100, 소수점 7자리");
+
+                    b.Property<long>("SubscriberCount")
+                        .HasColumnType("bigint");
+
+                    b.Property<string>("ThumbnailUrl")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<long>("VideoCount")
+                        .HasColumnType("bigint");
+
+                    b.Property<long>("ViewCount")
+                        .HasColumnType("bigint");
+
+                    b.Property<string>("WidgetToken")
+                        .IsRequired()
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("위젯 토큰");
+
+                    b.Property<string>("YouTubeChannelID")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("YouTubeLastSyncedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("YouTube API 마지막 동기화 시각(UTC) — 30일 정책 enforcement");
+
+                    b.Property<DateTime?>("YouTubePublishedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("YouTubeUrl")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("YouTube 채널 URL");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("DonationCode")
+                        .IsUnique()
+                        .HasFilter("[DonationCode] IS NOT NULL");
+
+                    b.HasIndex("Handle")
+                        .IsUnique()
+                        .HasFilter("[Handle] IS NOT NULL");
+
+                    b.HasIndex("MemberID")
+                        .IsUnique();
+
+                    b.HasIndex("Name")
+                        .IsUnique();
+
+                    b.HasIndex("SID")
+                        .IsUnique();
+
+                    b.HasIndex("WidgetToken")
+                        .IsUnique();
+
+                    b.HasIndex("YouTubeLastSyncedAt");
+
+                    b.HasIndex("YouTubeUrl")
+                        .IsUnique();
+
+                    b.HasIndex("MemberID", "IsActive");
+
+                    b.HasIndex("MemberID", "IsVerified");
+
+                    b.HasIndex("MemberID", "IsVerified", "IsActive");
+
+                    b.ToTable("Channel", null, t =>
+                        {
+                            t.HasComment("채널 정보");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.ChannelBroadcastStats", b =>
+                {
+                    b.Property<int>("ChannelID")
+                        .HasColumnType("int")
+                        .HasComment("채널 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("생성 일시");
+
+                    b.Property<long>("CumulativeViews")
+                        .HasColumnType("bigint")
+                        .HasComment("누적 조회수");
+
+                    b.Property<DateTime?>("LastAggregatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 집계 일시");
+
+                    b.Property<DateTime?>("LastBroadcastAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 방송 일시");
+
+                    b.Property<int>("SessionCount")
+                        .HasColumnType("int")
+                        .HasComment("방송 횟수");
+
+                    b.Property<long>("TotalDurationSec")
+                        .HasColumnType("bigint")
+                        .HasComment("누적 방송 시간 (초)");
+
+                    b.Property<long>("TotalLikes")
+                        .HasColumnType("bigint")
+                        .HasComment("누적 좋아요");
+
+                    b.HasKey("ChannelID");
+
+                    b.ToTable("ChannelBroadcastStats", null, t =>
+                        {
+                            t.HasComment("채널별 누적 방송 지표");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.ChannelHandleHistory", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("ChangedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("변경 일시");
+
+                    b.Property<int>("ChannelID")
+                        .HasColumnType("int")
+                        .HasComment("채널 ID");
+
+                    b.Property<string>("OldHandle")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("이전 핸들");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("OldHandle");
+
+                    b.HasIndex("ChannelID", "ChangedAt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("ChannelHandleHistory", null, t =>
+                        {
+                            t.HasComment("채널 핸들 변경 이력");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberEmailChangeLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AfterEmail")
+                        .IsRequired()
+                        .HasMaxLength(60)
+                        .HasColumnType("nvarchar(60)")
+                        .HasComment("바뀐 이메일");
+
+                    b.Property<string>("BeforeEmail")
+                        .HasMaxLength(60)
+                        .HasColumnType("nvarchar(60)")
+                        .HasComment("이전 이메일");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP Address");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Referer")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("이전 페이지 주소");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("MemberID");
+
+                    b.ToTable("MemberEmailChangeLog", null, t =>
+                        {
+                            t.HasComment("사용자 이메일 변경 내역");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberExpLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("Amount")
+                        .HasColumnType("int")
+                        .HasComment("변동량");
+
+                    b.Property<long>("Balance")
+                        .HasColumnType("bigint")
+                        .HasComment("잔액");
+
+                    b.Property<int?>("BroadcastSessionID")
+                        .HasColumnType("int")
+                        .HasComment("방송 세션 ID (리더보드 집계 대상)");
+
+                    b.Property<int?>("ChannelID")
+                        .HasColumnType("int")
+                        .HasComment("채널 ID (channel 단위 조회용)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("기록 일시");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Reason")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("사유");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("BroadcastSessionID", "MemberID");
+
+                    b.HasIndex("ChannelID", "MemberID", "CreatedAt");
+
+                    b.ToTable("MemberExpLog", null, t =>
+                        {
+                            t.HasComment("경험치 변동 내역");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberIntroChangeLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AfterIntro")
+                        .HasMaxLength(3000)
+                        .HasColumnType("nvarchar(3000)")
+                        .HasComment("바꾼 자기소개");
+
+                    b.Property<string>("BeforeIntro")
+                        .HasMaxLength(3000)
+                        .HasColumnType("nvarchar(3000)")
+                        .HasComment("이전 자기소개");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP Address (IPv6 호환)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Referer")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("이전 페이지 주소");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.ToTable("MemberIntroChangeLog", null, t =>
+                        {
+                            t.HasComment("자기소개 변경 내역");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberItemUsageLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<byte>("Action")
+                        .HasColumnType("tinyint")
+                        .HasComment("액션 (1=Used, 2=Revoked)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("Detail")
+                        .HasMaxLength(300)
+                        .HasColumnType("nvarchar(300)")
+                        .HasComment("결과 요약");
+
+                    b.Property<byte>("Kind")
+                        .HasColumnType("tinyint")
+                        .HasComment("아이템 종류");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<int>("MemberItemID")
+                        .HasColumnType("int")
+                        .HasComment("MemberItem ID");
+
+                    b.Property<int>("ProductID")
+                        .HasColumnType("int")
+                        .HasComment("상품 ID");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID", "CreatedAt");
+
+                    b.ToTable("MemberItemUsageLog", null, t =>
+                        {
+                            t.HasComment("소모품 아이템 사용/회수 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberLoginLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Account")
+                        .IsRequired()
+                        .HasMaxLength(120)
+                        .HasColumnType("nvarchar(120)")
+                        .HasComment("로그인 시도한 계정");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP Address");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Reason")
+                        .HasMaxLength(225)
+                        .HasColumnType("nvarchar(225)")
+                        .HasComment("실패 이유");
+
+                    b.Property<string>("Referer")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("이전 페이지 주소");
+
+                    b.Property<bool>("Success")
+                        .HasColumnType("bit")
+                        .HasComment("로그인 성공 여부 (0: 실패, 1: 성공)");
+
+                    b.Property<string>("Url")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("요청 주소");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Account");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("MemberID", "Success");
+
+                    b.ToTable("MemberLoginLog", null, t =>
+                        {
+                            t.HasComment("로그인 기록");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberNameChangeLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AfterName")
+                        .HasMaxLength(40)
+                        .HasColumnType("nvarchar(40)")
+                        .HasComment("바꾼 별명");
+
+                    b.Property<string>("BeforeName")
+                        .HasMaxLength(40)
+                        .HasColumnType("nvarchar(40)")
+                        .HasComment("이전 별명");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP Address (IPv6 호환)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Referer")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("이전 페이지 주소");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.ToTable("MemberNameChangeLog", null, t =>
+                        {
+                            t.HasComment("별명 변경 내역");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberSummaryChangeLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AfterSummary")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("바꾼 한마디");
+
+                    b.Property<string>("BeforeSummary")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("이전 한마디");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP Address (IPv6 호환)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Referer")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("이전 페이지 주소");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.ToTable("MemberSummaryChangeLog", null, t =>
+                        {
+                            t.HasComment("한마디 변경 내역");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberThumbChangeLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AfterThumb")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("바꾼 이미지");
+
+                    b.Property<string>("BeforeThumb")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("이전 이미지");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP Address (IPv6 호환)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Referer")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("이전 페이지 주소");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.ToTable("MemberThumbChangeLog", null, t =>
+                        {
+                            t.HasComment("프로필 이미지 변경 내역");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Member", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime?>("AuthCertifiedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("본인인증 일시");
+
+                    b.Property<string>("BannerUrl")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("배너 이미지");
+
+                    b.Property<DateOnly?>("Birthday")
+                        .HasColumnType("date")
+                        .HasComment("생년월일");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("가입 일시");
+
+                    b.Property<DateTime?>("DeletedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("탈퇴 일시");
+
+                    b.Property<DateTime?>("DeniedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("차단 일시");
+
+                    b.Property<string>("DeviceInfo")
+                        .HasMaxLength(400)
+                        .HasColumnType("nvarchar(400)")
+                        .HasComment("로그인 단말기 정보");
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasMaxLength(60)
+                        .HasColumnType("nvarchar(60)")
+                        .HasComment("이메일");
+
+                    b.Property<DateTime?>("EmailVerifiedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("이메일 인증 일시");
+
+                    b.Property<string>("FirstName")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("본명(성)");
+
+                    b.Property<string>("FullName")
+                        .HasMaxLength(40)
+                        .HasColumnType("nvarchar(40)")
+                        .HasComment("본명");
+
+                    b.Property<int?>("Gender")
+                        .HasColumnType("int")
+                        .HasComment("성별");
+
+                    b.Property<string>("Icon")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("아이콘");
+
+                    b.Property<string>("Intro")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("자기소개");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP Address");
+
+                    b.Property<bool>("IsAdmin")
+                        .HasColumnType("bit")
+                        .HasComment("운영진 여부");
+
+                    b.Property<bool>("IsAuthCertified")
+                        .HasColumnType("bit")
+                        .HasComment("본인 인증 여부");
+
+                    b.Property<bool>("IsCreator")
+                        .HasColumnType("bit")
+                        .HasComment("크리에이터 여부");
+
+                    b.Property<bool>("IsDenied")
+                        .HasColumnType("bit")
+                        .HasComment("차단 여부");
+
+                    b.Property<bool>("IsEmailVerified")
+                        .HasColumnType("bit")
+                        .HasComment("이메일 인증 여부");
+
+                    b.Property<bool>("IsWithdraw")
+                        .HasColumnType("bit")
+                        .HasComment("탈퇴 여부");
+
+                    b.Property<DateTime?>("LastEmailChangedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 이메일 변경 일시");
+
+                    b.Property<DateTime?>("LastIntroChangedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 자기소개 변경 일시");
+
+                    b.Property<DateTime?>("LastLoginAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 로그인 일시");
+
+                    b.Property<string>("LastLoginIp")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("마지막 로그인 IP (IPv6 호환 — 최대 45 char)");
+
+                    b.Property<string>("LastName")
+                        .HasMaxLength(40)
+                        .HasColumnType("nvarchar(40)")
+                        .HasComment("본명(이름)");
+
+                    b.Property<DateTime?>("LastNameChangedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 별명 변경 일시");
+
+                    b.Property<DateTime?>("LastSummaryChangedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 한마디 변경 일시");
+
+                    b.Property<DateTime?>("LastThumbChangedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int?>("MemberGradeID")
+                        .HasColumnType("int")
+                        .HasComment("회원등급 PK");
+
+                    b.Property<string>("Name")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("별명");
+
+                    b.Property<string>("Password")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("비밀번호");
+
+                    b.Property<string>("PasswordHash")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime>("PasswordUpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("비밀번호 변경 일시");
+
+                    b.Property<Guid?>("PaymentCustomerKey")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Phone")
+                        .HasMaxLength(15)
+                        .HasColumnType("nvarchar(15)")
+                        .HasComment("연락처");
+
+                    b.Property<string>("SID")
+                        .IsRequired()
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("SID");
+
+                    b.Property<string>("SignupIP")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("회원가입 시 IP (IPv6 호환 — 최대 45 char)");
+
+                    b.Property<string>("Summary")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("한마디");
+
+                    b.Property<string>("Thumb")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("썸네일");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("DeletedAt");
+
+                    b.HasIndex("Email")
+                        .IsUnique();
+
+                    b.HasIndex("FullName");
+
+                    b.HasIndex("Gender");
+
+                    b.HasIndex("IsAdmin");
+
+                    b.HasIndex("IsAuthCertified");
+
+                    b.HasIndex("IsCreator");
+
+                    b.HasIndex("IsDenied");
+
+                    b.HasIndex("IsEmailVerified");
+
+                    b.HasIndex("IsWithdraw");
+
+                    b.HasIndex("MemberGradeID");
+
+                    b.HasIndex("Name")
+                        .IsUnique()
+                        .HasFilter("[Name] IS NOT NULL");
+
+                    b.HasIndex("Phone");
+
+                    b.HasIndex("SID")
+                        .IsUnique();
+
+                    b.ToTable("Member", null, t =>
+                        {
+                            t.HasComment("회원 정보");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberApprove", b =>
+                {
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<DateTime?>("DisclosureInvestConsentAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("투자 현황 공개 동의 일시");
+
+                    b.Property<DateTime?>("DonationPublicConsentAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDisclosureInvest")
+                        .HasColumnType("bit")
+                        .HasComment("투자 현황 공개 여부");
+
+                    b.Property<bool>("IsDonationPublic")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsRankingPublic")
+                        .HasColumnType("bit")
+                        .HasComment("랭킹 공개 여부");
+
+                    b.Property<bool>("IsReceiveEmail")
+                        .HasColumnType("bit")
+                        .HasComment("E-MAIL 수신 여부");
+
+                    b.Property<bool>("IsReceiveNote")
+                        .HasColumnType("bit")
+                        .HasComment("쪽지 수신 여부");
+
+                    b.Property<bool>("IsReceiveSMS")
+                        .HasColumnType("bit")
+                        .HasComment("SMS 수신 여부");
+
+                    b.Property<DateTime?>("RankingPublicConsentAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("랭킹 공개 동의 일시");
+
+                    b.Property<DateTime?>("ReceiveEmailConsentAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("E-MAIL 수신 동의 일시");
+
+                    b.Property<DateTime?>("ReceiveNoteConsentAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("쪽지 수신 동의 일시");
+
+                    b.Property<DateTime?>("ReceiveSMSConsentAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("SMS 수신 동의 일시");
+
+                    b.HasKey("MemberID");
+
+                    b.ToTable("MemberApprove", null, t =>
+                        {
+                            t.HasComment("회원 알림 및 수신 동의");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberDailyRewardCounter", b =>
+                {
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<DateOnly>("RewardDate")
+                        .HasColumnType("date")
+                        .HasComment("KST 기준 일자");
+
+                    b.Property<byte>("ActionType")
+                        .HasColumnType("tinyint")
+                        .HasComment("액션 유형 (Post=1..PaperReward=8)");
+
+                    b.Property<int>("Count")
+                        .HasColumnType("int")
+                        .HasComment("오늘 지급 횟수");
+
+                    b.Property<int>("ExpTotal")
+                        .HasColumnType("int")
+                        .HasComment("오늘 지급 경험치 합계");
+
+                    b.Property<int>("PointTotal")
+                        .HasColumnType("int")
+                        .HasComment("오늘 지급 토큰 합계");
+
+                    b.HasKey("MemberID", "RewardDate", "ActionType");
+
+                    b.HasIndex("RewardDate");
+
+                    b.ToTable("MemberDailyRewardCounter", null, t =>
+                        {
+                            t.HasComment("일일 보상 캡 원장 (d3 M2)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberFollow", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("팔로우 일시");
+
+                    b.Property<int>("FolloweeMemberID")
+                        .HasColumnType("int")
+                        .HasComment("팔로우 대상 회원 ID");
+
+                    b.Property<int>("FollowerMemberID")
+                        .HasColumnType("int")
+                        .HasComment("팔로우 주체 회원 ID");
+
+                    b.Property<bool>("IsMuted")
+                        .HasColumnType("bit")
+                        .HasComment("피드 숨김 여부");
+
+                    b.Property<bool>("NotifyOnPost")
+                        .HasColumnType("bit")
+                        .HasComment("새 글 알림 수신 여부");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FolloweeMemberID");
+
+                    b.HasIndex("FollowerMemberID", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.HasIndex("FollowerMemberID", "FolloweeMemberID")
+                        .IsUnique();
+
+                    b.ToTable("MemberFollow", null, t =>
+                        {
+                            t.HasComment("회원 팔로우 관계");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberGrade", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("Description")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("설명");
+
+                    b.Property<string>("EngName")
+                        .IsRequired()
+                        .HasMaxLength(120)
+                        .HasColumnType("nvarchar(120)")
+                        .HasComment("영문 명");
+
+                    b.Property<string>("Image")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("이미지");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<string>("KorName")
+                        .IsRequired()
+                        .HasMaxLength(240)
+                        .HasColumnType("nvarchar(240)")
+                        .HasComment("한글 명");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("순서");
+
+                    b.Property<long>("RequiredAttendance")
+                        .HasColumnType("bigint")
+                        .HasComment("누적 출석 수");
+
+                    b.Property<int>("RequiredExp")
+                        .HasColumnType("int")
+                        .HasComment("누적 경험치");
+
+                    b.Property<string>("TextColor")
+                        .HasMaxLength(7)
+                        .HasColumnType("nvarchar(7)")
+                        .HasComment("표시 색상");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("EngName")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive");
+
+                    b.HasIndex("KorName")
+                        .IsUnique();
+
+                    b.HasIndex("Order");
+
+                    b.HasIndex("Order", "IsActive");
+
+                    b.ToTable("MemberGrade", null, t =>
+                        {
+                            t.HasComment("회원 등급");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberItem", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("AcquiredAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("획득 일시");
+
+                    b.Property<int>("DurationDays")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(0)
+                        .HasComment("효과 지속일 (0=즉시소모/영구)");
+
+                    b.Property<byte?>("EquipSlot")
+                        .HasColumnType("tinyint")
+                        .HasComment("장착 슬롯 (1=Badge, 2=NicknameEffect, 3=CommentEffect, null=소모품)");
+
+                    b.Property<DateTime?>("ExpiresAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("만료 일시 (null=영구)");
+
+                    b.Property<int?>("GiftFromMemberID")
+                        .HasColumnType("int")
+                        .HasComment("선물 발신자 회원 ID (null=본인구매)");
+
+                    b.Property<bool>("IsEquipped")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bit")
+                        .HasDefaultValue(false)
+                        .HasComment("장착 여부 (지위 아이템)");
+
+                    b.Property<byte>("Kind")
+                        .HasColumnType("tinyint")
+                        .HasComment("아이템 종류 (2~4=지위, 5~11=소모품)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID (지급 대상)");
+
+                    b.Property<int>("OrderItemID")
+                        .HasColumnType("int")
+                        .HasComment("발급 근거 주문항목 ID");
+
+                    b.Property<int>("ProductID")
+                        .HasColumnType("int")
+                        .HasComment("상품 ID");
+
+                    b.Property<DateTime?>("RevokedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("회수 일시 (환불)");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion");
+
+                    b.Property<DateTime?>("UsedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("소모/활성 일시 (null=미사용)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("OrderItemID");
+
+                    b.HasIndex("ProductID");
+
+                    b.HasIndex("MemberID", "EquipSlot")
+                        .IsUnique()
+                        .HasFilter("[IsEquipped] = 1");
+
+                    b.HasIndex("MemberID", "ExpiresAt");
+
+                    b.HasIndex("MemberID", "Kind", "UsedAt");
+
+                    b.ToTable("MemberItem", null, t =>
+                        {
+                            t.HasComment("계정 귀속 아이템 (지위 아이템 장착형 + 소모품)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberOAuthToken", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<string>("AccessTokenEnc")
+                        .IsRequired()
+                        .HasMaxLength(2048)
+                        .HasColumnType("nvarchar(2048)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime>("ExpiresAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Provider")
+                        .IsRequired()
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("ProviderUserKey")
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<string>("RefreshTokenEnc")
+                        .HasMaxLength(2048)
+                        .HasColumnType("nvarchar(2048)");
+
+                    b.Property<string>("Scopes")
+                        .IsRequired()
+                        .HasMaxLength(1024)
+                        .HasColumnType("nvarchar(1024)");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID", "Provider")
+                        .IsUnique();
+
+                    b.HasIndex("Provider", "ProviderUserKey");
+
+                    b.ToTable("MemberOAuthToken", null, t =>
+                        {
+                            t.HasComment("회원 OAuth 토큰");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberStats", b =>
+                {
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<long>("AttendanceCount")
+                        .HasColumnType("bigint")
+                        .HasComment("출석");
+
+                    b.Property<long>("BookmarkGivenCount")
+                        .HasColumnType("bigint")
+                        .HasComment("즐겨찾기 글 수");
+
+                    b.Property<long>("CommentCount")
+                        .HasColumnType("bigint")
+                        .HasComment("작성 댓글");
+
+                    b.Property<long>("Exp")
+                        .HasColumnType("bigint")
+                        .HasComment("경험치");
+
+                    b.Property<long>("FollowerCount")
+                        .HasColumnType("bigint")
+                        .HasComment("구독자");
+
+                    b.Property<long>("FollowingCount")
+                        .HasColumnType("bigint")
+                        .HasComment("구독 중");
+
+                    b.Property<long>("LikeGivenCount")
+                        .HasColumnType("bigint")
+                        .HasComment("누른 좋아요 수");
+
+                    b.Property<long>("LikeReceivedCount")
+                        .HasColumnType("bigint")
+                        .HasComment("받은 좋아요 수");
+
+                    b.Property<long>("LoginCount")
+                        .HasColumnType("bigint")
+                        .HasComment("로그인");
+
+                    b.Property<long>("PaymentCount")
+                        .HasColumnType("bigint")
+                        .HasComment("결제 횟수");
+
+                    b.Property<long>("PostCount")
+                        .HasColumnType("bigint")
+                        .HasComment("작성 게시글");
+
+                    b.Property<long>("ReportedCount")
+                        .HasColumnType("bigint")
+                        .HasComment("신고 당한 횟수");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion")
+                        .HasComment("동시성");
+
+                    b.Property<int>("SuspensionCount")
+                        .HasColumnType("int")
+                        .HasComment("정지 횟수");
+
+                    b.Property<long>("TotalCanceledAmount")
+                        .HasColumnType("bigint")
+                        .HasComment("누적 취소/환불 금액");
+
+                    b.Property<long>("TotalPaidAmount")
+                        .HasColumnType("bigint")
+                        .HasComment("누적 결제 금액");
+
+                    b.Property<int>("WarningCount")
+                        .HasColumnType("int")
+                        .HasComment("경고 횟수");
+
+                    b.HasKey("MemberID");
+
+                    b.ToTable("MemberStats", null, t =>
+                        {
+                            t.HasComment("회원 활동 집계");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberTrackRecord", b =>
+                {
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID (PK)");
+
+                    b.Property<int>("BestStreak")
+                        .HasColumnType("int")
+                        .HasComment("역대 최고 연속 적중");
+
+                    b.Property<int>("CurrentStreak")
+                        .HasColumnType("int")
+                        .HasComment("현재 연속 적중");
+
+                    b.Property<decimal>("HitRate")
+                        .HasPrecision(5, 2)
+                        .HasColumnType("decimal(5,2)")
+                        .HasComment("적중률 % (Hits/(Hits+Misses)*100)");
+
+                    b.Property<int>("Hits")
+                        .HasColumnType("int")
+                        .HasComment("적중 수");
+
+                    b.Property<int>("Misses")
+                        .HasColumnType("int")
+                        .HasComment("실패 수");
+
+                    b.Property<int>("Predictions")
+                        .HasColumnType("int")
+                        .HasComment("채점 완료 예측 총계 (Hits+Misses+Voids)");
+
+                    b.Property<byte>("Tier")
+                        .HasColumnType("tinyint")
+                        .HasComment("배지 등급 (0=None/1=Bronze/2=Silver/3=Gold/4=GoldAnt)");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("갱신 일시");
+
+                    b.Property<int>("Voids")
+                        .HasColumnType("int")
+                        .HasComment("무효 수 (표본 제외)");
+
+                    b.HasKey("MemberID");
+
+                    b.HasIndex("HitRate")
+                        .IsDescending()
+                        .HasDatabaseName("IX_MemberTrackRecord_HitRate")
+                        .HasFilter("[Predictions] >= 10");
+
+                    b.ToTable("MemberTrackRecord", null, t =>
+                        {
+                            t.HasComment("회원 예측 트랙레코드 집계 (적중률 배지·리더보드)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.RefreshToken", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime>("ExpiresAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsRevoked")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bit")
+                        .HasDefaultValue(false);
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("ReplacedByToken")
+                        .HasMaxLength(256)
+                        .HasColumnType("nvarchar(256)");
+
+                    b.Property<DateTime?>("RevokedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Token")
+                        .IsRequired()
+                        .HasMaxLength(256)
+                        .HasColumnType("nvarchar(256)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("Token")
+                        .IsUnique();
+
+                    b.ToTable("RefreshToken", null, t =>
+                        {
+                            t.HasComment("리프레시 토큰");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Notes.Note", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Content")
+                        .IsRequired()
+                        .HasMaxLength(2000)
+                        .HasColumnType("nvarchar(2000)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDeletedByReceiver")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDeletedBySender")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsRead")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsSystem")
+                        .HasColumnType("bit");
+
+                    b.Property<DateTime?>("ReadAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("ReceiverMemberID")
+                        .HasColumnType("int");
+
+                    b.Property<int?>("RelatedID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("RelatedType")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<int>("SenderMemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("SenderMemberID", "IsDeletedBySender", "CreatedAt")
+                        .IsDescending(false, false, true);
+
+                    b.HasIndex("ReceiverMemberID", "IsDeletedByReceiver", "IsRead", "CreatedAt")
+                        .IsDescending(false, false, false, true);
+
+                    b.ToTable("Note", null, t =>
+                        {
+                            t.HasComment("쪽지");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Notifications.Notification", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("ActionUrl")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("ImageUrl")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<bool>("IsRead")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Message")
+                        .IsRequired()
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<DateTime?>("ReadAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int?>("RelatedID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("RelatedType")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID", "IsRead", "CreatedAt")
+                        .IsDescending(false, false, true);
+
+                    b.HasIndex("MemberID", "Type", "CreatedAt")
+                        .IsDescending(false, false, true);
+
+                    b.ToTable("Notification", null, t =>
+                        {
+                            t.HasComment("알림");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Banner.BannerItem", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("DesktopImage")
+                        .HasMaxLength(1024)
+                        .HasColumnType("nvarchar(1024)")
+                        .HasComment("이미지(Desktop)");
+
+                    b.Property<DateTime?>("EndAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("사용 기간 - 종료");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<string>("Link")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("주소");
+
+                    b.Property<string>("LinkTarget")
+                        .IsRequired()
+                        .ValueGeneratedOnAdd()
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)")
+                        .HasDefaultValue("_self")
+                        .HasComment("링크 타겟 (_self/_blank)");
+
+                    b.Property<string>("MobileImage")
+                        .HasMaxLength(1024)
+                        .HasColumnType("nvarchar(1024)")
+                        .HasComment("이미지(Mobile)");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("순서");
+
+                    b.Property<int>("PositionID")
+                        .HasColumnType("int")
+                        .HasComment("배너 위치 ID");
+
+                    b.Property<DateTime?>("StartAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("사용 기간 - 시작");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("배너 명");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("IsActive");
+
+                    b.HasIndex("Order");
+
+                    b.HasIndex("PositionID");
+
+                    b.HasIndex("PositionID", "Order", "IsActive");
+
+                    b.ToTable("BannerItem", null, t =>
+                        {
+                            t.HasComment("배너 아이템");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Banner.BannerPosition", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("위치 구분");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("위치 명");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive");
+
+                    b.HasIndex("Code", "IsActive");
+
+                    b.ToTable("BannerPosition", null, t =>
+                        {
+                            t.HasComment("배너 위치");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Document", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("주소");
+
+                    b.Property<string>("Content")
+                        .HasMaxLength(5000)
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("내용");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(120)
+                        .HasColumnType("nvarchar(120)")
+                        .HasComment("제목");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<int>("Views")
+                        .HasColumnType("int")
+                        .HasComment("조회 수");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive");
+
+                    b.HasIndex("Subject");
+
+                    b.HasIndex("Code", "IsActive");
+
+                    b.ToTable("Document", null, t =>
+                        {
+                            t.HasComment("문서");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Faq.FaqCategory", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("주소");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("순서");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("분류 명");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code")
+                        .IsUnique();
+
+                    b.HasIndex("Order", "IsActive");
+
+                    b.HasIndex("Code", "Order", "IsActive");
+
+                    b.ToTable("FaqCategory", null, t =>
+                        {
+                            t.HasComment("FAQ 분류");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Faq.FaqItem", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Answer")
+                        .HasMaxLength(4000)
+                        .HasColumnType("nvarchar(4000)")
+                        .HasComment("답변");
+
+                    b.Property<int>("CategoryID")
+                        .HasColumnType("int")
+                        .HasComment("분류 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("순서");
+
+                    b.Property<string>("Question")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("질문");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CategoryID");
+
+                    b.HasIndex("IsActive");
+
+                    b.HasIndex("Order");
+
+                    b.HasIndex("Order", "IsActive");
+
+                    b.HasIndex("CategoryID", "Order", "IsActive");
+
+                    b.ToTable("FaqItem", null, t =>
+                        {
+                            t.HasComment("FAQ 목록");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Popup.Popup", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Content")
+                        .HasMaxLength(4000)
+                        .HasColumnType("nvarchar(4000)")
+                        .HasComment("내용");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<DateTime?>("EndAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("사용 기간 - 종료");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<string>("Link")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("주소");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("순서");
+
+                    b.Property<int>("PositionID")
+                        .HasColumnType("int")
+                        .HasComment("팝업 위치 ID");
+
+                    b.Property<DateTime?>("StartAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("사용 기간 - 시작");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("제목");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Order");
+
+                    b.HasIndex("PositionID");
+
+                    b.HasIndex("Order", "IsActive");
+
+                    b.HasIndex("StartAt", "EndAt", "Order", "IsActive");
+
+                    b.ToTable("Popup", null, t =>
+                        {
+                            t.HasComment("팝업");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Popup.PopupPosition", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("위치 구분");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("위치 명");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive");
+
+                    b.HasIndex("Code", "IsActive");
+
+                    b.ToTable("PopupPosition", null, t =>
+                        {
+                            t.HasComment("팝업 위치");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperAccount", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<decimal>("ReservedToken")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("매수 예약 토큰");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion");
+
+                    b.Property<decimal>("Token")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("자유 현금 토큰");
+
+                    b.Property<decimal>("TotalDeposited")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("누적 입금");
+
+                    b.Property<decimal>("TotalWithdrawn")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("누적 출금");
+
+                    b.Property<decimal>("Units")
+                        .HasPrecision(18, 8)
+                        .HasColumnType("decimal(18,8)")
+                        .HasComment("좌수");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID")
+                        .IsUnique();
+
+                    b.ToTable("PaperAccount", null, t =>
+                        {
+                            t.HasComment("모의투자 계좌 (회원당 1개)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperDailySnapshot", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("AccountID")
+                        .HasColumnType("int")
+                        .HasComment("계좌 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("CumReturnBp")
+                        .HasColumnType("int")
+                        .HasComment("누적 수익률 Bp");
+
+                    b.Property<int>("DailyReturnBp")
+                        .HasColumnType("int")
+                        .HasComment("일간 수익률 Bp");
+
+                    b.Property<decimal>("Equity")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("순자산");
+
+                    b.Property<int>("FillCountCum")
+                        .HasColumnType("int")
+                        .HasComment("누적 체결 수");
+
+                    b.Property<int>("MddBp")
+                        .HasColumnType("int")
+                        .HasComment("최대 낙폭 Bp");
+
+                    b.Property<decimal>("PeakEquity")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("최고 순자산");
+
+                    b.Property<decimal>("PositionsValue")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("포지션 평가액");
+
+                    b.Property<decimal>("Token")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("자유+예약 토큰");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date")
+                        .HasComment("거래일");
+
+                    b.Property<decimal>("UnitNav")
+                        .HasPrecision(18, 8)
+                        .HasColumnType("decimal(18,8)")
+                        .HasComment("좌당 순자산");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("AccountID", "TradeDate")
+                        .IsUnique();
+
+                    b.HasIndex("TradeDate", "CumReturnBp")
+                        .IsDescending(false, true);
+
+                    b.ToTable("PaperDailySnapshot", null, t =>
+                        {
+                            t.HasComment("모의투자 계좌 일별 스냅샷 (좌수 NAV·수익률·MDD)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperFill", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<decimal>("Amount")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("체결 총액");
+
+                    b.Property<decimal>("Fee")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("수수료");
+
+                    b.Property<DateTime>("FilledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("OrderID")
+                        .HasColumnType("int")
+                        .HasComment("주문 ID");
+
+                    b.Property<decimal>("Price")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("체결가");
+
+                    b.Property<DateOnly>("PriceDate")
+                        .HasColumnType("date")
+                        .HasComment("체결가 기준일");
+
+                    b.Property<int>("Quantity")
+                        .HasColumnType("int")
+                        .HasComment("수량");
+
+                    b.Property<decimal?>("RealizedPnL")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("매도 확정 손익");
+
+                    b.Property<decimal>("Tax")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("거래세");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("OrderID")
+                        .IsUnique();
+
+                    b.ToTable("PaperFill", null, t =>
+                        {
+                            t.HasComment("모의투자 체결 결과 (주문당 1건, 멱등)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperLedger", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("AccountID")
+                        .HasColumnType("int")
+                        .HasComment("계좌 ID");
+
+                    b.Property<decimal>("BalanceAfter")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("이동 후 자유 토큰 잔액");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<decimal>("TokenAmount")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("이동 토큰");
+
+                    b.Property<byte>("Type")
+                        .HasColumnType("tinyint")
+                        .HasComment("유형 (1=입금, 2=출금)");
+
+                    b.Property<decimal>("UnitsDelta")
+                        .HasPrecision(18, 8)
+                        .HasColumnType("decimal(18,8)")
+                        .HasComment("좌수 변화");
+
+                    b.Property<string>("WalletTxRefID")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("연결 지갑 거래 RefID");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("AccountID", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("PaperLedger", null, t =>
+                        {
+                            t.HasComment("모의투자 입출금 감사 원장");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperOrder", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("AccountID")
+                        .HasColumnType("int")
+                        .HasComment("계좌 ID");
+
+                    b.Property<DateTime>("CancelableUntil")
+                        .HasColumnType("datetime2")
+                        .HasComment("취소 가능 시한");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<byte>("FillRule")
+                        .HasColumnType("tinyint")
+                        .HasComment("체결 규칙 (1=시가, 2=종가)");
+
+                    b.Property<int>("Quantity")
+                        .HasColumnType("int")
+                        .HasComment("수량");
+
+                    b.Property<string>("RejectReason")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("거부 사유");
+
+                    b.Property<decimal>("ReservedAmount")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("매수 예약금");
+
+                    b.Property<byte>("Side")
+                        .HasColumnType("tinyint")
+                        .HasComment("방향 (1=매수, 2=매도)");
+
+                    b.Property<byte>("Status")
+                        .HasColumnType("tinyint")
+                        .HasComment("상태 (1=대기, 2=체결, 3=취소, 4=거부)");
+
+                    b.Property<string>("StockCode")
+                        .IsRequired()
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("단축코드");
+
+                    b.Property<DateOnly>("TargetDate")
+                        .HasColumnType("date")
+                        .HasComment("체결 기준일");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("AccountID", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.HasIndex("Status", "TargetDate");
+
+                    b.ToTable("PaperOrder", null, t =>
+                        {
+                            t.HasComment("모의투자 주문");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperPosition", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("AccountID")
+                        .HasColumnType("int")
+                        .HasComment("계좌 ID");
+
+                    b.Property<decimal>("AvgPrice")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("평균 단가");
+
+                    b.Property<int>("Quantity")
+                        .HasColumnType("int")
+                        .HasComment("보유 수량");
+
+                    b.Property<int>("ReservedQuantity")
+                        .HasColumnType("int")
+                        .HasComment("매도 예약 수량");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion");
+
+                    b.Property<string>("StockCode")
+                        .IsRequired()
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("단축코드");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("AccountID", "StockCode")
+                        .IsUnique();
+
+                    b.ToTable("PaperPosition", null, t =>
+                        {
+                            t.HasComment("모의투자 보유 포지션");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.PaymentOrder", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("Amount")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("CancelledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("FailReason")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("MerchantID")
+                        .IsRequired()
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)");
+
+                    b.Property<string>("OrderID")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<string>("OrderName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)");
+
+                    b.Property<DateTime?>("PaidAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("PaymentMethod")
+                        .HasColumnType("int");
+
+                    b.Property<int>("PointAmount")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TransactionID")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.Property<int>("VatAmount")
+                        .HasColumnType("int");
+
+                    b.Property<string>("VirtualAccountBank")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<DateTime?>("VirtualAccountExpireAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("VirtualAccountHolder")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("VirtualAccountNumber")
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("OrderID")
+                        .IsUnique();
+
+                    b.HasIndex("Status");
+
+                    b.HasIndex("TransactionID");
+
+                    b.ToTable("PaymentOrder", null, t =>
+                        {
+                            t.HasComment("PG 결제 주문");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.PaymentReconcileLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("Amount")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Kind")
+                        .HasColumnType("int");
+
+                    b.Property<int>("PaymentOrderID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Reason")
+                        .IsRequired()
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)");
+
+                    b.Property<string>("TransactionID")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("PaymentOrderID");
+
+                    b.ToTable("PaymentReconcileLog", null, t =>
+                        {
+                            t.HasComment("PG 성공 후 저장 실패 대사 로그 (Phase 1.5)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.Toss.TossCancel", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("CancelAmount")
+                        .HasColumnType("int");
+
+                    b.Property<string>("CancelReason")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.Property<string>("CancelRequester")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)");
+
+                    b.Property<DateTime?>("CanceledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("OrderID")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<string>("PaymentKey")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.Property<int>("PaymentOrderID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("RawResponse")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ResponseCode")
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<string>("ResponseMessage")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<string>("Status")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("TransactionKey")
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("OrderID");
+
+                    b.HasIndex("PaymentKey");
+
+                    b.HasIndex("PaymentOrderID");
+
+                    b.HasIndex("TransactionKey");
+
+                    b.ToTable("TossCancel", null, t =>
+                        {
+                            t.HasComment("토스페이먼츠 결제 취소 (요청+응답)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.Toss.TossConfirm", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("Amount")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("ApprovedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Method")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("OrderID")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<string>("PaymentKey")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.Property<int>("PaymentOrderID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("RawResponse")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ReceiptUrl")
+                        .HasMaxLength(300)
+                        .HasColumnType("nvarchar(300)");
+
+                    b.Property<string>("ResponseCode")
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<string>("ResponseMessage")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<string>("Status")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<int?>("TotalAmount")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("OrderID")
+                        .IsUnique();
+
+                    b.HasIndex("PaymentKey")
+                        .IsUnique();
+
+                    b.HasIndex("PaymentOrderID");
+
+                    b.HasIndex("Status");
+
+                    b.ToTable("TossConfirm", null, t =>
+                        {
+                            t.HasComment("토스페이먼츠 결제 승인 (요청+응답)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.Toss.TossLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("ExtraData")
+                        .HasMaxLength(4000)
+                        .HasColumnType("nvarchar(4000)");
+
+                    b.Property<int>("LogType")
+                        .HasColumnType("int");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Message")
+                        .IsRequired()
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<string>("OrderID")
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<string>("PaymentKey")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code");
+
+                    b.HasIndex("LogType");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("OrderID");
+
+                    b.HasIndex("PaymentKey");
+
+                    b.ToTable("TossLog", null, t =>
+                        {
+                            t.HasComment("토스페이먼츠 결제 에러/실패/웹훅/대사 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.BondDailyTrade", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<byte>("BondMarket")
+                        .HasColumnType("tinyint")
+                        .HasComment("채권 시장 구분 (1=국채전문유통, 2=일반채권, 3=소액채권)");
+
+                    b.Property<decimal>("ChangeAmount")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일 대비 (CMPPREVDD_PRC)");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("종가 가격 (CLSPRC)");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(12)
+                        .HasColumnType("nvarchar(12)")
+                        .HasComment("단축코드 (ISU_CD) — 12자리 ISIN");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<decimal>("High")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("고가 가격 (HGPRC)");
+
+                    b.Property<decimal?>("HighYield")
+                        .HasPrecision(9, 3)
+                        .HasColumnType("decimal(9,3)")
+                        .HasComment("고가 수익률 % (HGPRC_YD)");
+
+                    b.Property<string>("IssueType")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("종목구분 (국채전문, GOVBND_ISU_TP_NM)");
+
+                    b.Property<decimal>("Low")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("저가 가격 (LWPRC)");
+
+                    b.Property<decimal?>("LowYield")
+                        .HasPrecision(9, 3)
+                        .HasColumnType("decimal(9,3)")
+                        .HasComment("저가 수익률 % (LWPRC_YD)");
+
+                    b.Property<string>("MaturityYears")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("만기년수 (국채전문, BND_EXP_TP_NM)");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명");
+
+                    b.Property<decimal>("Open")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("시가 가격 (OPNPRC)");
+
+                    b.Property<decimal?>("OpenYield")
+                        .HasPrecision(9, 3)
+                        .HasColumnType("decimal(9,3)")
+                        .HasComment("시가 수익률 % (OPNPRC_YD)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradeValue")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (ACC_TRDVAL, 원)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량 (ACC_TRDVOL)");
+
+                    b.Property<decimal?>("YieldToMaturity")
+                        .HasPrecision(9, 3)
+                        .HasColumnType("decimal(9,3)")
+                        .HasComment("만기수익률 % (CLSPRC_YD)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BondMarket", "Code", "TradeDate")
+                        .IsUnique();
+
+                    b.HasIndex("BondMarket", "TradeDate", "TradeValue")
+                        .IsDescending(false, false, true);
+
+                    b.ToTable("BondDailyTrade", null, t =>
+                        {
+                            t.HasComment("채권(국채전문유통/일반채권/소액채권) 일별매매 시세 (KRX OpenAPI bon)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.BondIndexDailyPrice", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal?>("AvgConvexity")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("평균 컨벡시티 (AVG_CONVEXITY_PRC)");
+
+                    b.Property<decimal?>("AvgDuration")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("평균 듀레이션 (AVG_DURATION)");
+
+                    b.Property<decimal?>("AvgYield")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("평균 만기수익률 YTM (BND_IDX_AVG_YD)");
+
+                    b.Property<decimal?>("CallReinvestChange")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("Call재투자지수 전일 대비");
+
+                    b.Property<decimal?>("CallReinvestIndex")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("Call재투자지수 (CALL_REINVST_IDX)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("GroupName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("채권지수 그룹명 (BND_IDX_GRP_NM)");
+
+                    b.Property<decimal?>("MarketPriceChange")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("시장가격지수 전일 대비");
+
+                    b.Property<decimal?>("MarketPriceIndex")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("시장가격지수 (MKT_PRC_IDX)");
+
+                    b.Property<decimal?>("NetPriceChange")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("순가격지수 전일 대비");
+
+                    b.Property<decimal?>("NetPriceIndex")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("순가격지수 (NETPRC_IDX)");
+
+                    b.Property<decimal?>("TotalEarningChange")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("총수익지수 전일 대비");
+
+                    b.Property<decimal?>("TotalEarningIndex")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("총수익지수 (TOT_EARNG_IDX)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<decimal?>("ZeroReinvestChange")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("제로재투자지수 전일 대비");
+
+                    b.Property<decimal?>("ZeroReinvestIndex")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("제로재투자지수 (ZERO_REINVST_IDX)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("TradeDate");
+
+                    b.HasIndex("GroupName", "TradeDate")
+                        .IsUnique();
+
+                    b.ToTable("BondIndexDailyPrice", null, t =>
+                        {
+                            t.HasComment("채권지수 일별시세 (KRX OpenAPI idx/bon_dd_trd)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.CommodityDailyTrade", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal?>("ChangeAmount")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일 대비 (CMPPREVDD_PRC) — 금/배출권만");
+
+                    b.Property<decimal?>("ChangeRate")
+                        .HasPrecision(9, 2)
+                        .HasColumnType("decimal(9,2)")
+                        .HasComment("등락률 % (FLUC_RT) — 금/배출권만");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("종가 (TDD_CLSPRC) — 석유는 가중평균가격_경쟁");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(40)
+                        .HasColumnType("nvarchar(40)")
+                        .HasComment("단축코드 (ISU_CD) — 석유는 OIL_NM(유종구분)");
+
+                    b.Property<byte>("CommodityMarket")
+                        .HasColumnType("tinyint")
+                        .HasComment("일반상품 시장 구분 (1=석유, 2=금, 3=배출권)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<decimal>("High")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("고가 (TDD_HGPRC) — 석유 0");
+
+                    b.Property<decimal>("Low")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("저가 (TDD_LWPRC) — 석유 0");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명 (ISU_NM) — 석유는 유종구분");
+
+                    b.Property<decimal>("Open")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("시가 (TDD_OPNPRC) — 석유 0");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradeValue")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (ACC_TRDVAL, 원)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량 (ACC_TRDVOL)");
+
+                    b.Property<decimal?>("WeightedDiscussionPrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("가중평균가격_협의 (WT_DIS_AVG_PRC) — 석유만");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CommodityMarket", "Code", "TradeDate")
+                        .IsUnique();
+
+                    b.HasIndex("CommodityMarket", "TradeDate", "TradeValue")
+                        .IsDescending(false, false, true);
+
+                    b.ToTable("CommodityDailyTrade", null, t =>
+                        {
+                            t.HasComment("일반상품(석유/금/배출권) 일별매매 시세 (KRX OpenAPI gen)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.Disclosure", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<string>("CorpCls")
+                        .IsRequired()
+                        .HasMaxLength(1)
+                        .HasColumnType("nvarchar(1)")
+                        .HasComment("법인구분 (corp_cls, Y유가/K코스닥/N코넥스/E기타)");
+
+                    b.Property<string>("CorpCode")
+                        .IsRequired()
+                        .HasMaxLength(8)
+                        .HasColumnType("nvarchar(8)")
+                        .HasComment("고유번호 (corp_code, 8자리)");
+
+                    b.Property<string>("CorpName")
+                        .IsRequired()
+                        .HasMaxLength(150)
+                        .HasColumnType("nvarchar(150)")
+                        .HasComment("법인명 (corp_name)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("FlrNm")
+                        .IsRequired()
+                        .HasMaxLength(150)
+                        .HasColumnType("nvarchar(150)")
+                        .HasComment("공시 제출인명 (flr_nm)");
+
+                    b.Property<DateOnly>("RceptDt")
+                        .HasColumnType("date")
+                        .HasComment("접수일자 (rcept_dt)");
+
+                    b.Property<string>("RceptNo")
+                        .IsRequired()
+                        .HasMaxLength(14)
+                        .HasColumnType("nvarchar(14)")
+                        .HasComment("접수번호 (rcept_no, 14자리)");
+
+                    b.Property<string>("ReportNm")
+                        .IsRequired()
+                        .HasMaxLength(400)
+                        .HasColumnType("nvarchar(400)")
+                        .HasComment("보고서명 (report_nm)");
+
+                    b.Property<string>("Rm")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("비고 (rm)");
+
+                    b.Property<string>("StockCode")
+                        .HasMaxLength(6)
+                        .HasColumnType("nvarchar(6)")
+                        .HasComment("종목코드 (stock_code, 6자리) — 비상장이면 null");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("RceptDt")
+                        .IsDescending();
+
+                    b.HasIndex("RceptNo")
+                        .IsUnique();
+
+                    b.HasIndex("StockCode", "RceptDt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("Disclosure", null, t =>
+                        {
+                            t.HasComment("전자공시(DART) 공시 목록 (OpenDART list.json)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.EsgIndexDailyPrice", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal>("ChangeVal")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일비 (PRV_DD_CMPR)");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("현재가/종가 (CLSPRC_IDX)");
+
+                    b.Property<int>("ConstituentCount")
+                        .HasColumnType("int")
+                        .HasComment("구성종목수 (TRD_ISU_CNT)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FlucRateBp")
+                        .HasColumnType("int")
+                        .HasComment("등락률 basis point (%×100, UPDN_RATE)");
+
+                    b.Property<string>("IndexName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("지수명 (IDX_NM)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("Value")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (ACC_TRDVAL, 백만원)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량 (ACC_TRDVOL, 천주)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("TradeDate");
+
+                    b.HasIndex("IndexName", "TradeDate")
+                        .IsUnique();
+
+                    b.ToTable("EsgIndexDailyPrice", null, t =>
+                        {
+                            t.HasComment("ESG 지수 일별시세 (KRX OpenAPI esg/esg_index_info)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.EsgSecurity", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal>("ChangeAmount")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일비 (CMPPREVDD_PRC)");
+
+                    b.Property<decimal>("ChangeRate")
+                        .HasPrecision(9, 2)
+                        .HasColumnType("decimal(9,2)")
+                        .HasComment("등락률 % (FLUC_RT)");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("현재가/종가 (TDD_CLSPRC)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<long>("ListedShares")
+                        .HasColumnType("bigint")
+                        .HasComment("상장좌수 (LIST_SHRS)");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명 (ISU_ABBRV)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradeValue")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금(원) (ACC_TRDVAL)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량(좌) (ACC_TRDVOL)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Name", "TradeDate")
+                        .IsUnique();
+
+                    b.HasIndex("TradeDate", "TradeValue")
+                        .IsDescending(false, true);
+
+                    b.ToTable("EsgSecurity", null, t =>
+                        {
+                            t.HasComment("ESG 증권상품 일별시세 (KRX OpenAPI esg/esg_etp_info)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.EtpDailyTrade", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal?>("BaseIndexClose")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("기초지수 종가 (ETF/ETN)");
+
+                    b.Property<string>("BaseIndexName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("기초지수명 (ETF/ETN)");
+
+                    b.Property<decimal>("ChangeAmount")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일 대비");
+
+                    b.Property<decimal>("ChangeRate")
+                        .HasPrecision(7, 2)
+                        .HasColumnType("decimal(7,2)")
+                        .HasComment("등락률 % (ELW 는 0)");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("종가");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("단축코드 (ISU_CD)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<byte>("EtpType")
+                        .HasColumnType("tinyint")
+                        .HasComment("증권상품 구분 (1=ETF, 2=ETN, 3=ELW)");
+
+                    b.Property<decimal>("High")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("고가");
+
+                    b.Property<long?>("ListedShares")
+                        .HasColumnType("bigint")
+                        .HasComment("상장증권수/상장좌수");
+
+                    b.Property<decimal>("Low")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("저가");
+
+                    b.Property<long?>("MarketCap")
+                        .HasColumnType("bigint")
+                        .HasComment("시가총액 (원)");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명");
+
+                    b.Property<decimal?>("Nav")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("ETF NAV / ETN 지표가치(IV)");
+
+                    b.Property<long?>("NetAssetTotal")
+                        .HasColumnType("bigint")
+                        .HasComment("ETF 순자산총액 / ETN 지표가치총액 (원)");
+
+                    b.Property<decimal>("Open")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("시가");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradeValue")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (원)");
+
+                    b.Property<string>("Underlying")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("ELW 기초자산명");
+
+                    b.Property<decimal?>("UnderlyingClose")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("ELW 기초자산 종가");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("EtpType", "Code", "TradeDate")
+                        .IsUnique();
+
+                    b.HasIndex("EtpType", "TradeDate", "TradeValue")
+                        .IsDescending(false, false, true);
+
+                    b.ToTable("EtpDailyTrade", null, t =>
+                        {
+                            t.HasComment("증권상품(ETF/ETN/ELW) 일별매매 시세 (KRX OpenAPI etp)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.ExchangeRate", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("CurrencyName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("통화명 (cur_nm)");
+
+                    b.Property<string>("CurrencyUnit")
+                        .IsRequired()
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("통화 코드 (cur_unit) — 예: USD, JPY(100)");
+
+                    b.Property<decimal>("DealBasRate")
+                        .HasPrecision(10, 2)
+                        .HasColumnType("decimal(10,2)")
+                        .HasComment("매매기준율 (deal_bas_r)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<decimal?>("Ttb")
+                        .HasPrecision(10, 2)
+                        .HasColumnType("decimal(10,2)")
+                        .HasComment("전신환 받으실 때 (ttb)");
+
+                    b.Property<decimal?>("Tts")
+                        .HasPrecision(10, 2)
+                        .HasColumnType("decimal(10,2)")
+                        .HasComment("전신환 보내실 때 (tts)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("TradeDate");
+
+                    b.HasIndex("CurrencyUnit", "TradeDate")
+                        .IsUnique();
+
+                    b.ToTable("ExchangeRate", null, t =>
+                        {
+                            t.HasComment("일별 환율 (한국수출입은행 OpenAPI AP01 현재환율)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.FuturesDailyTrade", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal>("ChangeAmount")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일 대비 (CMPPREVDD_PRC)");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("종가 (TDD_CLSPRC)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<byte>("FuturesKind")
+                        .HasColumnType("tinyint")
+                        .HasComment("선물 상품군 구분 (1=일반선물, 2=주식선물유가, 3=주식선물코스닥)");
+
+                    b.Property<decimal>("High")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("고가 (TDD_HGPRC)");
+
+                    b.Property<string>("IsuCode")
+                        .IsRequired()
+                        .HasMaxLength(12)
+                        .HasColumnType("nvarchar(12)")
+                        .HasComment("종목코드 (ISU_CD) — 8자리 영숫자");
+
+                    b.Property<string>("IsuName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명");
+
+                    b.Property<decimal>("Low")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("저가 (TDD_LWPRC)");
+
+                    b.Property<string>("MarketName")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("시장구분 (MKT_NM 정규/야간)");
+
+                    b.Property<decimal>("Open")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("시가 (TDD_OPNPRC)");
+
+                    b.Property<long?>("OpenInterest")
+                        .HasColumnType("bigint")
+                        .HasComment("미결제약정 (ACC_OPNINT_QTY)");
+
+                    b.Property<string>("ProductName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("상품구분 (PROD_NM)");
+
+                    b.Property<byte>("Session")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("tinyint")
+                        .HasDefaultValue((byte)1)
+                        .HasComment("매매 세션 (1=정규, 2=야간)");
+
+                    b.Property<decimal?>("SettlePrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("정산가 (SETL_PRC)");
+
+                    b.Property<decimal?>("SpotPrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("현물가 (SPOT_PRC)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradeValue")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (ACC_TRDVAL, 원)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량 (ACC_TRDVOL)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FuturesKind", "IsuCode", "TradeDate", "Session")
+                        .IsUnique();
+
+                    b.HasIndex("FuturesKind", "TradeDate", "Session", "TradeValue")
+                        .IsDescending(false, false, false, true);
+
+                    b.ToTable("FuturesDailyTrade", null, t =>
+                        {
+                            t.HasComment("선물(일반/주식유가/주식코스닥) 일별매매 시세 (KRX OpenAPI drv)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.IndexDailyPrice", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal>("ChangeVal")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일 대비");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("종가");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FlucRateBp")
+                        .HasColumnType("int")
+                        .HasComment("등락률 basis point (%×100)");
+
+                    b.Property<decimal>("High")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("고가");
+
+                    b.Property<string>("IndexName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("지수명");
+
+                    b.Property<decimal>("Low")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("저가");
+
+                    b.Property<long?>("MarketCap")
+                        .HasColumnType("bigint")
+                        .HasComment("상장시가총액 (원)");
+
+                    b.Property<decimal>("Open")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("시가");
+
+                    b.Property<byte>("Series")
+                        .HasColumnType("tinyint")
+                        .HasComment("계열 구분 (1=KOSPI, 2=KOSDAQ, 3=KRX)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("Value")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (원)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("TradeDate");
+
+                    b.HasIndex("Series", "IndexName", "TradeDate")
+                        .IsUnique();
+
+                    b.ToTable("IndexDailyPrice", null, t =>
+                        {
+                            t.HasComment("지수(시장) 일별 마감 시세 (KRX OpenAPI)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.InterestRate", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("ItemName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("항목명 (cur_nm 등)");
+
+                    b.Property<decimal?>("Rate")
+                        .HasPrecision(9, 4)
+                        .HasColumnType("decimal(9,4)")
+                        .HasComment("금리 % — 미고시 시 null");
+
+                    b.Property<byte>("RateType")
+                        .HasColumnType("tinyint")
+                        .HasComment("금리 종류 (1=대출금리, 2=국제금리)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("TradeDate");
+
+                    b.HasIndex("RateType", "ItemName", "TradeDate")
+                        .IsUnique();
+
+                    b.ToTable("InterestRate", null, t =>
+                        {
+                            t.HasComment("일별 금리 (한국수출입은행 OpenAPI AP02 대출금리 / AP03 국제금리)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.MarketHoliday", b =>
+                {
+                    b.Property<DateOnly>("Date")
+                        .HasColumnType("date");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("휴장 사유");
+
+                    b.HasKey("Date");
+
+                    b.ToTable("MarketHoliday", null, t =>
+                        {
+                            t.HasComment("KRX 휴장일 (주말 제외, Admin 수동 관리)");
+                        });
+
+                    b.HasData(
+                        new
+                        {
+                            Date = new DateOnly(2026, 1, 1),
+                            Name = "신정"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 2, 16),
+                            Name = "설날 연휴"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 2, 17),
+                            Name = "설날"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 2, 18),
+                            Name = "설날 연휴"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 3, 2),
+                            Name = "삼일절 대체공휴일"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 5, 5),
+                            Name = "어린이날"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 5, 25),
+                            Name = "부처님오신날 대체공휴일"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 6, 3),
+                            Name = "전국동시지방선거"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 8, 17),
+                            Name = "광복절 대체공휴일"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 9, 24),
+                            Name = "추석 연휴"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 9, 25),
+                            Name = "추석"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 9, 28),
+                            Name = "추석 대체공휴일"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 10, 5),
+                            Name = "개천절 대체공휴일"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 10, 9),
+                            Name = "한글날"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 12, 25),
+                            Name = "성탄절"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 12, 31),
+                            Name = "연말 휴장일"
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.OptionsDailyTrade", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal>("ChangeAmount")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일 대비 (CMPPREVDD_PRC)");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("종가 (TDD_CLSPRC)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<decimal>("High")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("고가 (TDD_HGPRC)");
+
+                    b.Property<decimal?>("ImpliedVolatility")
+                        .HasPrecision(9, 3)
+                        .HasColumnType("decimal(9,3)")
+                        .HasComment("내재변동성 % (IMP_VOLT)");
+
+                    b.Property<string>("IsuCode")
+                        .IsRequired()
+                        .HasMaxLength(12)
+                        .HasColumnType("nvarchar(12)")
+                        .HasComment("종목코드 (ISU_CD) — 8자리 영숫자");
+
+                    b.Property<string>("IsuName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명");
+
+                    b.Property<decimal>("Low")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("저가 (TDD_LWPRC)");
+
+                    b.Property<decimal?>("NextDayBasePrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("익일정산가 (NXTDD_BAS_PRC)");
+
+                    b.Property<decimal>("Open")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("시가 (TDD_OPNPRC)");
+
+                    b.Property<long?>("OpenInterest")
+                        .HasColumnType("bigint")
+                        .HasComment("미결제약정 (ACC_OPNINT_QTY)");
+
+                    b.Property<byte>("OptionsKind")
+                        .HasColumnType("tinyint")
+                        .HasComment("옵션 상품군 구분 (1=일반옵션, 2=주식옵션유가, 3=주식옵션코스닥)");
+
+                    b.Property<string>("ProductName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("상품구분 (PROD_NM)");
+
+                    b.Property<byte>("RightType")
+                        .HasColumnType("tinyint")
+                        .HasComment("권리유형 (RGHT_TP_NM — 1=Call, 2=Put)");
+
+                    b.Property<byte>("Session")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("tinyint")
+                        .HasDefaultValue((byte)1)
+                        .HasComment("매매 세션 (1=정규, 2=야간)");
+
+                    b.Property<decimal?>("StrikePrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("행사가 (ISU_NM 에서 파싱)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradeValue")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (ACC_TRDVAL, 원)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량 (ACC_TRDVOL)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("OptionsKind", "IsuCode", "TradeDate", "Session")
+                        .IsUnique();
+
+                    b.HasIndex("OptionsKind", "TradeDate", "Session", "TradeValue")
+                        .IsDescending(false, false, false, true);
+
+                    b.ToTable("OptionsDailyTrade", null, t =>
+                        {
+                            t.HasComment("옵션(일반/주식유가/주식코스닥) 일별매매 시세 (KRX OpenAPI drv)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.SeibroIssuerCode", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("IssucoCustno")
+                        .HasColumnType("int")
+                        .HasComment("발행회사 고객번호 (ISSUCO_CUSTNO)");
+
+                    b.Property<string>("Market")
+                        .IsRequired()
+                        .HasMaxLength(2)
+                        .HasColumnType("nchar(2)")
+                        .IsFixedLength()
+                        .HasComment("시장구분 (MART_TPCD) — 11유가/12코스닥/13K-OTC/14코넥스/50기타");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명 (KOR_SECN_NM)");
+
+                    b.Property<string>("ShortCode")
+                        .IsRequired()
+                        .HasMaxLength(12)
+                        .HasColumnType("nvarchar(12)")
+                        .HasComment("단축코드 (SHOTN_ISIN)");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("IssucoCustno");
+
+                    b.HasIndex("Market", "ShortCode")
+                        .IsUnique();
+
+                    b.ToTable("SeibroIssuerCode", null, t =>
+                        {
+                            t.HasComment("SEIBro 시장별 단축코드↔발행회사번호 매핑 (getShotnByMart)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.SriBond", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<string>("BondType")
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("채권유형 (BND_TP_NM)");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(12)
+                        .HasColumnType("nvarchar(12)")
+                        .HasComment("표준코드 (ISU_CD) — 12자리 ISIN");
+
+                    b.Property<decimal?>("CouponRate")
+                        .HasPrecision(9, 5)
+                        .HasColumnType("decimal(9,5)")
+                        .HasComment("표면이자율 % (ISU_RT)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<long>("IssueAmount")
+                        .HasColumnType("bigint")
+                        .HasComment("발행금액 (ISU_AMT, 원)");
+
+                    b.Property<DateOnly?>("IssueDate")
+                        .HasColumnType("date")
+                        .HasComment("발행일 (ISU_DD)");
+
+                    b.Property<string>("IssuerName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("발행기관 (ISUR_NM)");
+
+                    b.Property<long>("ListAmount")
+                        .HasColumnType("bigint")
+                        .HasComment("상장금액 (LIST_AMT, 원)");
+
+                    b.Property<DateOnly?>("ListDate")
+                        .HasColumnType("date")
+                        .HasComment("상장일 (LIST_DD)");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명 (ISU_NM)");
+
+                    b.Property<DateOnly?>("RedemptionDate")
+                        .HasColumnType("date")
+                        .HasComment("상환일 (REDMPT_DD)");
+
+                    b.Property<string>("SriBondType")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("채권종류 (SRI_BND_TP_NM)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code", "TradeDate")
+                        .IsUnique();
+
+                    b.HasIndex("TradeDate", "SriBondType");
+
+                    b.ToTable("SriBond", null, t =>
+                        {
+                            t.HasComment("사회책임투자채권(SRI) 정보 스냅샷 (KRX OpenAPI esg/sri_bond_info)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.Stock", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("단축코드");
+
+                    b.Property<string>("CorpCode")
+                        .HasMaxLength(8)
+                        .HasColumnType("nchar(8)")
+                        .IsFixedLength()
+                        .HasComment("DART 고유번호");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateOnly?>("DelistedDate")
+                        .HasColumnType("date");
+
+                    b.Property<string>("EnglishName")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.Property<decimal?>("FaceValue")
+                        .HasPrecision(15, 4)
+                        .HasColumnType("decimal(15,4)")
+                        .HasComment("액면가 (SEIBro PVAL)");
+
+                    b.Property<string>("ISIN")
+                        .HasMaxLength(12)
+                        .HasColumnType("nchar(12)")
+                        .IsFixedLength()
+                        .HasComment("표준코드");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<bool?>("IsElectronicSecurity")
+                        .HasColumnType("bit")
+                        .HasComment("전자증권 여부 (SEIBro ELTSC_YN)");
+
+                    b.Property<int?>("IssucoCustno")
+                        .HasColumnType("int")
+                        .HasComment("SEIBro 발행회사 고객번호 (ISSUCO_CUSTNO) — 기업정보 API 조인키");
+
+                    b.Property<decimal?>("LastChangeRate")
+                        .HasPrecision(7, 2)
+                        .HasColumnType("decimal(7,2)");
+
+                    b.Property<int?>("LastClosePrice")
+                        .HasColumnType("int");
+
+                    b.Property<DateOnly?>("LastTradingDate")
+                        .HasColumnType("date");
+
+                    b.Property<DateOnly>("ListedDate")
+                        .HasColumnType("date");
+
+                    b.Property<byte>("Market")
+                        .HasColumnType("tinyint")
+                        .HasComment("시장 구분 (1=KOSPI, 2=KOSDAQ, 3=KONEX)");
+
+                    b.Property<long?>("MarketCap")
+                        .HasColumnType("bigint");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)");
+
+                    b.Property<string>("SectorName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)");
+
+                    b.Property<long?>("TotalIssuedShares")
+                        .HasColumnType("bigint")
+                        .HasComment("총발행주식수 (SEIBro TOTAL_STK_CNT)");
+
+                    b.Property<byte>("TradingStatus")
+                        .HasColumnType("tinyint")
+                        .HasComment("거래 상태 (0=정상, 1=거래정지, 2=관리종목)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<decimal?>("VotingRights")
+                        .HasPrecision(5, 2)
+                        .HasColumnType("decimal(5,2)")
+                        .HasComment("1주당 의결권수 (SEIBro VOTRNO)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code")
+                        .IsUnique();
+
+                    b.HasIndex("CorpCode");
+
+                    b.HasIndex("ISIN")
+                        .IsUnique()
+                        .HasFilter("[ISIN] IS NOT NULL");
+
+                    b.HasIndex("IssucoCustno");
+
+                    b.HasIndex("Name");
+
+                    b.HasIndex("Market", "IsActive");
+
+                    b.ToTable("Stock", null, t =>
+                        {
+                            t.HasComment("종목 마스터 (KRX 상장종목)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.StockBoardStats", b =>
+                {
+                    b.Property<string>("StockCode")
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("종목 단축코드 (PK)");
+
+                    b.Property<int>("Comments")
+                        .HasColumnType("int")
+                        .HasComment("댓글 수");
+
+                    b.Property<DateTime?>("LastPostAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 글 작성 일시");
+
+                    b.Property<int>("Posts")
+                        .HasColumnType("int")
+                        .HasComment("게시글 수");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("갱신 일시");
+
+                    b.HasKey("StockCode");
+
+                    b.ToTable("StockBoardStats", null, t =>
+                        {
+                            t.HasComment("종목 가상보드 통계 (글/댓글 수)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.StockDailyPrice", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<int>("ChangeAmount")
+                        .HasColumnType("int");
+
+                    b.Property<decimal>("ChangeRate")
+                        .HasPrecision(7, 2)
+                        .HasColumnType("decimal(7,2)")
+                        .HasComment("등락률 %");
+
+                    b.Property<int>("Close")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("High")
+                        .HasColumnType("int");
+
+                    b.Property<long?>("ListedShares")
+                        .HasColumnType("bigint");
+
+                    b.Property<int>("Low")
+                        .HasColumnType("int");
+
+                    b.Property<long?>("MarketCap")
+                        .HasColumnType("bigint");
+
+                    b.Property<int>("Open")
+                        .HasColumnType("int");
+
+                    b.Property<int>("StockID")
+                        .HasColumnType("int");
+
+                    b.Property<DateOnly>("TradingDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradingValue")
+                        .HasColumnType("bigint");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("StockID", "TradingDate")
+                        .IsUnique();
+
+                    b.HasIndex("TradingDate", "ChangeRate")
+                        .IsDescending(false, true);
+
+                    b.HasIndex("TradingDate", "TradingValue")
+                        .IsDescending(false, true);
+
+                    b.ToTable("StockDailyPrice", null, t =>
+                        {
+                            t.HasComment("T+1 일별 마감 시세 (금융위 API)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.WarrantDailyTrade", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal>("ChangeAmount")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일 대비");
+
+                    b.Property<decimal>("ChangeRate")
+                        .HasPrecision(7, 2)
+                        .HasColumnType("decimal(7,2)")
+                        .HasComment("등락률 %");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("종가");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(12)
+                        .HasColumnType("nvarchar(12)")
+                        .HasComment("단축코드 (ISU_CD) — 8자리 영숫자");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateOnly?>("DelistDate")
+                        .HasColumnType("date")
+                        .HasComment("상장폐지일 (증서, DELIST_DD)");
+
+                    b.Property<DateOnly?>("ExerciseEndDate")
+                        .HasColumnType("date")
+                        .HasComment("행사 종료일 (증권, EXST_END_DD)");
+
+                    b.Property<decimal?>("ExercisePrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("행사가 (증권, EXER_PRC)");
+
+                    b.Property<DateOnly?>("ExerciseStartDate")
+                        .HasColumnType("date")
+                        .HasComment("행사 시작일 (증권, EXST_STRT_DD)");
+
+                    b.Property<decimal>("High")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("고가");
+
+                    b.Property<decimal?>("IssuePrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("발행가 (증서, ISU_PRC)");
+
+                    b.Property<long?>("ListedShares")
+                        .HasColumnType("bigint")
+                        .HasComment("상장증권수");
+
+                    b.Property<decimal>("Low")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("저가");
+
+                    b.Property<byte>("Market")
+                        .HasColumnType("tinyint")
+                        .HasComment("시장 구분 (1=KOSPI, 2=KOSDAQ, 3=KONEX)");
+
+                    b.Property<long?>("MarketCap")
+                        .HasColumnType("bigint")
+                        .HasComment("시가총액 (원)");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명");
+
+                    b.Property<decimal>("Open")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("시가");
+
+                    b.Property<string>("TargetStockCode")
+                        .HasMaxLength(6)
+                        .HasColumnType("nvarchar(6)")
+                        .HasComment("대상주식 단축코드 (TARSTK_ISU_SRT_CD)");
+
+                    b.Property<string>("TargetStockName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("대상주식명 (TARSTK_ISU_NM)");
+
+                    b.Property<decimal?>("TargetStockPrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("대상주식 현재가 (TARSTK_ISU_PRSNT_PRC)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradeValue")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (원)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량");
+
+                    b.Property<byte>("WarrantType")
+                        .HasColumnType("tinyint")
+                        .HasComment("신주인수권 구분 (1=증권, 2=증서)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("WarrantType", "Code", "TradeDate")
+                        .IsUnique();
+
+                    b.HasIndex("WarrantType", "TradeDate", "TradeValue")
+                        .IsDescending(false, false, true);
+
+                    b.ToTable("WarrantDailyTrade", null, t =>
+                        {
+                            t.HasComment("신주인수권증권/증서 일별매매 시세 (KRX OpenAPI sto sw/sr)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Coupon", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("ExpiresAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("GameID")
+                        .HasColumnType("int")
+                        .HasComment("게임 ID (필수)");
+
+                    b.Property<int>("GeneratedCount")
+                        .HasColumnType("int");
+
+                    b.Property<int>("LowStockThreshold")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(10);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.Property<int>("ProductID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("UsagePolicy")
+                        .HasColumnType("int");
+
+                    b.Property<int>("UsedCount")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("GameID");
+
+                    b.HasIndex("ProductID");
+
+                    b.ToTable("Coupon", null, t =>
+                        {
+                            t.HasComment("쿠폰 메타 (코드 풀의 상위)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.CouponCode", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("코드 평문 (사용자 표시용)");
+
+                    b.Property<string>("CodeHash")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)")
+                        .HasComment("SHA-256 hex (UNIQUE, 조회용)");
+
+                    b.Property<int>("CouponID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("IssuedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int?>("IssuedToMemberID")
+                        .HasColumnType("int");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int")
+                        .HasComment("상태 (1=Available, 2=Reserved, 3=Issued, 4=Used)");
+
+                    b.Property<DateTime?>("UsedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CodeHash")
+                        .IsUnique();
+
+                    b.HasIndex("IssuedToMemberID");
+
+                    b.HasIndex("CouponID", "Status");
+
+                    b.ToTable("CouponCode", null, t =>
+                        {
+                            t.HasComment("쿠폰 코드 풀 (Code 평문 + CodeHash SHA-256 hex)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Game", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("BigImage")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("큰 이미지 (상세/배너용)");
+
+                    b.Property<string>("Code")
+                        .HasMaxLength(6)
+                        .HasColumnType("nvarchar(6)")
+                        .HasComment("게임 코드 (UNIQUE, 외부 연동/내부 식별)");
+
+                    b.Property<decimal>("CommissionRate")
+                        .HasPrecision(10, 7)
+                        .HasColumnType("decimal(10,7)")
+                        .HasComment("게임사 수익률(%) — 0~100, 소수점 7자리");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("게임 소개 (CKEditor HTML)");
+
+                    b.Property<string>("EngName")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("게임 영문명");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("KorName")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("게임 한글명");
+
+                    b.Property<string>("Link")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("게임 다운로드/공식 사이트 주소");
+
+                    b.Property<string>("MinSpec")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("최소 사양 (자유 텍스트)");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Publisher")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("게임사/퍼블리셔");
+
+                    b.Property<string>("RecommendedSpec")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("권장 사양 (자유 텍스트)");
+
+                    b.Property<DateOnly?>("ReleaseDate")
+                        .HasColumnType("date")
+                        .HasComment("게임 출시일");
+
+                    b.Property<string>("Thumbnail")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("작은 이미지 (목록 카드용)");
+
+                    b.Property<string>("TrailerUrl")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("YouTube 예고편 URL");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code")
+                        .IsUnique()
+                        .HasFilter("[Code] IS NOT NULL");
+
+                    b.HasIndex("KorName")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive", "Order");
+
+                    b.ToTable("Game", null, t =>
+                        {
+                            t.HasComment("상점 제휴 게임");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameCategory", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("EngName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("카테고리 영문명");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("KorName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("카테고리 한글명");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("KorName")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive", "Order");
+
+                    b.ToTable("GameCategory", null, t =>
+                        {
+                            t.HasComment("게임 카테고리 코드");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameCategoryMap", b =>
+                {
+                    b.Property<int>("GameID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("GameCategoryID")
+                        .HasColumnType("int");
+
+                    b.HasKey("GameID", "GameCategoryID");
+
+                    b.HasIndex("GameCategoryID");
+
+                    b.ToTable("GameCategoryMap", null, t =>
+                        {
+                            t.HasComment("게임-카테고리 N:M");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameGenre", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("EngName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("장르 영문명");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("KorName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("장르 한글명");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("KorName")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive", "Order");
+
+                    b.ToTable("GameGenre", null, t =>
+                        {
+                            t.HasComment("게임 장르 코드");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameGenreMap", b =>
+                {
+                    b.Property<int>("GameID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("GameGenreID")
+                        .HasColumnType("int");
+
+                    b.HasKey("GameID", "GameGenreID");
+
+                    b.HasIndex("GameGenreID");
+
+                    b.ToTable("GameGenreMap", null, t =>
+                        {
+                            t.HasComment("게임-장르 N:M");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameImage", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("ContentType")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("MIME");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("비활성 일시");
+
+                    b.Property<string>("Extension")
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)")
+                        .HasComment("확장자");
+
+                    b.Property<string>("FileName")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("원본 파일명");
+
+                    b.Property<int>("GameID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("HashedName")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("저장 파일명(해시)");
+
+                    b.Property<short?>("Height")
+                        .HasColumnType("smallint")
+                        .HasComment("세로 픽셀");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit")
+                        .HasComment("비활성 여부");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int")
+                        .HasComment("정렬 순서");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("상대 경로");
+
+                    b.Property<long?>("Size")
+                        .HasColumnType("bigint")
+                        .HasComment("바이트 크기");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("UUID");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("접근 URL");
+
+                    b.Property<short?>("Width")
+                        .HasColumnType("smallint")
+                        .HasComment("가로 픽셀");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("GameID");
+
+                    b.HasIndex("UUID")
+                        .IsUnique();
+
+                    b.HasIndex("GameID", "IsDisabled");
+
+                    b.ToTable("GameImage", null, t =>
+                        {
+                            t.HasComment("게임 상세 이미지 갤러리");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameLanguage", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("EngName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("언어 영문명");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("KorName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("언어 한글명");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("KorName")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive", "Order");
+
+                    b.ToTable("GameLanguage", null, t =>
+                        {
+                            t.HasComment("게임 지원 언어 마스터");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameLanguageSupport", b =>
+                {
+                    b.Property<int>("GameID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("GameLanguageID")
+                        .HasColumnType("int");
+
+                    b.Property<bool>("FullAudio")
+                        .HasColumnType("bit")
+                        .HasComment("풀 오디오(음성) 지원");
+
+                    b.Property<bool>("Interface")
+                        .HasColumnType("bit")
+                        .HasComment("인터페이스 지원");
+
+                    b.Property<bool>("Subtitles")
+                        .HasColumnType("bit")
+                        .HasComment("자막 지원");
+
+                    b.HasKey("GameID", "GameLanguageID");
+
+                    b.HasIndex("GameLanguageID");
+
+                    b.ToTable("GameLanguageSupport", null, t =>
+                        {
+                            t.HasComment("게임별 언어 지원 (인터페이스/풀오디오/자막)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameSettlement", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AdminMemo")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("GameID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Month")
+                        .HasColumnType("int");
+
+                    b.Property<int>("OrderCount")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("SettledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("SettledByAdminEmail")
+                        .HasMaxLength(256)
+                        .HasColumnType("nvarchar(256)");
+
+                    b.Property<string>("SettledByAdminUserId")
+                        .HasMaxLength(450)
+                        .HasColumnType("nvarchar(450)");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int")
+                        .HasComment("정산 상태 (1=Pending, 2=Settled)");
+
+                    b.Property<int>("TotalRevenueAmount")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Year")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("GameID", "Year", "Month")
+                        .IsUnique();
+
+                    b.HasIndex("Year", "Month", "Status");
+
+                    b.ToTable("GameSettlement", null, t =>
+                        {
+                            t.HasComment("게임사 월별 정산 큐");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.MemberAddress", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Address1_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("기본 주소 (암호화)");
+
+                    b.Property<string>("Address2_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("상세 주소 (암호화)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDefault")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("KeyVersion")
+                        .HasColumnType("int")
+                        .HasComment("암호화 키 버전");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Phone_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("연락처 (암호화)");
+
+                    b.Property<string>("RecipientName_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("수령인명 (암호화)");
+
+                    b.Property<string>("RecipientName_Hash")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)")
+                        .HasComment("수령인명 SHA-256 hex (검색용)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("ZipCode")
+                        .IsRequired()
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("RecipientName_Hash");
+
+                    b.HasIndex("MemberID", "IsDefault");
+
+                    b.ToTable("MemberAddress", null, t =>
+                        {
+                            t.HasComment("회원 배송 주소 (AES-GCM 암호화)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.MemberInventory", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("AcquiredAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("CouponCodeID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("DeletedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("사용자 보관함 소프트 삭제 일시. NULL = 보관함 노출");
+
+                    b.Property<DateTime?>("ExpiresAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("OrderItemID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("UsedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CouponCodeID")
+                        .IsUnique();
+
+                    b.HasIndex("OrderItemID");
+
+                    b.HasIndex("MemberID", "DeletedAt");
+
+                    b.HasIndex("MemberID", "UsedAt");
+
+                    b.ToTable("MemberInventory", null, t =>
+                        {
+                            t.HasComment("회원 보관함 (Digital 상품)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Order", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("CancelReason")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<int?>("ChannelID")
+                        .HasColumnType("int")
+                        .HasComment("후원 채널 (선택)");
+
+                    b.Property<int>("ChannelRewardAmount")
+                        .HasColumnType("int")
+                        .HasComment("채널주 채널 보상 입금 금액 (비활성 — 과거 주문 호환)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("GameRevenueAmount")
+                        .HasColumnType("int")
+                        .HasComment("게임사 정산 큐 적재 금액");
+
+                    b.Property<string>("GiftMessage")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("선물 메시지");
+
+                    b.Property<int?>("GiftToMemberID")
+                        .HasColumnType("int")
+                        .HasComment("선물 수신자 회원 ID (null=본인구매)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("OrderNumber")
+                        .IsRequired()
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("주문 번호 (UNIQUE)");
+
+                    b.Property<DateTime?>("PaidAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("PlatformFeeAmount")
+                        .HasColumnType("int")
+                        .HasComment("dpot 몫");
+
+                    b.Property<string>("RefundReason")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int")
+                        .HasComment("주문 상태");
+
+                    b.Property<int>("TotalAmount")
+                        .HasColumnType("int")
+                        .HasComment("총 결제 금액");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("ChannelID");
+
+                    b.HasIndex("OrderNumber")
+                        .IsUnique();
+
+                    b.HasIndex("Status", "CreatedAt");
+
+                    b.HasIndex("MemberID", "Status", "CreatedAt");
+
+                    b.ToTable("Order", null, t =>
+                        {
+                            t.HasComment("상점 주문 헤더");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.OrderItem", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int?>("IssuedCouponCodeID")
+                        .HasColumnType("int")
+                        .HasComment("Digital 상품 발급 쿠폰 코드");
+
+                    b.Property<int>("OrderID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("ProductID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Quantity")
+                        .HasColumnType("int");
+
+                    b.Property<int>("UnitPrice")
+                        .HasColumnType("int")
+                        .HasComment("주문 시점 상품 단가 스냅샷");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("IssuedCouponCodeID");
+
+                    b.HasIndex("OrderID");
+
+                    b.HasIndex("ProductID");
+
+                    b.ToTable("OrderItem", null, t =>
+                        {
+                            t.HasComment("주문 라인");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.OrderRefund", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AdminEmail")
+                        .HasMaxLength(256)
+                        .HasColumnType("nvarchar(256)");
+
+                    b.Property<string>("AdminMemo")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<string>("AdminUserId")
+                        .HasMaxLength(450)
+                        .HasColumnType("nvarchar(450)");
+
+                    b.Property<int>("Amount")
+                        .HasColumnType("int");
+
+                    b.Property<int>("OrderID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Reason")
+                        .IsRequired()
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<int>("ReasonType")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(7)
+                        .HasComment("사유 유형 (1=ChangedMind, 2=OptionChange, 3=ProductDefect, 4=ProductInfoMismatch, 5=DeliveryDelay, 6=WrongDelivery, 7=Other)");
+
+                    b.Property<DateTime>("RequestedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("ResolvedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int")
+                        .HasComment("상태 (1=Requested, 2=Approved, 3=Rejected, 4=Completed)");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int")
+                        .HasComment("유형 (1=Cancel, 2=Return, 3=Exchange, 4=Refund)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Status");
+
+                    b.HasIndex("OrderID", "Status");
+
+                    b.ToTable("OrderRefund", null, t =>
+                        {
+                            t.HasComment("통합 환불 이력 (취소/반품/교환/환불)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.OrderRefundItem", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("CouponCodeID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("OrderItemID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("OrderRefundID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("PostRefundAction")
+                        .HasColumnType("int")
+                        .HasComment("쿠폰 후처리 (1=Restore 회수, 2=Expire 만료)");
+
+                    b.Property<int>("UnitAmount")
+                        .HasColumnType("int")
+                        .HasComment("환불 단가 스냅샷");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CouponCodeID")
+                        .IsUnique();
+
+                    b.HasIndex("OrderItemID");
+
+                    b.HasIndex("OrderRefundID");
+
+                    b.ToTable("OrderRefundItem", null, t =>
+                        {
+                            t.HasComment("환불 단위 — 쿠폰 별 후처리(회수/만료) 정책. OrderRefund 1:N");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Product", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<byte>("DiscountType")
+                        .HasColumnType("tinyint");
+
+                    b.Property<int>("DiscountValue")
+                        .HasColumnType("int");
+
+                    b.Property<int>("DurationDays")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(0)
+                        .HasComment("아이템 효과 지속일 (0=즉시소모/영구)");
+
+                    b.Property<string>("EffectPayload")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("지위 아이템 효과 페이로드 JSON (색상·아이콘·애니메이션)");
+
+                    b.Property<int?>("GameID")
+                        .HasColumnType("int")
+                        .HasComment("게임 ID (선택 — null=플랫폼 직접판매)");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsGiftable")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bit")
+                        .HasDefaultValue(false)
+                        .HasComment("선물하기 가능 여부");
+
+                    b.Property<byte?>("ItemKind")
+                        .HasColumnType("tinyint")
+                        .HasComment("아이템 종류 (null=일반상품, 2~4=지위, 5~11=소모품)");
+
+                    b.Property<int>("MaxPurchase")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(999)
+                        .HasComment("1회 주문 최대 구매 수량 (하드 상한 999)");
+
+                    b.Property<int>("MinPurchase")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(1)
+                        .HasComment("1회 주문 최소 구매 수량");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("상품명");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Price")
+                        .HasColumnType("int")
+                        .HasComment("판매가 (KRW)");
+
+                    b.Property<bool>("RequireDonationChannel")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bit")
+                        .HasDefaultValue(false)
+                        .HasComment("구매 시 후원 채널 선택 필수 여부");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion");
+
+                    b.Property<DateTime?>("SaleEndAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("SaleStartAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Stock")
+                        .HasColumnType("int")
+                        .HasComment("재고 (-1=무제한)");
+
+                    b.Property<string>("Thumbnail")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int")
+                        .HasComment("상품 유형 (1=Physical, 2=Digital)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("IsActive", "Type");
+
+                    b.HasIndex("ItemKind", "IsActive");
+
+                    b.HasIndex("GameID", "IsActive", "Order");
+
+                    b.ToTable("Product", null, t =>
+                        {
+                            t.HasComment("상점 상품");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.ProductLimitConfig", b =>
+                {
+                    b.Property<int>("ProductID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MaxQuantity")
+                        .HasColumnType("int")
+                        .HasComment("회원당 누적 최대 구매 수량 (0=무제한)");
+
+                    b.Property<DateTime?>("PeriodEndAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("Custom 시 절대 윈도우 종료 시각 (UTC)");
+
+                    b.Property<DateTime?>("PeriodStartAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("Custom 시 절대 윈도우 시작 시각 (UTC)");
+
+                    b.Property<int>("PeriodType")
+                        .HasColumnType("int")
+                        .HasComment("기간 유형 (0=None, 1=Day, 2=Week, 3=Month, 4=Custom)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("UsePeriodLimit")
+                        .HasColumnType("bit")
+                        .HasComment("기간 제한 사용 여부");
+
+                    b.Property<bool>("UseQuantityLimit")
+                        .HasColumnType("bit")
+                        .HasComment("수량 제한 사용 여부");
+
+                    b.HasKey("ProductID");
+
+                    b.ToTable("ProductLimitConfig", null, t =>
+                        {
+                            t.HasComment("상품 판매 정책 (1:1 with Product)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Shipment", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Address1_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Address2_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("AdminMemo")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<string>("Carrier")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DeliveredAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("KeyVersion")
+                        .HasColumnType("int");
+
+                    b.Property<int>("OrderID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Phone_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("RecipientName_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("ShippedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("ShippingFee")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(0);
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TrackingNumber")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<string>("ZipCode")
+                        .IsRequired()
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("OrderID")
+                        .IsUnique();
+
+                    b.HasIndex("Status");
+
+                    b.HasIndex("TrackingNumber");
+
+                    b.ToTable("Shipment", null, t =>
+                        {
+                            t.HasComment("배송 (주문 시점 주소 스냅샷, 암호화)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Wallets.Wallet", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<Guid>("WalletKey")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID")
+                        .IsUnique();
+
+                    b.HasIndex("WalletKey")
+                        .IsUnique();
+
+                    b.ToTable("Wallet", null, t =>
+                        {
+                            t.HasComment("회원 지갑");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Wallets.WalletBalance", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int");
+
+                    b.Property<Guid>("WalletKey")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("WalletKey", "Type")
+                        .IsUnique();
+
+                    b.ToTable("WalletBalance", null, t =>
+                        {
+                            t.HasComment("회원 지갑 잔액");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Wallets.WalletTransaction", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BalanceType")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Memo")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<string>("Reason")
+                        .IsRequired()
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)");
+
+                    b.Property<string>("RefID")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)");
+
+                    b.Property<int>("TxType")
+                        .HasColumnType("int");
+
+                    b.Property<string>("UserID")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)");
+
+                    b.Property<Guid>("WalletKey")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("WalletKey");
+
+                    b.HasIndex("WalletKey", "CreatedAt");
+
+                    b.ToTable("WalletTransaction", null, t =>
+                        {
+                            t.HasComment("회원 거래 장부");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Chat.ChatBan", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", null)
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Domain.Entities.Common.Config", b =>
+                {
+                    b.OwnsOne("Domain.Entities.Common.AccountConfig", "Account", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<int?>("ChangeEmailDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_ChangeEmailDay")
+                                .HasComment("이메일 갱신 주기(일)");
+
+                            b1.Property<int?>("ChangeIntroDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_ChangeIntroDay")
+                                .HasComment("자기소개 갱신 주기(일)");
+
+                            b1.Property<int?>("ChangeNameDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_ChangeNameDay")
+                                .HasComment("별명 갱신 주기(일)");
+
+                            b1.Property<int?>("ChangePasswordDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_ChangePasswordDay")
+                                .HasComment("비밀번호 갱신 주기(일)");
+
+                            b1.Property<int?>("ChangeSummaryDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_ChangeSummaryDay")
+                                .HasComment("한마디 갱신 주기(일)");
+
+                            b1.Property<int?>("ChangeThumbDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_ChangeThumbDay")
+                                .HasComment("프로필 이미지 갱신 주기(일)");
+
+                            b1.Property<string>("DeniedEmailList")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Account_DeniedEmailList")
+                                .HasComment("금지 이메일");
+
+                            b1.Property<string>("DeniedNameList")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Account_DeniedNameList")
+                                .HasComment("금지 별명");
+
+                            b1.Property<bool>("IsLoginEmailVerifiedOnly")
+                                .HasColumnType("bit");
+
+                            b1.Property<bool>("IsRegisterBlock")
+                                .HasColumnType("bit")
+                                .HasColumnName("Account_IsRegisterBlock")
+                                .HasComment("회원가입 차단");
+
+                            b1.Property<bool>("IsRegisterEmailAuth")
+                                .HasColumnType("bit")
+                                .HasColumnName("Account_IsRegisterEmailAuth")
+                                .HasComment("회원가입 시 이메일 인증");
+
+                            b1.Property<int?>("MaxLoginTryCount")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_MaxLoginTryCount")
+                                .HasComment("로그인 시도 제한 횟수");
+
+                            b1.Property<int?>("MaxLoginTryLimitSecond")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_MaxLoginTryLimitSecond")
+                                .HasComment("로그인 시도 제한 시간(초)");
+
+                            b1.Property<int?>("PasswordMinLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_PasswordMinLength")
+                                .HasComment("비밀번호 최소 길이");
+
+                            b1.Property<int?>("PasswordNumbersLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_PasswordNumbersLength")
+                                .HasComment("비밀번호 최소 숫자 수");
+
+                            b1.Property<int?>("PasswordSpecialcharsLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_PasswordSpecialcharsLength")
+                                .HasComment("비밀번호 최소 특수문자 수");
+
+                            b1.Property<int?>("PasswordUppercaseLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_PasswordUppercaseLength")
+                                .HasComment("비밀번호 최소 대문자 수");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.AttendanceConfig", "Attendance", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("BaseExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Attendance_BaseExp")
+                                .HasComment("기본 경험치");
+
+                            b1.Property<int>("BasePoint")
+                                .HasColumnType("int")
+                                .HasColumnName("Attendance_BasePoint")
+                                .HasComment("기본 포인트");
+
+                            b1.Property<bool>("IsEnabled")
+                                .HasColumnType("bit")
+                                .HasColumnName("Attendance_IsEnabled")
+                                .HasComment("출석 기능 활성화");
+
+                            b1.Property<string>("RankBonusConfig")
+                                .HasMaxLength(2000)
+                                .HasColumnType("nvarchar(2000)")
+                                .HasColumnName("Attendance_RankBonusConfig")
+                                .HasComment("순위별 보상 설정 (JSON)");
+
+                            b1.Property<int>("StreakBonusMaxDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Attendance_StreakBonusMaxDays")
+                                .HasComment("가중치 최대 적용 일수");
+
+                            b1.Property<int>("StreakBonusPerDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Attendance_StreakBonusPerDay")
+                                .HasComment("1일당 추가 경험치");
+
+                            b1.Property<int>("StreakBonusPointPerDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Attendance_StreakBonusPointPerDay")
+                                .HasComment("1일당 추가 포인트");
+
+                            b1.Property<bool>("UseRankBonus")
+                                .HasColumnType("bit")
+                                .HasColumnName("Attendance_UseRankBonus")
+                                .HasComment("순위 보상 사용");
+
+                            b1.Property<bool>("UseStreakBonus")
+                                .HasColumnType("bit")
+                                .HasColumnName("Attendance_UseStreakBonus")
+                                .HasComment("연속 출석 가중치 사용");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.BasicConfig", "Basic", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("AdminWhiteIPList")
+                                .HasMaxLength(1000)
+                                .HasColumnType("nvarchar(1000)")
+                                .HasColumnName("Basic_AdminWhiteIPList")
+                                .HasComment("관리자단 접근 가능 IP");
+
+                            b1.Property<string>("BlockAlertContent")
+                                .HasMaxLength(5000)
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Basic_BlockAlertContent")
+                                .HasComment("차단 시 안내문 내용");
+
+                            b1.Property<string>("BlockAlertTitle")
+                                .HasMaxLength(200)
+                                .HasColumnType("nvarchar(200)")
+                                .HasColumnName("Basic_BlockAlertTitle")
+                                .HasComment("차단 시 안내문 제목");
+
+                            b1.Property<string>("FromEmail")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Basic_FromEmail")
+                                .HasComment("송수신 이메일");
+
+                            b1.Property<string>("FromName")
+                                .HasMaxLength(30)
+                                .HasColumnType("nvarchar(30)")
+                                .HasColumnName("Basic_FromName")
+                                .HasComment("송수신자 이름");
+
+                            b1.Property<string>("FrontWhiteIPList")
+                                .HasMaxLength(1000)
+                                .HasColumnType("nvarchar(1000)")
+                                .HasColumnName("Basic_FrontWhiteIPList")
+                                .HasComment("사용자단 접근 가능 IP");
+
+                            b1.Property<bool>("IsMaintenance")
+                                .HasColumnType("bit")
+                                .HasColumnName("Basic_IsMaintenance")
+                                .HasComment("점검 여부");
+
+                            b1.Property<string>("MaintenanceContent")
+                                .HasMaxLength(5000)
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Basic_MaintenanceContent")
+                                .HasComment("점검 내용");
+
+                            b1.Property<int>("NoteDailySendLimit")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(3)
+                                .HasColumnName("Basic_NoteDailySendLimit")
+                                .HasComment("쪽지 일일 발송 제한 (사용자 1인당, 시스템 제외)");
+
+                            b1.Property<string>("RootID")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Basic_RootID")
+                                .HasComment("최고 관리자 ID");
+
+                            b1.Property<string>("SiteName")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Basic_SiteName")
+                                .HasComment("사이트 이름");
+
+                            b1.Property<string>("SiteURL")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Basic_SiteURL")
+                                .HasComment("사이트 주소");
+
+                            b1.Property<bool>("SmtpEnableSSL")
+                                .HasColumnType("bit")
+                                .HasColumnName("Basic_SmtpEnableSSL")
+                                .HasComment("SMTP Enable SSL");
+
+                            b1.Property<string>("SmtpPassword")
+                                .HasMaxLength(200)
+                                .HasColumnType("nvarchar(200)")
+                                .HasColumnName("Basic_SmtpPassword")
+                                .HasComment("SMTP Password");
+
+                            b1.Property<int?>("SmtpPort")
+                                .HasColumnType("int")
+                                .HasColumnName("Basic_SmtpPort")
+                                .HasComment("SMTP Port");
+
+                            b1.Property<string>("SmtpServer")
+                                .HasMaxLength(200)
+                                .HasColumnType("nvarchar(200)")
+                                .HasColumnName("Basic_SmtpServer")
+                                .HasComment("SMTP Server");
+
+                            b1.Property<string>("SmtpUsername")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Basic_SmtpUsername")
+                                .HasComment("SMTP Username");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.ChatExpConfig", "ChatExp", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("ChatXpPerMessage")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(1)
+                                .HasColumnName("ChatExp_ChatXpPerMessage")
+                                .HasComment("채팅 1건당 지급 XP");
+
+                            b1.Property<int>("ChatXpSessionLimit")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(50)
+                                .HasColumnName("ChatExp_ChatXpSessionLimit")
+                                .HasComment("방송 세션당 채팅 XP 상한");
+
+                            b1.Property<int>("CrownTopN")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(3)
+                                .HasColumnName("ChatExp_CrownTopN")
+                                .HasComment("크라운 뱃지 Top N");
+
+                            b1.Property<int>("DonationXpPerAmount")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(1000)
+                                .HasColumnName("ChatExp_DonationXpPerAmount")
+                                .HasComment("후원 N POINT당 1 XP");
+
+                            b1.Property<int>("LeaderboardSize")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(50)
+                                .HasColumnName("ChatExp_LeaderboardSize")
+                                .HasComment("리더보드 Top N");
+
+                            b1.Property<int>("MinContentLength")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(2)
+                                .HasColumnName("ChatExp_MinContentLength")
+                                .HasComment("XP 적립 최소 글자수");
+
+                            b1.Property<int>("RateLimitSec")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(2)
+                                .HasColumnName("ChatExp_RateLimitSec")
+                                .HasComment("채팅 쿨다운(초)");
+
+                            b1.Property<bool>("UxShowLeaderboard")
+                                .HasColumnType("bit")
+                                .HasColumnName("ChatExp_UxShowLeaderboard")
+                                .HasComment("watch에서 리더보드 노출");
+
+                            b1.Property<bool>("UxShowMyXpBadge")
+                                .HasColumnType("bit")
+                                .HasColumnName("ChatExp_UxShowMyXpBadge")
+                                .HasComment("내 XP 뱃지 노출");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.CompanyConfig", "Company", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("AddedSaleNo")
+                                .HasMaxLength(20)
+                                .HasColumnType("nvarchar(20)")
+                                .HasColumnName("Company_AddedSaleNo")
+                                .HasComment("부가통신 사업자번호");
+
+                            b1.Property<string>("Address")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Company_Address")
+                                .HasComment("사업장 소재지");
+
+                            b1.Property<string>("AdminEmail")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Company_AdminEmail")
+                                .HasComment("정보관리책임자 이메일");
+
+                            b1.Property<string>("AdminName")
+                                .HasMaxLength(70)
+                                .HasColumnType("nvarchar(70)")
+                                .HasColumnName("Company_AdminName")
+                                .HasComment("정보관리책임자");
+
+                            b1.Property<string>("BankCode")
+                                .HasMaxLength(10)
+                                .HasColumnType("nvarchar(10)")
+                                .HasColumnName("Company_BankCode")
+                                .HasComment("입금계좌 - 은행");
+
+                            b1.Property<string>("BankNumber")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Company_BankNumber")
+                                .HasComment("입금계좌 - 계좌번호");
+
+                            b1.Property<string>("BankOwner")
+                                .HasMaxLength(70)
+                                .HasColumnType("nvarchar(70)")
+                                .HasColumnName("Company_BankOwner")
+                                .HasComment("입금계좌 - 예금주");
+
+                            b1.Property<string>("Fax")
+                                .HasMaxLength(20)
+                                .HasColumnType("nvarchar(20)")
+                                .HasColumnName("Company_Fax")
+                                .HasComment("FAX");
+
+                            b1.Property<string>("Hosting")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Company_Hosting")
+                                .HasComment("호스팅 서비스");
+
+                            b1.Property<string>("Name")
+                                .HasMaxLength(70)
+                                .HasColumnType("nvarchar(70)")
+                                .HasColumnName("Company_Name")
+                                .HasComment("상호 명");
+
+                            b1.Property<string>("Owner")
+                                .HasMaxLength(50)
+                                .HasColumnType("nvarchar(50)")
+                                .HasColumnName("Company_Owner")
+                                .HasComment("대표자 명");
+
+                            b1.Property<string>("RegNo")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Company_RegNo")
+                                .HasComment("사업자 등록 번호");
+
+                            b1.Property<string>("RetailSaleNo")
+                                .HasMaxLength(20)
+                                .HasColumnType("nvarchar(20)")
+                                .HasColumnName("Company_RetailSaleNo")
+                                .HasComment("통신판매업 신고번호");
+
+                            b1.Property<string>("SiteUrl")
+                                .HasMaxLength(200)
+                                .HasColumnType("nvarchar(200)")
+                                .HasColumnName("Company_SiteUrl")
+                                .HasComment("사이트 주소");
+
+                            b1.Property<string>("Tel")
+                                .HasMaxLength(20)
+                                .HasColumnType("nvarchar(20)")
+                                .HasColumnName("Company_Tel")
+                                .HasComment("대표 전화번호");
+
+                            b1.Property<string>("ZipCode")
+                                .HasMaxLength(8)
+                                .HasColumnType("nvarchar(8)")
+                                .HasColumnName("Company_ZipCode")
+                                .HasComment("사업장 주소(우편번호)");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.CryptoConfig", "Crypto", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("MainPageCoinCount")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(10)
+                                .HasColumnName("Crypto_MainPageCoinCount")
+                                .HasComment("메인 페이지 기본 표시 코인 수");
+
+                            b1.Property<decimal>("PlungeThreshold")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("decimal(5,2)")
+                                .HasDefaultValue(-5.0m)
+                                .HasColumnName("Crypto_PlungeThreshold")
+                                .HasComment("급락 임계값 (%)");
+
+                            b1.Property<decimal>("SurgeThreshold")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("decimal(5,2)")
+                                .HasDefaultValue(5.0m)
+                                .HasColumnName("Crypto_SurgeThreshold")
+                                .HasComment("급등 임계값 (%)");
+
+                            b1.Property<int>("TickerRefreshSeconds")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(5)
+                                .HasColumnName("Crypto_TickerRefreshSeconds")
+                                .HasComment("시세 업데이트 주기 (초)");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.EmailTemplateConfig", "EmailTemplate", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("ChangedEmailFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_ChangedEmailFormContent")
+                                .HasComment("이메일 변경 완료 - 내용");
+
+                            b1.Property<string>("ChangedEmailFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_ChangedEmailFormTitle")
+                                .HasComment("이메일 변경 완료 - 제목");
+
+                            b1.Property<string>("ChangedPasswordEmailFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_ChangedPasswordEmailFormContent")
+                                .HasComment("비밀번호 변경 완료 - 내용");
+
+                            b1.Property<string>("ChangedPasswordEmailFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_ChangedPasswordEmailFormTitle")
+                                .HasComment("비밀번호 변경 완료 - 제목");
+
+                            b1.Property<string>("EmailVerifyFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_EmailVerifyFormContent")
+                                .HasComment("이메일 변경 시 - 내용");
+
+                            b1.Property<string>("EmailVerifyFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_EmailVerifyFormTitle")
+                                .HasComment("이메일 변경 시 - 제목");
+
+                            b1.Property<string>("RegisterEmailFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_RegisterEmailFormContent")
+                                .HasComment("회원가입 시 - 내용");
+
+                            b1.Property<string>("RegisterEmailFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_RegisterEmailFormTitle")
+                                .HasComment("회원가입 시 - 제목");
+
+                            b1.Property<string>("RegistrationEmailFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_RegistrationEmailFormContent")
+                                .HasComment("회원가입 완료 - 내용");
+
+                            b1.Property<string>("RegistrationEmailFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_RegistrationEmailFormTitle")
+                                .HasComment("회원가입 완료 - 제목");
+
+                            b1.Property<string>("ResetPasswordEmailFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_ResetPasswordEmailFormContent")
+                                .HasComment("비밀번호 재설정 - 내용");
+
+                            b1.Property<string>("ResetPasswordEmailFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_ResetPasswordEmailFormTitle")
+                                .HasComment("비밀번호 재설정 - 제목");
+
+                            b1.Property<string>("WithdrawEmailFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_WithdrawEmailFormContent")
+                                .HasComment("회원탈퇴 시 - 내용");
+
+                            b1.Property<string>("WithdrawEmailFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_WithdrawEmailFormTitle")
+                                .HasComment("회원탈퇴 시 - 제목");
+
+                            b1.Property<string>("WithdrawVerifyEmailFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_WithdrawVerifyEmailFormContent")
+                                .HasComment("회원탈퇴 인증 - 내용");
+
+                            b1.Property<string>("WithdrawVerifyEmailFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_WithdrawVerifyEmailFormTitle")
+                                .HasComment("회원탈퇴 인증 - 제목");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.ExternalApiConfig", "External", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("GoogleAppId")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("External_GoogleAppId")
+                                .HasComment("Google APP ID");
+
+                            b1.Property<string>("GoogleClientId")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("External_GoogleClientId")
+                                .HasComment("Google Client ID");
+
+                            b1.Property<string>("GoogleClientSecretEnc")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("External_GoogleClientSecretEnc")
+                                .HasComment("Google Client Secret (암호화 저장 권장)");
+
+                            b1.Property<string>("TossLiveClientKeyEnc")
+                                .HasColumnType("nvarchar(max)");
+
+                            b1.Property<string>("TossLiveSecretKeyEnc")
+                                .HasColumnType("nvarchar(max)");
+
+                            b1.Property<string>("TossPayMode")
+                                .HasColumnType("nvarchar(max)");
+
+                            b1.Property<string>("TossTestClientKeyEnc")
+                                .HasColumnType("nvarchar(max)");
+
+                            b1.Property<string>("TossTestSecretKeyEnc")
+                                .HasColumnType("nvarchar(max)");
+
+                            b1.Property<string>("YouTubeApiKeyEnc")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("External_YouTubeApiKeyEnc")
+                                .HasComment("YouTube API Key (암호화 저장 권장)");
+
+                            b1.Property<string>("YouTubeApiName")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("External_YouTubeApiName")
+                                .HasComment("YouTube API Name");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.ImagesConfig", "Images", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("AppIcon_192")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_AppIcon_192")
+                                .HasComment("App-icon-192");
+
+                            b1.Property<string>("AppIcon_512")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_AppIcon_512")
+                                .HasComment("App-icon-512");
+
+                            b1.Property<string>("AppleTouchIcon")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_AppleTouchIcon")
+                                .HasComment("Apple-touch-icon");
+
+                            b1.Property<string>("Favicon")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_Favicon")
+                                .HasComment("Favicon");
+
+                            b1.Property<string>("LogoHorizontal")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_LogoHorizontal")
+                                .HasComment("Logo-horizontal");
+
+                            b1.Property<string>("LogoSquare")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_LogoSquare")
+                                .HasComment("Logo-square");
+
+                            b1.Property<string>("OgDefault")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_OgDefault")
+                                .HasComment("og-default");
+
+                            b1.Property<string>("TwitterImage")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_TwitterImage")
+                                .HasComment("Twitter-image");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.MetaConfig", "Meta", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("Adds")
+                                .HasColumnType("nvarchar(max)");
+
+                            b1.Property<string>("ApplicationName")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Meta_ApplicationName")
+                                .HasComment("Meta Application Name");
+
+                            b1.Property<string>("Author")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Meta_Author")
+                                .HasComment("Meta Author");
+
+                            b1.Property<string>("Description")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Meta_Description")
+                                .HasComment("Meta Description");
+
+                            b1.Property<string>("Generator")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Meta_Generator")
+                                .HasComment("Meta Generator");
+
+                            b1.Property<string>("Keywords")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Meta_Keywords")
+                                .HasComment("Meta Keywords");
+
+                            b1.Property<string>("Robots")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Meta_Robots")
+                                .HasComment("Meta Robots");
+
+                            b1.Property<string>("Viewport")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Meta_Viewport")
+                                .HasComment("Meta Viewport");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.PaperConfig", "Paper", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<bool>("Enabled")
+                                .HasColumnType("bit")
+                                .HasColumnName("Paper_Enabled")
+                                .HasComment("모의투자 활성화");
+
+                            b1.Property<int>("FeeRateBp")
+                                .HasColumnType("int")
+                                .HasColumnName("Paper_FeeRateBp")
+                                .HasComment("매매 수수료 Bp");
+
+                            b1.Property<int>("MaxHolding")
+                                .HasColumnType("int")
+                                .HasColumnName("Paper_MaxHolding")
+                                .HasComment("계좌 최대 보유 토큰 (0=무제한)");
+
+                            b1.Property<int>("MinDeposit")
+                                .HasColumnType("int")
+                                .HasColumnName("Paper_MinDeposit")
+                                .HasComment("최소 입금 토큰");
+
+                            b1.Property<int>("MinFillsForRank")
+                                .HasColumnType("int")
+                                .HasColumnName("Paper_MinFillsForRank")
+                                .HasComment("리더보드 등재 최소 체결 수");
+
+                            b1.Property<int>("OrderMaxPctBp")
+                                .HasColumnType("int")
+                                .HasColumnName("Paper_OrderMaxPctBp")
+                                .HasComment("1주문 상한 Bp");
+
+                            b1.Property<int>("TaxRateBp")
+                                .HasColumnType("int")
+                                .HasColumnName("Paper_TaxRateBp")
+                                .HasComment("매도 거래세 Bp");
+
+                            b1.Property<int>("WithdrawProfitBurnBp")
+                                .HasColumnType("int")
+                                .HasColumnName("Paper_WithdrawProfitBurnBp")
+                                .HasComment("출금 수익분 소각 Bp");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.RewardConfig", "Reward", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("ChatDailyCount")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_ChatDailyCount")
+                                .HasComment("채팅 보상 일일 횟수 상한 (0=무제한)");
+
+                            b1.Property<int>("ChatDailyExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_ChatDailyExp")
+                                .HasComment("채팅 보상 일일 경험치 상한 (0=무제한)");
+
+                            b1.Property<int>("CheerDailyMax")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("CheerFeePercent")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("CheerMinAmount")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("CommentDailyCount")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_CommentDailyCount")
+                                .HasComment("댓글 보상 일일 횟수 상한 (0=무제한)");
+
+                            b1.Property<int>("CommentDailyExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_CommentDailyExp")
+                                .HasComment("댓글 보상 일일 경험치 상한 (0=무제한)");
+
+                            b1.Property<int>("CommentDailyPoint")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_CommentDailyPoint")
+                                .HasComment("댓글 보상 일일 토큰 상한 (0=무제한)");
+
+                            b1.Property<int>("CommentExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_CommentExp")
+                                .HasComment("댓글 작성 지급 경험치");
+
+                            b1.Property<int>("CommentPoint")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_CommentPoint")
+                                .HasComment("댓글 작성 지급 토큰");
+
+                            b1.Property<int>("LikeGivenDailyCount")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_LikeGivenDailyCount")
+                                .HasComment("추천(누른 쪽) 보상 일일 횟수 상한 (0=무제한)");
+
+                            b1.Property<int>("LikeGivenDailyExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_LikeGivenDailyExp")
+                                .HasComment("추천(누른 쪽) 보상 일일 경험치 상한 (0=무제한)");
+
+                            b1.Property<int>("LikeGivenExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_LikeGivenExp")
+                                .HasComment("추천(누른 쪽) 지급 경험치");
+
+                            b1.Property<int>("LikeReceivedDailyCount")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_LikeReceivedDailyCount")
+                                .HasComment("추천(받은 쪽) 보상 일일 횟수 상한 (0=무제한)");
+
+                            b1.Property<int>("LikeReceivedDailyPoint")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_LikeReceivedDailyPoint")
+                                .HasComment("추천(받은 쪽) 보상 일일 토큰 상한 (0=무제한)");
+
+                            b1.Property<int>("LikeReceivedPoint")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_LikeReceivedPoint")
+                                .HasComment("추천(받은 쪽) 지급 토큰");
+
+                            b1.Property<int>("MinCommentLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_MinCommentLength")
+                                .HasComment("보상 지급 최소 댓글 길이 (0=제한 없음)");
+
+                            b1.Property<int>("MinPostLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_MinPostLength")
+                                .HasComment("보상 지급 최소 게시글 길이 (0=제한 없음)");
+
+                            b1.Property<int>("NewMemberHoldDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_NewMemberHoldDays")
+                                .HasComment("신규 회원 보상 유예 기간(일, 0=유예 없음)");
+
+                            b1.Property<int>("PostDailyCount")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_PostDailyCount")
+                                .HasComment("게시글 보상 일일 횟수 상한 (0=무제한)");
+
+                            b1.Property<int>("PostDailyExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_PostDailyExp")
+                                .HasComment("게시글 보상 일일 경험치 상한 (0=무제한)");
+
+                            b1.Property<int>("PostDailyPoint")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_PostDailyPoint")
+                                .HasComment("게시글 보상 일일 토큰 상한 (0=무제한)");
+
+                            b1.Property<int>("PostExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_PostExp")
+                                .HasComment("게시글 작성 지급 경험치");
+
+                            b1.Property<int>("PostPoint")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_PostPoint")
+                                .HasComment("게시글 작성 지급 토큰");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.SignupRewardConfig", "SignupReward", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("CashAmount")
+                                .HasColumnType("int")
+                                .HasColumnName("SignupReward_CashAmount")
+                                .HasComment("지급 캐시 (Adjusted)");
+
+                            b1.Property<int>("CoinAmount")
+                                .HasColumnType("int")
+                                .HasColumnName("SignupReward_CoinAmount")
+                                .HasComment("지급 코인 (Airdrop)");
+
+                            b1.Property<bool>("Enabled")
+                                .HasColumnType("bit")
+                                .HasColumnName("SignupReward_Enabled")
+                                .HasComment("가입 축하 보상 활성화");
+
+                            b1.Property<int>("ExpAmount")
+                                .HasColumnType("int")
+                                .HasColumnName("SignupReward_ExpAmount")
+                                .HasComment("지급 경험치");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.Navigation("Account")
+                        .IsRequired();
+
+                    b.Navigation("Attendance")
+                        .IsRequired();
+
+                    b.Navigation("Basic")
+                        .IsRequired();
+
+                    b.Navigation("ChatExp")
+                        .IsRequired();
+
+                    b.Navigation("Company")
+                        .IsRequired();
+
+                    b.Navigation("Crypto")
+                        .IsRequired();
+
+                    b.Navigation("EmailTemplate")
+                        .IsRequired();
+
+                    b.Navigation("External")
+                        .IsRequired();
+
+                    b.Navigation("Images")
+                        .IsRequired();
+
+                    b.Navigation("Meta")
+                        .IsRequired();
+
+                    b.Navigation("Paper")
+                        .IsRequired();
+
+                    b.Navigation("Reward")
+                        .IsRequired();
+
+                    b.Navigation("SignupReward")
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedBookmark", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany("FeedBookmark")
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FeedPost");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedComment", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany("FeedComment")
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Feed.FeedComment", "Parent")
+                        .WithMany("Children")
+                        .HasForeignKey("ParentID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.Navigation("FeedPost");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Parent");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedCommentLike", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedComment", "FeedComment")
+                        .WithMany("FeedCommentLike")
+                        .HasForeignKey("FeedCommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany()
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FeedComment");
+
+                    b.Navigation("FeedPost");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedLike", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany("FeedLike")
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FeedPost");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPost", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostImage", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany("FeedPostImage")
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FeedPost");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostMedia", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany("FeedPostMedia")
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FeedPost");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostMention", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany("FeedPostMention")
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FeedPost");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostTag", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany("FeedPostTag")
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Feed.FeedTag", "FeedTag")
+                        .WithMany("FeedPostTag")
+                        .HasForeignKey("FeedTagID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FeedPost");
+
+                    b.Navigation("FeedTag");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.Board", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.BoardGroup", "BoardGroup")
+                        .WithMany("Board")
+                        .HasForeignKey("BoardGroupID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("BoardGroup");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardManager", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany("BoardManager")
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardMeta", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", null)
+                        .WithOne("BoardMeta")
+                        .HasForeignKey("Domain.Entities.Forum.Boards.BoardMeta", "BoardID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaComment", "Comment", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<bool>("AllowDeleteProtection")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_AllowDeleteProtection");
+
+                            b1.Property<bool>("AllowDisLike")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_AllowDisLike");
+
+                            b1.Property<bool>("AllowLike")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_AllowLike");
+
+                            b1.Property<bool>("AllowSecret")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_AllowSecret");
+
+                            b1.Property<bool>("AllowUpdateProtection")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_AllowUpdateProtection");
+
+                            b1.Property<int>("BlameHideCount")
+                                .HasColumnType("int")
+                                .HasColumnName("Comment_BlameHideCount");
+
+                            b1.Property<string>("ContentPlaceholder")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Comment_ContentPlaceholder");
+
+                            b1.Property<int>("DeleteProtectionDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Comment_DeleteProtectionDays");
+
+                            b1.Property<bool>("EnableComment")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_EnableComment");
+
+                            b1.Property<bool>("EnableCommentUpdateLog")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_EnableCommentUpdateLog");
+
+                            b1.Property<bool>("EnableEditor")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_EnableEditor");
+
+                            b1.Property<int>("MaxContentLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Comment_MaxContentLength");
+
+                            b1.Property<int>("MinContentLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Comment_MinContentLength");
+
+                            b1.Property<int>("PerPage")
+                                .HasColumnType("int")
+                                .HasColumnName("Comment_PerPage");
+
+                            b1.Property<bool>("ShowMemberIcon")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_ShowMemberIcon");
+
+                            b1.Property<bool>("ShowMemberThumb")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_ShowMemberThumb");
+
+                            b1.Property<int>("UpdateProtectionDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Comment_UpdateProtectionDays");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaExp", "Exp", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("CommentWriteExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_CommentWriteExp");
+
+                            b1.Property<int>("CommentWriteExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_CommentWriteExpWithinDays");
+
+                            b1.Property<int>("CommentWriteUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_CommentWriteUndoExp");
+
+                            b1.Property<bool>("EnableExp")
+                                .HasColumnType("bit")
+                                .HasColumnName("Exp_EnableExp");
+
+                            b1.Property<short>("FileDownloadExp")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Exp_FileDownloadExp");
+
+                            b1.Property<int>("FileUploadExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_FileUploadExp");
+
+                            b1.Property<int>("FileUploadExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_FileUploadExpWithinDays");
+
+                            b1.Property<int>("FileUploadUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_FileUploadUndoExp");
+
+                            b1.Property<int>("OtherCommentDisLikeExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherCommentDisLikeExp");
+
+                            b1.Property<int>("OtherCommentDisLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherCommentDisLikeExpWithinDays");
+
+                            b1.Property<int>("OtherCommentDisLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherCommentDisLikeUndoExp");
+
+                            b1.Property<int>("OtherCommentLikeExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherCommentLikeExp");
+
+                            b1.Property<int>("OtherCommentLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherCommentLikeExpWithinDays");
+
+                            b1.Property<int>("OtherCommentLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherCommentLikeUndoExp");
+
+                            b1.Property<int>("OtherPostDisLikeExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostDisLikeExp");
+
+                            b1.Property<int>("OtherPostDisLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostDisLikeExpWithinDays");
+
+                            b1.Property<int>("OtherPostDisLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostDisLikeUndoExp");
+
+                            b1.Property<int>("OtherPostLikeExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostLikeExp");
+
+                            b1.Property<int>("OtherPostLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostLikeExpWithinDays");
+
+                            b1.Property<int>("OtherPostLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostLikeUndoExp");
+
+                            b1.Property<short>("OtherPostReadExp")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Exp_OtherPostReadExp");
+
+                            b1.Property<int>("OtherPostReadExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostReadExpWithinDays");
+
+                            b1.Property<int>("OtherPostReadUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostReadUndoExp");
+
+                            b1.Property<short>("OwnCommentDisLikeExp")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Exp_OwnCommentDisLikeExp");
+
+                            b1.Property<int>("OwnCommentDisLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnCommentDisLikeExpWithinDays");
+
+                            b1.Property<int>("OwnCommentDisLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnCommentDisLikeUndoExp");
+
+                            b1.Property<int>("OwnCommentLikeExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnCommentLikeExp");
+
+                            b1.Property<int>("OwnCommentLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnCommentLikeExpWithinDays");
+
+                            b1.Property<int>("OwnCommentLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnCommentLikeUndoExp");
+
+                            b1.Property<short>("OwnPostDisLikeExp")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Exp_OwnPostDisLikeExp");
+
+                            b1.Property<int>("OwnPostDisLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostDisLikeExpWithinDays");
+
+                            b1.Property<int>("OwnPostDisLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostDisLikeUndoExp");
+
+                            b1.Property<int>("OwnPostLikeExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostLikeExp");
+
+                            b1.Property<int>("OwnPostLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostLikeExpWithinDays");
+
+                            b1.Property<int>("OwnPostLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostLikeUndoExp");
+
+                            b1.Property<int>("OwnPostReadExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostReadExp");
+
+                            b1.Property<int>("OwnPostReadExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostReadExpWithinDays");
+
+                            b1.Property<int>("OwnPostReadUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostReadUndoExp");
+
+                            b1.Property<int>("PostWriteExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_PostWriteExp");
+
+                            b1.Property<int>("PostWriteExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_PostWriteExpWithinDays");
+
+                            b1.Property<int>("PostWriteUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_PostWriteUndoExp");
+
+                            b1.Property<bool>("ShowExpGuide")
+                                .HasColumnType("bit")
+                                .HasColumnName("Exp_ShowExpGuide");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaGeneral", "General", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<bool>("AllowDeleteProtection")
+                                .HasColumnType("bit")
+                                .HasColumnName("General_AllowDeleteProtection");
+
+                            b1.Property<bool>("AllowUpdateProtection")
+                                .HasColumnType("bit")
+                                .HasColumnName("General_AllowUpdateProtection");
+
+                            b1.Property<int>("DeleteProtectionDays")
+                                .HasColumnType("int")
+                                .HasColumnName("General_DeleteProtectionDays");
+
+                            b1.Property<bool>("EnableFileDownLog")
+                                .HasColumnType("bit")
+                                .HasColumnName("General_EnableFileDownLog");
+
+                            b1.Property<bool>("EnableLinkClickLog")
+                                .HasColumnType("bit")
+                                .HasColumnName("General_EnableLinkClickLog");
+
+                            b1.Property<bool>("EnablePostUpdateLog")
+                                .HasColumnType("bit")
+                                .HasColumnName("General_EnablePostUpdateLog");
+
+                            b1.Property<int>("UpdateProtectionDays")
+                                .HasColumnType("int")
+                                .HasColumnName("General_UpdateProtectionDays");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaList", "List", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<bool>("AlwaysShowWriteButton")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_AlwaysShowWriteButton");
+
+                            b1.Property<bool>("ExceptNotice")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_ExceptNotice");
+
+                            b1.Property<bool>("ExceptSpeaker")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_ExceptSpeaker");
+
+                            b1.Property<string>("FooterContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("List_FooterContent");
+
+                            b1.Property<string>("HeaderContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("List_HeaderContent");
+
+                            b1.Property<bool>("IsHotIcon")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_IsHotIcon");
+
+                            b1.Property<bool>("IsNewIcon")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_IsNewIcon");
+
+                            b1.Property<byte?>("Layout")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("List_Layout");
+
+                            b1.Property<byte>("PerPage")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("List_PerPage");
+
+                            b1.Property<bool>("ShowFooter")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_ShowFooter");
+
+                            b1.Property<bool>("ShowFooterListView")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_ShowFooterListView");
+
+                            b1.Property<bool>("ShowHeader")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_ShowHeader");
+
+                            b1.Property<byte?>("Sort")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("List_Sort");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaNotify", "Notify", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<byte?>("CommentWriteNotify")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("Notify_CommentWriteNotify");
+
+                            b1.Property<byte?>("PostWriteNotify")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("Notify_PostWriteNotify");
+
+                            b1.Property<byte?>("ReplyWriteNotify")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("Notify_ReplyWriteNotify");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaNotifyTemplate", "NotifyTemplate", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("CommentWriteEmailNotifyContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("NotifyTemplate_CommentWriteEmailNotifyContent");
+
+                            b1.Property<string>("CommentWriteEmailNotifySubject")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("NotifyTemplate_CommentWriteEmailNotifySubject");
+
+                            b1.Property<string>("PostWriteEmailNotifyContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("NotifyTemplate_PostWriteEmailNotifyContent");
+
+                            b1.Property<string>("PostWriteEmailNotifySubject")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("NotifyTemplate_PostWriteEmailNotifySubject");
+
+                            b1.Property<string>("ReplyWriteEmailNotifyContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("NotifyTemplate_ReplyWriteEmailNotifyContent");
+
+                            b1.Property<string>("ReplyWriteEmailNotifySubject")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("NotifyTemplate_ReplyWriteEmailNotifySubject");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaPermission", "Permission", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<short>("BoardAccess")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_BoardAccess");
+
+                            b1.Property<short>("CommentView")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_CommentView");
+
+                            b1.Property<short>("CommentWrite")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_CommentWrite");
+
+                            b1.Property<short>("FileDownload")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_FileDownload");
+
+                            b1.Property<short>("FileUpload")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_FileUpload");
+
+                            b1.Property<short>("PostView")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_PostView");
+
+                            b1.Property<short>("PostWrite")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_PostWrite");
+
+                            b1.Property<short>("ReplyWrite")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_ReplyWrite");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaView", "View", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<bool>("AllowBlame")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowBlame");
+
+                            b1.Property<bool>("AllowBookmark")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowBookmark");
+
+                            b1.Property<bool>("AllowContentLinkTargetBlank")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowContentLinkTargetBlank");
+
+                            b1.Property<bool>("AllowDislike")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowDislike");
+
+                            b1.Property<bool>("AllowLike")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowLike");
+
+                            b1.Property<bool>("AllowPostUrlCopy")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowPostUrlCopy");
+
+                            b1.Property<bool>("AllowPostUrlQrCode")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowPostUrlQrCode");
+
+                            b1.Property<bool>("AllowPrevNextBotton")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowPrevNextBotton");
+
+                            b1.Property<bool>("AllowPrint")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowPrint");
+
+                            b1.Property<bool>("AllowSnsShare")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowSnsShare");
+
+                            b1.Property<int>("BlameHideCount")
+                                .HasColumnType("int")
+                                .HasColumnName("View_BlameHideCount");
+
+                            b1.Property<bool>("ShowMemberIcon")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_ShowMemberIcon");
+
+                            b1.Property<bool>("ShowMemberRegDate")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_ShowMemberRegDate");
+
+                            b1.Property<bool>("ShowMemberSummary")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_ShowMemberSummary");
+
+                            b1.Property<bool>("ShowMemberThumb")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_ShowMemberThumb");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaWrite", "Write", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<bool>("AllowEditor")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_AllowEditor");
+
+                            b1.Property<bool>("AllowFile")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_AllowFile");
+
+                            b1.Property<bool>("AllowImage")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_AllowImage");
+
+                            b1.Property<bool>("AllowMedia")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_AllowMedia");
+
+                            b1.Property<bool>("AllowPrefix")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_AllowPrefix");
+
+                            b1.Property<bool>("AllowSecret")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_AllowSecret");
+
+                            b1.Property<bool>("AllowTag")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_AllowTag");
+
+                            b1.Property<string>("DefaultContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Write_DefaultContent");
+
+                            b1.Property<string>("DefaultSubject")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Write_DefaultSubject");
+
+                            b1.Property<string>("FileUploadExtension")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Write_FileUploadExtension");
+
+                            b1.Property<byte>("FileUploadLimit")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("Write_FileUploadLimit");
+
+                            b1.Property<int>("FileUploadMaxSize")
+                                .HasColumnType("int")
+                                .HasColumnName("Write_FileUploadMaxSize");
+
+                            b1.Property<string>("FooterContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Write_FooterContent");
+
+                            b1.Property<string>("HeaderContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Write_HeaderContent");
+
+                            b1.Property<byte>("ImageUploadLimit")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("Write_ImageUploadLimit");
+
+                            b1.Property<int>("ImageUploadMaxSize")
+                                .HasColumnType("int")
+                                .HasColumnName("Write_ImageUploadMaxSize");
+
+                            b1.Property<byte>("MediaUploadLimit")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("Write_MediaUploadLimit");
+
+                            b1.Property<bool>("RequireImage")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_RequireImage");
+
+                            b1.Property<bool>("RequiredPrefix")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_RequiredPrefix");
+
+                            b1.Property<bool>("ShowFooter")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_ShowFooter");
+
+                            b1.Property<bool>("ShowHeader")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_ShowHeader");
+
+                            b1.Property<byte>("TagLimit")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("Write_TagLimit");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.Navigation("Comment")
+                        .IsRequired();
+
+                    b.Navigation("Exp")
+                        .IsRequired();
+
+                    b.Navigation("General")
+                        .IsRequired();
+
+                    b.Navigation("List")
+                        .IsRequired();
+
+                    b.Navigation("Notify")
+                        .IsRequired();
+
+                    b.Navigation("NotifyTemplate")
+                        .IsRequired();
+
+                    b.Navigation("Permission")
+                        .IsRequired();
+
+                    b.Navigation("View")
+                        .IsRequired();
+
+                    b.Navigation("Write")
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardPrefix", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany("BoardPrefix")
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Briefings.DailyBriefing", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.Comment", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "MentionMember")
+                        .WithMany()
+                        .HasForeignKey("MentionMemberID")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Parent")
+                        .WithMany("Children")
+                        .HasForeignKey("ParentID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("Comment")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("MentionMember");
+
+                    b.Navigation("Parent");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentFile", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentFile")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentImage", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentImage")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentLink", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentLink")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentMedia", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentMedia")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentMention", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithOne("CommentMention")
+                        .HasForeignKey("Domain.Entities.Forum.Comments.CommentMention", "CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentReaction", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentReaction")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentReport", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentReport")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentFileDownLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Comments.CommentFile", "CommentFile")
+                        .WithMany()
+                        .HasForeignKey("CommentFileID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentFileDownLog")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("CommentFile");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentLinkClickLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentLinkClickLog")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.CommentLink", "CommentLink")
+                        .WithMany()
+                        .HasForeignKey("CommentLinkID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("CommentLink");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentUpdateLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentUpdateLog")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostFileDownLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.HasOne("Domain.Entities.Forum.Posts.PostFile", "PostFile")
+                        .WithMany()
+                        .HasForeignKey("PostFileID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostFileDownLog")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+
+                    b.Navigation("PostFile");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostLinkClickLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostLinkClickLog")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.PostLink", "PostLink")
+                        .WithMany()
+                        .HasForeignKey("PostLinkID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+
+                    b.Navigation("PostLink");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostUpdateLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostUpdateLog")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostViewLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID");
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.Post", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany("Post")
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Boards.BoardPrefix", "BoardPrefix")
+                        .WithMany()
+                        .HasForeignKey("BoardPrefixID")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.Navigation("Board");
+
+                    b.Navigation("BoardPrefix");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostBookmark", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostBookmark")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostCheer", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "FromMember")
+                        .WithMany()
+                        .HasForeignKey("FromMemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "ToMember")
+                        .WithMany()
+                        .HasForeignKey("ToMemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.Navigation("FromMember");
+
+                    b.Navigation("Post");
+
+                    b.Navigation("ToMember");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostFile", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostFile")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostImage", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostImage")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostLink", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostLink")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostMedia", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostMedia")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostPrediction", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostReaction", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostReaction")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostReport", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostReport")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostStockTag", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostTag", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostTag")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Tag", "Tag")
+                        .WithMany("PostTag")
+                        .HasForeignKey("TagID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Post");
+
+                    b.Navigation("Tag");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Attendance", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.BroadcastSession", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Channel", "Channel")
+                        .WithMany()
+                        .HasForeignKey("ChannelID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Channel");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Channel", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithOne("Channel")
+                        .HasForeignKey("Domain.Entities.Members.Channel", "MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.ChannelBroadcastStats", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Channel", "Channel")
+                        .WithMany()
+                        .HasForeignKey("ChannelID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Channel");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.ChannelHandleHistory", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Channel", "Channel")
+                        .WithMany()
+                        .HasForeignKey("ChannelID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Channel");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberEmailChangeLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberExpLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.BroadcastSession", "BroadcastSession")
+                        .WithMany()
+                        .HasForeignKey("BroadcastSessionID")
+                        .OnDelete(DeleteBehavior.NoAction);
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("BroadcastSession");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberIntroChangeLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberLoginLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberNameChangeLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberSummaryChangeLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberThumbChangeLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Member", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.MemberGrade", "MemberGrade")
+                        .WithMany()
+                        .HasForeignKey("MemberGradeID")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.Navigation("MemberGrade");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberApprove", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithOne("MemberApprove")
+                        .HasForeignKey("Domain.Entities.Members.MemberApprove", "MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberDailyRewardCounter", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", null)
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberFollow", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Followee")
+                        .WithMany()
+                        .HasForeignKey("FolloweeMemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Follower")
+                        .WithMany()
+                        .HasForeignKey("FollowerMemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Followee");
+
+                    b.Navigation("Follower");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberItem", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.Product", "Product")
+                        .WithMany()
+                        .HasForeignKey("ProductID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Product");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberOAuthToken", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberStats", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithOne("MemberStats")
+                        .HasForeignKey("Domain.Entities.Members.MemberStats", "MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberTrackRecord", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithOne()
+                        .HasForeignKey("Domain.Entities.Members.MemberTrackRecord", "MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.RefreshToken", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Notes.Note", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Receiver")
+                        .WithMany()
+                        .HasForeignKey("ReceiverMemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Sender")
+                        .WithMany()
+                        .HasForeignKey("SenderMemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.Navigation("Receiver");
+
+                    b.Navigation("Sender");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Notifications.Notification", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Banner.BannerItem", b =>
+                {
+                    b.HasOne("Domain.Entities.Page.Banner.BannerPosition", "BannerPosition")
+                        .WithMany("BannerItems")
+                        .HasForeignKey("PositionID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("BannerPosition");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Faq.FaqItem", b =>
+                {
+                    b.HasOne("Domain.Entities.Page.Faq.FaqCategory", "FaqCategory")
+                        .WithMany("FaqItems")
+                        .HasForeignKey("CategoryID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FaqCategory");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Popup.Popup", b =>
+                {
+                    b.HasOne("Domain.Entities.Page.Popup.PopupPosition", "PopupPosition")
+                        .WithMany("Popups")
+                        .HasForeignKey("PositionID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("PopupPosition");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperAccount", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperDailySnapshot", b =>
+                {
+                    b.HasOne("Domain.Entities.Paper.PaperAccount", "Account")
+                        .WithMany()
+                        .HasForeignKey("AccountID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Account");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperFill", b =>
+                {
+                    b.HasOne("Domain.Entities.Paper.PaperOrder", "Order")
+                        .WithMany()
+                        .HasForeignKey("OrderID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Order");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperLedger", b =>
+                {
+                    b.HasOne("Domain.Entities.Paper.PaperAccount", "Account")
+                        .WithMany()
+                        .HasForeignKey("AccountID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Account");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperOrder", b =>
+                {
+                    b.HasOne("Domain.Entities.Paper.PaperAccount", "Account")
+                        .WithMany()
+                        .HasForeignKey("AccountID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Account");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperPosition", b =>
+                {
+                    b.HasOne("Domain.Entities.Paper.PaperAccount", "Account")
+                        .WithMany()
+                        .HasForeignKey("AccountID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Account");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.PaymentOrder", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.Toss.TossCancel", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Payments.PaymentOrder", "PaymentOrder")
+                        .WithMany()
+                        .HasForeignKey("PaymentOrderID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+
+                    b.Navigation("PaymentOrder");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.Toss.TossConfirm", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Payments.PaymentOrder", "PaymentOrder")
+                        .WithMany()
+                        .HasForeignKey("PaymentOrderID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+
+                    b.Navigation("PaymentOrder");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.Toss.TossLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.NoAction);
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.StockDailyPrice", b =>
+                {
+                    b.HasOne("Domain.Entities.Stocks.Stock", "Stock")
+                        .WithMany()
+                        .HasForeignKey("StockID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.Navigation("Stock");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Coupon", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Game", "Game")
+                        .WithMany()
+                        .HasForeignKey("GameID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.Product", "Product")
+                        .WithMany()
+                        .HasForeignKey("ProductID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Game");
+
+                    b.Navigation("Product");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.CouponCode", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Coupon", "Coupon")
+                        .WithMany()
+                        .HasForeignKey("CouponID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "IssuedToMember")
+                        .WithMany()
+                        .HasForeignKey("IssuedToMemberID")
+                        .OnDelete(DeleteBehavior.NoAction);
+
+                    b.Navigation("Coupon");
+
+                    b.Navigation("IssuedToMember");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameCategoryMap", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.GameCategory", "GameCategory")
+                        .WithMany("GameCategoryMap")
+                        .HasForeignKey("GameCategoryID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.Game", "Game")
+                        .WithMany("GameCategoryMap")
+                        .HasForeignKey("GameID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Game");
+
+                    b.Navigation("GameCategory");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameGenreMap", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.GameGenre", "GameGenre")
+                        .WithMany("GameGenreMap")
+                        .HasForeignKey("GameGenreID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.Game", "Game")
+                        .WithMany("GameGenreMap")
+                        .HasForeignKey("GameID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Game");
+
+                    b.Navigation("GameGenre");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameImage", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Game", "Game")
+                        .WithMany("GameImage")
+                        .HasForeignKey("GameID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Game");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameLanguageSupport", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Game", "Game")
+                        .WithMany("GameLanguageSupport")
+                        .HasForeignKey("GameID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.GameLanguage", "GameLanguage")
+                        .WithMany("GameLanguageSupport")
+                        .HasForeignKey("GameLanguageID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Game");
+
+                    b.Navigation("GameLanguage");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameSettlement", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Game", "Game")
+                        .WithMany()
+                        .HasForeignKey("GameID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Game");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.MemberAddress", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.MemberInventory", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.CouponCode", "CouponCode")
+                        .WithMany()
+                        .HasForeignKey("CouponCodeID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.OrderItem", "OrderItem")
+                        .WithMany()
+                        .HasForeignKey("OrderItemID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("CouponCode");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("OrderItem");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Order", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Channel", "Channel")
+                        .WithMany()
+                        .HasForeignKey("ChannelID")
+                        .OnDelete(DeleteBehavior.NoAction);
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Channel");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.OrderItem", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.CouponCode", "IssuedCouponCode")
+                        .WithMany()
+                        .HasForeignKey("IssuedCouponCodeID")
+                        .OnDelete(DeleteBehavior.NoAction);
+
+                    b.HasOne("Domain.Entities.Store.Order", "Order")
+                        .WithMany("Items")
+                        .HasForeignKey("OrderID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.Product", "Product")
+                        .WithMany()
+                        .HasForeignKey("ProductID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("IssuedCouponCode");
+
+                    b.Navigation("Order");
+
+                    b.Navigation("Product");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.OrderRefund", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Order", "Order")
+                        .WithMany("Refunds")
+                        .HasForeignKey("OrderID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Order");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.OrderRefundItem", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.CouponCode", "CouponCode")
+                        .WithMany()
+                        .HasForeignKey("CouponCodeID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.OrderItem", "OrderItem")
+                        .WithMany()
+                        .HasForeignKey("OrderItemID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.OrderRefund", "OrderRefund")
+                        .WithMany("Items")
+                        .HasForeignKey("OrderRefundID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("CouponCode");
+
+                    b.Navigation("OrderItem");
+
+                    b.Navigation("OrderRefund");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Product", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Game", "Game")
+                        .WithMany()
+                        .HasForeignKey("GameID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.Navigation("Game");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.ProductLimitConfig", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Product", "Product")
+                        .WithOne()
+                        .HasForeignKey("Domain.Entities.Store.ProductLimitConfig", "ProductID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Product");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Shipment", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Order", "Order")
+                        .WithOne()
+                        .HasForeignKey("Domain.Entities.Store.Shipment", "OrderID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Order");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Wallets.Wallet", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithOne("Wallet")
+                        .HasForeignKey("Domain.Entities.Wallets.Wallet", "MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Wallets.WalletBalance", b =>
+                {
+                    b.HasOne("Domain.Entities.Wallets.Wallet", null)
+                        .WithMany("Balances")
+                        .HasForeignKey("WalletKey")
+                        .HasPrincipalKey("WalletKey")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.OwnsOne("Domain.Entities.Common.ValueObject.Money", "Amount", b1 =>
+                        {
+                            b1.Property<int>("WalletBalanceID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("Currency")
+                                .IsRequired()
+                                .HasMaxLength(10)
+                                .HasColumnType("nvarchar(10)")
+                                .HasColumnName("Currency");
+
+                            b1.Property<decimal>("Value")
+                                .HasPrecision(18)
+                                .HasColumnType("decimal(18,0)")
+                                .HasColumnName("Amount");
+
+                            b1.HasKey("WalletBalanceID");
+
+                            b1.ToTable("WalletBalance");
+
+                            b1.WithOwner()
+                                .HasForeignKey("WalletBalanceID");
+                        });
+
+                    b.Navigation("Amount")
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Domain.Entities.Wallets.WalletTransaction", b =>
+                {
+                    b.HasOne("Domain.Entities.Wallets.Wallet", "Wallet")
+                        .WithMany("Transactions")
+                        .HasForeignKey("WalletKey")
+                        .HasPrincipalKey("WalletKey")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.OwnsOne("Domain.Entities.Common.ValueObject.Money", "Amount", b1 =>
+                        {
+                            b1.Property<int>("WalletTransactionID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("Currency")
+                                .IsRequired()
+                                .HasMaxLength(10)
+                                .HasColumnType("nvarchar(10)")
+                                .HasColumnName("Currency");
+
+                            b1.Property<decimal>("Value")
+                                .HasPrecision(18)
+                                .HasColumnType("decimal(18,0)")
+                                .HasColumnName("Amount");
+
+                            b1.HasKey("WalletTransactionID");
+
+                            b1.ToTable("WalletTransaction");
+
+                            b1.WithOwner()
+                                .HasForeignKey("WalletTransactionID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.ValueObject.Money", "BalanceAfter", b1 =>
+                        {
+                            b1.Property<int>("WalletTransactionID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("Currency")
+                                .IsRequired()
+                                .HasMaxLength(10)
+                                .HasColumnType("nvarchar(10)")
+                                .HasColumnName("BalanceAfterCurrency");
+
+                            b1.Property<decimal>("Value")
+                                .HasPrecision(18)
+                                .HasColumnType("decimal(18,0)")
+                                .HasColumnName("BalanceAfter");
+
+                            b1.HasKey("WalletTransactionID");
+
+                            b1.ToTable("WalletTransaction");
+
+                            b1.WithOwner()
+                                .HasForeignKey("WalletTransactionID");
+                        });
+
+                    b.Navigation("Amount")
+                        .IsRequired();
+
+                    b.Navigation("BalanceAfter")
+                        .IsRequired();
+
+                    b.Navigation("Wallet");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedComment", b =>
+                {
+                    b.Navigation("Children");
+
+                    b.Navigation("FeedCommentLike");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPost", b =>
+                {
+                    b.Navigation("FeedBookmark");
+
+                    b.Navigation("FeedComment");
+
+                    b.Navigation("FeedLike");
+
+                    b.Navigation("FeedPostImage");
+
+                    b.Navigation("FeedPostMedia");
+
+                    b.Navigation("FeedPostMention");
+
+                    b.Navigation("FeedPostTag");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedTag", b =>
+                {
+                    b.Navigation("FeedPostTag");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.Board", b =>
+                {
+                    b.Navigation("BoardManager");
+
+                    b.Navigation("BoardMeta")
+                        .IsRequired();
+
+                    b.Navigation("BoardPrefix");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardGroup", b =>
+                {
+                    b.Navigation("Board");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.Comment", b =>
+                {
+                    b.Navigation("Children");
+
+                    b.Navigation("CommentFile");
+
+                    b.Navigation("CommentFileDownLog");
+
+                    b.Navigation("CommentImage");
+
+                    b.Navigation("CommentLink");
+
+                    b.Navigation("CommentLinkClickLog");
+
+                    b.Navigation("CommentMedia");
+
+                    b.Navigation("CommentMention");
+
+                    b.Navigation("CommentReaction");
+
+                    b.Navigation("CommentReport");
+
+                    b.Navigation("CommentUpdateLog");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.Post", b =>
+                {
+                    b.Navigation("Comment");
+
+                    b.Navigation("PostBookmark");
+
+                    b.Navigation("PostFile");
+
+                    b.Navigation("PostFileDownLog");
+
+                    b.Navigation("PostImage");
+
+                    b.Navigation("PostLink");
+
+                    b.Navigation("PostLinkClickLog");
+
+                    b.Navigation("PostMedia");
+
+                    b.Navigation("PostReaction");
+
+                    b.Navigation("PostReport");
+
+                    b.Navigation("PostTag");
+
+                    b.Navigation("PostUpdateLog");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.Tag", b =>
+                {
+                    b.Navigation("PostTag");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Member", b =>
+                {
+                    b.Navigation("Channel");
+
+                    b.Navigation("MemberApprove")
+                        .IsRequired();
+
+                    b.Navigation("MemberStats")
+                        .IsRequired();
+
+                    b.Navigation("Wallet");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Banner.BannerPosition", b =>
+                {
+                    b.Navigation("BannerItems");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Faq.FaqCategory", b =>
+                {
+                    b.Navigation("FaqItems");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Popup.PopupPosition", b =>
+                {
+                    b.Navigation("Popups");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Game", b =>
+                {
+                    b.Navigation("GameCategoryMap");
+
+                    b.Navigation("GameGenreMap");
+
+                    b.Navigation("GameImage");
+
+                    b.Navigation("GameLanguageSupport");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameCategory", b =>
+                {
+                    b.Navigation("GameCategoryMap");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameGenre", b =>
+                {
+                    b.Navigation("GameGenreMap");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameLanguage", b =>
+                {
+                    b.Navigation("GameLanguageSupport");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Order", b =>
+                {
+                    b.Navigation("Items");
+
+                    b.Navigation("Refunds");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.OrderRefund", b =>
+                {
+                    b.Navigation("Items");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Wallets.Wallet", b =>
+                {
+                    b.Navigation("Balances");
+
+                    b.Navigation("Transactions");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}

+ 119 - 0
Infrastructure/Persistence/Migrations/20260707093947_AddSeibroIssuerAndStockExtension.cs

@@ -0,0 +1,119 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Infrastructure.Migrations.AppDb
+{
+    /// <inheritdoc />
+    public partial class AddSeibroIssuerAndStockExtension : Migration
+    {
+        /// <inheritdoc />
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.AddColumn<decimal>(
+                name: "FaceValue",
+                table: "Stock",
+                type: "decimal(15,4)",
+                precision: 15,
+                scale: 4,
+                nullable: true,
+                comment: "액면가 (SEIBro PVAL)");
+
+            migrationBuilder.AddColumn<bool>(
+                name: "IsElectronicSecurity",
+                table: "Stock",
+                type: "bit",
+                nullable: true,
+                comment: "전자증권 여부 (SEIBro ELTSC_YN)");
+
+            migrationBuilder.AddColumn<int>(
+                name: "IssucoCustno",
+                table: "Stock",
+                type: "int",
+                nullable: true,
+                comment: "SEIBro 발행회사 고객번호 (ISSUCO_CUSTNO) — 기업정보 API 조인키");
+
+            migrationBuilder.AddColumn<long>(
+                name: "TotalIssuedShares",
+                table: "Stock",
+                type: "bigint",
+                nullable: true,
+                comment: "총발행주식수 (SEIBro TOTAL_STK_CNT)");
+
+            migrationBuilder.AddColumn<decimal>(
+                name: "VotingRights",
+                table: "Stock",
+                type: "decimal(5,2)",
+                precision: 5,
+                scale: 2,
+                nullable: true,
+                comment: "1주당 의결권수 (SEIBro VOTRNO)");
+
+            migrationBuilder.CreateTable(
+                name: "SeibroIssuerCode",
+                columns: table => new
+                {
+                    ID = table.Column<int>(type: "int", nullable: false)
+                        .Annotation("SqlServer:Identity", "1, 1"),
+                    Market = table.Column<string>(type: "nchar(2)", fixedLength: true, maxLength: 2, nullable: false, comment: "시장구분 (MART_TPCD) — 11유가/12코스닥/13K-OTC/14코넥스/50기타"),
+                    ShortCode = table.Column<string>(type: "nvarchar(12)", maxLength: 12, nullable: false, comment: "단축코드 (SHOTN_ISIN)"),
+                    Name = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false, comment: "종목명 (KOR_SECN_NM)"),
+                    IssucoCustno = table.Column<int>(type: "int", nullable: false, comment: "발행회사 고객번호 (ISSUCO_CUSTNO)"),
+                    UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_SeibroIssuerCode", x => x.ID);
+                },
+                comment: "SEIBro 시장별 단축코드↔발행회사번호 매핑 (getShotnByMart)");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_Stock_IssucoCustno",
+                table: "Stock",
+                column: "IssucoCustno");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_SeibroIssuerCode_IssucoCustno",
+                table: "SeibroIssuerCode",
+                column: "IssucoCustno");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_SeibroIssuerCode_Market_ShortCode",
+                table: "SeibroIssuerCode",
+                columns: new[] { "Market", "ShortCode" },
+                unique: true);
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropTable(
+                name: "SeibroIssuerCode");
+
+            migrationBuilder.DropIndex(
+                name: "IX_Stock_IssucoCustno",
+                table: "Stock");
+
+            migrationBuilder.DropColumn(
+                name: "FaceValue",
+                table: "Stock");
+
+            migrationBuilder.DropColumn(
+                name: "IsElectronicSecurity",
+                table: "Stock");
+
+            migrationBuilder.DropColumn(
+                name: "IssucoCustno",
+                table: "Stock");
+
+            migrationBuilder.DropColumn(
+                name: "TotalIssuedShares",
+                table: "Stock");
+
+            migrationBuilder.DropColumn(
+                name: "VotingRights",
+                table: "Stock");
+        }
+    }
+}

+ 12736 - 0
Infrastructure/Persistence/Migrations/20260707100929_AddSeibroDividend.Designer.cs

@@ -0,0 +1,12736 @@
+// <auto-generated />
+using System;
+using Infrastructure.Persistence;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Metadata;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+
+#nullable disable
+
+namespace Infrastructure.Migrations.AppDb
+{
+    [DbContext(typeof(AppDbContext))]
+    [Migration("20260707100929_AddSeibroDividend")]
+    partial class AddSeibroDividend
+    {
+        /// <inheritdoc />
+        protected override void BuildTargetModel(ModelBuilder modelBuilder)
+        {
+#pragma warning disable 612, 618
+            modelBuilder
+                .HasAnnotation("ProductVersion", "10.0.7")
+                .HasAnnotation("Relational:MaxIdentifierLength", 128);
+
+            SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder);
+
+            modelBuilder.Entity("Domain.Entities.Chat.ChatBan", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("CreatedBy")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("제재 등록자");
+
+                    b.Property<DateTime?>("ExpiresAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("제재 대상 회원 ID");
+
+                    b.Property<string>("Reason")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("제재 사유");
+
+                    b.Property<string>("RoomKey")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("제재 룸 키 (NULL=전체)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID", "ExpiresAt");
+
+                    b.ToTable("ChatBan", null, t =>
+                        {
+                            t.HasComment("채팅 제재 (RoomKey NULL=전체, ExpiresAt NULL=무기한)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Chat.ChatRoomConfig", b =>
+                {
+                    b.Property<string>("RoomKey")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("룸 키");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("활성 여부 (종목방 단계 오픈 게이트)");
+
+                    b.Property<string>("Notice")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("상단 고정 공지");
+
+                    b.Property<short>("SlowModeSeconds")
+                        .HasColumnType("smallint")
+                        .HasComment("슬로우 모드 (초)");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("RoomKey");
+
+                    b.ToTable("ChatRoomConfig", null, t =>
+                        {
+                            t.HasComment("채팅방 설정 (main | stock:{code})");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Common.Config", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("LastUpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 수정일시");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion")
+                        .HasComment("동시성 제어용");
+
+                    b.HasKey("ID");
+
+                    b.ToTable("Config", null, t =>
+                        {
+                            t.HasComment("운영 정보 설정 값");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Common.EmailLog", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<string>("Category")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("카테고리 (auth.register, forum.post.notify 등)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("datetime2")
+                        .HasDefaultValueSql("GETUTCDATE()")
+                        .HasComment("등록 시각 (UTC)");
+
+                    b.Property<DateTime?>("FailedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("실패 확정 시각 (UTC)");
+
+                    b.Property<string>("LastError")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("마지막 오류 메시지");
+
+                    b.Property<int>("MaxRetryCount")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(3)
+                        .HasComment("최대 재시도 횟수");
+
+                    b.Property<string>("MessageHtml")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("HTML 본문");
+
+                    b.Property<string>("MessageText")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("텍스트 본문 (선택)");
+
+                    b.Property<DateTime>("NextRetryAt")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("datetime2")
+                        .HasDefaultValueSql("GETUTCDATE()")
+                        .HasComment("다음 시도 시각 (UTC)");
+
+                    b.Property<DateTime?>("ProcessedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("처리 완료 시각 (UTC)");
+
+                    b.Property<int>("RetryCount")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(0)
+                        .HasComment("재시도 횟수");
+
+                    b.Property<byte>("Status")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("tinyint")
+                        .HasDefaultValue((byte)0)
+                        .HasComment("상태 (0=Pending, 1=Processing, 2=Sent, 3=Failed)");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("제목");
+
+                    b.Property<string>("ToAddress")
+                        .IsRequired()
+                        .HasMaxLength(256)
+                        .HasColumnType("nvarchar(256)")
+                        .HasComment("수신자 이메일");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt")
+                        .HasDatabaseName("IX_EmailLog_CreatedAt");
+
+                    b.HasIndex("Status", "NextRetryAt")
+                        .HasDatabaseName("IX_EmailLog_Status_NextRetryAt");
+
+                    b.ToTable("EmailLog", null, t =>
+                        {
+                            t.HasComment("이메일 발송 큐");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Director.AdminAccessLog", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("생성 일시");
+
+                    b.Property<long>("ElapsedMs")
+                        .HasColumnType("bigint")
+                        .HasComment("처리 시간 (밀리초)");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP 주소");
+
+                    b.Property<string>("MenuName")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("메뉴 이름");
+
+                    b.Property<string>("Method")
+                        .IsRequired()
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)")
+                        .HasComment("HTTP Method");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasMaxLength(2048)
+                        .HasColumnType("nvarchar(2048)")
+                        .HasComment("요청 경로");
+
+                    b.Property<string>("QueryString")
+                        .HasMaxLength(2048)
+                        .HasColumnType("nvarchar(2048)")
+                        .HasComment("쿼리 스트링");
+
+                    b.Property<int>("StatusCode")
+                        .HasColumnType("int")
+                        .HasComment("응답 상태 코드");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.Property<string>("UserID")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)")
+                        .HasComment("관리자 사용자 ID");
+
+                    b.Property<string>("UserName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("관리자 사용자 이름");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("UserID");
+
+                    b.ToTable("AdminAccessLog", null, t =>
+                        {
+                            t.HasComment("관리자 접근 기록");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Director.AdminLoginLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Account")
+                        .IsRequired()
+                        .HasMaxLength(120)
+                        .HasColumnType("nvarchar(120)")
+                        .HasComment("로그인 시도 계정");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("생성 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP 주소");
+
+                    b.Property<string>("Reason")
+                        .HasMaxLength(225)
+                        .HasColumnType("nvarchar(225)")
+                        .HasComment("실패 사유");
+
+                    b.Property<bool>("Success")
+                        .HasColumnType("bit")
+                        .HasComment("로그인 성공 여부");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Account");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.ToTable("AdminLoginLog", null, t =>
+                        {
+                            t.HasComment("관리자 로그인 기록");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.EmailVerification.EmailVerifyNumber", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)")
+                        .HasComment("Code");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasMaxLength(60)
+                        .HasColumnType("nvarchar(60)")
+                        .HasComment("이메일");
+
+                    b.Property<DateTime>("Expiration")
+                        .HasColumnType("datetime2")
+                        .HasComment("만료 일시");
+
+                    b.Property<bool>("IsVerified")
+                        .HasColumnType("bit")
+                        .HasComment("인증 여부");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int")
+                        .HasComment("인증 유형 (이메일 인증 / 비밀번호 재설정)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code");
+
+                    b.HasIndex("Email");
+
+                    b.HasIndex("Expiration");
+
+                    b.HasIndex("IsVerified");
+
+                    b.HasIndex("Type");
+
+                    b.HasIndex("Type", "Code");
+
+                    b.HasIndex("Type", "Code", "IsVerified");
+
+                    b.ToTable("EmailVerifyNumber", null, t =>
+                        {
+                            t.HasComment("이메일 인증 번호들");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.EmailVerification.EmailVerifyToken", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Additional")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("추가 정보(JSON)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasMaxLength(60)
+                        .HasColumnType("nvarchar(60)")
+                        .HasComment("이메일");
+
+                    b.Property<DateTime>("Expiration")
+                        .HasColumnType("datetime2")
+                        .HasComment("만료 일시");
+
+                    b.Property<bool>("IsVerified")
+                        .HasColumnType("bit")
+                        .HasComment("인증 여부");
+
+                    b.Property<string>("Token")
+                        .IsRequired()
+                        .HasMaxLength(256)
+                        .HasColumnType("nvarchar(256)")
+                        .HasComment("Token");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int")
+                        .HasComment("인증 유형 (이메일 인증 / 비밀번호 재설정)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Email");
+
+                    b.HasIndex("Expiration");
+
+                    b.HasIndex("IsVerified");
+
+                    b.HasIndex("Token");
+
+                    b.HasIndex("Type");
+
+                    b.HasIndex("Type", "Email", "Token");
+
+                    b.HasIndex("Type", "Email", "Token", "IsVerified");
+
+                    b.ToTable("EmailVerifyToken", null, t =>
+                        {
+                            t.HasComment("이메일 인증 토큰들");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedBookmark", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("FeedPostID", "MemberID")
+                        .IsUnique();
+
+                    b.HasIndex("MemberID", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("FeedBookmark", null, t =>
+                        {
+                            t.HasComment("피드 포스트 북마크");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedComment", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Content")
+                        .IsRequired()
+                        .HasMaxLength(2000)
+                        .HasColumnType("nvarchar(2000)")
+                        .HasComment("댓글 내용");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<DateTime?>("DeletedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("삭제 일시");
+
+                    b.Property<short>("Depth")
+                        .HasColumnType("smallint")
+                        .HasComment("중첩 깊이 (0 = 루트)");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int")
+                        .HasComment("FeedPost ID");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("삭제 여부");
+
+                    b.Property<int>("Likes")
+                        .HasColumnType("int")
+                        .HasComment("좋아요 수");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("작성 회원 ID");
+
+                    b.Property<int?>("ParentID")
+                        .HasColumnType("int")
+                        .HasComment("부모 댓글 ID (대댓글용)");
+
+                    b.Property<int>("Replies")
+                        .HasColumnType("int")
+                        .HasComment("자식 댓글 수");
+
+                    b.Property<int>("Reports")
+                        .HasColumnType("int")
+                        .HasComment("신고 수");
+
+                    b.Property<int>("Score")
+                        .HasColumnType("int")
+                        .HasComment("랭킹 스코어");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("ParentID");
+
+                    b.HasIndex("FeedPostID", "IsDeleted", "ParentID", "CreatedAt")
+                        .IsDescending(false, false, false, true);
+
+                    b.HasIndex("FeedPostID", "IsDeleted", "ParentID", "Score", "ID")
+                        .IsDescending(false, false, false, true, true);
+
+                    b.HasIndex("FeedPostID", "MemberID", "IsDeleted", "ParentID", "CreatedAt")
+                        .IsDescending(false, false, false, false, true);
+
+                    b.ToTable("FeedComment", null, t =>
+                        {
+                            t.HasComment("피드 댓글 (Reddit식 계층형)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedCommentLike", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FeedCommentID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedCommentID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("FeedCommentID", "MemberID")
+                        .IsUnique();
+
+                    b.ToTable("FeedCommentLike", null, t =>
+                        {
+                            t.HasComment("피드 댓글 좋아요");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedLike", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("FeedPostID", "MemberID")
+                        .IsUnique();
+
+                    b.ToTable("FeedLike", null, t =>
+                        {
+                            t.HasComment("피드 포스트 좋아요");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPost", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("Bookmarks")
+                        .HasColumnType("int")
+                        .HasComment("북마크 수");
+
+                    b.Property<int>("Comments")
+                        .HasColumnType("int")
+                        .HasComment("댓글 수");
+
+                    b.Property<string>("Content")
+                        .IsRequired()
+                        .HasMaxLength(5000)
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("본문");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<DateTime?>("DeletedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("삭제 일시");
+
+                    b.Property<byte>("Images")
+                        .HasColumnType("tinyint")
+                        .HasComment("이미지 개수");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("작성자 IP");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("삭제 여부");
+
+                    b.Property<int>("Likes")
+                        .HasColumnType("int")
+                        .HasComment("좋아요 수");
+
+                    b.Property<byte>("Medias")
+                        .HasColumnType("tinyint")
+                        .HasComment("미디어 개수");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("작성 회원 ID");
+
+                    b.Property<int>("Reports")
+                        .HasColumnType("int")
+                        .HasComment("신고 수");
+
+                    b.Property<byte>("Tags")
+                        .HasColumnType("tinyint")
+                        .HasComment("태그 개수");
+
+                    b.Property<string>("Thumbnail")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("썸네일 URL");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("작성자 User-Agent");
+
+                    b.Property<int>("Views")
+                        .HasColumnType("int")
+                        .HasComment("조회수");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("IsDeleted");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("IsDeleted", "CreatedAt");
+
+                    b.HasIndex("MemberID", "IsDeleted", "CreatedAt");
+
+                    b.HasIndex("IsDeleted", "Likes", "Comments", "Views");
+
+                    b.ToTable("FeedPost", null, t =>
+                        {
+                            t.HasComment("피드 포스트");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostImage", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("ContentType")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("MIME");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("비활성 일시");
+
+                    b.Property<string>("Extension")
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)")
+                        .HasComment("확장자");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("FileName")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("원본 파일명");
+
+                    b.Property<string>("HashedName")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("저장 파일명(해시)");
+
+                    b.Property<short?>("Height")
+                        .HasColumnType("smallint")
+                        .HasComment("세로 픽셀");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit")
+                        .HasComment("비활성 여부");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("상대 경로");
+
+                    b.Property<long?>("Size")
+                        .HasColumnType("bigint")
+                        .HasComment("바이트 크기");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("UUID");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("접근 URL");
+
+                    b.Property<short?>("Width")
+                        .HasColumnType("smallint")
+                        .HasComment("가로 픽셀");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.HasIndex("UUID")
+                        .IsUnique();
+
+                    b.HasIndex("FeedPostID", "HashedName");
+
+                    b.HasIndex("FeedPostID", "IsDisabled");
+
+                    b.ToTable("FeedPostImage", null, t =>
+                        {
+                            t.HasComment("피드 포스트 이미지");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostMedia", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("미디어 URL");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.ToTable("FeedPostMedia", null, t =>
+                        {
+                            t.HasComment("피드 포스트 미디어 링크");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostMention", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Length")
+                        .HasColumnType("int")
+                        .HasComment("길이");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("RawHandle")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)")
+                        .HasComment("원문 @handle");
+
+                    b.Property<int>("Start")
+                        .HasColumnType("int")
+                        .HasComment("본문 내 시작 인덱스");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("FeedPostID", "MemberID")
+                        .IsUnique();
+
+                    b.HasIndex("MemberID", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("FeedPostMention", null, t =>
+                        {
+                            t.HasComment("피드 포스트 멘션");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostTag", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FeedPostID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("FeedTagID")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FeedPostID");
+
+                    b.HasIndex("FeedTagID");
+
+                    b.HasIndex("FeedPostID", "FeedTagID")
+                        .IsUnique();
+
+                    b.HasIndex("FeedTagID", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("FeedPostTag", null, t =>
+                        {
+                            t.HasComment("피드 포스트-태그 조인");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedTag", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("태그 이름");
+
+                    b.Property<string>("Slug")
+                        .IsRequired()
+                        .HasMaxLength(120)
+                        .HasColumnType("nvarchar(120)")
+                        .HasComment("태그 슬러그 (URL용)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<long>("UsageCount")
+                        .HasColumnType("bigint")
+                        .HasComment("사용 횟수");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Name")
+                        .IsUnique();
+
+                    b.HasIndex("Slug")
+                        .IsUnique();
+
+                    b.HasIndex("UsageCount")
+                        .IsDescending();
+
+                    b.ToTable("FeedTag", null, t =>
+                        {
+                            t.HasComment("피드 태그 마스터");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.Board", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardGroupID")
+                        .HasColumnType("int")
+                        .HasComment("분류 ID");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("게시판 주소");
+
+                    b.Property<int>("Comments")
+                        .HasColumnType("int")
+                        .HasComment("댓글 수");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<bool>("IsSearch")
+                        .HasColumnType("bit")
+                        .HasComment("검색 여부");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(70)
+                        .HasColumnType("nvarchar(70)")
+                        .HasComment("게시판 이름");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("순서");
+
+                    b.Property<int>("Posts")
+                        .HasColumnType("int")
+                        .HasComment("게시글 수");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardGroupID");
+
+                    b.HasIndex("Code")
+                        .IsUnique();
+
+                    b.HasIndex("Comments");
+
+                    b.HasIndex("IsActive");
+
+                    b.HasIndex("IsSearch");
+
+                    b.HasIndex("Name");
+
+                    b.HasIndex("Order");
+
+                    b.HasIndex("Posts");
+
+                    b.HasIndex("Code", "IsActive");
+
+                    b.HasIndex("Code", "IsSearch");
+
+                    b.HasIndex("IsSearch", "IsActive");
+
+                    b.ToTable("Board", null, t =>
+                        {
+                            t.HasComment("게시판");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardGroup", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<short>("Boards")
+                        .HasColumnType("smallint")
+                        .HasComment("게시판 수");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("게시판 분류 주소");
+
+                    b.Property<int>("Comments")
+                        .HasColumnType("int")
+                        .HasComment("댓글 수");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(70)
+                        .HasColumnType("nvarchar(70)")
+                        .HasComment("게시판 분류 명");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("순서");
+
+                    b.Property<int>("Posts")
+                        .HasColumnType("int")
+                        .HasComment("게시글 수");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code")
+                        .IsUnique();
+
+                    b.HasIndex("Order");
+
+                    b.HasIndex("Order", "CreatedAt");
+
+                    b.HasIndex("Code", "Order", "CreatedAt");
+
+                    b.ToTable("BoardGroup", null, t =>
+                        {
+                            t.HasComment("게시판 분류");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardManager", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<bool>("CanDelete")
+                        .HasColumnType("bit")
+                        .HasComment("삭제 권한");
+
+                    b.Property<bool>("CanEdit")
+                        .HasColumnType("bit")
+                        .HasComment("수정 권한");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("관리자 ID");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("BoardID", "MemberID");
+
+                    b.ToTable("BoardManager", null, t =>
+                        {
+                            t.HasComment("게시판 관리자");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardMeta", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID")
+                        .IsUnique();
+
+                    b.ToTable("BoardMeta", null, t =>
+                        {
+                            t.HasComment("게시판 설정");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardPrefix", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<string>("Color")
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)")
+                        .HasComment("색상");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("말머리");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("정렬 순서");
+
+                    b.Property<int>("Posts")
+                        .HasColumnType("int")
+                        .HasComment("사용 게시글 수");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID", "IsActive", "Order", "CreatedAt");
+
+                    b.ToTable("BoardPrefix", null, t =>
+                        {
+                            t.HasComment("게시판 말머리");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Briefings.DailyBriefing", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateOnly>("BriefingDate")
+                        .HasColumnType("date")
+                        .HasComment("브리핑 대상 일자 (KST, UNIQUE)");
+
+                    b.Property<DateTime>("GeneratedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("생성 일시");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("발행된 게시글 ID (FK Post)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BriefingDate")
+                        .IsUnique();
+
+                    b.HasIndex("PostID");
+
+                    b.ToTable("DailyBriefing", null, t =>
+                        {
+                            t.HasComment("장전 브리핑 발행 기록 (중복 발행 방지)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.Comment", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<string>("Content")
+                        .IsRequired()
+                        .HasMaxLength(4000)
+                        .HasColumnType("nvarchar(4000)")
+                        .HasComment("댓글 내용");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<DateTime?>("DeletedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<short>("Depth")
+                        .HasColumnType("smallint")
+                        .HasComment("댓글 깊이");
+
+                    b.Property<int>("Dislikes")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<byte>("Files")
+                        .HasColumnType("tinyint");
+
+                    b.Property<int>("Images")
+                        .HasColumnType("int");
+
+                    b.Property<string>("IpAddress")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("삭제 여부");
+
+                    b.Property<bool>("IsReply")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsSecret")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("Likes")
+                        .HasColumnType("int");
+
+                    b.Property<byte>("Medias")
+                        .HasColumnType("tinyint");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<int?>("MentionMemberID")
+                        .HasColumnType("int")
+                        .HasComment("언급 대상 회원 ID");
+
+                    b.Property<string>("Name")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int?>("ParentID")
+                        .HasColumnType("int")
+                        .HasComment("부모 댓글 ID");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<int>("Replies")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Reports")
+                        .HasColumnType("int");
+
+                    b.Property<string>("SID")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("Score")
+                        .HasColumnType("int")
+                        .HasComment("점수");
+
+                    b.Property<byte>("Status")
+                        .HasColumnType("tinyint")
+                        .HasComment("댓글 상태");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("UserAgent")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("MentionMemberID");
+
+                    b.HasIndex("ParentID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("PostID", "IsDeleted", "ParentID", "CreatedAt")
+                        .IsDescending(false, false, false, true);
+
+                    b.HasIndex("PostID", "IsDeleted", "ParentID", "Score", "ID")
+                        .IsDescending(false, false, false, true, true);
+
+                    b.HasIndex("PostID", "MemberID", "IsDeleted", "ParentID", "CreatedAt")
+                        .IsDescending(false, false, false, false, true);
+
+                    b.HasIndex("PostID", "MemberID", "IsDeleted", "ParentID", "Score", "ID")
+                        .IsDescending(false, false, false, false, true, true);
+
+                    b.ToTable("Comment", null, t =>
+                        {
+                            t.HasComment("댓글");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentFile", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("ContentType")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Downloads")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Extension")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("FileName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("HashedName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<long?>("Size")
+                        .HasColumnType("bigint");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("UUID")
+                        .IsUnique();
+
+                    b.ToTable("CommentFile", null, t =>
+                        {
+                            t.HasComment("댓글 파일");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentImage", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("ContentType")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Extension")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("FileName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("HashedName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<short?>("Height")
+                        .HasColumnType("smallint");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<long?>("Size")
+                        .HasColumnType("bigint");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<short?>("Width")
+                        .HasColumnType("smallint");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("UUID")
+                        .IsUnique();
+
+                    b.ToTable("CommentImage", null, t =>
+                        {
+                            t.HasComment("댓글 이미지");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentLink", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Clicks")
+                        .HasColumnType("int");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("PostID");
+
+                    b.ToTable("CommentLink", null, t =>
+                        {
+                            t.HasComment("댓글 링크");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentMedia", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("PostID");
+
+                    b.ToTable("CommentMedia", null, t =>
+                        {
+                            t.HasComment("댓글 미디어");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentMention", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<int>("Length")
+                        .HasColumnType("int")
+                        .HasComment("길이");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("언급된 회원 ID");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<string>("RawHandle")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)")
+                        .HasComment("원문 회원 언급값");
+
+                    b.Property<int>("Start")
+                        .HasColumnType("int")
+                        .HasComment("본문 내 시작 인덱스");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("CommentID")
+                        .IsUnique();
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("CommentID", "ID");
+
+                    b.HasIndex("CommentID", "MemberID", "ID");
+
+                    b.HasIndex("CommentID", "MemberID", "Start");
+
+                    b.ToTable("CommentMention", null, t =>
+                        {
+                            t.HasComment("댓글 멘션");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentReaction", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<byte>("Reaction")
+                        .HasColumnType("tinyint")
+                        .HasComment("반응 구분");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("Reaction");
+
+                    b.HasIndex("CommentID", "ID");
+
+                    b.HasIndex("CommentID", "MemberID")
+                        .IsUnique();
+
+                    b.ToTable("CommentReaction", null, t =>
+                        {
+                            t.HasComment("댓글 반응");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentReport", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Memo")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("처리 내용");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<string>("Reason")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("신고 내용");
+
+                    b.Property<byte>("Status")
+                        .HasColumnType("tinyint")
+                        .HasComment("처리 상태");
+
+                    b.Property<byte>("Type")
+                        .HasColumnType("tinyint")
+                        .HasComment("신고 사유");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("Status");
+
+                    b.HasIndex("Type");
+
+                    b.HasIndex("CommentID", "ID");
+
+                    b.HasIndex("CommentID", "MemberID")
+                        .IsUnique();
+
+                    b.ToTable("CommentReport", null, t =>
+                        {
+                            t.HasComment("댓글 신고");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentFileDownLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("CommentFileID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 파일 ID");
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CommentFileID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("CommentID", "CommentFileID");
+
+                    b.HasIndex("CommentID", "CommentFileID", "MemberID");
+
+                    b.ToTable("CommentFileDownLog", null, t =>
+                        {
+                            t.HasComment("댓글 파일 다운로드 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentLinkClickLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 ID");
+
+                    b.Property<int>("CommentLinkID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 링크 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("CommentLinkID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("CommentID", "CommentLinkID");
+
+                    b.HasIndex("CommentID", "CommentLinkID", "MemberID");
+
+                    b.ToTable("CommentLinkClickLog", null, t =>
+                        {
+                            t.HasComment("댓글 링크 클릭 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentUpdateLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("CommentID")
+                        .HasColumnType("int")
+                        .HasComment("댓글 ID");
+
+                    b.Property<string>("ContentDiff")
+                        .HasMaxLength(4000)
+                        .HasColumnType("nvarchar(4000)")
+                        .HasComment("변경 내용");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Note")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("비고");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CommentID");
+
+                    b.HasIndex("ContentDiff");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("CommentID", "ID");
+
+                    b.HasIndex("CommentID", "MemberID");
+
+                    b.HasIndex("CommentID", "MemberID", "ID");
+
+                    b.ToTable("CommentUpdateLog", null, t =>
+                        {
+                            t.HasComment("댓글 수정 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostFileDownLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<int>("PostFileID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 파일 ID");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostFileID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("PostID", "PostFileID");
+
+                    b.HasIndex("PostID", "PostFileID", "MemberID");
+
+                    b.ToTable("PostFileDownLog", null, t =>
+                        {
+                            t.HasComment("게시글 파일 다운로드 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostLinkClickLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<int>("PostLinkID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 파일 ID");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("PostLinkID");
+
+                    b.HasIndex("PostID", "PostLinkID");
+
+                    b.HasIndex("PostID", "PostLinkID", "MemberID");
+
+                    b.ToTable("PostLinkClickLog", null, t =>
+                        {
+                            t.HasComment("게시글 링크 클릭 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostUpdateLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("ContentDiff")
+                        .HasMaxLength(4000)
+                        .HasColumnType("nvarchar(4000)")
+                        .HasComment("변경 내용");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Note")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("비고");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<string>("SubjectDiff")
+                        .HasMaxLength(4000)
+                        .HasColumnType("nvarchar(4000)")
+                        .HasComment("변경 제목");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("ContentDiff");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("SubjectDiff");
+
+                    b.HasIndex("PostID", "ID");
+
+                    b.HasIndex("PostID", "MemberID");
+
+                    b.HasIndex("PostID", "MemberID", "ID");
+
+                    b.ToTable("PostUpdateLog", null, t =>
+                        {
+                            t.HasComment("게시글 수정 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostViewLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("IpAddress")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("UserAgent")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.ToTable("PostViewLog");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.Post", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<int?>("BoardPrefixID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 말머리 ID");
+
+                    b.Property<int>("Bookmarks")
+                        .HasColumnType("int")
+                        .HasComment("즐겨찾기 수");
+
+                    b.Property<int>("Comments")
+                        .HasColumnType("int")
+                        .HasComment("댓글 수");
+
+                    b.Property<string>("Content")
+                        .IsRequired()
+                        .HasMaxLength(8000)
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("내용");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<DateTime?>("DeletedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("삭제 일시");
+
+                    b.Property<int>("Dislikes")
+                        .HasColumnType("int")
+                        .HasComment("싫어요");
+
+                    b.Property<string>("Email")
+                        .HasMaxLength(60)
+                        .HasColumnType("nvarchar(60)")
+                        .HasComment("회원 이메일");
+
+                    b.Property<byte>("Files")
+                        .HasColumnType("tinyint")
+                        .HasComment("파일 수");
+
+                    b.Property<byte>("Images")
+                        .HasColumnType("tinyint")
+                        .HasComment("이미지 수");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP");
+
+                    b.Property<bool>("IsAnonymous")
+                        .HasColumnType("bit")
+                        .HasComment("익명 글 여부");
+
+                    b.Property<bool>("IsDeleted")
+                        .HasColumnType("bit")
+                        .HasComment("삭제 여부");
+
+                    b.Property<bool>("IsNotice")
+                        .HasColumnType("bit")
+                        .HasComment("일반 공지 여부");
+
+                    b.Property<bool>("IsReply")
+                        .HasColumnType("bit")
+                        .HasComment("답변 여부");
+
+                    b.Property<bool>("IsSecret")
+                        .HasColumnType("bit")
+                        .HasComment("비밀글 여부");
+
+                    b.Property<bool>("IsSpeaker")
+                        .HasColumnType("bit")
+                        .HasComment("전체 공지 여부");
+
+                    b.Property<DateTime?>("LastCommentUpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 댓글 일시");
+
+                    b.Property<DateTime?>("LastReplyUpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 답변 일시");
+
+                    b.Property<int>("Likes")
+                        .HasColumnType("int")
+                        .HasComment("좋아요");
+
+                    b.Property<byte>("Medias")
+                        .HasColumnType("tinyint")
+                        .HasComment("미디어 수");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Name")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("회원 이름");
+
+                    b.Property<int>("Reports")
+                        .HasColumnType("int")
+                        .HasComment("신고 수");
+
+                    b.Property<string>("SID")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("회원 SID");
+
+                    b.Property<string>("StockCode")
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("종목 가상보드 파티션 코드 (stock 보드 전용)");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("제목");
+
+                    b.Property<byte>("Tags")
+                        .HasColumnType("tinyint")
+                        .HasComment("Tag 수");
+
+                    b.Property<string>("Thumbnail")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("대표 이미지");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-Agent");
+
+                    b.Property<int>("Views")
+                        .HasColumnType("int")
+                        .HasComment("조회 수");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("BoardPrefixID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("ID", "BoardID");
+
+                    b.HasIndex("StockCode", "CreatedAt")
+                        .IsDescending(false, true)
+                        .HasDatabaseName("IX_Post_StockCode_CreatedAt")
+                        .HasFilter("[StockCode] IS NOT NULL AND [IsDeleted] = 0");
+
+                    b.HasIndex("ID", "BoardID", "IsDeleted");
+
+                    b.HasIndex("MemberID", "IsDeleted", "CreatedAt")
+                        .IsDescending(false, false, true);
+
+                    b.HasIndex("ID", "BoardID", "BoardPrefixID", "IsDeleted", "Comments");
+
+                    b.HasIndex("ID", "BoardID", "BoardPrefixID", "IsDeleted", "CreatedAt");
+
+                    b.HasIndex("ID", "BoardID", "BoardPrefixID", "IsDeleted", "Likes");
+
+                    b.HasIndex("ID", "BoardID", "BoardPrefixID", "IsDeleted", "Views");
+
+                    b.ToTable("Post", null, t =>
+                        {
+                            t.HasComment("게시글");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostBookmark", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("IpAddress")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("UserAgent")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("PostID", "MemberID")
+                        .IsUnique();
+
+                    b.ToTable("PostBookmark", null, t =>
+                        {
+                            t.HasComment("게시글 즐겨찾기");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostCheer", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("Amount")
+                        .HasColumnType("int")
+                        .HasComment("총 응원 금액");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("응원 일시");
+
+                    b.Property<int>("FeeAmount")
+                        .HasColumnType("int")
+                        .HasComment("플랫폼 수수료(소각분)");
+
+                    b.Property<int>("FromMemberID")
+                        .HasColumnType("int")
+                        .HasComment("응원 발신자 회원 ID");
+
+                    b.Property<string>("Message")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("응원 한마디");
+
+                    b.Property<int>("NetAmount")
+                        .HasColumnType("int")
+                        .HasComment("작성자 수령 순액(Reward 적립)");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("응원 대상 게시글 ID");
+
+                    b.Property<int>("ToMemberID")
+                        .HasColumnType("int")
+                        .HasComment("응원 수신자(글 작성자) 회원 ID");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("FromMemberID", "CreatedAt");
+
+                    b.HasIndex("ToMemberID", "CreatedAt");
+
+                    b.ToTable("PostCheer", null, t =>
+                        {
+                            t.HasComment("분석글 응원(Cheer) — D3 M4");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostFile", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("ContentType")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Downloads")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Extension")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("FileName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("HashedName")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<long?>("Size")
+                        .HasColumnType("bigint");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("UUID")
+                        .IsUnique();
+
+                    b.ToTable("PostFile", null, t =>
+                        {
+                            t.HasComment("게시글 파일");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostImage", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<string>("ContentType")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("MIME 타입");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("비활성 일시");
+
+                    b.Property<string>("Extension")
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)")
+                        .HasComment("확장자");
+
+                    b.Property<string>("FileName")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("원본 파일명");
+
+                    b.Property<string>("HashedName")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("저장 파일명");
+
+                    b.Property<short?>("Height")
+                        .HasColumnType("smallint")
+                        .HasComment("세로 해상도(px)");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit")
+                        .HasComment("비활성 여부");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("저장 경로");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<long?>("Size")
+                        .HasColumnType("bigint")
+                        .HasComment("용량(byte)");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("이미지 ID");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("URL");
+
+                    b.Property<short?>("Width")
+                        .HasColumnType("smallint")
+                        .HasComment("가로 해상도(px)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("UUID")
+                        .IsUnique();
+
+                    b.HasIndex("PostID", "HashedName");
+
+                    b.HasIndex("PostID", "HashedName", "IsDisabled");
+
+                    b.ToTable("PostImage", null, t =>
+                        {
+                            t.HasComment("게시글 이미지");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostLink", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Clicks")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("PostID");
+
+                    b.ToTable("PostLink", null, t =>
+                        {
+                            t.HasComment("게시글 링크");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostMedia", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("PostID");
+
+                    b.ToTable("PostMedia", null, t =>
+                        {
+                            t.HasComment("게시글 미디어");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostPrediction", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<decimal>("BasePrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("작성 시점 기준가");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<byte>("Direction")
+                        .HasColumnType("tinyint")
+                        .HasComment("예측 방향 (1=상승, 2=하락)");
+
+                    b.Property<DateOnly>("DueDate")
+                        .HasColumnType("date")
+                        .HasComment("채점 예정일");
+
+                    b.Property<short>("HorizonDays")
+                        .HasColumnType("smallint")
+                        .HasComment("예측 기간 (영업일 수)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("작성 회원 ID");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID (1:1)");
+
+                    b.Property<DateTime?>("SettledAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("채점 일시");
+
+                    b.Property<decimal?>("SettledPrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("채점 시점 종가");
+
+                    b.Property<byte>("Status")
+                        .HasColumnType("tinyint")
+                        .HasComment("상태 (0=Pending/1=Hit/2=Miss/3=Void)");
+
+                    b.Property<string>("StockCode")
+                        .IsRequired()
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("예측 종목 단축코드");
+
+                    b.Property<decimal?>("TargetPrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("목표가 (선택)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("PostID")
+                        .IsUnique();
+
+                    b.HasIndex("MemberID", "Status");
+
+                    b.HasIndex("Status", "DueDate");
+
+                    b.ToTable("PostPrediction", null, t =>
+                        {
+                            t.HasComment("예측글 (방향/기간 예측 + 채점)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostReaction", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("IP Address");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<byte>("Reaction")
+                        .HasColumnType("tinyint")
+                        .HasComment("반응 구분");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("Reaction");
+
+                    b.HasIndex("PostID", "MemberID")
+                        .IsUnique();
+
+                    b.ToTable("PostReaction", null, t =>
+                        {
+                            t.HasComment("게시글 반응");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostReport", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int")
+                        .HasComment("게시판 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(15)
+                        .HasColumnType("nvarchar(15)")
+                        .HasComment("IP Address");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Memo")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("처리 내용");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<string>("Reason")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("신고 내용");
+
+                    b.Property<byte>("Status")
+                        .HasColumnType("tinyint")
+                        .HasComment("처리 상태");
+
+                    b.Property<byte>("Type")
+                        .HasColumnType("tinyint")
+                        .HasComment("신고 사유");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("Status");
+
+                    b.HasIndex("Type");
+
+                    b.HasIndex("PostID", "MemberID")
+                        .IsUnique();
+
+                    b.ToTable("PostReport", null, t =>
+                        {
+                            t.HasComment("게시글 신고");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostStockTag", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("게시글 ID");
+
+                    b.Property<string>("StockCode")
+                        .IsRequired()
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("종목 단축코드");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("PostID", "StockCode")
+                        .IsUnique();
+
+                    b.HasIndex("StockCode", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("PostStockTag", null, t =>
+                        {
+                            t.HasComment("글 본문 $종목 태그 (언급량 랭킹 원천)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostTag", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BoardID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("TagID")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BoardID");
+
+                    b.HasIndex("PostID");
+
+                    b.HasIndex("TagID");
+
+                    b.ToTable("PostTag", null, t =>
+                        {
+                            t.HasComment("게시글 태그 연결");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.Tag", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(450)");
+
+                    b.Property<string>("Slug")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(450)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<long>("UsageCount")
+                        .HasColumnType("bigint");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Name")
+                        .IsUnique();
+
+                    b.HasIndex("Slug")
+                        .IsUnique();
+
+                    b.HasIndex("UsageCount");
+
+                    b.ToTable("Tag", null, t =>
+                        {
+                            t.HasComment("태그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Attendance", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("ConsecutiveDays")
+                        .HasColumnType("int")
+                        .HasComment("연속 출석 일수");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("출석 일시");
+
+                    b.Property<int>("ExpRewarded")
+                        .HasColumnType("int")
+                        .HasComment("지급 경험치");
+
+                    b.Property<string>("Greeting")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("출석 인사");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<int>("PointRewarded")
+                        .HasColumnType("int")
+                        .HasComment("지급 포인트");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt")
+                        .IsDescending();
+
+                    b.HasIndex("MemberID", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("Attendance", null, t =>
+                        {
+                            t.HasComment("출석 기록");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.BroadcastSession", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("ChannelID")
+                        .HasColumnType("int")
+                        .HasComment("채널 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("생성 일시");
+
+                    b.Property<int>("DurationSec")
+                        .HasColumnType("int")
+                        .HasComment("방송 시간 (초)");
+
+                    b.Property<DateTime?>("EndAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("방송 종료 시각");
+
+                    b.Property<long>("FinalLikes")
+                        .HasColumnType("bigint")
+                        .HasComment("최종 좋아요");
+
+                    b.Property<long>("FinalViews")
+                        .HasColumnType("bigint")
+                        .HasComment("최종 조회수");
+
+                    b.Property<bool>("IsFinalized")
+                        .HasColumnType("bit")
+                        .HasComment("최종 확정 여부 (End + 24h 경과)");
+
+                    b.Property<int>("Platform")
+                        .HasColumnType("int")
+                        .HasComment("플랫폼 (YouTube=1)");
+
+                    b.Property<DateTime?>("StartAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("방송 시작 시각");
+
+                    b.Property<string>("Title")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("방송 제목");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("VideoID")
+                        .IsRequired()
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("플랫폼 비디오 ID");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("IsFinalized");
+
+                    b.HasIndex("ChannelID", "EndAt")
+                        .IsDescending(false, true);
+
+                    b.HasIndex("Platform", "VideoID")
+                        .IsUnique();
+
+                    b.ToTable("BroadcastSession", null, t =>
+                        {
+                            t.HasComment("방송 세션 (라이브 1회 단위)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Channel", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("BannerUrl")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("DonationCode")
+                        .HasMaxLength(7)
+                        .HasColumnType("nvarchar(7)")
+                        .HasComment("후원 코드(4~7자 영문+숫자, 대문자). 1회성 발급, 변경 불가");
+
+                    b.Property<string>("Email")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Handle")
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("핸들");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("활성 여부");
+
+                    b.Property<bool>("IsVerified")
+                        .HasColumnType("bit")
+                        .HasComment("인증 여부");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("채널 이름");
+
+                    b.Property<decimal>("PlatformFeeRate")
+                        .HasPrecision(10, 7)
+                        .HasColumnType("decimal(10,7)")
+                        .HasComment("후원 수수료(%) — dpot 몫, 0~100, 소수점 7자리");
+
+                    b.Property<string>("SID")
+                        .IsRequired()
+                        .HasMaxLength(24)
+                        .HasColumnType("nvarchar(24)")
+                        .HasComment("채널 ID");
+
+                    b.Property<decimal>("StoreCommissionRate")
+                        .ValueGeneratedOnAdd()
+                        .HasPrecision(10, 7)
+                        .HasColumnType("decimal(10,7)")
+                        .HasDefaultValue(0m)
+                        .HasComment("상점 매출 보상률(%) — 채널 몫, 0~100, 소수점 7자리");
+
+                    b.Property<long>("SubscriberCount")
+                        .HasColumnType("bigint");
+
+                    b.Property<string>("ThumbnailUrl")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<long>("VideoCount")
+                        .HasColumnType("bigint");
+
+                    b.Property<long>("ViewCount")
+                        .HasColumnType("bigint");
+
+                    b.Property<string>("WidgetToken")
+                        .IsRequired()
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)")
+                        .HasComment("위젯 토큰");
+
+                    b.Property<string>("YouTubeChannelID")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("YouTubeLastSyncedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("YouTube API 마지막 동기화 시각(UTC) — 30일 정책 enforcement");
+
+                    b.Property<DateTime?>("YouTubePublishedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("YouTubeUrl")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("YouTube 채널 URL");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("DonationCode")
+                        .IsUnique()
+                        .HasFilter("[DonationCode] IS NOT NULL");
+
+                    b.HasIndex("Handle")
+                        .IsUnique()
+                        .HasFilter("[Handle] IS NOT NULL");
+
+                    b.HasIndex("MemberID")
+                        .IsUnique();
+
+                    b.HasIndex("Name")
+                        .IsUnique();
+
+                    b.HasIndex("SID")
+                        .IsUnique();
+
+                    b.HasIndex("WidgetToken")
+                        .IsUnique();
+
+                    b.HasIndex("YouTubeLastSyncedAt");
+
+                    b.HasIndex("YouTubeUrl")
+                        .IsUnique();
+
+                    b.HasIndex("MemberID", "IsActive");
+
+                    b.HasIndex("MemberID", "IsVerified");
+
+                    b.HasIndex("MemberID", "IsVerified", "IsActive");
+
+                    b.ToTable("Channel", null, t =>
+                        {
+                            t.HasComment("채널 정보");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.ChannelBroadcastStats", b =>
+                {
+                    b.Property<int>("ChannelID")
+                        .HasColumnType("int")
+                        .HasComment("채널 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("생성 일시");
+
+                    b.Property<long>("CumulativeViews")
+                        .HasColumnType("bigint")
+                        .HasComment("누적 조회수");
+
+                    b.Property<DateTime?>("LastAggregatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 집계 일시");
+
+                    b.Property<DateTime?>("LastBroadcastAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 방송 일시");
+
+                    b.Property<int>("SessionCount")
+                        .HasColumnType("int")
+                        .HasComment("방송 횟수");
+
+                    b.Property<long>("TotalDurationSec")
+                        .HasColumnType("bigint")
+                        .HasComment("누적 방송 시간 (초)");
+
+                    b.Property<long>("TotalLikes")
+                        .HasColumnType("bigint")
+                        .HasComment("누적 좋아요");
+
+                    b.HasKey("ChannelID");
+
+                    b.ToTable("ChannelBroadcastStats", null, t =>
+                        {
+                            t.HasComment("채널별 누적 방송 지표");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.ChannelHandleHistory", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("ChangedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("변경 일시");
+
+                    b.Property<int>("ChannelID")
+                        .HasColumnType("int")
+                        .HasComment("채널 ID");
+
+                    b.Property<string>("OldHandle")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("이전 핸들");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("OldHandle");
+
+                    b.HasIndex("ChannelID", "ChangedAt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("ChannelHandleHistory", null, t =>
+                        {
+                            t.HasComment("채널 핸들 변경 이력");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberEmailChangeLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AfterEmail")
+                        .IsRequired()
+                        .HasMaxLength(60)
+                        .HasColumnType("nvarchar(60)")
+                        .HasComment("바뀐 이메일");
+
+                    b.Property<string>("BeforeEmail")
+                        .HasMaxLength(60)
+                        .HasColumnType("nvarchar(60)")
+                        .HasComment("이전 이메일");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP Address");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Referer")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("이전 페이지 주소");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("MemberID");
+
+                    b.ToTable("MemberEmailChangeLog", null, t =>
+                        {
+                            t.HasComment("사용자 이메일 변경 내역");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberExpLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("Amount")
+                        .HasColumnType("int")
+                        .HasComment("변동량");
+
+                    b.Property<long>("Balance")
+                        .HasColumnType("bigint")
+                        .HasComment("잔액");
+
+                    b.Property<int?>("BroadcastSessionID")
+                        .HasColumnType("int")
+                        .HasComment("방송 세션 ID (리더보드 집계 대상)");
+
+                    b.Property<int?>("ChannelID")
+                        .HasColumnType("int")
+                        .HasComment("채널 ID (channel 단위 조회용)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("기록 일시");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Reason")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("사유");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("BroadcastSessionID", "MemberID");
+
+                    b.HasIndex("ChannelID", "MemberID", "CreatedAt");
+
+                    b.ToTable("MemberExpLog", null, t =>
+                        {
+                            t.HasComment("경험치 변동 내역");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberIntroChangeLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AfterIntro")
+                        .HasMaxLength(3000)
+                        .HasColumnType("nvarchar(3000)")
+                        .HasComment("바꾼 자기소개");
+
+                    b.Property<string>("BeforeIntro")
+                        .HasMaxLength(3000)
+                        .HasColumnType("nvarchar(3000)")
+                        .HasComment("이전 자기소개");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP Address (IPv6 호환)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Referer")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("이전 페이지 주소");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.ToTable("MemberIntroChangeLog", null, t =>
+                        {
+                            t.HasComment("자기소개 변경 내역");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberItemUsageLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<byte>("Action")
+                        .HasColumnType("tinyint")
+                        .HasComment("액션 (1=Used, 2=Revoked)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("Detail")
+                        .HasMaxLength(300)
+                        .HasColumnType("nvarchar(300)")
+                        .HasComment("결과 요약");
+
+                    b.Property<byte>("Kind")
+                        .HasColumnType("tinyint")
+                        .HasComment("아이템 종류");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<int>("MemberItemID")
+                        .HasColumnType("int")
+                        .HasComment("MemberItem ID");
+
+                    b.Property<int>("ProductID")
+                        .HasColumnType("int")
+                        .HasComment("상품 ID");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID", "CreatedAt");
+
+                    b.ToTable("MemberItemUsageLog", null, t =>
+                        {
+                            t.HasComment("소모품 아이템 사용/회수 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberLoginLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Account")
+                        .IsRequired()
+                        .HasMaxLength(120)
+                        .HasColumnType("nvarchar(120)")
+                        .HasComment("로그인 시도한 계정");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP Address");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Reason")
+                        .HasMaxLength(225)
+                        .HasColumnType("nvarchar(225)")
+                        .HasComment("실패 이유");
+
+                    b.Property<string>("Referer")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("이전 페이지 주소");
+
+                    b.Property<bool>("Success")
+                        .HasColumnType("bit")
+                        .HasComment("로그인 성공 여부 (0: 실패, 1: 성공)");
+
+                    b.Property<string>("Url")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("요청 주소");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Account");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("MemberID", "Success");
+
+                    b.ToTable("MemberLoginLog", null, t =>
+                        {
+                            t.HasComment("로그인 기록");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberNameChangeLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AfterName")
+                        .HasMaxLength(40)
+                        .HasColumnType("nvarchar(40)")
+                        .HasComment("바꾼 별명");
+
+                    b.Property<string>("BeforeName")
+                        .HasMaxLength(40)
+                        .HasColumnType("nvarchar(40)")
+                        .HasComment("이전 별명");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP Address (IPv6 호환)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Referer")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("이전 페이지 주소");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.ToTable("MemberNameChangeLog", null, t =>
+                        {
+                            t.HasComment("별명 변경 내역");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberSummaryChangeLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AfterSummary")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("바꾼 한마디");
+
+                    b.Property<string>("BeforeSummary")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("이전 한마디");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP Address (IPv6 호환)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Referer")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("이전 페이지 주소");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.ToTable("MemberSummaryChangeLog", null, t =>
+                        {
+                            t.HasComment("한마디 변경 내역");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberThumbChangeLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AfterThumb")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("바꾼 이미지");
+
+                    b.Property<string>("BeforeThumb")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("이전 이미지");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP Address (IPv6 호환)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<string>("Referer")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("이전 페이지 주소");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(512)
+                        .HasColumnType("nvarchar(512)")
+                        .HasComment("User Agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.ToTable("MemberThumbChangeLog", null, t =>
+                        {
+                            t.HasComment("프로필 이미지 변경 내역");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Member", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime?>("AuthCertifiedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("본인인증 일시");
+
+                    b.Property<string>("BannerUrl")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("배너 이미지");
+
+                    b.Property<DateOnly?>("Birthday")
+                        .HasColumnType("date")
+                        .HasComment("생년월일");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("가입 일시");
+
+                    b.Property<DateTime?>("DeletedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("탈퇴 일시");
+
+                    b.Property<DateTime?>("DeniedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("차단 일시");
+
+                    b.Property<string>("DeviceInfo")
+                        .HasMaxLength(400)
+                        .HasColumnType("nvarchar(400)")
+                        .HasComment("로그인 단말기 정보");
+
+                    b.Property<string>("Email")
+                        .IsRequired()
+                        .HasMaxLength(60)
+                        .HasColumnType("nvarchar(60)")
+                        .HasComment("이메일");
+
+                    b.Property<DateTime?>("EmailVerifiedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("이메일 인증 일시");
+
+                    b.Property<string>("FirstName")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("본명(성)");
+
+                    b.Property<string>("FullName")
+                        .HasMaxLength(40)
+                        .HasColumnType("nvarchar(40)")
+                        .HasComment("본명");
+
+                    b.Property<int?>("Gender")
+                        .HasColumnType("int")
+                        .HasComment("성별");
+
+                    b.Property<string>("Icon")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("아이콘");
+
+                    b.Property<string>("Intro")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("자기소개");
+
+                    b.Property<string>("IpAddress")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("IP Address");
+
+                    b.Property<bool>("IsAdmin")
+                        .HasColumnType("bit")
+                        .HasComment("운영진 여부");
+
+                    b.Property<bool>("IsAuthCertified")
+                        .HasColumnType("bit")
+                        .HasComment("본인 인증 여부");
+
+                    b.Property<bool>("IsCreator")
+                        .HasColumnType("bit")
+                        .HasComment("크리에이터 여부");
+
+                    b.Property<bool>("IsDenied")
+                        .HasColumnType("bit")
+                        .HasComment("차단 여부");
+
+                    b.Property<bool>("IsEmailVerified")
+                        .HasColumnType("bit")
+                        .HasComment("이메일 인증 여부");
+
+                    b.Property<bool>("IsWithdraw")
+                        .HasColumnType("bit")
+                        .HasComment("탈퇴 여부");
+
+                    b.Property<DateTime?>("LastEmailChangedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 이메일 변경 일시");
+
+                    b.Property<DateTime?>("LastIntroChangedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 자기소개 변경 일시");
+
+                    b.Property<DateTime?>("LastLoginAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 로그인 일시");
+
+                    b.Property<string>("LastLoginIp")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("마지막 로그인 IP (IPv6 호환 — 최대 45 char)");
+
+                    b.Property<string>("LastName")
+                        .HasMaxLength(40)
+                        .HasColumnType("nvarchar(40)")
+                        .HasComment("본명(이름)");
+
+                    b.Property<DateTime?>("LastNameChangedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 별명 변경 일시");
+
+                    b.Property<DateTime?>("LastSummaryChangedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 한마디 변경 일시");
+
+                    b.Property<DateTime?>("LastThumbChangedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int?>("MemberGradeID")
+                        .HasColumnType("int")
+                        .HasComment("회원등급 PK");
+
+                    b.Property<string>("Name")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("별명");
+
+                    b.Property<string>("Password")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("비밀번호");
+
+                    b.Property<string>("PasswordHash")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime>("PasswordUpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("비밀번호 변경 일시");
+
+                    b.Property<Guid?>("PaymentCustomerKey")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.Property<string>("Phone")
+                        .HasMaxLength(15)
+                        .HasColumnType("nvarchar(15)")
+                        .HasComment("연락처");
+
+                    b.Property<string>("SID")
+                        .IsRequired()
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("SID");
+
+                    b.Property<string>("SignupIP")
+                        .HasMaxLength(45)
+                        .HasColumnType("nvarchar(45)")
+                        .HasComment("회원가입 시 IP (IPv6 호환 — 최대 45 char)");
+
+                    b.Property<string>("Summary")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)")
+                        .HasComment("한마디");
+
+                    b.Property<string>("Thumb")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("썸네일");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<string>("UserAgent")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("User-agent");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("DeletedAt");
+
+                    b.HasIndex("Email")
+                        .IsUnique();
+
+                    b.HasIndex("FullName");
+
+                    b.HasIndex("Gender");
+
+                    b.HasIndex("IsAdmin");
+
+                    b.HasIndex("IsAuthCertified");
+
+                    b.HasIndex("IsCreator");
+
+                    b.HasIndex("IsDenied");
+
+                    b.HasIndex("IsEmailVerified");
+
+                    b.HasIndex("IsWithdraw");
+
+                    b.HasIndex("MemberGradeID");
+
+                    b.HasIndex("Name")
+                        .IsUnique()
+                        .HasFilter("[Name] IS NOT NULL");
+
+                    b.HasIndex("Phone");
+
+                    b.HasIndex("SID")
+                        .IsUnique();
+
+                    b.ToTable("Member", null, t =>
+                        {
+                            t.HasComment("회원 정보");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberApprove", b =>
+                {
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<DateTime?>("DisclosureInvestConsentAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("투자 현황 공개 동의 일시");
+
+                    b.Property<DateTime?>("DonationPublicConsentAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDisclosureInvest")
+                        .HasColumnType("bit")
+                        .HasComment("투자 현황 공개 여부");
+
+                    b.Property<bool>("IsDonationPublic")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsRankingPublic")
+                        .HasColumnType("bit")
+                        .HasComment("랭킹 공개 여부");
+
+                    b.Property<bool>("IsReceiveEmail")
+                        .HasColumnType("bit")
+                        .HasComment("E-MAIL 수신 여부");
+
+                    b.Property<bool>("IsReceiveNote")
+                        .HasColumnType("bit")
+                        .HasComment("쪽지 수신 여부");
+
+                    b.Property<bool>("IsReceiveSMS")
+                        .HasColumnType("bit")
+                        .HasComment("SMS 수신 여부");
+
+                    b.Property<DateTime?>("RankingPublicConsentAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("랭킹 공개 동의 일시");
+
+                    b.Property<DateTime?>("ReceiveEmailConsentAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("E-MAIL 수신 동의 일시");
+
+                    b.Property<DateTime?>("ReceiveNoteConsentAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("쪽지 수신 동의 일시");
+
+                    b.Property<DateTime?>("ReceiveSMSConsentAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("SMS 수신 동의 일시");
+
+                    b.HasKey("MemberID");
+
+                    b.ToTable("MemberApprove", null, t =>
+                        {
+                            t.HasComment("회원 알림 및 수신 동의");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberDailyRewardCounter", b =>
+                {
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<DateOnly>("RewardDate")
+                        .HasColumnType("date")
+                        .HasComment("KST 기준 일자");
+
+                    b.Property<byte>("ActionType")
+                        .HasColumnType("tinyint")
+                        .HasComment("액션 유형 (Post=1..PaperReward=8)");
+
+                    b.Property<int>("Count")
+                        .HasColumnType("int")
+                        .HasComment("오늘 지급 횟수");
+
+                    b.Property<int>("ExpTotal")
+                        .HasColumnType("int")
+                        .HasComment("오늘 지급 경험치 합계");
+
+                    b.Property<int>("PointTotal")
+                        .HasColumnType("int")
+                        .HasComment("오늘 지급 토큰 합계");
+
+                    b.HasKey("MemberID", "RewardDate", "ActionType");
+
+                    b.HasIndex("RewardDate");
+
+                    b.ToTable("MemberDailyRewardCounter", null, t =>
+                        {
+                            t.HasComment("일일 보상 캡 원장 (d3 M2)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberFollow", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("팔로우 일시");
+
+                    b.Property<int>("FolloweeMemberID")
+                        .HasColumnType("int")
+                        .HasComment("팔로우 대상 회원 ID");
+
+                    b.Property<int>("FollowerMemberID")
+                        .HasColumnType("int")
+                        .HasComment("팔로우 주체 회원 ID");
+
+                    b.Property<bool>("IsMuted")
+                        .HasColumnType("bit")
+                        .HasComment("피드 숨김 여부");
+
+                    b.Property<bool>("NotifyOnPost")
+                        .HasColumnType("bit")
+                        .HasComment("새 글 알림 수신 여부");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FolloweeMemberID");
+
+                    b.HasIndex("FollowerMemberID", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.HasIndex("FollowerMemberID", "FolloweeMemberID")
+                        .IsUnique();
+
+                    b.ToTable("MemberFollow", null, t =>
+                        {
+                            t.HasComment("회원 팔로우 관계");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberGrade", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("Description")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("설명");
+
+                    b.Property<string>("EngName")
+                        .IsRequired()
+                        .HasMaxLength(120)
+                        .HasColumnType("nvarchar(120)")
+                        .HasComment("영문 명");
+
+                    b.Property<string>("Image")
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("이미지");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<string>("KorName")
+                        .IsRequired()
+                        .HasMaxLength(240)
+                        .HasColumnType("nvarchar(240)")
+                        .HasComment("한글 명");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("순서");
+
+                    b.Property<long>("RequiredAttendance")
+                        .HasColumnType("bigint")
+                        .HasComment("누적 출석 수");
+
+                    b.Property<int>("RequiredExp")
+                        .HasColumnType("int")
+                        .HasComment("누적 경험치");
+
+                    b.Property<string>("TextColor")
+                        .HasMaxLength(7)
+                        .HasColumnType("nvarchar(7)")
+                        .HasComment("표시 색상");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("EngName")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive");
+
+                    b.HasIndex("KorName")
+                        .IsUnique();
+
+                    b.HasIndex("Order");
+
+                    b.HasIndex("Order", "IsActive");
+
+                    b.ToTable("MemberGrade", null, t =>
+                        {
+                            t.HasComment("회원 등급");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberItem", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("AcquiredAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("획득 일시");
+
+                    b.Property<int>("DurationDays")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(0)
+                        .HasComment("효과 지속일 (0=즉시소모/영구)");
+
+                    b.Property<byte?>("EquipSlot")
+                        .HasColumnType("tinyint")
+                        .HasComment("장착 슬롯 (1=Badge, 2=NicknameEffect, 3=CommentEffect, null=소모품)");
+
+                    b.Property<DateTime?>("ExpiresAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("만료 일시 (null=영구)");
+
+                    b.Property<int?>("GiftFromMemberID")
+                        .HasColumnType("int")
+                        .HasComment("선물 발신자 회원 ID (null=본인구매)");
+
+                    b.Property<bool>("IsEquipped")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bit")
+                        .HasDefaultValue(false)
+                        .HasComment("장착 여부 (지위 아이템)");
+
+                    b.Property<byte>("Kind")
+                        .HasColumnType("tinyint")
+                        .HasComment("아이템 종류 (2~4=지위, 5~11=소모품)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID (지급 대상)");
+
+                    b.Property<int>("OrderItemID")
+                        .HasColumnType("int")
+                        .HasComment("발급 근거 주문항목 ID");
+
+                    b.Property<int>("ProductID")
+                        .HasColumnType("int")
+                        .HasComment("상품 ID");
+
+                    b.Property<DateTime?>("RevokedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("회수 일시 (환불)");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion");
+
+                    b.Property<DateTime?>("UsedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("소모/활성 일시 (null=미사용)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("OrderItemID");
+
+                    b.HasIndex("ProductID");
+
+                    b.HasIndex("MemberID", "EquipSlot")
+                        .IsUnique()
+                        .HasFilter("[IsEquipped] = 1");
+
+                    b.HasIndex("MemberID", "ExpiresAt");
+
+                    b.HasIndex("MemberID", "Kind", "UsedAt");
+
+                    b.ToTable("MemberItem", null, t =>
+                        {
+                            t.HasComment("계정 귀속 아이템 (지위 아이템 장착형 + 소모품)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberOAuthToken", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<string>("AccessTokenEnc")
+                        .IsRequired()
+                        .HasMaxLength(2048)
+                        .HasColumnType("nvarchar(2048)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime>("ExpiresAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Provider")
+                        .IsRequired()
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("ProviderUserKey")
+                        .HasMaxLength(128)
+                        .HasColumnType("nvarchar(128)");
+
+                    b.Property<string>("RefreshTokenEnc")
+                        .HasMaxLength(2048)
+                        .HasColumnType("nvarchar(2048)");
+
+                    b.Property<string>("Scopes")
+                        .IsRequired()
+                        .HasMaxLength(1024)
+                        .HasColumnType("nvarchar(1024)");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID", "Provider")
+                        .IsUnique();
+
+                    b.HasIndex("Provider", "ProviderUserKey");
+
+                    b.ToTable("MemberOAuthToken", null, t =>
+                        {
+                            t.HasComment("회원 OAuth 토큰");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberStats", b =>
+                {
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<long>("AttendanceCount")
+                        .HasColumnType("bigint")
+                        .HasComment("출석");
+
+                    b.Property<long>("BookmarkGivenCount")
+                        .HasColumnType("bigint")
+                        .HasComment("즐겨찾기 글 수");
+
+                    b.Property<long>("CommentCount")
+                        .HasColumnType("bigint")
+                        .HasComment("작성 댓글");
+
+                    b.Property<long>("Exp")
+                        .HasColumnType("bigint")
+                        .HasComment("경험치");
+
+                    b.Property<long>("FollowerCount")
+                        .HasColumnType("bigint")
+                        .HasComment("구독자");
+
+                    b.Property<long>("FollowingCount")
+                        .HasColumnType("bigint")
+                        .HasComment("구독 중");
+
+                    b.Property<long>("LikeGivenCount")
+                        .HasColumnType("bigint")
+                        .HasComment("누른 좋아요 수");
+
+                    b.Property<long>("LikeReceivedCount")
+                        .HasColumnType("bigint")
+                        .HasComment("받은 좋아요 수");
+
+                    b.Property<long>("LoginCount")
+                        .HasColumnType("bigint")
+                        .HasComment("로그인");
+
+                    b.Property<long>("PaymentCount")
+                        .HasColumnType("bigint")
+                        .HasComment("결제 횟수");
+
+                    b.Property<long>("PostCount")
+                        .HasColumnType("bigint")
+                        .HasComment("작성 게시글");
+
+                    b.Property<long>("ReportedCount")
+                        .HasColumnType("bigint")
+                        .HasComment("신고 당한 횟수");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion")
+                        .HasComment("동시성");
+
+                    b.Property<int>("SuspensionCount")
+                        .HasColumnType("int")
+                        .HasComment("정지 횟수");
+
+                    b.Property<long>("TotalCanceledAmount")
+                        .HasColumnType("bigint")
+                        .HasComment("누적 취소/환불 금액");
+
+                    b.Property<long>("TotalPaidAmount")
+                        .HasColumnType("bigint")
+                        .HasComment("누적 결제 금액");
+
+                    b.Property<int>("WarningCount")
+                        .HasColumnType("int")
+                        .HasComment("경고 횟수");
+
+                    b.HasKey("MemberID");
+
+                    b.ToTable("MemberStats", null, t =>
+                        {
+                            t.HasComment("회원 활동 집계");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberTrackRecord", b =>
+                {
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID (PK)");
+
+                    b.Property<int>("BestStreak")
+                        .HasColumnType("int")
+                        .HasComment("역대 최고 연속 적중");
+
+                    b.Property<int>("CurrentStreak")
+                        .HasColumnType("int")
+                        .HasComment("현재 연속 적중");
+
+                    b.Property<decimal>("HitRate")
+                        .HasPrecision(5, 2)
+                        .HasColumnType("decimal(5,2)")
+                        .HasComment("적중률 % (Hits/(Hits+Misses)*100)");
+
+                    b.Property<int>("Hits")
+                        .HasColumnType("int")
+                        .HasComment("적중 수");
+
+                    b.Property<int>("Misses")
+                        .HasColumnType("int")
+                        .HasComment("실패 수");
+
+                    b.Property<int>("Predictions")
+                        .HasColumnType("int")
+                        .HasComment("채점 완료 예측 총계 (Hits+Misses+Voids)");
+
+                    b.Property<byte>("Tier")
+                        .HasColumnType("tinyint")
+                        .HasComment("배지 등급 (0=None/1=Bronze/2=Silver/3=Gold/4=GoldAnt)");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("갱신 일시");
+
+                    b.Property<int>("Voids")
+                        .HasColumnType("int")
+                        .HasComment("무효 수 (표본 제외)");
+
+                    b.HasKey("MemberID");
+
+                    b.HasIndex("HitRate")
+                        .IsDescending()
+                        .HasDatabaseName("IX_MemberTrackRecord_HitRate")
+                        .HasFilter("[Predictions] >= 10");
+
+                    b.ToTable("MemberTrackRecord", null, t =>
+                        {
+                            t.HasComment("회원 예측 트랙레코드 집계 (적중률 배지·리더보드)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.RefreshToken", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime>("ExpiresAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsRevoked")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bit")
+                        .HasDefaultValue(false);
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("ReplacedByToken")
+                        .HasMaxLength(256)
+                        .HasColumnType("nvarchar(256)");
+
+                    b.Property<DateTime?>("RevokedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Token")
+                        .IsRequired()
+                        .HasMaxLength(256)
+                        .HasColumnType("nvarchar(256)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("Token")
+                        .IsUnique();
+
+                    b.ToTable("RefreshToken", null, t =>
+                        {
+                            t.HasComment("리프레시 토큰");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Notes.Note", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Content")
+                        .IsRequired()
+                        .HasMaxLength(2000)
+                        .HasColumnType("nvarchar(2000)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDeletedByReceiver")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsDeletedBySender")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsRead")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsSystem")
+                        .HasColumnType("bit");
+
+                    b.Property<DateTime?>("ReadAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("ReceiverMemberID")
+                        .HasColumnType("int");
+
+                    b.Property<int?>("RelatedID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("RelatedType")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<int>("SenderMemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("SenderMemberID", "IsDeletedBySender", "CreatedAt")
+                        .IsDescending(false, false, true);
+
+                    b.HasIndex("ReceiverMemberID", "IsDeletedByReceiver", "IsRead", "CreatedAt")
+                        .IsDescending(false, false, false, true);
+
+                    b.ToTable("Note", null, t =>
+                        {
+                            t.HasComment("쪽지");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Notifications.Notification", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("ActionUrl")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("ImageUrl")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<bool>("IsRead")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Message")
+                        .IsRequired()
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<DateTime?>("ReadAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int?>("RelatedID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("RelatedType")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<string>("Title")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID", "IsRead", "CreatedAt")
+                        .IsDescending(false, false, true);
+
+                    b.HasIndex("MemberID", "Type", "CreatedAt")
+                        .IsDescending(false, false, true);
+
+                    b.ToTable("Notification", null, t =>
+                        {
+                            t.HasComment("알림");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Banner.BannerItem", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<string>("DesktopImage")
+                        .HasMaxLength(1024)
+                        .HasColumnType("nvarchar(1024)")
+                        .HasComment("이미지(Desktop)");
+
+                    b.Property<DateTime?>("EndAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("사용 기간 - 종료");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<string>("Link")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("주소");
+
+                    b.Property<string>("LinkTarget")
+                        .IsRequired()
+                        .ValueGeneratedOnAdd()
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)")
+                        .HasDefaultValue("_self")
+                        .HasComment("링크 타겟 (_self/_blank)");
+
+                    b.Property<string>("MobileImage")
+                        .HasMaxLength(1024)
+                        .HasColumnType("nvarchar(1024)")
+                        .HasComment("이미지(Mobile)");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("순서");
+
+                    b.Property<int>("PositionID")
+                        .HasColumnType("int")
+                        .HasComment("배너 위치 ID");
+
+                    b.Property<DateTime?>("StartAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("사용 기간 - 시작");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("배너 명");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("IsActive");
+
+                    b.HasIndex("Order");
+
+                    b.HasIndex("PositionID");
+
+                    b.HasIndex("PositionID", "Order", "IsActive");
+
+                    b.ToTable("BannerItem", null, t =>
+                        {
+                            t.HasComment("배너 아이템");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Banner.BannerPosition", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("위치 구분");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("위치 명");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive");
+
+                    b.HasIndex("Code", "IsActive");
+
+                    b.ToTable("BannerPosition", null, t =>
+                        {
+                            t.HasComment("배너 위치");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Document", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("주소");
+
+                    b.Property<string>("Content")
+                        .HasMaxLength(5000)
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("내용");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(120)
+                        .HasColumnType("nvarchar(120)")
+                        .HasComment("제목");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.Property<int>("Views")
+                        .HasColumnType("int")
+                        .HasComment("조회 수");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive");
+
+                    b.HasIndex("Subject");
+
+                    b.HasIndex("Code", "IsActive");
+
+                    b.ToTable("Document", null, t =>
+                        {
+                            t.HasComment("문서");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Faq.FaqCategory", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("주소");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("순서");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("분류 명");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code")
+                        .IsUnique();
+
+                    b.HasIndex("Order", "IsActive");
+
+                    b.HasIndex("Code", "Order", "IsActive");
+
+                    b.ToTable("FaqCategory", null, t =>
+                        {
+                            t.HasComment("FAQ 분류");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Faq.FaqItem", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Answer")
+                        .HasMaxLength(4000)
+                        .HasColumnType("nvarchar(4000)")
+                        .HasComment("답변");
+
+                    b.Property<int>("CategoryID")
+                        .HasColumnType("int")
+                        .HasComment("분류 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("순서");
+
+                    b.Property<string>("Question")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("질문");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CategoryID");
+
+                    b.HasIndex("IsActive");
+
+                    b.HasIndex("Order");
+
+                    b.HasIndex("Order", "IsActive");
+
+                    b.HasIndex("CategoryID", "Order", "IsActive");
+
+                    b.ToTable("FaqItem", null, t =>
+                        {
+                            t.HasComment("FAQ 목록");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Popup.Popup", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Content")
+                        .HasMaxLength(4000)
+                        .HasColumnType("nvarchar(4000)")
+                        .HasComment("내용");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<DateTime?>("EndAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("사용 기간 - 종료");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<string>("Link")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("주소");
+
+                    b.Property<short>("Order")
+                        .HasColumnType("smallint")
+                        .HasComment("순서");
+
+                    b.Property<int>("PositionID")
+                        .HasColumnType("int")
+                        .HasComment("팝업 위치 ID");
+
+                    b.Property<DateTime?>("StartAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("사용 기간 - 시작");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("제목");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Order");
+
+                    b.HasIndex("PositionID");
+
+                    b.HasIndex("Order", "IsActive");
+
+                    b.HasIndex("StartAt", "EndAt", "Order", "IsActive");
+
+                    b.ToTable("Popup", null, t =>
+                        {
+                            t.HasComment("팝업");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Popup.PopupPosition", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("위치 구분");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("등록 일시");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit")
+                        .HasComment("사용 여부");
+
+                    b.Property<string>("Subject")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("위치 명");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("수정 일시");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive");
+
+                    b.HasIndex("Code", "IsActive");
+
+                    b.ToTable("PopupPosition", null, t =>
+                        {
+                            t.HasComment("팝업 위치");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperAccount", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int")
+                        .HasComment("회원 ID");
+
+                    b.Property<decimal>("ReservedToken")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("매수 예약 토큰");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion");
+
+                    b.Property<decimal>("Token")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("자유 현금 토큰");
+
+                    b.Property<decimal>("TotalDeposited")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("누적 입금");
+
+                    b.Property<decimal>("TotalWithdrawn")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("누적 출금");
+
+                    b.Property<decimal>("Units")
+                        .HasPrecision(18, 8)
+                        .HasColumnType("decimal(18,8)")
+                        .HasComment("좌수");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID")
+                        .IsUnique();
+
+                    b.ToTable("PaperAccount", null, t =>
+                        {
+                            t.HasComment("모의투자 계좌 (회원당 1개)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperDailySnapshot", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("AccountID")
+                        .HasColumnType("int")
+                        .HasComment("계좌 ID");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("CumReturnBp")
+                        .HasColumnType("int")
+                        .HasComment("누적 수익률 Bp");
+
+                    b.Property<int>("DailyReturnBp")
+                        .HasColumnType("int")
+                        .HasComment("일간 수익률 Bp");
+
+                    b.Property<decimal>("Equity")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("순자산");
+
+                    b.Property<int>("FillCountCum")
+                        .HasColumnType("int")
+                        .HasComment("누적 체결 수");
+
+                    b.Property<int>("MddBp")
+                        .HasColumnType("int")
+                        .HasComment("최대 낙폭 Bp");
+
+                    b.Property<decimal>("PeakEquity")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("최고 순자산");
+
+                    b.Property<decimal>("PositionsValue")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("포지션 평가액");
+
+                    b.Property<decimal>("Token")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("자유+예약 토큰");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date")
+                        .HasComment("거래일");
+
+                    b.Property<decimal>("UnitNav")
+                        .HasPrecision(18, 8)
+                        .HasColumnType("decimal(18,8)")
+                        .HasComment("좌당 순자산");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("AccountID", "TradeDate")
+                        .IsUnique();
+
+                    b.HasIndex("TradeDate", "CumReturnBp")
+                        .IsDescending(false, true);
+
+                    b.ToTable("PaperDailySnapshot", null, t =>
+                        {
+                            t.HasComment("모의투자 계좌 일별 스냅샷 (좌수 NAV·수익률·MDD)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperFill", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<decimal>("Amount")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("체결 총액");
+
+                    b.Property<decimal>("Fee")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("수수료");
+
+                    b.Property<DateTime>("FilledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("OrderID")
+                        .HasColumnType("int")
+                        .HasComment("주문 ID");
+
+                    b.Property<decimal>("Price")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("체결가");
+
+                    b.Property<DateOnly>("PriceDate")
+                        .HasColumnType("date")
+                        .HasComment("체결가 기준일");
+
+                    b.Property<int>("Quantity")
+                        .HasColumnType("int")
+                        .HasComment("수량");
+
+                    b.Property<decimal?>("RealizedPnL")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("매도 확정 손익");
+
+                    b.Property<decimal>("Tax")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("거래세");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("OrderID")
+                        .IsUnique();
+
+                    b.ToTable("PaperFill", null, t =>
+                        {
+                            t.HasComment("모의투자 체결 결과 (주문당 1건, 멱등)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperLedger", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("AccountID")
+                        .HasColumnType("int")
+                        .HasComment("계좌 ID");
+
+                    b.Property<decimal>("BalanceAfter")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("이동 후 자유 토큰 잔액");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<decimal>("TokenAmount")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("이동 토큰");
+
+                    b.Property<byte>("Type")
+                        .HasColumnType("tinyint")
+                        .HasComment("유형 (1=입금, 2=출금)");
+
+                    b.Property<decimal>("UnitsDelta")
+                        .HasPrecision(18, 8)
+                        .HasColumnType("decimal(18,8)")
+                        .HasComment("좌수 변화");
+
+                    b.Property<string>("WalletTxRefID")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("연결 지갑 거래 RefID");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("AccountID", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("PaperLedger", null, t =>
+                        {
+                            t.HasComment("모의투자 입출금 감사 원장");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperOrder", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("AccountID")
+                        .HasColumnType("int")
+                        .HasComment("계좌 ID");
+
+                    b.Property<DateTime>("CancelableUntil")
+                        .HasColumnType("datetime2")
+                        .HasComment("취소 가능 시한");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<byte>("FillRule")
+                        .HasColumnType("tinyint")
+                        .HasComment("체결 규칙 (1=시가, 2=종가)");
+
+                    b.Property<int>("Quantity")
+                        .HasColumnType("int")
+                        .HasComment("수량");
+
+                    b.Property<string>("RejectReason")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("거부 사유");
+
+                    b.Property<decimal>("ReservedAmount")
+                        .HasPrecision(18)
+                        .HasColumnType("decimal(18,0)")
+                        .HasComment("매수 예약금");
+
+                    b.Property<byte>("Side")
+                        .HasColumnType("tinyint")
+                        .HasComment("방향 (1=매수, 2=매도)");
+
+                    b.Property<byte>("Status")
+                        .HasColumnType("tinyint")
+                        .HasComment("상태 (1=대기, 2=체결, 3=취소, 4=거부)");
+
+                    b.Property<string>("StockCode")
+                        .IsRequired()
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("단축코드");
+
+                    b.Property<DateOnly>("TargetDate")
+                        .HasColumnType("date")
+                        .HasComment("체결 기준일");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("AccountID", "CreatedAt")
+                        .IsDescending(false, true);
+
+                    b.HasIndex("Status", "TargetDate");
+
+                    b.ToTable("PaperOrder", null, t =>
+                        {
+                            t.HasComment("모의투자 주문");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperPosition", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("AccountID")
+                        .HasColumnType("int")
+                        .HasComment("계좌 ID");
+
+                    b.Property<decimal>("AvgPrice")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("평균 단가");
+
+                    b.Property<int>("Quantity")
+                        .HasColumnType("int")
+                        .HasComment("보유 수량");
+
+                    b.Property<int>("ReservedQuantity")
+                        .HasColumnType("int")
+                        .HasComment("매도 예약 수량");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion");
+
+                    b.Property<string>("StockCode")
+                        .IsRequired()
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("단축코드");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("AccountID", "StockCode")
+                        .IsUnique();
+
+                    b.ToTable("PaperPosition", null, t =>
+                        {
+                            t.HasComment("모의투자 보유 포지션");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.PaymentOrder", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("Amount")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("CancelledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("FailReason")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("MerchantID")
+                        .IsRequired()
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)");
+
+                    b.Property<string>("OrderID")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<string>("OrderName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)");
+
+                    b.Property<DateTime?>("PaidAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("PaymentMethod")
+                        .HasColumnType("int");
+
+                    b.Property<int>("PointAmount")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TransactionID")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.Property<int>("VatAmount")
+                        .HasColumnType("int");
+
+                    b.Property<string>("VirtualAccountBank")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<DateTime?>("VirtualAccountExpireAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("VirtualAccountHolder")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("VirtualAccountNumber")
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("OrderID")
+                        .IsUnique();
+
+                    b.HasIndex("Status");
+
+                    b.HasIndex("TransactionID");
+
+                    b.ToTable("PaymentOrder", null, t =>
+                        {
+                            t.HasComment("PG 결제 주문");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.PaymentReconcileLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("Amount")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Kind")
+                        .HasColumnType("int");
+
+                    b.Property<int>("PaymentOrderID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Reason")
+                        .IsRequired()
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)");
+
+                    b.Property<string>("TransactionID")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("PaymentOrderID");
+
+                    b.ToTable("PaymentReconcileLog", null, t =>
+                        {
+                            t.HasComment("PG 성공 후 저장 실패 대사 로그 (Phase 1.5)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.Toss.TossCancel", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("CancelAmount")
+                        .HasColumnType("int");
+
+                    b.Property<string>("CancelReason")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.Property<string>("CancelRequester")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)");
+
+                    b.Property<DateTime?>("CanceledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("OrderID")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<string>("PaymentKey")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.Property<int>("PaymentOrderID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("RawResponse")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ResponseCode")
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<string>("ResponseMessage")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<string>("Status")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("TransactionKey")
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("OrderID");
+
+                    b.HasIndex("PaymentKey");
+
+                    b.HasIndex("PaymentOrderID");
+
+                    b.HasIndex("TransactionKey");
+
+                    b.ToTable("TossCancel", null, t =>
+                        {
+                            t.HasComment("토스페이먼츠 결제 취소 (요청+응답)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.Toss.TossConfirm", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("Amount")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("ApprovedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Method")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<string>("OrderID")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<string>("PaymentKey")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.Property<int>("PaymentOrderID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("RawResponse")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("ReceiptUrl")
+                        .HasMaxLength(300)
+                        .HasColumnType("nvarchar(300)");
+
+                    b.Property<string>("ResponseCode")
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<string>("ResponseMessage")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<string>("Status")
+                        .HasMaxLength(32)
+                        .HasColumnType("nvarchar(32)");
+
+                    b.Property<int?>("TotalAmount")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("OrderID")
+                        .IsUnique();
+
+                    b.HasIndex("PaymentKey")
+                        .IsUnique();
+
+                    b.HasIndex("PaymentOrderID");
+
+                    b.HasIndex("Status");
+
+                    b.ToTable("TossConfirm", null, t =>
+                        {
+                            t.HasComment("토스페이먼츠 결제 승인 (요청+응답)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.Toss.TossLog", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("ExtraData")
+                        .HasMaxLength(4000)
+                        .HasColumnType("nvarchar(4000)");
+
+                    b.Property<int>("LogType")
+                        .HasColumnType("int");
+
+                    b.Property<int?>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Message")
+                        .IsRequired()
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<string>("OrderID")
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)");
+
+                    b.Property<string>("PaymentKey")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code");
+
+                    b.HasIndex("LogType");
+
+                    b.HasIndex("MemberID");
+
+                    b.HasIndex("OrderID");
+
+                    b.HasIndex("PaymentKey");
+
+                    b.ToTable("TossLog", null, t =>
+                        {
+                            t.HasComment("토스페이먼츠 결제 에러/실패/웹훅/대사 로그");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.BondDailyTrade", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<byte>("BondMarket")
+                        .HasColumnType("tinyint")
+                        .HasComment("채권 시장 구분 (1=국채전문유통, 2=일반채권, 3=소액채권)");
+
+                    b.Property<decimal>("ChangeAmount")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일 대비 (CMPPREVDD_PRC)");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("종가 가격 (CLSPRC)");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(12)
+                        .HasColumnType("nvarchar(12)")
+                        .HasComment("단축코드 (ISU_CD) — 12자리 ISIN");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<decimal>("High")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("고가 가격 (HGPRC)");
+
+                    b.Property<decimal?>("HighYield")
+                        .HasPrecision(9, 3)
+                        .HasColumnType("decimal(9,3)")
+                        .HasComment("고가 수익률 % (HGPRC_YD)");
+
+                    b.Property<string>("IssueType")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("종목구분 (국채전문, GOVBND_ISU_TP_NM)");
+
+                    b.Property<decimal>("Low")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("저가 가격 (LWPRC)");
+
+                    b.Property<decimal?>("LowYield")
+                        .HasPrecision(9, 3)
+                        .HasColumnType("decimal(9,3)")
+                        .HasComment("저가 수익률 % (LWPRC_YD)");
+
+                    b.Property<string>("MaturityYears")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("만기년수 (국채전문, BND_EXP_TP_NM)");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명");
+
+                    b.Property<decimal>("Open")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("시가 가격 (OPNPRC)");
+
+                    b.Property<decimal?>("OpenYield")
+                        .HasPrecision(9, 3)
+                        .HasColumnType("decimal(9,3)")
+                        .HasComment("시가 수익률 % (OPNPRC_YD)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradeValue")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (ACC_TRDVAL, 원)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량 (ACC_TRDVOL)");
+
+                    b.Property<decimal?>("YieldToMaturity")
+                        .HasPrecision(9, 3)
+                        .HasColumnType("decimal(9,3)")
+                        .HasComment("만기수익률 % (CLSPRC_YD)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BondMarket", "Code", "TradeDate")
+                        .IsUnique();
+
+                    b.HasIndex("BondMarket", "TradeDate", "TradeValue")
+                        .IsDescending(false, false, true);
+
+                    b.ToTable("BondDailyTrade", null, t =>
+                        {
+                            t.HasComment("채권(국채전문유통/일반채권/소액채권) 일별매매 시세 (KRX OpenAPI bon)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.BondIndexDailyPrice", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal?>("AvgConvexity")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("평균 컨벡시티 (AVG_CONVEXITY_PRC)");
+
+                    b.Property<decimal?>("AvgDuration")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("평균 듀레이션 (AVG_DURATION)");
+
+                    b.Property<decimal?>("AvgYield")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("평균 만기수익률 YTM (BND_IDX_AVG_YD)");
+
+                    b.Property<decimal?>("CallReinvestChange")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("Call재투자지수 전일 대비");
+
+                    b.Property<decimal?>("CallReinvestIndex")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("Call재투자지수 (CALL_REINVST_IDX)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("GroupName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("채권지수 그룹명 (BND_IDX_GRP_NM)");
+
+                    b.Property<decimal?>("MarketPriceChange")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("시장가격지수 전일 대비");
+
+                    b.Property<decimal?>("MarketPriceIndex")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("시장가격지수 (MKT_PRC_IDX)");
+
+                    b.Property<decimal?>("NetPriceChange")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("순가격지수 전일 대비");
+
+                    b.Property<decimal?>("NetPriceIndex")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("순가격지수 (NETPRC_IDX)");
+
+                    b.Property<decimal?>("TotalEarningChange")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("총수익지수 전일 대비");
+
+                    b.Property<decimal?>("TotalEarningIndex")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("총수익지수 (TOT_EARNG_IDX)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<decimal?>("ZeroReinvestChange")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("제로재투자지수 전일 대비");
+
+                    b.Property<decimal?>("ZeroReinvestIndex")
+                        .HasPrecision(18, 4)
+                        .HasColumnType("decimal(18,4)")
+                        .HasComment("제로재투자지수 (ZERO_REINVST_IDX)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("TradeDate");
+
+                    b.HasIndex("GroupName", "TradeDate")
+                        .IsUnique();
+
+                    b.ToTable("BondIndexDailyPrice", null, t =>
+                        {
+                            t.HasComment("채권지수 일별시세 (KRX OpenAPI idx/bon_dd_trd)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.CommodityDailyTrade", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal?>("ChangeAmount")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일 대비 (CMPPREVDD_PRC) — 금/배출권만");
+
+                    b.Property<decimal?>("ChangeRate")
+                        .HasPrecision(9, 2)
+                        .HasColumnType("decimal(9,2)")
+                        .HasComment("등락률 % (FLUC_RT) — 금/배출권만");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("종가 (TDD_CLSPRC) — 석유는 가중평균가격_경쟁");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(40)
+                        .HasColumnType("nvarchar(40)")
+                        .HasComment("단축코드 (ISU_CD) — 석유는 OIL_NM(유종구분)");
+
+                    b.Property<byte>("CommodityMarket")
+                        .HasColumnType("tinyint")
+                        .HasComment("일반상품 시장 구분 (1=석유, 2=금, 3=배출권)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<decimal>("High")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("고가 (TDD_HGPRC) — 석유 0");
+
+                    b.Property<decimal>("Low")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("저가 (TDD_LWPRC) — 석유 0");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명 (ISU_NM) — 석유는 유종구분");
+
+                    b.Property<decimal>("Open")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("시가 (TDD_OPNPRC) — 석유 0");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradeValue")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (ACC_TRDVAL, 원)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량 (ACC_TRDVOL)");
+
+                    b.Property<decimal?>("WeightedDiscussionPrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("가중평균가격_협의 (WT_DIS_AVG_PRC) — 석유만");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CommodityMarket", "Code", "TradeDate")
+                        .IsUnique();
+
+                    b.HasIndex("CommodityMarket", "TradeDate", "TradeValue")
+                        .IsDescending(false, false, true);
+
+                    b.ToTable("CommodityDailyTrade", null, t =>
+                        {
+                            t.HasComment("일반상품(석유/금/배출권) 일별매매 시세 (KRX OpenAPI gen)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.Disclosure", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<string>("CorpCls")
+                        .IsRequired()
+                        .HasMaxLength(1)
+                        .HasColumnType("nvarchar(1)")
+                        .HasComment("법인구분 (corp_cls, Y유가/K코스닥/N코넥스/E기타)");
+
+                    b.Property<string>("CorpCode")
+                        .IsRequired()
+                        .HasMaxLength(8)
+                        .HasColumnType("nvarchar(8)")
+                        .HasComment("고유번호 (corp_code, 8자리)");
+
+                    b.Property<string>("CorpName")
+                        .IsRequired()
+                        .HasMaxLength(150)
+                        .HasColumnType("nvarchar(150)")
+                        .HasComment("법인명 (corp_name)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("FlrNm")
+                        .IsRequired()
+                        .HasMaxLength(150)
+                        .HasColumnType("nvarchar(150)")
+                        .HasComment("공시 제출인명 (flr_nm)");
+
+                    b.Property<DateOnly>("RceptDt")
+                        .HasColumnType("date")
+                        .HasComment("접수일자 (rcept_dt)");
+
+                    b.Property<string>("RceptNo")
+                        .IsRequired()
+                        .HasMaxLength(14)
+                        .HasColumnType("nvarchar(14)")
+                        .HasComment("접수번호 (rcept_no, 14자리)");
+
+                    b.Property<string>("ReportNm")
+                        .IsRequired()
+                        .HasMaxLength(400)
+                        .HasColumnType("nvarchar(400)")
+                        .HasComment("보고서명 (report_nm)");
+
+                    b.Property<string>("Rm")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("비고 (rm)");
+
+                    b.Property<string>("StockCode")
+                        .HasMaxLength(6)
+                        .HasColumnType("nvarchar(6)")
+                        .HasComment("종목코드 (stock_code, 6자리) — 비상장이면 null");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("RceptDt")
+                        .IsDescending();
+
+                    b.HasIndex("RceptNo")
+                        .IsUnique();
+
+                    b.HasIndex("StockCode", "RceptDt")
+                        .IsDescending(false, true);
+
+                    b.ToTable("Disclosure", null, t =>
+                        {
+                            t.HasComment("전자공시(DART) 공시 목록 (OpenDART list.json)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.Dividend", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<decimal?>("CashAllocAmt")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("현금배정금액 (CASH_ALOC_AMT) — 1주당 현금배당");
+
+                    b.Property<decimal?>("CashAllocRatio")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("현금배정비율 (CASH_ALOC_RATIO)");
+
+                    b.Property<decimal?>("CashDiffDiviAmt")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("현금차등배당금액 (CASH_DIFF_DIVIAMT_VAL)");
+
+                    b.Property<decimal?>("CashDiffDiviRate")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("현금차등배당율 (CASH_DIFF_DIVI_RATE)");
+
+                    b.Property<DateOnly?>("DeliDt")
+                        .HasColumnType("date")
+                        .HasComment("교부일자(주식, DELI_DT)");
+
+                    b.Property<string>("Isin")
+                        .IsRequired()
+                        .HasMaxLength(12)
+                        .HasColumnType("nchar(12)")
+                        .IsFixedLength()
+                        .HasComment("종목번호 (ISIN)");
+
+                    b.Property<string>("KorSecnNm")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("한글종목명 (KOR_SECN_NM)");
+
+                    b.Property<bool?>("MajshrEtcDiffAllocYn")
+                        .HasColumnType("bit")
+                        .HasComment("대주주기타차등배정여부 (MAJSHR_ETC_DIFF_ALOC_YN)");
+
+                    b.Property<decimal?>("MartpDiffDiviRate")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("시가차등배당율 (MARTP_DIFF_DIVI_RATE)");
+
+                    b.Property<decimal?>("MartpDivRate")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("시가배당율 (MARTP_DIV_RATE)");
+
+                    b.Property<decimal?>("Pval")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("액면가 (PVAL)");
+
+                    b.Property<DateOnly>("RgtStdDt")
+                        .HasColumnType("date")
+                        .HasComment("권리기준일자 (RGT_STD_DT)");
+
+                    b.Property<string>("SecnKacdNm")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("종목종류 (SECN_KACD_NM) — 보통주/우선주…");
+
+                    b.Property<decimal?>("StkAllocRatio")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("주식배정비율 (STK_ALOC_RATIO)");
+
+                    b.Property<decimal?>("StkDiffDiviRate")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("주식차등배당율 (STK_DIFF_DIVI_RATE)");
+
+                    b.Property<DateOnly?>("Th1PayTermBeginDt")
+                        .HasColumnType("date")
+                        .HasComment("배당지급일(현금, TH1_PAY_TERM_BEGIN_DT)");
+
+                    b.Property<bool?>("TstkNoagnYn")
+                        .HasColumnType("bit")
+                        .HasComment("자사주무배정여부 (TSTK_NOAGN_YN)");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("RgtStdDt");
+
+                    b.HasIndex("Isin", "RgtStdDt")
+                        .IsUnique();
+
+                    b.ToTable("Dividend", null, t =>
+                        {
+                            t.HasComment("SEIBro 배당분배금내역 (getDivInfo) — 종목별 배정비율·금액·시가배당율. Isin 으로 Stock 조인");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.DividendSchedule", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AllocWhcd")
+                        .HasMaxLength(1)
+                        .HasColumnType("nvarchar(1)")
+                        .HasComment("배정방법코드 (ALOC_WHCD)");
+
+                    b.Property<string>("FixTpcd")
+                        .HasMaxLength(1)
+                        .HasColumnType("nvarchar(1)")
+                        .HasComment("확정구분코드 (FIX_TPCD)");
+
+                    b.Property<bool?>("IsElectronicSecurity")
+                        .HasColumnType("bit")
+                        .HasComment("전자증권 여부 (ELTSC_YN)");
+
+                    b.Property<int>("IssucoCustno")
+                        .HasColumnType("int")
+                        .HasComment("발행회사 고객번호 (ISSUCO_CUSTNO)");
+
+                    b.Property<string>("RepSecnNm")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("대표종목명 (REP_SECN_NM)");
+
+                    b.Property<string>("RgtRacd")
+                        .HasMaxLength(3)
+                        .HasColumnType("nvarchar(3)")
+                        .HasComment("권리사유코드 (RGT_RACD) — 103 배당/분배");
+
+                    b.Property<string>("RgtRsnDetailSortCd")
+                        .IsRequired()
+                        .HasMaxLength(2)
+                        .HasColumnType("nvarchar(2)")
+                        .HasComment("권리사유세부유형코드 — 01주식 02현금 03동시 04무배당");
+
+                    b.Property<DateOnly>("RgtStdDt")
+                        .HasColumnType("date")
+                        .HasComment("권리기준일자 (RGT_STD_DT)");
+
+                    b.Property<DateOnly?>("RostCloseBeginDt")
+                        .HasColumnType("date")
+                        .HasComment("명부폐쇄시작일자 (ROST_CLOSE_BEGIN_DT)");
+
+                    b.Property<DateOnly?>("RostCloseExpryDt")
+                        .HasColumnType("date")
+                        .HasComment("명부폐쇄종료일자 (ROST_CLOSE_EXPRY_DT)");
+
+                    b.Property<string>("SetaccTpcd")
+                        .HasMaxLength(1)
+                        .HasColumnType("nvarchar(1)")
+                        .HasComment("결산구분코드 (SETACC_TPCD)");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateOnly?>("XrgtDt")
+                        .HasColumnType("date")
+                        .HasComment("권리락일자 (XRGT_DT)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("RgtStdDt");
+
+                    b.HasIndex("XrgtDt");
+
+                    b.HasIndex("IssucoCustno", "RgtStdDt", "RgtRsnDetailSortCd")
+                        .IsUnique();
+
+                    b.ToTable("DividendSchedule", null, t =>
+                        {
+                            t.HasComment("SEIBro 배당일정 (getDivSchedulInfo) — 현금/주식/동시/무배당 일정·권리락일");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.EsgIndexDailyPrice", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal>("ChangeVal")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일비 (PRV_DD_CMPR)");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("현재가/종가 (CLSPRC_IDX)");
+
+                    b.Property<int>("ConstituentCount")
+                        .HasColumnType("int")
+                        .HasComment("구성종목수 (TRD_ISU_CNT)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FlucRateBp")
+                        .HasColumnType("int")
+                        .HasComment("등락률 basis point (%×100, UPDN_RATE)");
+
+                    b.Property<string>("IndexName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("지수명 (IDX_NM)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("Value")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (ACC_TRDVAL, 백만원)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량 (ACC_TRDVOL, 천주)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("TradeDate");
+
+                    b.HasIndex("IndexName", "TradeDate")
+                        .IsUnique();
+
+                    b.ToTable("EsgIndexDailyPrice", null, t =>
+                        {
+                            t.HasComment("ESG 지수 일별시세 (KRX OpenAPI esg/esg_index_info)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.EsgSecurity", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal>("ChangeAmount")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일비 (CMPPREVDD_PRC)");
+
+                    b.Property<decimal>("ChangeRate")
+                        .HasPrecision(9, 2)
+                        .HasColumnType("decimal(9,2)")
+                        .HasComment("등락률 % (FLUC_RT)");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("현재가/종가 (TDD_CLSPRC)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<long>("ListedShares")
+                        .HasColumnType("bigint")
+                        .HasComment("상장좌수 (LIST_SHRS)");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명 (ISU_ABBRV)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradeValue")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금(원) (ACC_TRDVAL)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량(좌) (ACC_TRDVOL)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Name", "TradeDate")
+                        .IsUnique();
+
+                    b.HasIndex("TradeDate", "TradeValue")
+                        .IsDescending(false, true);
+
+                    b.ToTable("EsgSecurity", null, t =>
+                        {
+                            t.HasComment("ESG 증권상품 일별시세 (KRX OpenAPI esg/esg_etp_info)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.EtpDailyTrade", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal?>("BaseIndexClose")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("기초지수 종가 (ETF/ETN)");
+
+                    b.Property<string>("BaseIndexName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("기초지수명 (ETF/ETN)");
+
+                    b.Property<decimal>("ChangeAmount")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일 대비");
+
+                    b.Property<decimal>("ChangeRate")
+                        .HasPrecision(7, 2)
+                        .HasColumnType("decimal(7,2)")
+                        .HasComment("등락률 % (ELW 는 0)");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("종가");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("단축코드 (ISU_CD)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<byte>("EtpType")
+                        .HasColumnType("tinyint")
+                        .HasComment("증권상품 구분 (1=ETF, 2=ETN, 3=ELW)");
+
+                    b.Property<decimal>("High")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("고가");
+
+                    b.Property<long?>("ListedShares")
+                        .HasColumnType("bigint")
+                        .HasComment("상장증권수/상장좌수");
+
+                    b.Property<decimal>("Low")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("저가");
+
+                    b.Property<long?>("MarketCap")
+                        .HasColumnType("bigint")
+                        .HasComment("시가총액 (원)");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명");
+
+                    b.Property<decimal?>("Nav")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("ETF NAV / ETN 지표가치(IV)");
+
+                    b.Property<long?>("NetAssetTotal")
+                        .HasColumnType("bigint")
+                        .HasComment("ETF 순자산총액 / ETN 지표가치총액 (원)");
+
+                    b.Property<decimal>("Open")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("시가");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradeValue")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (원)");
+
+                    b.Property<string>("Underlying")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("ELW 기초자산명");
+
+                    b.Property<decimal?>("UnderlyingClose")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("ELW 기초자산 종가");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("EtpType", "Code", "TradeDate")
+                        .IsUnique();
+
+                    b.HasIndex("EtpType", "TradeDate", "TradeValue")
+                        .IsDescending(false, false, true);
+
+                    b.ToTable("EtpDailyTrade", null, t =>
+                        {
+                            t.HasComment("증권상품(ETF/ETN/ELW) 일별매매 시세 (KRX OpenAPI etp)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.ExchangeRate", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("CurrencyName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("통화명 (cur_nm)");
+
+                    b.Property<string>("CurrencyUnit")
+                        .IsRequired()
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("통화 코드 (cur_unit) — 예: USD, JPY(100)");
+
+                    b.Property<decimal>("DealBasRate")
+                        .HasPrecision(10, 2)
+                        .HasColumnType("decimal(10,2)")
+                        .HasComment("매매기준율 (deal_bas_r)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<decimal?>("Ttb")
+                        .HasPrecision(10, 2)
+                        .HasColumnType("decimal(10,2)")
+                        .HasComment("전신환 받으실 때 (ttb)");
+
+                    b.Property<decimal?>("Tts")
+                        .HasPrecision(10, 2)
+                        .HasColumnType("decimal(10,2)")
+                        .HasComment("전신환 보내실 때 (tts)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("TradeDate");
+
+                    b.HasIndex("CurrencyUnit", "TradeDate")
+                        .IsUnique();
+
+                    b.ToTable("ExchangeRate", null, t =>
+                        {
+                            t.HasComment("일별 환율 (한국수출입은행 OpenAPI AP01 현재환율)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.FuturesDailyTrade", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal>("ChangeAmount")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일 대비 (CMPPREVDD_PRC)");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("종가 (TDD_CLSPRC)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<byte>("FuturesKind")
+                        .HasColumnType("tinyint")
+                        .HasComment("선물 상품군 구분 (1=일반선물, 2=주식선물유가, 3=주식선물코스닥)");
+
+                    b.Property<decimal>("High")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("고가 (TDD_HGPRC)");
+
+                    b.Property<string>("IsuCode")
+                        .IsRequired()
+                        .HasMaxLength(12)
+                        .HasColumnType("nvarchar(12)")
+                        .HasComment("종목코드 (ISU_CD) — 8자리 영숫자");
+
+                    b.Property<string>("IsuName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명");
+
+                    b.Property<decimal>("Low")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("저가 (TDD_LWPRC)");
+
+                    b.Property<string>("MarketName")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("시장구분 (MKT_NM 정규/야간)");
+
+                    b.Property<decimal>("Open")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("시가 (TDD_OPNPRC)");
+
+                    b.Property<long?>("OpenInterest")
+                        .HasColumnType("bigint")
+                        .HasComment("미결제약정 (ACC_OPNINT_QTY)");
+
+                    b.Property<string>("ProductName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("상품구분 (PROD_NM)");
+
+                    b.Property<byte>("Session")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("tinyint")
+                        .HasDefaultValue((byte)1)
+                        .HasComment("매매 세션 (1=정규, 2=야간)");
+
+                    b.Property<decimal?>("SettlePrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("정산가 (SETL_PRC)");
+
+                    b.Property<decimal?>("SpotPrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("현물가 (SPOT_PRC)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradeValue")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (ACC_TRDVAL, 원)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량 (ACC_TRDVOL)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("FuturesKind", "IsuCode", "TradeDate", "Session")
+                        .IsUnique();
+
+                    b.HasIndex("FuturesKind", "TradeDate", "Session", "TradeValue")
+                        .IsDescending(false, false, false, true);
+
+                    b.ToTable("FuturesDailyTrade", null, t =>
+                        {
+                            t.HasComment("선물(일반/주식유가/주식코스닥) 일별매매 시세 (KRX OpenAPI drv)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.IndexDailyPrice", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal>("ChangeVal")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일 대비");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("종가");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("FlucRateBp")
+                        .HasColumnType("int")
+                        .HasComment("등락률 basis point (%×100)");
+
+                    b.Property<decimal>("High")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("고가");
+
+                    b.Property<string>("IndexName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("지수명");
+
+                    b.Property<decimal>("Low")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("저가");
+
+                    b.Property<long?>("MarketCap")
+                        .HasColumnType("bigint")
+                        .HasComment("상장시가총액 (원)");
+
+                    b.Property<decimal>("Open")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("시가");
+
+                    b.Property<byte>("Series")
+                        .HasColumnType("tinyint")
+                        .HasComment("계열 구분 (1=KOSPI, 2=KOSDAQ, 3=KRX)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("Value")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (원)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("TradeDate");
+
+                    b.HasIndex("Series", "IndexName", "TradeDate")
+                        .IsUnique();
+
+                    b.ToTable("IndexDailyPrice", null, t =>
+                        {
+                            t.HasComment("지수(시장) 일별 마감 시세 (KRX OpenAPI)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.InterestRate", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("ItemName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("항목명 (cur_nm 등)");
+
+                    b.Property<decimal?>("Rate")
+                        .HasPrecision(9, 4)
+                        .HasColumnType("decimal(9,4)")
+                        .HasComment("금리 % — 미고시 시 null");
+
+                    b.Property<byte>("RateType")
+                        .HasColumnType("tinyint")
+                        .HasComment("금리 종류 (1=대출금리, 2=국제금리)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("TradeDate");
+
+                    b.HasIndex("RateType", "ItemName", "TradeDate")
+                        .IsUnique();
+
+                    b.ToTable("InterestRate", null, t =>
+                        {
+                            t.HasComment("일별 금리 (한국수출입은행 OpenAPI AP02 대출금리 / AP03 국제금리)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.MarketHoliday", b =>
+                {
+                    b.Property<DateOnly>("Date")
+                        .HasColumnType("date");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("휴장 사유");
+
+                    b.HasKey("Date");
+
+                    b.ToTable("MarketHoliday", null, t =>
+                        {
+                            t.HasComment("KRX 휴장일 (주말 제외, Admin 수동 관리)");
+                        });
+
+                    b.HasData(
+                        new
+                        {
+                            Date = new DateOnly(2026, 1, 1),
+                            Name = "신정"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 2, 16),
+                            Name = "설날 연휴"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 2, 17),
+                            Name = "설날"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 2, 18),
+                            Name = "설날 연휴"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 3, 2),
+                            Name = "삼일절 대체공휴일"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 5, 5),
+                            Name = "어린이날"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 5, 25),
+                            Name = "부처님오신날 대체공휴일"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 6, 3),
+                            Name = "전국동시지방선거"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 8, 17),
+                            Name = "광복절 대체공휴일"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 9, 24),
+                            Name = "추석 연휴"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 9, 25),
+                            Name = "추석"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 9, 28),
+                            Name = "추석 대체공휴일"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 10, 5),
+                            Name = "개천절 대체공휴일"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 10, 9),
+                            Name = "한글날"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 12, 25),
+                            Name = "성탄절"
+                        },
+                        new
+                        {
+                            Date = new DateOnly(2026, 12, 31),
+                            Name = "연말 휴장일"
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.OptionsDailyTrade", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal>("ChangeAmount")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일 대비 (CMPPREVDD_PRC)");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("종가 (TDD_CLSPRC)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<decimal>("High")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("고가 (TDD_HGPRC)");
+
+                    b.Property<decimal?>("ImpliedVolatility")
+                        .HasPrecision(9, 3)
+                        .HasColumnType("decimal(9,3)")
+                        .HasComment("내재변동성 % (IMP_VOLT)");
+
+                    b.Property<string>("IsuCode")
+                        .IsRequired()
+                        .HasMaxLength(12)
+                        .HasColumnType("nvarchar(12)")
+                        .HasComment("종목코드 (ISU_CD) — 8자리 영숫자");
+
+                    b.Property<string>("IsuName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명");
+
+                    b.Property<decimal>("Low")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("저가 (TDD_LWPRC)");
+
+                    b.Property<decimal?>("NextDayBasePrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("익일정산가 (NXTDD_BAS_PRC)");
+
+                    b.Property<decimal>("Open")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("시가 (TDD_OPNPRC)");
+
+                    b.Property<long?>("OpenInterest")
+                        .HasColumnType("bigint")
+                        .HasComment("미결제약정 (ACC_OPNINT_QTY)");
+
+                    b.Property<byte>("OptionsKind")
+                        .HasColumnType("tinyint")
+                        .HasComment("옵션 상품군 구분 (1=일반옵션, 2=주식옵션유가, 3=주식옵션코스닥)");
+
+                    b.Property<string>("ProductName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("상품구분 (PROD_NM)");
+
+                    b.Property<byte>("RightType")
+                        .HasColumnType("tinyint")
+                        .HasComment("권리유형 (RGHT_TP_NM — 1=Call, 2=Put)");
+
+                    b.Property<byte>("Session")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("tinyint")
+                        .HasDefaultValue((byte)1)
+                        .HasComment("매매 세션 (1=정규, 2=야간)");
+
+                    b.Property<decimal?>("StrikePrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("행사가 (ISU_NM 에서 파싱)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradeValue")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (ACC_TRDVAL, 원)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량 (ACC_TRDVOL)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("OptionsKind", "IsuCode", "TradeDate", "Session")
+                        .IsUnique();
+
+                    b.HasIndex("OptionsKind", "TradeDate", "Session", "TradeValue")
+                        .IsDescending(false, false, false, true);
+
+                    b.ToTable("OptionsDailyTrade", null, t =>
+                        {
+                            t.HasComment("옵션(일반/주식유가/주식코스닥) 일별매매 시세 (KRX OpenAPI drv)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.RightsBaseDate", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("IssucoCustno")
+                        .HasColumnType("int")
+                        .HasComment("발행회사 고객번호 (ISSUCO_CUSTNO)");
+
+                    b.Property<string>("RepSecnNm")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("대표종목명 (REP_SECN_NM)");
+
+                    b.Property<string>("RgtRacd")
+                        .IsRequired()
+                        .HasMaxLength(3)
+                        .HasColumnType("nvarchar(3)")
+                        .HasComment("권리사유코드 (RGT_RACD)");
+
+                    b.Property<string>("RgtRacdNm")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("권리사유명 (RGT_RACD_NM)");
+
+                    b.Property<string>("RgtRsnDetailSortCd")
+                        .IsRequired()
+                        .HasMaxLength(2)
+                        .HasColumnType("nvarchar(2)")
+                        .HasComment("권리사유세부유형코드 (RGT_RSN_DTAIL_SORT_CD)");
+
+                    b.Property<DateOnly>("RgtStdDt")
+                        .HasColumnType("date")
+                        .HasComment("권리기준일자 (RGT_STD_DT)");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("RgtRacd");
+
+                    b.HasIndex("RgtStdDt");
+
+                    b.HasIndex("IssucoCustno", "RgtStdDt", "RgtRacd", "RgtRsnDetailSortCd")
+                        .IsUnique();
+
+                    b.ToTable("RightsBaseDate", null, t =>
+                        {
+                            t.HasComment("SEIBro 권리기준일 (getStddtInfo) — Wave 3 기업행위 이벤트 발견 소스");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.SeibroIssuerCode", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("IssucoCustno")
+                        .HasColumnType("int")
+                        .HasComment("발행회사 고객번호 (ISSUCO_CUSTNO)");
+
+                    b.Property<string>("Market")
+                        .IsRequired()
+                        .HasMaxLength(2)
+                        .HasColumnType("nchar(2)")
+                        .IsFixedLength()
+                        .HasComment("시장구분 (MART_TPCD) — 11유가/12코스닥/13K-OTC/14코넥스/50기타");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명 (KOR_SECN_NM)");
+
+                    b.Property<string>("ShortCode")
+                        .IsRequired()
+                        .HasMaxLength(12)
+                        .HasColumnType("nvarchar(12)")
+                        .HasComment("단축코드 (SHOTN_ISIN)");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("IssucoCustno");
+
+                    b.HasIndex("Market", "ShortCode")
+                        .IsUnique();
+
+                    b.ToTable("SeibroIssuerCode", null, t =>
+                        {
+                            t.HasComment("SEIBro 시장별 단축코드↔발행회사번호 매핑 (getShotnByMart)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.SriBond", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<string>("BondType")
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("채권유형 (BND_TP_NM)");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(12)
+                        .HasColumnType("nvarchar(12)")
+                        .HasComment("표준코드 (ISU_CD) — 12자리 ISIN");
+
+                    b.Property<decimal?>("CouponRate")
+                        .HasPrecision(9, 5)
+                        .HasColumnType("decimal(9,5)")
+                        .HasComment("표면이자율 % (ISU_RT)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<long>("IssueAmount")
+                        .HasColumnType("bigint")
+                        .HasComment("발행금액 (ISU_AMT, 원)");
+
+                    b.Property<DateOnly?>("IssueDate")
+                        .HasColumnType("date")
+                        .HasComment("발행일 (ISU_DD)");
+
+                    b.Property<string>("IssuerName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("발행기관 (ISUR_NM)");
+
+                    b.Property<long>("ListAmount")
+                        .HasColumnType("bigint")
+                        .HasComment("상장금액 (LIST_AMT, 원)");
+
+                    b.Property<DateOnly?>("ListDate")
+                        .HasColumnType("date")
+                        .HasComment("상장일 (LIST_DD)");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명 (ISU_NM)");
+
+                    b.Property<DateOnly?>("RedemptionDate")
+                        .HasColumnType("date")
+                        .HasComment("상환일 (REDMPT_DD)");
+
+                    b.Property<string>("SriBondType")
+                        .IsRequired()
+                        .HasMaxLength(30)
+                        .HasColumnType("nvarchar(30)")
+                        .HasComment("채권종류 (SRI_BND_TP_NM)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code", "TradeDate")
+                        .IsUnique();
+
+                    b.HasIndex("TradeDate", "SriBondType");
+
+                    b.ToTable("SriBond", null, t =>
+                        {
+                            t.HasComment("사회책임투자채권(SRI) 정보 스냅샷 (KRX OpenAPI esg/sri_bond_info)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.Stock", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("단축코드");
+
+                    b.Property<string>("CorpCode")
+                        .HasMaxLength(8)
+                        .HasColumnType("nchar(8)")
+                        .IsFixedLength()
+                        .HasComment("DART 고유번호");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateOnly?>("DelistedDate")
+                        .HasColumnType("date");
+
+                    b.Property<string>("EnglishName")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.Property<decimal?>("FaceValue")
+                        .HasPrecision(15, 4)
+                        .HasColumnType("decimal(15,4)")
+                        .HasComment("액면가 (SEIBro PVAL)");
+
+                    b.Property<string>("ISIN")
+                        .HasMaxLength(12)
+                        .HasColumnType("nchar(12)")
+                        .IsFixedLength()
+                        .HasComment("표준코드");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<bool?>("IsElectronicSecurity")
+                        .HasColumnType("bit")
+                        .HasComment("전자증권 여부 (SEIBro ELTSC_YN)");
+
+                    b.Property<int?>("IssucoCustno")
+                        .HasColumnType("int")
+                        .HasComment("SEIBro 발행회사 고객번호 (ISSUCO_CUSTNO) — 기업정보 API 조인키");
+
+                    b.Property<decimal?>("LastChangeRate")
+                        .HasPrecision(7, 2)
+                        .HasColumnType("decimal(7,2)");
+
+                    b.Property<int?>("LastClosePrice")
+                        .HasColumnType("int");
+
+                    b.Property<DateOnly?>("LastTradingDate")
+                        .HasColumnType("date");
+
+                    b.Property<DateOnly>("ListedDate")
+                        .HasColumnType("date");
+
+                    b.Property<byte>("Market")
+                        .HasColumnType("tinyint")
+                        .HasComment("시장 구분 (1=KOSPI, 2=KOSDAQ, 3=KONEX)");
+
+                    b.Property<long?>("MarketCap")
+                        .HasColumnType("bigint");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)");
+
+                    b.Property<string>("SectorName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)");
+
+                    b.Property<long?>("TotalIssuedShares")
+                        .HasColumnType("bigint")
+                        .HasComment("총발행주식수 (SEIBro TOTAL_STK_CNT)");
+
+                    b.Property<byte>("TradingStatus")
+                        .HasColumnType("tinyint")
+                        .HasComment("거래 상태 (0=정상, 1=거래정지, 2=관리종목)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<decimal?>("VotingRights")
+                        .HasPrecision(5, 2)
+                        .HasColumnType("decimal(5,2)")
+                        .HasComment("1주당 의결권수 (SEIBro VOTRNO)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code")
+                        .IsUnique();
+
+                    b.HasIndex("CorpCode");
+
+                    b.HasIndex("ISIN")
+                        .IsUnique()
+                        .HasFilter("[ISIN] IS NOT NULL");
+
+                    b.HasIndex("IssucoCustno");
+
+                    b.HasIndex("Name");
+
+                    b.HasIndex("Market", "IsActive");
+
+                    b.ToTable("Stock", null, t =>
+                        {
+                            t.HasComment("종목 마스터 (KRX 상장종목)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.StockBoardStats", b =>
+                {
+                    b.Property<string>("StockCode")
+                        .HasMaxLength(6)
+                        .HasColumnType("nchar(6)")
+                        .IsFixedLength()
+                        .HasComment("종목 단축코드 (PK)");
+
+                    b.Property<int>("Comments")
+                        .HasColumnType("int")
+                        .HasComment("댓글 수");
+
+                    b.Property<DateTime?>("LastPostAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("마지막 글 작성 일시");
+
+                    b.Property<int>("Posts")
+                        .HasColumnType("int")
+                        .HasComment("게시글 수");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("갱신 일시");
+
+                    b.HasKey("StockCode");
+
+                    b.ToTable("StockBoardStats", null, t =>
+                        {
+                            t.HasComment("종목 가상보드 통계 (글/댓글 수)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.StockDailyPrice", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<int>("ChangeAmount")
+                        .HasColumnType("int");
+
+                    b.Property<decimal>("ChangeRate")
+                        .HasPrecision(7, 2)
+                        .HasColumnType("decimal(7,2)")
+                        .HasComment("등락률 %");
+
+                    b.Property<int>("Close")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("High")
+                        .HasColumnType("int");
+
+                    b.Property<long?>("ListedShares")
+                        .HasColumnType("bigint");
+
+                    b.Property<int>("Low")
+                        .HasColumnType("int");
+
+                    b.Property<long?>("MarketCap")
+                        .HasColumnType("bigint");
+
+                    b.Property<int>("Open")
+                        .HasColumnType("int");
+
+                    b.Property<int>("StockID")
+                        .HasColumnType("int");
+
+                    b.Property<DateOnly>("TradingDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradingValue")
+                        .HasColumnType("bigint");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("StockID", "TradingDate")
+                        .IsUnique();
+
+                    b.HasIndex("TradingDate", "ChangeRate")
+                        .IsDescending(false, true);
+
+                    b.HasIndex("TradingDate", "TradingValue")
+                        .IsDescending(false, true);
+
+                    b.ToTable("StockDailyPrice", null, t =>
+                        {
+                            t.HasComment("T+1 일별 마감 시세 (금융위 API)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.WarrantDailyTrade", b =>
+                {
+                    b.Property<long>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bigint");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<long>("ID"));
+
+                    b.Property<decimal>("ChangeAmount")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("전일 대비");
+
+                    b.Property<decimal>("ChangeRate")
+                        .HasPrecision(7, 2)
+                        .HasColumnType("decimal(7,2)")
+                        .HasComment("등락률 %");
+
+                    b.Property<decimal>("Close")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("종가");
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(12)
+                        .HasColumnType("nvarchar(12)")
+                        .HasComment("단축코드 (ISU_CD) — 8자리 영숫자");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateOnly?>("DelistDate")
+                        .HasColumnType("date")
+                        .HasComment("상장폐지일 (증서, DELIST_DD)");
+
+                    b.Property<DateOnly?>("ExerciseEndDate")
+                        .HasColumnType("date")
+                        .HasComment("행사 종료일 (증권, EXST_END_DD)");
+
+                    b.Property<decimal?>("ExercisePrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("행사가 (증권, EXER_PRC)");
+
+                    b.Property<DateOnly?>("ExerciseStartDate")
+                        .HasColumnType("date")
+                        .HasComment("행사 시작일 (증권, EXST_STRT_DD)");
+
+                    b.Property<decimal>("High")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("고가");
+
+                    b.Property<decimal?>("IssuePrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("발행가 (증서, ISU_PRC)");
+
+                    b.Property<long?>("ListedShares")
+                        .HasColumnType("bigint")
+                        .HasComment("상장증권수");
+
+                    b.Property<decimal>("Low")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("저가");
+
+                    b.Property<byte>("Market")
+                        .HasColumnType("tinyint")
+                        .HasComment("시장 구분 (1=KOSPI, 2=KOSDAQ, 3=KONEX)");
+
+                    b.Property<long?>("MarketCap")
+                        .HasColumnType("bigint")
+                        .HasComment("시가총액 (원)");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명");
+
+                    b.Property<decimal>("Open")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("시가");
+
+                    b.Property<string>("TargetStockCode")
+                        .HasMaxLength(6)
+                        .HasColumnType("nvarchar(6)")
+                        .HasComment("대상주식 단축코드 (TARSTK_ISU_SRT_CD)");
+
+                    b.Property<string>("TargetStockName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("대상주식명 (TARSTK_ISU_NM)");
+
+                    b.Property<decimal?>("TargetStockPrice")
+                        .HasPrecision(18, 2)
+                        .HasColumnType("decimal(18,2)")
+                        .HasComment("대상주식 현재가 (TARSTK_ISU_PRSNT_PRC)");
+
+                    b.Property<DateOnly>("TradeDate")
+                        .HasColumnType("date");
+
+                    b.Property<long>("TradeValue")
+                        .HasColumnType("bigint")
+                        .HasComment("거래대금 (원)");
+
+                    b.Property<long>("Volume")
+                        .HasColumnType("bigint")
+                        .HasComment("거래량");
+
+                    b.Property<byte>("WarrantType")
+                        .HasColumnType("tinyint")
+                        .HasComment("신주인수권 구분 (1=증권, 2=증서)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("WarrantType", "Code", "TradeDate")
+                        .IsUnique();
+
+                    b.HasIndex("WarrantType", "TradeDate", "TradeValue")
+                        .IsDescending(false, false, true);
+
+                    b.ToTable("WarrantDailyTrade", null, t =>
+                        {
+                            t.HasComment("신주인수권증권/증서 일별매매 시세 (KRX OpenAPI sto sw/sr)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Coupon", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("ExpiresAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("GameID")
+                        .HasColumnType("int")
+                        .HasComment("게임 ID (필수)");
+
+                    b.Property<int>("GeneratedCount")
+                        .HasColumnType("int");
+
+                    b.Property<int>("LowStockThreshold")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(10);
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)");
+
+                    b.Property<int>("ProductID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("UsagePolicy")
+                        .HasColumnType("int");
+
+                    b.Property<int>("UsedCount")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("GameID");
+
+                    b.HasIndex("ProductID");
+
+                    b.ToTable("Coupon", null, t =>
+                        {
+                            t.HasComment("쿠폰 메타 (코드 풀의 상위)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.CouponCode", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Code")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("코드 평문 (사용자 표시용)");
+
+                    b.Property<string>("CodeHash")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)")
+                        .HasComment("SHA-256 hex (UNIQUE, 조회용)");
+
+                    b.Property<int>("CouponID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("IssuedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int?>("IssuedToMemberID")
+                        .HasColumnType("int");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int")
+                        .HasComment("상태 (1=Available, 2=Reserved, 3=Issued, 4=Used)");
+
+                    b.Property<DateTime?>("UsedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CodeHash")
+                        .IsUnique();
+
+                    b.HasIndex("IssuedToMemberID");
+
+                    b.HasIndex("CouponID", "Status");
+
+                    b.ToTable("CouponCode", null, t =>
+                        {
+                            t.HasComment("쿠폰 코드 풀 (Code 평문 + CodeHash SHA-256 hex)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Game", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("BigImage")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("큰 이미지 (상세/배너용)");
+
+                    b.Property<string>("Code")
+                        .HasMaxLength(6)
+                        .HasColumnType("nvarchar(6)")
+                        .HasComment("게임 코드 (UNIQUE, 외부 연동/내부 식별)");
+
+                    b.Property<decimal>("CommissionRate")
+                        .HasPrecision(10, 7)
+                        .HasColumnType("decimal(10,7)")
+                        .HasComment("게임사 수익률(%) — 0~100, 소수점 7자리");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("게임 소개 (CKEditor HTML)");
+
+                    b.Property<string>("EngName")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("게임 영문명");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("KorName")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("게임 한글명");
+
+                    b.Property<string>("Link")
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("게임 다운로드/공식 사이트 주소");
+
+                    b.Property<string>("MinSpec")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("최소 사양 (자유 텍스트)");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Publisher")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("게임사/퍼블리셔");
+
+                    b.Property<string>("RecommendedSpec")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("권장 사양 (자유 텍스트)");
+
+                    b.Property<DateOnly?>("ReleaseDate")
+                        .HasColumnType("date")
+                        .HasComment("게임 출시일");
+
+                    b.Property<string>("Thumbnail")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("작은 이미지 (목록 카드용)");
+
+                    b.Property<string>("TrailerUrl")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("YouTube 예고편 URL");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Code")
+                        .IsUnique()
+                        .HasFilter("[Code] IS NOT NULL");
+
+                    b.HasIndex("KorName")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive", "Order");
+
+                    b.ToTable("Game", null, t =>
+                        {
+                            t.HasComment("상점 제휴 게임");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameCategory", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("EngName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("카테고리 영문명");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("KorName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("카테고리 한글명");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("KorName")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive", "Order");
+
+                    b.ToTable("GameCategory", null, t =>
+                        {
+                            t.HasComment("게임 카테고리 코드");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameCategoryMap", b =>
+                {
+                    b.Property<int>("GameID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("GameCategoryID")
+                        .HasColumnType("int");
+
+                    b.HasKey("GameID", "GameCategoryID");
+
+                    b.HasIndex("GameCategoryID");
+
+                    b.ToTable("GameCategoryMap", null, t =>
+                        {
+                            t.HasComment("게임-카테고리 N:M");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameGenre", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("EngName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("장르 영문명");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("KorName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("장르 한글명");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("KorName")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive", "Order");
+
+                    b.ToTable("GameGenre", null, t =>
+                        {
+                            t.HasComment("게임 장르 코드");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameGenreMap", b =>
+                {
+                    b.Property<int>("GameID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("GameGenreID")
+                        .HasColumnType("int");
+
+                    b.HasKey("GameID", "GameGenreID");
+
+                    b.HasIndex("GameGenreID");
+
+                    b.ToTable("GameGenreMap", null, t =>
+                        {
+                            t.HasComment("게임-장르 N:M");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameImage", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("ContentType")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("MIME");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DisabledAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("비활성 일시");
+
+                    b.Property<string>("Extension")
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)")
+                        .HasComment("확장자");
+
+                    b.Property<string>("FileName")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("원본 파일명");
+
+                    b.Property<int>("GameID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("HashedName")
+                        .IsRequired()
+                        .HasMaxLength(255)
+                        .HasColumnType("nvarchar(255)")
+                        .HasComment("저장 파일명(해시)");
+
+                    b.Property<short?>("Height")
+                        .HasColumnType("smallint")
+                        .HasComment("세로 픽셀");
+
+                    b.Property<bool>("IsDisabled")
+                        .HasColumnType("bit")
+                        .HasComment("비활성 여부");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int")
+                        .HasComment("정렬 순서");
+
+                    b.Property<string>("Path")
+                        .IsRequired()
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)")
+                        .HasComment("상대 경로");
+
+                    b.Property<long?>("Size")
+                        .HasColumnType("bigint")
+                        .HasComment("바이트 크기");
+
+                    b.Property<Guid>("UUID")
+                        .HasColumnType("uniqueidentifier")
+                        .HasComment("UUID");
+
+                    b.Property<string>("Url")
+                        .IsRequired()
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)")
+                        .HasComment("접근 URL");
+
+                    b.Property<short?>("Width")
+                        .HasColumnType("smallint")
+                        .HasComment("가로 픽셀");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("GameID");
+
+                    b.HasIndex("UUID")
+                        .IsUnique();
+
+                    b.HasIndex("GameID", "IsDisabled");
+
+                    b.ToTable("GameImage", null, t =>
+                        {
+                            t.HasComment("게임 상세 이미지 갤러리");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameLanguage", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("EngName")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("언어 영문명");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<string>("KorName")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("언어 한글명");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("KorName")
+                        .IsUnique();
+
+                    b.HasIndex("IsActive", "Order");
+
+                    b.ToTable("GameLanguage", null, t =>
+                        {
+                            t.HasComment("게임 지원 언어 마스터");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameLanguageSupport", b =>
+                {
+                    b.Property<int>("GameID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("GameLanguageID")
+                        .HasColumnType("int");
+
+                    b.Property<bool>("FullAudio")
+                        .HasColumnType("bit")
+                        .HasComment("풀 오디오(음성) 지원");
+
+                    b.Property<bool>("Interface")
+                        .HasColumnType("bit")
+                        .HasComment("인터페이스 지원");
+
+                    b.Property<bool>("Subtitles")
+                        .HasColumnType("bit")
+                        .HasComment("자막 지원");
+
+                    b.HasKey("GameID", "GameLanguageID");
+
+                    b.HasIndex("GameLanguageID");
+
+                    b.ToTable("GameLanguageSupport", null, t =>
+                        {
+                            t.HasComment("게임별 언어 지원 (인터페이스/풀오디오/자막)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameSettlement", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AdminMemo")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("GameID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Month")
+                        .HasColumnType("int");
+
+                    b.Property<int>("OrderCount")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("SettledAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("SettledByAdminEmail")
+                        .HasMaxLength(256)
+                        .HasColumnType("nvarchar(256)");
+
+                    b.Property<string>("SettledByAdminUserId")
+                        .HasMaxLength(450)
+                        .HasColumnType("nvarchar(450)");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int")
+                        .HasComment("정산 상태 (1=Pending, 2=Settled)");
+
+                    b.Property<int>("TotalRevenueAmount")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Year")
+                        .HasColumnType("int");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("GameID", "Year", "Month")
+                        .IsUnique();
+
+                    b.HasIndex("Year", "Month", "Status");
+
+                    b.ToTable("GameSettlement", null, t =>
+                        {
+                            t.HasComment("게임사 월별 정산 큐");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.MemberAddress", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Address1_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("기본 주소 (암호화)");
+
+                    b.Property<string>("Address2_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("상세 주소 (암호화)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("IsDefault")
+                        .HasColumnType("bit");
+
+                    b.Property<int>("KeyVersion")
+                        .HasColumnType("int")
+                        .HasComment("암호화 키 버전");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Phone_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("연락처 (암호화)");
+
+                    b.Property<string>("RecipientName_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("수령인명 (암호화)");
+
+                    b.Property<string>("RecipientName_Hash")
+                        .IsRequired()
+                        .HasMaxLength(64)
+                        .HasColumnType("nvarchar(64)")
+                        .HasComment("수령인명 SHA-256 hex (검색용)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("ZipCode")
+                        .IsRequired()
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("RecipientName_Hash");
+
+                    b.HasIndex("MemberID", "IsDefault");
+
+                    b.ToTable("MemberAddress", null, t =>
+                        {
+                            t.HasComment("회원 배송 주소 (AES-GCM 암호화)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.MemberInventory", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("AcquiredAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("CouponCodeID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("DeletedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("사용자 보관함 소프트 삭제 일시. NULL = 보관함 노출");
+
+                    b.Property<DateTime?>("ExpiresAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("OrderItemID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("UsedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CouponCodeID")
+                        .IsUnique();
+
+                    b.HasIndex("OrderItemID");
+
+                    b.HasIndex("MemberID", "DeletedAt");
+
+                    b.HasIndex("MemberID", "UsedAt");
+
+                    b.ToTable("MemberInventory", null, t =>
+                        {
+                            t.HasComment("회원 보관함 (Digital 상품)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Order", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("CancelReason")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<int?>("ChannelID")
+                        .HasColumnType("int")
+                        .HasComment("후원 채널 (선택)");
+
+                    b.Property<int>("ChannelRewardAmount")
+                        .HasColumnType("int")
+                        .HasComment("채널주 채널 보상 입금 금액 (비활성 — 과거 주문 호환)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("GameRevenueAmount")
+                        .HasColumnType("int")
+                        .HasComment("게임사 정산 큐 적재 금액");
+
+                    b.Property<string>("GiftMessage")
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("선물 메시지");
+
+                    b.Property<int?>("GiftToMemberID")
+                        .HasColumnType("int")
+                        .HasComment("선물 수신자 회원 ID (null=본인구매)");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("OrderNumber")
+                        .IsRequired()
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("주문 번호 (UNIQUE)");
+
+                    b.Property<DateTime?>("PaidAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("PlatformFeeAmount")
+                        .HasColumnType("int")
+                        .HasComment("dpot 몫");
+
+                    b.Property<string>("RefundReason")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int")
+                        .HasComment("주문 상태");
+
+                    b.Property<int>("TotalAmount")
+                        .HasColumnType("int")
+                        .HasComment("총 결제 금액");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("ChannelID");
+
+                    b.HasIndex("OrderNumber")
+                        .IsUnique();
+
+                    b.HasIndex("Status", "CreatedAt");
+
+                    b.HasIndex("MemberID", "Status", "CreatedAt");
+
+                    b.ToTable("Order", null, t =>
+                        {
+                            t.HasComment("상점 주문 헤더");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.OrderItem", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int?>("IssuedCouponCodeID")
+                        .HasColumnType("int")
+                        .HasComment("Digital 상품 발급 쿠폰 코드");
+
+                    b.Property<int>("OrderID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("ProductID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Quantity")
+                        .HasColumnType("int");
+
+                    b.Property<int>("UnitPrice")
+                        .HasColumnType("int")
+                        .HasComment("주문 시점 상품 단가 스냅샷");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("IssuedCouponCodeID");
+
+                    b.HasIndex("OrderID");
+
+                    b.HasIndex("ProductID");
+
+                    b.ToTable("OrderItem", null, t =>
+                        {
+                            t.HasComment("주문 라인");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.OrderRefund", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AdminEmail")
+                        .HasMaxLength(256)
+                        .HasColumnType("nvarchar(256)");
+
+                    b.Property<string>("AdminMemo")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<string>("AdminUserId")
+                        .HasMaxLength(450)
+                        .HasColumnType("nvarchar(450)");
+
+                    b.Property<int>("Amount")
+                        .HasColumnType("int");
+
+                    b.Property<int>("OrderID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Reason")
+                        .IsRequired()
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<int>("ReasonType")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(7)
+                        .HasComment("사유 유형 (1=ChangedMind, 2=OptionChange, 3=ProductDefect, 4=ProductInfoMismatch, 5=DeliveryDelay, 6=WrongDelivery, 7=Other)");
+
+                    b.Property<DateTime>("RequestedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("ResolvedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int")
+                        .HasComment("상태 (1=Requested, 2=Approved, 3=Rejected, 4=Completed)");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int")
+                        .HasComment("유형 (1=Cancel, 2=Return, 3=Exchange, 4=Refund)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("Status");
+
+                    b.HasIndex("OrderID", "Status");
+
+                    b.ToTable("OrderRefund", null, t =>
+                        {
+                            t.HasComment("통합 환불 이력 (취소/반품/교환/환불)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.OrderRefundItem", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("CouponCodeID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("OrderItemID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("OrderRefundID")
+                        .HasColumnType("int");
+
+                    b.Property<int>("PostRefundAction")
+                        .HasColumnType("int")
+                        .HasComment("쿠폰 후처리 (1=Restore 회수, 2=Expire 만료)");
+
+                    b.Property<int>("UnitAmount")
+                        .HasColumnType("int")
+                        .HasComment("환불 단가 스냅샷");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CouponCodeID")
+                        .IsUnique();
+
+                    b.HasIndex("OrderItemID");
+
+                    b.HasIndex("OrderRefundID");
+
+                    b.ToTable("OrderRefundItem", null, t =>
+                        {
+                            t.HasComment("환불 단위 — 쿠폰 별 후처리(회수/만료) 정책. OrderRefund 1:N");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Product", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Description")
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<byte>("DiscountType")
+                        .HasColumnType("tinyint");
+
+                    b.Property<int>("DiscountValue")
+                        .HasColumnType("int");
+
+                    b.Property<int>("DurationDays")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(0)
+                        .HasComment("아이템 효과 지속일 (0=즉시소모/영구)");
+
+                    b.Property<string>("EffectPayload")
+                        .HasColumnType("nvarchar(max)")
+                        .HasComment("지위 아이템 효과 페이로드 JSON (색상·아이콘·애니메이션)");
+
+                    b.Property<int?>("GameID")
+                        .HasColumnType("int")
+                        .HasComment("게임 ID (선택 — null=플랫폼 직접판매)");
+
+                    b.Property<bool>("IsActive")
+                        .HasColumnType("bit");
+
+                    b.Property<bool>("IsGiftable")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bit")
+                        .HasDefaultValue(false)
+                        .HasComment("선물하기 가능 여부");
+
+                    b.Property<byte?>("ItemKind")
+                        .HasColumnType("tinyint")
+                        .HasComment("아이템 종류 (null=일반상품, 2~4=지위, 5~11=소모품)");
+
+                    b.Property<int>("MaxPurchase")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(999)
+                        .HasComment("1회 주문 최대 구매 수량 (하드 상한 999)");
+
+                    b.Property<int>("MinPurchase")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(1)
+                        .HasComment("1회 주문 최소 구매 수량");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(200)
+                        .HasColumnType("nvarchar(200)")
+                        .HasComment("상품명");
+
+                    b.Property<int>("Order")
+                        .HasColumnType("int");
+
+                    b.Property<int>("Price")
+                        .HasColumnType("int")
+                        .HasComment("판매가 (KRW)");
+
+                    b.Property<bool>("RequireDonationChannel")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("bit")
+                        .HasDefaultValue(false)
+                        .HasComment("구매 시 후원 채널 선택 필수 여부");
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion");
+
+                    b.Property<DateTime?>("SaleEndAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("SaleStartAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("Stock")
+                        .HasColumnType("int")
+                        .HasComment("재고 (-1=무제한)");
+
+                    b.Property<string>("Thumbnail")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int")
+                        .HasComment("상품 유형 (1=Physical, 2=Digital)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("IsActive", "Type");
+
+                    b.HasIndex("ItemKind", "IsActive");
+
+                    b.HasIndex("GameID", "IsActive", "Order");
+
+                    b.ToTable("Product", null, t =>
+                        {
+                            t.HasComment("상점 상품");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.ProductLimitConfig", b =>
+                {
+                    b.Property<int>("ProductID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MaxQuantity")
+                        .HasColumnType("int")
+                        .HasComment("회원당 누적 최대 구매 수량 (0=무제한)");
+
+                    b.Property<DateTime?>("PeriodEndAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("Custom 시 절대 윈도우 종료 시각 (UTC)");
+
+                    b.Property<DateTime?>("PeriodStartAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("Custom 시 절대 윈도우 시작 시각 (UTC)");
+
+                    b.Property<int>("PeriodType")
+                        .HasColumnType("int")
+                        .HasComment("기간 유형 (0=None, 1=Day, 2=Week, 3=Month, 4=Custom)");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<bool>("UsePeriodLimit")
+                        .HasColumnType("bit")
+                        .HasComment("기간 제한 사용 여부");
+
+                    b.Property<bool>("UseQuantityLimit")
+                        .HasColumnType("bit")
+                        .HasComment("수량 제한 사용 여부");
+
+                    b.HasKey("ProductID");
+
+                    b.ToTable("ProductLimitConfig", null, t =>
+                        {
+                            t.HasComment("상품 판매 정책 (1:1 with Product)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Shipment", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("Address1_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("Address2_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("AdminMemo")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<string>("Carrier")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateTime?>("DeliveredAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("KeyVersion")
+                        .HasColumnType("int");
+
+                    b.Property<int>("OrderID")
+                        .HasColumnType("int");
+
+                    b.Property<string>("Phone_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<string>("RecipientName_Encrypted")
+                        .IsRequired()
+                        .HasColumnType("nvarchar(max)");
+
+                    b.Property<DateTime?>("ShippedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("ShippingFee")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasDefaultValue(0);
+
+                    b.Property<int>("Status")
+                        .HasColumnType("int");
+
+                    b.Property<string>("TrackingNumber")
+                        .HasMaxLength(50)
+                        .HasColumnType("nvarchar(50)");
+
+                    b.Property<string>("ZipCode")
+                        .IsRequired()
+                        .HasMaxLength(10)
+                        .HasColumnType("nvarchar(10)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("OrderID")
+                        .IsUnique();
+
+                    b.HasIndex("Status");
+
+                    b.HasIndex("TrackingNumber");
+
+                    b.ToTable("Shipment", null, t =>
+                        {
+                            t.HasComment("배송 (주문 시점 주소 스냅샷, 암호화)");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Wallets.Wallet", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<int>("MemberID")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime?>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<Guid>("WalletKey")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("MemberID")
+                        .IsUnique();
+
+                    b.HasIndex("WalletKey")
+                        .IsUnique();
+
+                    b.ToTable("Wallet", null, t =>
+                        {
+                            t.HasComment("회원 지갑");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Wallets.WalletBalance", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<byte[]>("RowVersion")
+                        .IsConcurrencyToken()
+                        .IsRequired()
+                        .ValueGeneratedOnAddOrUpdate()
+                        .HasColumnType("rowversion");
+
+                    b.Property<int>("Type")
+                        .HasColumnType("int");
+
+                    b.Property<Guid>("WalletKey")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("WalletKey", "Type")
+                        .IsUnique();
+
+                    b.ToTable("WalletBalance", null, t =>
+                        {
+                            t.HasComment("회원 지갑 잔액");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Wallets.WalletTransaction", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("BalanceType")
+                        .HasColumnType("int");
+
+                    b.Property<DateTime>("CreatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<string>("Memo")
+                        .HasMaxLength(500)
+                        .HasColumnType("nvarchar(500)");
+
+                    b.Property<string>("Reason")
+                        .IsRequired()
+                        .HasMaxLength(1000)
+                        .HasColumnType("nvarchar(1000)");
+
+                    b.Property<string>("RefID")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)");
+
+                    b.Property<int>("TxType")
+                        .HasColumnType("int");
+
+                    b.Property<string>("UserID")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)");
+
+                    b.Property<Guid>("WalletKey")
+                        .HasColumnType("uniqueidentifier");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("CreatedAt");
+
+                    b.HasIndex("WalletKey");
+
+                    b.HasIndex("WalletKey", "CreatedAt");
+
+                    b.ToTable("WalletTransaction", null, t =>
+                        {
+                            t.HasComment("회원 거래 장부");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Chat.ChatBan", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", null)
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Domain.Entities.Common.Config", b =>
+                {
+                    b.OwnsOne("Domain.Entities.Common.AccountConfig", "Account", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<int?>("ChangeEmailDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_ChangeEmailDay")
+                                .HasComment("이메일 갱신 주기(일)");
+
+                            b1.Property<int?>("ChangeIntroDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_ChangeIntroDay")
+                                .HasComment("자기소개 갱신 주기(일)");
+
+                            b1.Property<int?>("ChangeNameDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_ChangeNameDay")
+                                .HasComment("별명 갱신 주기(일)");
+
+                            b1.Property<int?>("ChangePasswordDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_ChangePasswordDay")
+                                .HasComment("비밀번호 갱신 주기(일)");
+
+                            b1.Property<int?>("ChangeSummaryDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_ChangeSummaryDay")
+                                .HasComment("한마디 갱신 주기(일)");
+
+                            b1.Property<int?>("ChangeThumbDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_ChangeThumbDay")
+                                .HasComment("프로필 이미지 갱신 주기(일)");
+
+                            b1.Property<string>("DeniedEmailList")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Account_DeniedEmailList")
+                                .HasComment("금지 이메일");
+
+                            b1.Property<string>("DeniedNameList")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Account_DeniedNameList")
+                                .HasComment("금지 별명");
+
+                            b1.Property<bool>("IsLoginEmailVerifiedOnly")
+                                .HasColumnType("bit");
+
+                            b1.Property<bool>("IsRegisterBlock")
+                                .HasColumnType("bit")
+                                .HasColumnName("Account_IsRegisterBlock")
+                                .HasComment("회원가입 차단");
+
+                            b1.Property<bool>("IsRegisterEmailAuth")
+                                .HasColumnType("bit")
+                                .HasColumnName("Account_IsRegisterEmailAuth")
+                                .HasComment("회원가입 시 이메일 인증");
+
+                            b1.Property<int?>("MaxLoginTryCount")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_MaxLoginTryCount")
+                                .HasComment("로그인 시도 제한 횟수");
+
+                            b1.Property<int?>("MaxLoginTryLimitSecond")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_MaxLoginTryLimitSecond")
+                                .HasComment("로그인 시도 제한 시간(초)");
+
+                            b1.Property<int?>("PasswordMinLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_PasswordMinLength")
+                                .HasComment("비밀번호 최소 길이");
+
+                            b1.Property<int?>("PasswordNumbersLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_PasswordNumbersLength")
+                                .HasComment("비밀번호 최소 숫자 수");
+
+                            b1.Property<int?>("PasswordSpecialcharsLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_PasswordSpecialcharsLength")
+                                .HasComment("비밀번호 최소 특수문자 수");
+
+                            b1.Property<int?>("PasswordUppercaseLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Account_PasswordUppercaseLength")
+                                .HasComment("비밀번호 최소 대문자 수");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.AttendanceConfig", "Attendance", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("BaseExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Attendance_BaseExp")
+                                .HasComment("기본 경험치");
+
+                            b1.Property<int>("BasePoint")
+                                .HasColumnType("int")
+                                .HasColumnName("Attendance_BasePoint")
+                                .HasComment("기본 포인트");
+
+                            b1.Property<bool>("IsEnabled")
+                                .HasColumnType("bit")
+                                .HasColumnName("Attendance_IsEnabled")
+                                .HasComment("출석 기능 활성화");
+
+                            b1.Property<string>("RankBonusConfig")
+                                .HasMaxLength(2000)
+                                .HasColumnType("nvarchar(2000)")
+                                .HasColumnName("Attendance_RankBonusConfig")
+                                .HasComment("순위별 보상 설정 (JSON)");
+
+                            b1.Property<int>("StreakBonusMaxDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Attendance_StreakBonusMaxDays")
+                                .HasComment("가중치 최대 적용 일수");
+
+                            b1.Property<int>("StreakBonusPerDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Attendance_StreakBonusPerDay")
+                                .HasComment("1일당 추가 경험치");
+
+                            b1.Property<int>("StreakBonusPointPerDay")
+                                .HasColumnType("int")
+                                .HasColumnName("Attendance_StreakBonusPointPerDay")
+                                .HasComment("1일당 추가 포인트");
+
+                            b1.Property<bool>("UseRankBonus")
+                                .HasColumnType("bit")
+                                .HasColumnName("Attendance_UseRankBonus")
+                                .HasComment("순위 보상 사용");
+
+                            b1.Property<bool>("UseStreakBonus")
+                                .HasColumnType("bit")
+                                .HasColumnName("Attendance_UseStreakBonus")
+                                .HasComment("연속 출석 가중치 사용");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.BasicConfig", "Basic", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("AdminWhiteIPList")
+                                .HasMaxLength(1000)
+                                .HasColumnType("nvarchar(1000)")
+                                .HasColumnName("Basic_AdminWhiteIPList")
+                                .HasComment("관리자단 접근 가능 IP");
+
+                            b1.Property<string>("BlockAlertContent")
+                                .HasMaxLength(5000)
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Basic_BlockAlertContent")
+                                .HasComment("차단 시 안내문 내용");
+
+                            b1.Property<string>("BlockAlertTitle")
+                                .HasMaxLength(200)
+                                .HasColumnType("nvarchar(200)")
+                                .HasColumnName("Basic_BlockAlertTitle")
+                                .HasComment("차단 시 안내문 제목");
+
+                            b1.Property<string>("FromEmail")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Basic_FromEmail")
+                                .HasComment("송수신 이메일");
+
+                            b1.Property<string>("FromName")
+                                .HasMaxLength(30)
+                                .HasColumnType("nvarchar(30)")
+                                .HasColumnName("Basic_FromName")
+                                .HasComment("송수신자 이름");
+
+                            b1.Property<string>("FrontWhiteIPList")
+                                .HasMaxLength(1000)
+                                .HasColumnType("nvarchar(1000)")
+                                .HasColumnName("Basic_FrontWhiteIPList")
+                                .HasComment("사용자단 접근 가능 IP");
+
+                            b1.Property<bool>("IsMaintenance")
+                                .HasColumnType("bit")
+                                .HasColumnName("Basic_IsMaintenance")
+                                .HasComment("점검 여부");
+
+                            b1.Property<string>("MaintenanceContent")
+                                .HasMaxLength(5000)
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Basic_MaintenanceContent")
+                                .HasComment("점검 내용");
+
+                            b1.Property<int>("NoteDailySendLimit")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(3)
+                                .HasColumnName("Basic_NoteDailySendLimit")
+                                .HasComment("쪽지 일일 발송 제한 (사용자 1인당, 시스템 제외)");
+
+                            b1.Property<string>("RootID")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Basic_RootID")
+                                .HasComment("최고 관리자 ID");
+
+                            b1.Property<string>("SiteName")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Basic_SiteName")
+                                .HasComment("사이트 이름");
+
+                            b1.Property<string>("SiteURL")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Basic_SiteURL")
+                                .HasComment("사이트 주소");
+
+                            b1.Property<bool>("SmtpEnableSSL")
+                                .HasColumnType("bit")
+                                .HasColumnName("Basic_SmtpEnableSSL")
+                                .HasComment("SMTP Enable SSL");
+
+                            b1.Property<string>("SmtpPassword")
+                                .HasMaxLength(200)
+                                .HasColumnType("nvarchar(200)")
+                                .HasColumnName("Basic_SmtpPassword")
+                                .HasComment("SMTP Password");
+
+                            b1.Property<int?>("SmtpPort")
+                                .HasColumnType("int")
+                                .HasColumnName("Basic_SmtpPort")
+                                .HasComment("SMTP Port");
+
+                            b1.Property<string>("SmtpServer")
+                                .HasMaxLength(200)
+                                .HasColumnType("nvarchar(200)")
+                                .HasColumnName("Basic_SmtpServer")
+                                .HasComment("SMTP Server");
+
+                            b1.Property<string>("SmtpUsername")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Basic_SmtpUsername")
+                                .HasComment("SMTP Username");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.ChatExpConfig", "ChatExp", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("ChatXpPerMessage")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(1)
+                                .HasColumnName("ChatExp_ChatXpPerMessage")
+                                .HasComment("채팅 1건당 지급 XP");
+
+                            b1.Property<int>("ChatXpSessionLimit")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(50)
+                                .HasColumnName("ChatExp_ChatXpSessionLimit")
+                                .HasComment("방송 세션당 채팅 XP 상한");
+
+                            b1.Property<int>("CrownTopN")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(3)
+                                .HasColumnName("ChatExp_CrownTopN")
+                                .HasComment("크라운 뱃지 Top N");
+
+                            b1.Property<int>("DonationXpPerAmount")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(1000)
+                                .HasColumnName("ChatExp_DonationXpPerAmount")
+                                .HasComment("후원 N POINT당 1 XP");
+
+                            b1.Property<int>("LeaderboardSize")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(50)
+                                .HasColumnName("ChatExp_LeaderboardSize")
+                                .HasComment("리더보드 Top N");
+
+                            b1.Property<int>("MinContentLength")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(2)
+                                .HasColumnName("ChatExp_MinContentLength")
+                                .HasComment("XP 적립 최소 글자수");
+
+                            b1.Property<int>("RateLimitSec")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(2)
+                                .HasColumnName("ChatExp_RateLimitSec")
+                                .HasComment("채팅 쿨다운(초)");
+
+                            b1.Property<bool>("UxShowLeaderboard")
+                                .HasColumnType("bit")
+                                .HasColumnName("ChatExp_UxShowLeaderboard")
+                                .HasComment("watch에서 리더보드 노출");
+
+                            b1.Property<bool>("UxShowMyXpBadge")
+                                .HasColumnType("bit")
+                                .HasColumnName("ChatExp_UxShowMyXpBadge")
+                                .HasComment("내 XP 뱃지 노출");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.CompanyConfig", "Company", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("AddedSaleNo")
+                                .HasMaxLength(20)
+                                .HasColumnType("nvarchar(20)")
+                                .HasColumnName("Company_AddedSaleNo")
+                                .HasComment("부가통신 사업자번호");
+
+                            b1.Property<string>("Address")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Company_Address")
+                                .HasComment("사업장 소재지");
+
+                            b1.Property<string>("AdminEmail")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Company_AdminEmail")
+                                .HasComment("정보관리책임자 이메일");
+
+                            b1.Property<string>("AdminName")
+                                .HasMaxLength(70)
+                                .HasColumnType("nvarchar(70)")
+                                .HasColumnName("Company_AdminName")
+                                .HasComment("정보관리책임자");
+
+                            b1.Property<string>("BankCode")
+                                .HasMaxLength(10)
+                                .HasColumnType("nvarchar(10)")
+                                .HasColumnName("Company_BankCode")
+                                .HasComment("입금계좌 - 은행");
+
+                            b1.Property<string>("BankNumber")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Company_BankNumber")
+                                .HasComment("입금계좌 - 계좌번호");
+
+                            b1.Property<string>("BankOwner")
+                                .HasMaxLength(70)
+                                .HasColumnType("nvarchar(70)")
+                                .HasColumnName("Company_BankOwner")
+                                .HasComment("입금계좌 - 예금주");
+
+                            b1.Property<string>("Fax")
+                                .HasMaxLength(20)
+                                .HasColumnType("nvarchar(20)")
+                                .HasColumnName("Company_Fax")
+                                .HasComment("FAX");
+
+                            b1.Property<string>("Hosting")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Company_Hosting")
+                                .HasComment("호스팅 서비스");
+
+                            b1.Property<string>("Name")
+                                .HasMaxLength(70)
+                                .HasColumnType("nvarchar(70)")
+                                .HasColumnName("Company_Name")
+                                .HasComment("상호 명");
+
+                            b1.Property<string>("Owner")
+                                .HasMaxLength(50)
+                                .HasColumnType("nvarchar(50)")
+                                .HasColumnName("Company_Owner")
+                                .HasComment("대표자 명");
+
+                            b1.Property<string>("RegNo")
+                                .HasMaxLength(100)
+                                .HasColumnType("nvarchar(100)")
+                                .HasColumnName("Company_RegNo")
+                                .HasComment("사업자 등록 번호");
+
+                            b1.Property<string>("RetailSaleNo")
+                                .HasMaxLength(20)
+                                .HasColumnType("nvarchar(20)")
+                                .HasColumnName("Company_RetailSaleNo")
+                                .HasComment("통신판매업 신고번호");
+
+                            b1.Property<string>("SiteUrl")
+                                .HasMaxLength(200)
+                                .HasColumnType("nvarchar(200)")
+                                .HasColumnName("Company_SiteUrl")
+                                .HasComment("사이트 주소");
+
+                            b1.Property<string>("Tel")
+                                .HasMaxLength(20)
+                                .HasColumnType("nvarchar(20)")
+                                .HasColumnName("Company_Tel")
+                                .HasComment("대표 전화번호");
+
+                            b1.Property<string>("ZipCode")
+                                .HasMaxLength(8)
+                                .HasColumnType("nvarchar(8)")
+                                .HasColumnName("Company_ZipCode")
+                                .HasComment("사업장 주소(우편번호)");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.CryptoConfig", "Crypto", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("MainPageCoinCount")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(10)
+                                .HasColumnName("Crypto_MainPageCoinCount")
+                                .HasComment("메인 페이지 기본 표시 코인 수");
+
+                            b1.Property<decimal>("PlungeThreshold")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("decimal(5,2)")
+                                .HasDefaultValue(-5.0m)
+                                .HasColumnName("Crypto_PlungeThreshold")
+                                .HasComment("급락 임계값 (%)");
+
+                            b1.Property<decimal>("SurgeThreshold")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("decimal(5,2)")
+                                .HasDefaultValue(5.0m)
+                                .HasColumnName("Crypto_SurgeThreshold")
+                                .HasComment("급등 임계값 (%)");
+
+                            b1.Property<int>("TickerRefreshSeconds")
+                                .ValueGeneratedOnAdd()
+                                .HasColumnType("int")
+                                .HasDefaultValue(5)
+                                .HasColumnName("Crypto_TickerRefreshSeconds")
+                                .HasComment("시세 업데이트 주기 (초)");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.EmailTemplateConfig", "EmailTemplate", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("ChangedEmailFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_ChangedEmailFormContent")
+                                .HasComment("이메일 변경 완료 - 내용");
+
+                            b1.Property<string>("ChangedEmailFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_ChangedEmailFormTitle")
+                                .HasComment("이메일 변경 완료 - 제목");
+
+                            b1.Property<string>("ChangedPasswordEmailFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_ChangedPasswordEmailFormContent")
+                                .HasComment("비밀번호 변경 완료 - 내용");
+
+                            b1.Property<string>("ChangedPasswordEmailFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_ChangedPasswordEmailFormTitle")
+                                .HasComment("비밀번호 변경 완료 - 제목");
+
+                            b1.Property<string>("EmailVerifyFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_EmailVerifyFormContent")
+                                .HasComment("이메일 변경 시 - 내용");
+
+                            b1.Property<string>("EmailVerifyFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_EmailVerifyFormTitle")
+                                .HasComment("이메일 변경 시 - 제목");
+
+                            b1.Property<string>("RegisterEmailFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_RegisterEmailFormContent")
+                                .HasComment("회원가입 시 - 내용");
+
+                            b1.Property<string>("RegisterEmailFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_RegisterEmailFormTitle")
+                                .HasComment("회원가입 시 - 제목");
+
+                            b1.Property<string>("RegistrationEmailFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_RegistrationEmailFormContent")
+                                .HasComment("회원가입 완료 - 내용");
+
+                            b1.Property<string>("RegistrationEmailFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_RegistrationEmailFormTitle")
+                                .HasComment("회원가입 완료 - 제목");
+
+                            b1.Property<string>("ResetPasswordEmailFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_ResetPasswordEmailFormContent")
+                                .HasComment("비밀번호 재설정 - 내용");
+
+                            b1.Property<string>("ResetPasswordEmailFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_ResetPasswordEmailFormTitle")
+                                .HasComment("비밀번호 재설정 - 제목");
+
+                            b1.Property<string>("WithdrawEmailFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_WithdrawEmailFormContent")
+                                .HasComment("회원탈퇴 시 - 내용");
+
+                            b1.Property<string>("WithdrawEmailFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_WithdrawEmailFormTitle")
+                                .HasComment("회원탈퇴 시 - 제목");
+
+                            b1.Property<string>("WithdrawVerifyEmailFormContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_WithdrawVerifyEmailFormContent")
+                                .HasComment("회원탈퇴 인증 - 내용");
+
+                            b1.Property<string>("WithdrawVerifyEmailFormTitle")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("EmailTemplate_WithdrawVerifyEmailFormTitle")
+                                .HasComment("회원탈퇴 인증 - 제목");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.ExternalApiConfig", "External", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("GoogleAppId")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("External_GoogleAppId")
+                                .HasComment("Google APP ID");
+
+                            b1.Property<string>("GoogleClientId")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("External_GoogleClientId")
+                                .HasComment("Google Client ID");
+
+                            b1.Property<string>("GoogleClientSecretEnc")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("External_GoogleClientSecretEnc")
+                                .HasComment("Google Client Secret (암호화 저장 권장)");
+
+                            b1.Property<string>("TossLiveClientKeyEnc")
+                                .HasColumnType("nvarchar(max)");
+
+                            b1.Property<string>("TossLiveSecretKeyEnc")
+                                .HasColumnType("nvarchar(max)");
+
+                            b1.Property<string>("TossPayMode")
+                                .HasColumnType("nvarchar(max)");
+
+                            b1.Property<string>("TossTestClientKeyEnc")
+                                .HasColumnType("nvarchar(max)");
+
+                            b1.Property<string>("TossTestSecretKeyEnc")
+                                .HasColumnType("nvarchar(max)");
+
+                            b1.Property<string>("YouTubeApiKeyEnc")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("External_YouTubeApiKeyEnc")
+                                .HasComment("YouTube API Key (암호화 저장 권장)");
+
+                            b1.Property<string>("YouTubeApiName")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("External_YouTubeApiName")
+                                .HasComment("YouTube API Name");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.ImagesConfig", "Images", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("AppIcon_192")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_AppIcon_192")
+                                .HasComment("App-icon-192");
+
+                            b1.Property<string>("AppIcon_512")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_AppIcon_512")
+                                .HasComment("App-icon-512");
+
+                            b1.Property<string>("AppleTouchIcon")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_AppleTouchIcon")
+                                .HasComment("Apple-touch-icon");
+
+                            b1.Property<string>("Favicon")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_Favicon")
+                                .HasComment("Favicon");
+
+                            b1.Property<string>("LogoHorizontal")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_LogoHorizontal")
+                                .HasComment("Logo-horizontal");
+
+                            b1.Property<string>("LogoSquare")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_LogoSquare")
+                                .HasComment("Logo-square");
+
+                            b1.Property<string>("OgDefault")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_OgDefault")
+                                .HasComment("og-default");
+
+                            b1.Property<string>("TwitterImage")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Images_TwitterImage")
+                                .HasComment("Twitter-image");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.MetaConfig", "Meta", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("Adds")
+                                .HasColumnType("nvarchar(max)");
+
+                            b1.Property<string>("ApplicationName")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Meta_ApplicationName")
+                                .HasComment("Meta Application Name");
+
+                            b1.Property<string>("Author")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Meta_Author")
+                                .HasComment("Meta Author");
+
+                            b1.Property<string>("Description")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Meta_Description")
+                                .HasComment("Meta Description");
+
+                            b1.Property<string>("Generator")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Meta_Generator")
+                                .HasComment("Meta Generator");
+
+                            b1.Property<string>("Keywords")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Meta_Keywords")
+                                .HasComment("Meta Keywords");
+
+                            b1.Property<string>("Robots")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Meta_Robots")
+                                .HasComment("Meta Robots");
+
+                            b1.Property<string>("Viewport")
+                                .HasMaxLength(255)
+                                .HasColumnType("nvarchar(255)")
+                                .HasColumnName("Meta_Viewport")
+                                .HasComment("Meta Viewport");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.PaperConfig", "Paper", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<bool>("Enabled")
+                                .HasColumnType("bit")
+                                .HasColumnName("Paper_Enabled")
+                                .HasComment("모의투자 활성화");
+
+                            b1.Property<int>("FeeRateBp")
+                                .HasColumnType("int")
+                                .HasColumnName("Paper_FeeRateBp")
+                                .HasComment("매매 수수료 Bp");
+
+                            b1.Property<int>("MaxHolding")
+                                .HasColumnType("int")
+                                .HasColumnName("Paper_MaxHolding")
+                                .HasComment("계좌 최대 보유 토큰 (0=무제한)");
+
+                            b1.Property<int>("MinDeposit")
+                                .HasColumnType("int")
+                                .HasColumnName("Paper_MinDeposit")
+                                .HasComment("최소 입금 토큰");
+
+                            b1.Property<int>("MinFillsForRank")
+                                .HasColumnType("int")
+                                .HasColumnName("Paper_MinFillsForRank")
+                                .HasComment("리더보드 등재 최소 체결 수");
+
+                            b1.Property<int>("OrderMaxPctBp")
+                                .HasColumnType("int")
+                                .HasColumnName("Paper_OrderMaxPctBp")
+                                .HasComment("1주문 상한 Bp");
+
+                            b1.Property<int>("TaxRateBp")
+                                .HasColumnType("int")
+                                .HasColumnName("Paper_TaxRateBp")
+                                .HasComment("매도 거래세 Bp");
+
+                            b1.Property<int>("WithdrawProfitBurnBp")
+                                .HasColumnType("int")
+                                .HasColumnName("Paper_WithdrawProfitBurnBp")
+                                .HasComment("출금 수익분 소각 Bp");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.RewardConfig", "Reward", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("ChatDailyCount")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_ChatDailyCount")
+                                .HasComment("채팅 보상 일일 횟수 상한 (0=무제한)");
+
+                            b1.Property<int>("ChatDailyExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_ChatDailyExp")
+                                .HasComment("채팅 보상 일일 경험치 상한 (0=무제한)");
+
+                            b1.Property<int>("CheerDailyMax")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("CheerFeePercent")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("CheerMinAmount")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("CommentDailyCount")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_CommentDailyCount")
+                                .HasComment("댓글 보상 일일 횟수 상한 (0=무제한)");
+
+                            b1.Property<int>("CommentDailyExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_CommentDailyExp")
+                                .HasComment("댓글 보상 일일 경험치 상한 (0=무제한)");
+
+                            b1.Property<int>("CommentDailyPoint")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_CommentDailyPoint")
+                                .HasComment("댓글 보상 일일 토큰 상한 (0=무제한)");
+
+                            b1.Property<int>("CommentExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_CommentExp")
+                                .HasComment("댓글 작성 지급 경험치");
+
+                            b1.Property<int>("CommentPoint")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_CommentPoint")
+                                .HasComment("댓글 작성 지급 토큰");
+
+                            b1.Property<int>("LikeGivenDailyCount")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_LikeGivenDailyCount")
+                                .HasComment("추천(누른 쪽) 보상 일일 횟수 상한 (0=무제한)");
+
+                            b1.Property<int>("LikeGivenDailyExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_LikeGivenDailyExp")
+                                .HasComment("추천(누른 쪽) 보상 일일 경험치 상한 (0=무제한)");
+
+                            b1.Property<int>("LikeGivenExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_LikeGivenExp")
+                                .HasComment("추천(누른 쪽) 지급 경험치");
+
+                            b1.Property<int>("LikeReceivedDailyCount")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_LikeReceivedDailyCount")
+                                .HasComment("추천(받은 쪽) 보상 일일 횟수 상한 (0=무제한)");
+
+                            b1.Property<int>("LikeReceivedDailyPoint")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_LikeReceivedDailyPoint")
+                                .HasComment("추천(받은 쪽) 보상 일일 토큰 상한 (0=무제한)");
+
+                            b1.Property<int>("LikeReceivedPoint")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_LikeReceivedPoint")
+                                .HasComment("추천(받은 쪽) 지급 토큰");
+
+                            b1.Property<int>("MinCommentLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_MinCommentLength")
+                                .HasComment("보상 지급 최소 댓글 길이 (0=제한 없음)");
+
+                            b1.Property<int>("MinPostLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_MinPostLength")
+                                .HasComment("보상 지급 최소 게시글 길이 (0=제한 없음)");
+
+                            b1.Property<int>("NewMemberHoldDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_NewMemberHoldDays")
+                                .HasComment("신규 회원 보상 유예 기간(일, 0=유예 없음)");
+
+                            b1.Property<int>("PostDailyCount")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_PostDailyCount")
+                                .HasComment("게시글 보상 일일 횟수 상한 (0=무제한)");
+
+                            b1.Property<int>("PostDailyExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_PostDailyExp")
+                                .HasComment("게시글 보상 일일 경험치 상한 (0=무제한)");
+
+                            b1.Property<int>("PostDailyPoint")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_PostDailyPoint")
+                                .HasComment("게시글 보상 일일 토큰 상한 (0=무제한)");
+
+                            b1.Property<int>("PostExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_PostExp")
+                                .HasComment("게시글 작성 지급 경험치");
+
+                            b1.Property<int>("PostPoint")
+                                .HasColumnType("int")
+                                .HasColumnName("Reward_PostPoint")
+                                .HasComment("게시글 작성 지급 토큰");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.SignupRewardConfig", "SignupReward", b1 =>
+                        {
+                            b1.Property<int>("ConfigID")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("CashAmount")
+                                .HasColumnType("int")
+                                .HasColumnName("SignupReward_CashAmount")
+                                .HasComment("지급 캐시 (Adjusted)");
+
+                            b1.Property<int>("CoinAmount")
+                                .HasColumnType("int")
+                                .HasColumnName("SignupReward_CoinAmount")
+                                .HasComment("지급 코인 (Airdrop)");
+
+                            b1.Property<bool>("Enabled")
+                                .HasColumnType("bit")
+                                .HasColumnName("SignupReward_Enabled")
+                                .HasComment("가입 축하 보상 활성화");
+
+                            b1.Property<int>("ExpAmount")
+                                .HasColumnType("int")
+                                .HasColumnName("SignupReward_ExpAmount")
+                                .HasComment("지급 경험치");
+
+                            b1.HasKey("ConfigID");
+
+                            b1.ToTable("Config");
+
+                            b1.WithOwner()
+                                .HasForeignKey("ConfigID");
+                        });
+
+                    b.Navigation("Account")
+                        .IsRequired();
+
+                    b.Navigation("Attendance")
+                        .IsRequired();
+
+                    b.Navigation("Basic")
+                        .IsRequired();
+
+                    b.Navigation("ChatExp")
+                        .IsRequired();
+
+                    b.Navigation("Company")
+                        .IsRequired();
+
+                    b.Navigation("Crypto")
+                        .IsRequired();
+
+                    b.Navigation("EmailTemplate")
+                        .IsRequired();
+
+                    b.Navigation("External")
+                        .IsRequired();
+
+                    b.Navigation("Images")
+                        .IsRequired();
+
+                    b.Navigation("Meta")
+                        .IsRequired();
+
+                    b.Navigation("Paper")
+                        .IsRequired();
+
+                    b.Navigation("Reward")
+                        .IsRequired();
+
+                    b.Navigation("SignupReward")
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedBookmark", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany("FeedBookmark")
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FeedPost");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedComment", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany("FeedComment")
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Feed.FeedComment", "Parent")
+                        .WithMany("Children")
+                        .HasForeignKey("ParentID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.Navigation("FeedPost");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Parent");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedCommentLike", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedComment", "FeedComment")
+                        .WithMany("FeedCommentLike")
+                        .HasForeignKey("FeedCommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany()
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FeedComment");
+
+                    b.Navigation("FeedPost");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedLike", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany("FeedLike")
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FeedPost");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPost", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostImage", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany("FeedPostImage")
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FeedPost");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostMedia", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany("FeedPostMedia")
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FeedPost");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostMention", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany("FeedPostMention")
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FeedPost");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPostTag", b =>
+                {
+                    b.HasOne("Domain.Entities.Feed.FeedPost", "FeedPost")
+                        .WithMany("FeedPostTag")
+                        .HasForeignKey("FeedPostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Feed.FeedTag", "FeedTag")
+                        .WithMany("FeedPostTag")
+                        .HasForeignKey("FeedTagID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FeedPost");
+
+                    b.Navigation("FeedTag");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.Board", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.BoardGroup", "BoardGroup")
+                        .WithMany("Board")
+                        .HasForeignKey("BoardGroupID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("BoardGroup");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardManager", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany("BoardManager")
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardMeta", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", null)
+                        .WithOne("BoardMeta")
+                        .HasForeignKey("Domain.Entities.Forum.Boards.BoardMeta", "BoardID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaComment", "Comment", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<bool>("AllowDeleteProtection")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_AllowDeleteProtection");
+
+                            b1.Property<bool>("AllowDisLike")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_AllowDisLike");
+
+                            b1.Property<bool>("AllowLike")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_AllowLike");
+
+                            b1.Property<bool>("AllowSecret")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_AllowSecret");
+
+                            b1.Property<bool>("AllowUpdateProtection")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_AllowUpdateProtection");
+
+                            b1.Property<int>("BlameHideCount")
+                                .HasColumnType("int")
+                                .HasColumnName("Comment_BlameHideCount");
+
+                            b1.Property<string>("ContentPlaceholder")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Comment_ContentPlaceholder");
+
+                            b1.Property<int>("DeleteProtectionDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Comment_DeleteProtectionDays");
+
+                            b1.Property<bool>("EnableComment")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_EnableComment");
+
+                            b1.Property<bool>("EnableCommentUpdateLog")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_EnableCommentUpdateLog");
+
+                            b1.Property<bool>("EnableEditor")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_EnableEditor");
+
+                            b1.Property<int>("MaxContentLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Comment_MaxContentLength");
+
+                            b1.Property<int>("MinContentLength")
+                                .HasColumnType("int")
+                                .HasColumnName("Comment_MinContentLength");
+
+                            b1.Property<int>("PerPage")
+                                .HasColumnType("int")
+                                .HasColumnName("Comment_PerPage");
+
+                            b1.Property<bool>("ShowMemberIcon")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_ShowMemberIcon");
+
+                            b1.Property<bool>("ShowMemberThumb")
+                                .HasColumnType("bit")
+                                .HasColumnName("Comment_ShowMemberThumb");
+
+                            b1.Property<int>("UpdateProtectionDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Comment_UpdateProtectionDays");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaExp", "Exp", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<int>("CommentWriteExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_CommentWriteExp");
+
+                            b1.Property<int>("CommentWriteExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_CommentWriteExpWithinDays");
+
+                            b1.Property<int>("CommentWriteUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_CommentWriteUndoExp");
+
+                            b1.Property<bool>("EnableExp")
+                                .HasColumnType("bit")
+                                .HasColumnName("Exp_EnableExp");
+
+                            b1.Property<short>("FileDownloadExp")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Exp_FileDownloadExp");
+
+                            b1.Property<int>("FileUploadExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_FileUploadExp");
+
+                            b1.Property<int>("FileUploadExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_FileUploadExpWithinDays");
+
+                            b1.Property<int>("FileUploadUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_FileUploadUndoExp");
+
+                            b1.Property<int>("OtherCommentDisLikeExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherCommentDisLikeExp");
+
+                            b1.Property<int>("OtherCommentDisLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherCommentDisLikeExpWithinDays");
+
+                            b1.Property<int>("OtherCommentDisLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherCommentDisLikeUndoExp");
+
+                            b1.Property<int>("OtherCommentLikeExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherCommentLikeExp");
+
+                            b1.Property<int>("OtherCommentLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherCommentLikeExpWithinDays");
+
+                            b1.Property<int>("OtherCommentLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherCommentLikeUndoExp");
+
+                            b1.Property<int>("OtherPostDisLikeExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostDisLikeExp");
+
+                            b1.Property<int>("OtherPostDisLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostDisLikeExpWithinDays");
+
+                            b1.Property<int>("OtherPostDisLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostDisLikeUndoExp");
+
+                            b1.Property<int>("OtherPostLikeExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostLikeExp");
+
+                            b1.Property<int>("OtherPostLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostLikeExpWithinDays");
+
+                            b1.Property<int>("OtherPostLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostLikeUndoExp");
+
+                            b1.Property<short>("OtherPostReadExp")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Exp_OtherPostReadExp");
+
+                            b1.Property<int>("OtherPostReadExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostReadExpWithinDays");
+
+                            b1.Property<int>("OtherPostReadUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OtherPostReadUndoExp");
+
+                            b1.Property<short>("OwnCommentDisLikeExp")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Exp_OwnCommentDisLikeExp");
+
+                            b1.Property<int>("OwnCommentDisLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnCommentDisLikeExpWithinDays");
+
+                            b1.Property<int>("OwnCommentDisLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnCommentDisLikeUndoExp");
+
+                            b1.Property<int>("OwnCommentLikeExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnCommentLikeExp");
+
+                            b1.Property<int>("OwnCommentLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnCommentLikeExpWithinDays");
+
+                            b1.Property<int>("OwnCommentLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnCommentLikeUndoExp");
+
+                            b1.Property<short>("OwnPostDisLikeExp")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Exp_OwnPostDisLikeExp");
+
+                            b1.Property<int>("OwnPostDisLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostDisLikeExpWithinDays");
+
+                            b1.Property<int>("OwnPostDisLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostDisLikeUndoExp");
+
+                            b1.Property<int>("OwnPostLikeExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostLikeExp");
+
+                            b1.Property<int>("OwnPostLikeExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostLikeExpWithinDays");
+
+                            b1.Property<int>("OwnPostLikeUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostLikeUndoExp");
+
+                            b1.Property<int>("OwnPostReadExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostReadExp");
+
+                            b1.Property<int>("OwnPostReadExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostReadExpWithinDays");
+
+                            b1.Property<int>("OwnPostReadUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_OwnPostReadUndoExp");
+
+                            b1.Property<int>("PostWriteExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_PostWriteExp");
+
+                            b1.Property<int>("PostWriteExpWithinDays")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_PostWriteExpWithinDays");
+
+                            b1.Property<int>("PostWriteUndoExp")
+                                .HasColumnType("int")
+                                .HasColumnName("Exp_PostWriteUndoExp");
+
+                            b1.Property<bool>("ShowExpGuide")
+                                .HasColumnType("bit")
+                                .HasColumnName("Exp_ShowExpGuide");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaGeneral", "General", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<bool>("AllowDeleteProtection")
+                                .HasColumnType("bit")
+                                .HasColumnName("General_AllowDeleteProtection");
+
+                            b1.Property<bool>("AllowUpdateProtection")
+                                .HasColumnType("bit")
+                                .HasColumnName("General_AllowUpdateProtection");
+
+                            b1.Property<int>("DeleteProtectionDays")
+                                .HasColumnType("int")
+                                .HasColumnName("General_DeleteProtectionDays");
+
+                            b1.Property<bool>("EnableFileDownLog")
+                                .HasColumnType("bit")
+                                .HasColumnName("General_EnableFileDownLog");
+
+                            b1.Property<bool>("EnableLinkClickLog")
+                                .HasColumnType("bit")
+                                .HasColumnName("General_EnableLinkClickLog");
+
+                            b1.Property<bool>("EnablePostUpdateLog")
+                                .HasColumnType("bit")
+                                .HasColumnName("General_EnablePostUpdateLog");
+
+                            b1.Property<int>("UpdateProtectionDays")
+                                .HasColumnType("int")
+                                .HasColumnName("General_UpdateProtectionDays");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaList", "List", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<bool>("AlwaysShowWriteButton")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_AlwaysShowWriteButton");
+
+                            b1.Property<bool>("ExceptNotice")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_ExceptNotice");
+
+                            b1.Property<bool>("ExceptSpeaker")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_ExceptSpeaker");
+
+                            b1.Property<string>("FooterContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("List_FooterContent");
+
+                            b1.Property<string>("HeaderContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("List_HeaderContent");
+
+                            b1.Property<bool>("IsHotIcon")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_IsHotIcon");
+
+                            b1.Property<bool>("IsNewIcon")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_IsNewIcon");
+
+                            b1.Property<byte?>("Layout")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("List_Layout");
+
+                            b1.Property<byte>("PerPage")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("List_PerPage");
+
+                            b1.Property<bool>("ShowFooter")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_ShowFooter");
+
+                            b1.Property<bool>("ShowFooterListView")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_ShowFooterListView");
+
+                            b1.Property<bool>("ShowHeader")
+                                .HasColumnType("bit")
+                                .HasColumnName("List_ShowHeader");
+
+                            b1.Property<byte?>("Sort")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("List_Sort");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaNotify", "Notify", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<byte?>("CommentWriteNotify")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("Notify_CommentWriteNotify");
+
+                            b1.Property<byte?>("PostWriteNotify")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("Notify_PostWriteNotify");
+
+                            b1.Property<byte?>("ReplyWriteNotify")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("Notify_ReplyWriteNotify");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaNotifyTemplate", "NotifyTemplate", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("CommentWriteEmailNotifyContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("NotifyTemplate_CommentWriteEmailNotifyContent");
+
+                            b1.Property<string>("CommentWriteEmailNotifySubject")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("NotifyTemplate_CommentWriteEmailNotifySubject");
+
+                            b1.Property<string>("PostWriteEmailNotifyContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("NotifyTemplate_PostWriteEmailNotifyContent");
+
+                            b1.Property<string>("PostWriteEmailNotifySubject")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("NotifyTemplate_PostWriteEmailNotifySubject");
+
+                            b1.Property<string>("ReplyWriteEmailNotifyContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("NotifyTemplate_ReplyWriteEmailNotifyContent");
+
+                            b1.Property<string>("ReplyWriteEmailNotifySubject")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("NotifyTemplate_ReplyWriteEmailNotifySubject");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaPermission", "Permission", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<short>("BoardAccess")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_BoardAccess");
+
+                            b1.Property<short>("CommentView")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_CommentView");
+
+                            b1.Property<short>("CommentWrite")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_CommentWrite");
+
+                            b1.Property<short>("FileDownload")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_FileDownload");
+
+                            b1.Property<short>("FileUpload")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_FileUpload");
+
+                            b1.Property<short>("PostView")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_PostView");
+
+                            b1.Property<short>("PostWrite")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_PostWrite");
+
+                            b1.Property<short>("ReplyWrite")
+                                .HasColumnType("smallint")
+                                .HasColumnName("Permission_ReplyWrite");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaView", "View", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<bool>("AllowBlame")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowBlame");
+
+                            b1.Property<bool>("AllowBookmark")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowBookmark");
+
+                            b1.Property<bool>("AllowContentLinkTargetBlank")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowContentLinkTargetBlank");
+
+                            b1.Property<bool>("AllowDislike")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowDislike");
+
+                            b1.Property<bool>("AllowLike")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowLike");
+
+                            b1.Property<bool>("AllowPostUrlCopy")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowPostUrlCopy");
+
+                            b1.Property<bool>("AllowPostUrlQrCode")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowPostUrlQrCode");
+
+                            b1.Property<bool>("AllowPrevNextBotton")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowPrevNextBotton");
+
+                            b1.Property<bool>("AllowPrint")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowPrint");
+
+                            b1.Property<bool>("AllowSnsShare")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_AllowSnsShare");
+
+                            b1.Property<int>("BlameHideCount")
+                                .HasColumnType("int")
+                                .HasColumnName("View_BlameHideCount");
+
+                            b1.Property<bool>("ShowMemberIcon")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_ShowMemberIcon");
+
+                            b1.Property<bool>("ShowMemberRegDate")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_ShowMemberRegDate");
+
+                            b1.Property<bool>("ShowMemberSummary")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_ShowMemberSummary");
+
+                            b1.Property<bool>("ShowMemberThumb")
+                                .HasColumnType("bit")
+                                .HasColumnName("View_ShowMemberThumb");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Forum.Boards.BoardMetaWrite", "Write", b1 =>
+                        {
+                            b1.Property<int>("BoardMetaID")
+                                .HasColumnType("int");
+
+                            b1.Property<bool>("AllowEditor")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_AllowEditor");
+
+                            b1.Property<bool>("AllowFile")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_AllowFile");
+
+                            b1.Property<bool>("AllowImage")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_AllowImage");
+
+                            b1.Property<bool>("AllowMedia")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_AllowMedia");
+
+                            b1.Property<bool>("AllowPrefix")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_AllowPrefix");
+
+                            b1.Property<bool>("AllowSecret")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_AllowSecret");
+
+                            b1.Property<bool>("AllowTag")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_AllowTag");
+
+                            b1.Property<string>("DefaultContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Write_DefaultContent");
+
+                            b1.Property<string>("DefaultSubject")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Write_DefaultSubject");
+
+                            b1.Property<string>("FileUploadExtension")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Write_FileUploadExtension");
+
+                            b1.Property<byte>("FileUploadLimit")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("Write_FileUploadLimit");
+
+                            b1.Property<int>("FileUploadMaxSize")
+                                .HasColumnType("int")
+                                .HasColumnName("Write_FileUploadMaxSize");
+
+                            b1.Property<string>("FooterContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Write_FooterContent");
+
+                            b1.Property<string>("HeaderContent")
+                                .HasColumnType("nvarchar(max)")
+                                .HasColumnName("Write_HeaderContent");
+
+                            b1.Property<byte>("ImageUploadLimit")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("Write_ImageUploadLimit");
+
+                            b1.Property<int>("ImageUploadMaxSize")
+                                .HasColumnType("int")
+                                .HasColumnName("Write_ImageUploadMaxSize");
+
+                            b1.Property<byte>("MediaUploadLimit")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("Write_MediaUploadLimit");
+
+                            b1.Property<bool>("RequireImage")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_RequireImage");
+
+                            b1.Property<bool>("RequiredPrefix")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_RequiredPrefix");
+
+                            b1.Property<bool>("ShowFooter")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_ShowFooter");
+
+                            b1.Property<bool>("ShowHeader")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_ShowHeader");
+
+                            b1.Property<byte>("TagLimit")
+                                .HasColumnType("tinyint")
+                                .HasColumnName("Write_TagLimit");
+
+                            b1.HasKey("BoardMetaID");
+
+                            b1.ToTable("BoardMeta");
+
+                            b1.WithOwner()
+                                .HasForeignKey("BoardMetaID");
+                        });
+
+                    b.Navigation("Comment")
+                        .IsRequired();
+
+                    b.Navigation("Exp")
+                        .IsRequired();
+
+                    b.Navigation("General")
+                        .IsRequired();
+
+                    b.Navigation("List")
+                        .IsRequired();
+
+                    b.Navigation("Notify")
+                        .IsRequired();
+
+                    b.Navigation("NotifyTemplate")
+                        .IsRequired();
+
+                    b.Navigation("Permission")
+                        .IsRequired();
+
+                    b.Navigation("View")
+                        .IsRequired();
+
+                    b.Navigation("Write")
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardPrefix", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany("BoardPrefix")
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Briefings.DailyBriefing", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.Comment", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "MentionMember")
+                        .WithMany()
+                        .HasForeignKey("MentionMemberID")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Parent")
+                        .WithMany("Children")
+                        .HasForeignKey("ParentID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("Comment")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("MentionMember");
+
+                    b.Navigation("Parent");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentFile", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentFile")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentImage", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentImage")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentLink", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentLink")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentMedia", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentMedia")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentMention", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithOne("CommentMention")
+                        .HasForeignKey("Domain.Entities.Forum.Comments.CommentMention", "CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentReaction", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentReaction")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.CommentReport", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentReport")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentFileDownLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Comments.CommentFile", "CommentFile")
+                        .WithMany()
+                        .HasForeignKey("CommentFileID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentFileDownLog")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("CommentFile");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentLinkClickLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentLinkClickLog")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Comments.CommentLink", "CommentLink")
+                        .WithMany()
+                        .HasForeignKey("CommentLinkID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("CommentLink");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.CommentUpdateLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Comments.Comment", "Comment")
+                        .WithMany("CommentUpdateLog")
+                        .HasForeignKey("CommentID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Comment");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostFileDownLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.HasOne("Domain.Entities.Forum.Posts.PostFile", "PostFile")
+                        .WithMany()
+                        .HasForeignKey("PostFileID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostFileDownLog")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+
+                    b.Navigation("PostFile");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostLinkClickLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostLinkClickLog")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.PostLink", "PostLink")
+                        .WithMany()
+                        .HasForeignKey("PostLinkID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+
+                    b.Navigation("PostLink");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostUpdateLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostUpdateLog")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Logs.PostViewLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID");
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.Post", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany("Post")
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Boards.BoardPrefix", "BoardPrefix")
+                        .WithMany()
+                        .HasForeignKey("BoardPrefixID")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.Navigation("Board");
+
+                    b.Navigation("BoardPrefix");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostBookmark", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostBookmark")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostCheer", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "FromMember")
+                        .WithMany()
+                        .HasForeignKey("FromMemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "ToMember")
+                        .WithMany()
+                        .HasForeignKey("ToMemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.Navigation("FromMember");
+
+                    b.Navigation("Post");
+
+                    b.Navigation("ToMember");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostFile", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostFile")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostImage", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostImage")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostLink", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostLink")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostMedia", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostMedia")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostPrediction", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostReaction", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostReaction")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostReport", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostReport")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostStockTag", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.PostTag", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")
+                        .WithMany()
+                        .HasForeignKey("BoardID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany("PostTag")
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Forum.Posts.Tag", "Tag")
+                        .WithMany("PostTag")
+                        .HasForeignKey("TagID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Board");
+
+                    b.Navigation("Post");
+
+                    b.Navigation("Tag");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Attendance", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.BroadcastSession", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Channel", "Channel")
+                        .WithMany()
+                        .HasForeignKey("ChannelID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Channel");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Channel", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithOne("Channel")
+                        .HasForeignKey("Domain.Entities.Members.Channel", "MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.ChannelBroadcastStats", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Channel", "Channel")
+                        .WithMany()
+                        .HasForeignKey("ChannelID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Channel");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.ChannelHandleHistory", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Channel", "Channel")
+                        .WithMany()
+                        .HasForeignKey("ChannelID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Channel");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberEmailChangeLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberExpLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.BroadcastSession", "BroadcastSession")
+                        .WithMany()
+                        .HasForeignKey("BroadcastSessionID")
+                        .OnDelete(DeleteBehavior.NoAction);
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("BroadcastSession");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberIntroChangeLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberLoginLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberNameChangeLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberSummaryChangeLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Logs.MemberThumbChangeLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Member", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.MemberGrade", "MemberGrade")
+                        .WithMany()
+                        .HasForeignKey("MemberGradeID")
+                        .OnDelete(DeleteBehavior.SetNull);
+
+                    b.Navigation("MemberGrade");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberApprove", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithOne("MemberApprove")
+                        .HasForeignKey("Domain.Entities.Members.MemberApprove", "MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberDailyRewardCounter", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", null)
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberFollow", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Followee")
+                        .WithMany()
+                        .HasForeignKey("FolloweeMemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Follower")
+                        .WithMany()
+                        .HasForeignKey("FollowerMemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Followee");
+
+                    b.Navigation("Follower");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberItem", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.Product", "Product")
+                        .WithMany()
+                        .HasForeignKey("ProductID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.Navigation("Member");
+
+                    b.Navigation("Product");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberOAuthToken", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberStats", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithOne("MemberStats")
+                        .HasForeignKey("Domain.Entities.Members.MemberStats", "MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.MemberTrackRecord", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithOne()
+                        .HasForeignKey("Domain.Entities.Members.MemberTrackRecord", "MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.RefreshToken", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Notes.Note", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Receiver")
+                        .WithMany()
+                        .HasForeignKey("ReceiverMemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Sender")
+                        .WithMany()
+                        .HasForeignKey("SenderMemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.Navigation("Receiver");
+
+                    b.Navigation("Sender");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Notifications.Notification", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Banner.BannerItem", b =>
+                {
+                    b.HasOne("Domain.Entities.Page.Banner.BannerPosition", "BannerPosition")
+                        .WithMany("BannerItems")
+                        .HasForeignKey("PositionID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("BannerPosition");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Faq.FaqItem", b =>
+                {
+                    b.HasOne("Domain.Entities.Page.Faq.FaqCategory", "FaqCategory")
+                        .WithMany("FaqItems")
+                        .HasForeignKey("CategoryID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("FaqCategory");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Popup.Popup", b =>
+                {
+                    b.HasOne("Domain.Entities.Page.Popup.PopupPosition", "PopupPosition")
+                        .WithMany("Popups")
+                        .HasForeignKey("PositionID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("PopupPosition");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperAccount", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperDailySnapshot", b =>
+                {
+                    b.HasOne("Domain.Entities.Paper.PaperAccount", "Account")
+                        .WithMany()
+                        .HasForeignKey("AccountID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Account");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperFill", b =>
+                {
+                    b.HasOne("Domain.Entities.Paper.PaperOrder", "Order")
+                        .WithMany()
+                        .HasForeignKey("OrderID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Order");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperLedger", b =>
+                {
+                    b.HasOne("Domain.Entities.Paper.PaperAccount", "Account")
+                        .WithMany()
+                        .HasForeignKey("AccountID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Account");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperOrder", b =>
+                {
+                    b.HasOne("Domain.Entities.Paper.PaperAccount", "Account")
+                        .WithMany()
+                        .HasForeignKey("AccountID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Account");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Paper.PaperPosition", b =>
+                {
+                    b.HasOne("Domain.Entities.Paper.PaperAccount", "Account")
+                        .WithMany()
+                        .HasForeignKey("AccountID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Account");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.PaymentOrder", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.Toss.TossCancel", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Payments.PaymentOrder", "PaymentOrder")
+                        .WithMany()
+                        .HasForeignKey("PaymentOrderID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+
+                    b.Navigation("PaymentOrder");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.Toss.TossConfirm", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Payments.PaymentOrder", "PaymentOrder")
+                        .WithMany()
+                        .HasForeignKey("PaymentOrderID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+
+                    b.Navigation("PaymentOrder");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Payments.Toss.TossLog", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.NoAction);
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.StockDailyPrice", b =>
+                {
+                    b.HasOne("Domain.Entities.Stocks.Stock", "Stock")
+                        .WithMany()
+                        .HasForeignKey("StockID")
+                        .OnDelete(DeleteBehavior.NoAction)
+                        .IsRequired();
+
+                    b.Navigation("Stock");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Coupon", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Game", "Game")
+                        .WithMany()
+                        .HasForeignKey("GameID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.Product", "Product")
+                        .WithMany()
+                        .HasForeignKey("ProductID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Game");
+
+                    b.Navigation("Product");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.CouponCode", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Coupon", "Coupon")
+                        .WithMany()
+                        .HasForeignKey("CouponID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "IssuedToMember")
+                        .WithMany()
+                        .HasForeignKey("IssuedToMemberID")
+                        .OnDelete(DeleteBehavior.NoAction);
+
+                    b.Navigation("Coupon");
+
+                    b.Navigation("IssuedToMember");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameCategoryMap", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.GameCategory", "GameCategory")
+                        .WithMany("GameCategoryMap")
+                        .HasForeignKey("GameCategoryID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.Game", "Game")
+                        .WithMany("GameCategoryMap")
+                        .HasForeignKey("GameID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Game");
+
+                    b.Navigation("GameCategory");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameGenreMap", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.GameGenre", "GameGenre")
+                        .WithMany("GameGenreMap")
+                        .HasForeignKey("GameGenreID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.Game", "Game")
+                        .WithMany("GameGenreMap")
+                        .HasForeignKey("GameID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Game");
+
+                    b.Navigation("GameGenre");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameImage", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Game", "Game")
+                        .WithMany("GameImage")
+                        .HasForeignKey("GameID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Game");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameLanguageSupport", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Game", "Game")
+                        .WithMany("GameLanguageSupport")
+                        .HasForeignKey("GameID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.GameLanguage", "GameLanguage")
+                        .WithMany("GameLanguageSupport")
+                        .HasForeignKey("GameLanguageID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Game");
+
+                    b.Navigation("GameLanguage");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameSettlement", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Game", "Game")
+                        .WithMany()
+                        .HasForeignKey("GameID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Game");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.MemberAddress", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.MemberInventory", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.CouponCode", "CouponCode")
+                        .WithMany()
+                        .HasForeignKey("CouponCodeID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.OrderItem", "OrderItem")
+                        .WithMany()
+                        .HasForeignKey("OrderItemID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("CouponCode");
+
+                    b.Navigation("Member");
+
+                    b.Navigation("OrderItem");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Order", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Channel", "Channel")
+                        .WithMany()
+                        .HasForeignKey("ChannelID")
+                        .OnDelete(DeleteBehavior.NoAction);
+
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithMany()
+                        .HasForeignKey("MemberID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("Channel");
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.OrderItem", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.CouponCode", "IssuedCouponCode")
+                        .WithMany()
+                        .HasForeignKey("IssuedCouponCodeID")
+                        .OnDelete(DeleteBehavior.NoAction);
+
+                    b.HasOne("Domain.Entities.Store.Order", "Order")
+                        .WithMany("Items")
+                        .HasForeignKey("OrderID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.Product", "Product")
+                        .WithMany()
+                        .HasForeignKey("ProductID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.Navigation("IssuedCouponCode");
+
+                    b.Navigation("Order");
+
+                    b.Navigation("Product");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.OrderRefund", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Order", "Order")
+                        .WithMany("Refunds")
+                        .HasForeignKey("OrderID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Order");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.OrderRefundItem", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.CouponCode", "CouponCode")
+                        .WithMany()
+                        .HasForeignKey("CouponCodeID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.OrderItem", "OrderItem")
+                        .WithMany()
+                        .HasForeignKey("OrderItemID")
+                        .OnDelete(DeleteBehavior.Restrict)
+                        .IsRequired();
+
+                    b.HasOne("Domain.Entities.Store.OrderRefund", "OrderRefund")
+                        .WithMany("Items")
+                        .HasForeignKey("OrderRefundID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("CouponCode");
+
+                    b.Navigation("OrderItem");
+
+                    b.Navigation("OrderRefund");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Product", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Game", "Game")
+                        .WithMany()
+                        .HasForeignKey("GameID")
+                        .OnDelete(DeleteBehavior.Restrict);
+
+                    b.Navigation("Game");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.ProductLimitConfig", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Product", "Product")
+                        .WithOne()
+                        .HasForeignKey("Domain.Entities.Store.ProductLimitConfig", "ProductID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Product");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Shipment", b =>
+                {
+                    b.HasOne("Domain.Entities.Store.Order", "Order")
+                        .WithOne()
+                        .HasForeignKey("Domain.Entities.Store.Shipment", "OrderID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Order");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Wallets.Wallet", b =>
+                {
+                    b.HasOne("Domain.Entities.Members.Member", "Member")
+                        .WithOne("Wallet")
+                        .HasForeignKey("Domain.Entities.Wallets.Wallet", "MemberID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Member");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Wallets.WalletBalance", b =>
+                {
+                    b.HasOne("Domain.Entities.Wallets.Wallet", null)
+                        .WithMany("Balances")
+                        .HasForeignKey("WalletKey")
+                        .HasPrincipalKey("WalletKey")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.OwnsOne("Domain.Entities.Common.ValueObject.Money", "Amount", b1 =>
+                        {
+                            b1.Property<int>("WalletBalanceID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("Currency")
+                                .IsRequired()
+                                .HasMaxLength(10)
+                                .HasColumnType("nvarchar(10)")
+                                .HasColumnName("Currency");
+
+                            b1.Property<decimal>("Value")
+                                .HasPrecision(18)
+                                .HasColumnType("decimal(18,0)")
+                                .HasColumnName("Amount");
+
+                            b1.HasKey("WalletBalanceID");
+
+                            b1.ToTable("WalletBalance");
+
+                            b1.WithOwner()
+                                .HasForeignKey("WalletBalanceID");
+                        });
+
+                    b.Navigation("Amount")
+                        .IsRequired();
+                });
+
+            modelBuilder.Entity("Domain.Entities.Wallets.WalletTransaction", b =>
+                {
+                    b.HasOne("Domain.Entities.Wallets.Wallet", "Wallet")
+                        .WithMany("Transactions")
+                        .HasForeignKey("WalletKey")
+                        .HasPrincipalKey("WalletKey")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.OwnsOne("Domain.Entities.Common.ValueObject.Money", "Amount", b1 =>
+                        {
+                            b1.Property<int>("WalletTransactionID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("Currency")
+                                .IsRequired()
+                                .HasMaxLength(10)
+                                .HasColumnType("nvarchar(10)")
+                                .HasColumnName("Currency");
+
+                            b1.Property<decimal>("Value")
+                                .HasPrecision(18)
+                                .HasColumnType("decimal(18,0)")
+                                .HasColumnName("Amount");
+
+                            b1.HasKey("WalletTransactionID");
+
+                            b1.ToTable("WalletTransaction");
+
+                            b1.WithOwner()
+                                .HasForeignKey("WalletTransactionID");
+                        });
+
+                    b.OwnsOne("Domain.Entities.Common.ValueObject.Money", "BalanceAfter", b1 =>
+                        {
+                            b1.Property<int>("WalletTransactionID")
+                                .HasColumnType("int");
+
+                            b1.Property<string>("Currency")
+                                .IsRequired()
+                                .HasMaxLength(10)
+                                .HasColumnType("nvarchar(10)")
+                                .HasColumnName("BalanceAfterCurrency");
+
+                            b1.Property<decimal>("Value")
+                                .HasPrecision(18)
+                                .HasColumnType("decimal(18,0)")
+                                .HasColumnName("BalanceAfter");
+
+                            b1.HasKey("WalletTransactionID");
+
+                            b1.ToTable("WalletTransaction");
+
+                            b1.WithOwner()
+                                .HasForeignKey("WalletTransactionID");
+                        });
+
+                    b.Navigation("Amount")
+                        .IsRequired();
+
+                    b.Navigation("BalanceAfter")
+                        .IsRequired();
+
+                    b.Navigation("Wallet");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedComment", b =>
+                {
+                    b.Navigation("Children");
+
+                    b.Navigation("FeedCommentLike");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedPost", b =>
+                {
+                    b.Navigation("FeedBookmark");
+
+                    b.Navigation("FeedComment");
+
+                    b.Navigation("FeedLike");
+
+                    b.Navigation("FeedPostImage");
+
+                    b.Navigation("FeedPostMedia");
+
+                    b.Navigation("FeedPostMention");
+
+                    b.Navigation("FeedPostTag");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Feed.FeedTag", b =>
+                {
+                    b.Navigation("FeedPostTag");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.Board", b =>
+                {
+                    b.Navigation("BoardManager");
+
+                    b.Navigation("BoardMeta")
+                        .IsRequired();
+
+                    b.Navigation("BoardPrefix");
+
+                    b.Navigation("Post");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Boards.BoardGroup", b =>
+                {
+                    b.Navigation("Board");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Comments.Comment", b =>
+                {
+                    b.Navigation("Children");
+
+                    b.Navigation("CommentFile");
+
+                    b.Navigation("CommentFileDownLog");
+
+                    b.Navigation("CommentImage");
+
+                    b.Navigation("CommentLink");
+
+                    b.Navigation("CommentLinkClickLog");
+
+                    b.Navigation("CommentMedia");
+
+                    b.Navigation("CommentMention");
+
+                    b.Navigation("CommentReaction");
+
+                    b.Navigation("CommentReport");
+
+                    b.Navigation("CommentUpdateLog");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.Post", b =>
+                {
+                    b.Navigation("Comment");
+
+                    b.Navigation("PostBookmark");
+
+                    b.Navigation("PostFile");
+
+                    b.Navigation("PostFileDownLog");
+
+                    b.Navigation("PostImage");
+
+                    b.Navigation("PostLink");
+
+                    b.Navigation("PostLinkClickLog");
+
+                    b.Navigation("PostMedia");
+
+                    b.Navigation("PostReaction");
+
+                    b.Navigation("PostReport");
+
+                    b.Navigation("PostTag");
+
+                    b.Navigation("PostUpdateLog");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Forum.Posts.Tag", b =>
+                {
+                    b.Navigation("PostTag");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Members.Member", b =>
+                {
+                    b.Navigation("Channel");
+
+                    b.Navigation("MemberApprove")
+                        .IsRequired();
+
+                    b.Navigation("MemberStats")
+                        .IsRequired();
+
+                    b.Navigation("Wallet");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Banner.BannerPosition", b =>
+                {
+                    b.Navigation("BannerItems");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Faq.FaqCategory", b =>
+                {
+                    b.Navigation("FaqItems");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Page.Popup.PopupPosition", b =>
+                {
+                    b.Navigation("Popups");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Game", b =>
+                {
+                    b.Navigation("GameCategoryMap");
+
+                    b.Navigation("GameGenreMap");
+
+                    b.Navigation("GameImage");
+
+                    b.Navigation("GameLanguageSupport");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameCategory", b =>
+                {
+                    b.Navigation("GameCategoryMap");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameGenre", b =>
+                {
+                    b.Navigation("GameGenreMap");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.GameLanguage", b =>
+                {
+                    b.Navigation("GameLanguageSupport");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.Order", b =>
+                {
+                    b.Navigation("Items");
+
+                    b.Navigation("Refunds");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Store.OrderRefund", b =>
+                {
+                    b.Navigation("Items");
+                });
+
+            modelBuilder.Entity("Domain.Entities.Wallets.Wallet", b =>
+                {
+                    b.Navigation("Balances");
+
+                    b.Navigation("Transactions");
+                });
+#pragma warning restore 612, 618
+        }
+    }
+}

+ 148 - 0
Infrastructure/Persistence/Migrations/20260707100929_AddSeibroDividend.cs

@@ -0,0 +1,148 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace Infrastructure.Migrations.AppDb
+{
+    /// <inheritdoc />
+    public partial class AddSeibroDividend : Migration
+    {
+        /// <inheritdoc />
+        protected override void Up(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.CreateTable(
+                name: "Dividend",
+                columns: table => new
+                {
+                    ID = table.Column<int>(type: "int", nullable: false)
+                        .Annotation("SqlServer:Identity", "1, 1"),
+                    Isin = table.Column<string>(type: "nchar(12)", fixedLength: true, maxLength: 12, nullable: false, comment: "종목번호 (ISIN)"),
+                    KorSecnNm = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false, comment: "한글종목명 (KOR_SECN_NM)"),
+                    SecnKacdNm = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: true, comment: "종목종류 (SECN_KACD_NM) — 보통주/우선주…"),
+                    RgtStdDt = table.Column<DateOnly>(type: "date", nullable: false, comment: "권리기준일자 (RGT_STD_DT)"),
+                    Pval = table.Column<decimal>(type: "decimal(28,10)", precision: 28, scale: 10, nullable: true, comment: "액면가 (PVAL)"),
+                    StkAllocRatio = table.Column<decimal>(type: "decimal(28,10)", precision: 28, scale: 10, nullable: true, comment: "주식배정비율 (STK_ALOC_RATIO)"),
+                    CashAllocRatio = table.Column<decimal>(type: "decimal(28,10)", precision: 28, scale: 10, nullable: true, comment: "현금배정비율 (CASH_ALOC_RATIO)"),
+                    CashAllocAmt = table.Column<decimal>(type: "decimal(28,10)", precision: 28, scale: 10, nullable: true, comment: "현금배정금액 (CASH_ALOC_AMT) — 1주당 현금배당"),
+                    MartpDivRate = table.Column<decimal>(type: "decimal(28,10)", precision: 28, scale: 10, nullable: true, comment: "시가배당율 (MARTP_DIV_RATE)"),
+                    Th1PayTermBeginDt = table.Column<DateOnly>(type: "date", nullable: true, comment: "배당지급일(현금, TH1_PAY_TERM_BEGIN_DT)"),
+                    DeliDt = table.Column<DateOnly>(type: "date", nullable: true, comment: "교부일자(주식, DELI_DT)"),
+                    MajshrEtcDiffAllocYn = table.Column<bool>(type: "bit", nullable: true, comment: "대주주기타차등배정여부 (MAJSHR_ETC_DIFF_ALOC_YN)"),
+                    TstkNoagnYn = table.Column<bool>(type: "bit", nullable: true, comment: "자사주무배정여부 (TSTK_NOAGN_YN)"),
+                    CashDiffDiviAmt = table.Column<decimal>(type: "decimal(28,10)", precision: 28, scale: 10, nullable: true, comment: "현금차등배당금액 (CASH_DIFF_DIVIAMT_VAL)"),
+                    CashDiffDiviRate = table.Column<decimal>(type: "decimal(28,10)", precision: 28, scale: 10, nullable: true, comment: "현금차등배당율 (CASH_DIFF_DIVI_RATE)"),
+                    StkDiffDiviRate = table.Column<decimal>(type: "decimal(28,10)", precision: 28, scale: 10, nullable: true, comment: "주식차등배당율 (STK_DIFF_DIVI_RATE)"),
+                    MartpDiffDiviRate = table.Column<decimal>(type: "decimal(28,10)", precision: 28, scale: 10, nullable: true, comment: "시가차등배당율 (MARTP_DIFF_DIVI_RATE)"),
+                    UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_Dividend", x => x.ID);
+                },
+                comment: "SEIBro 배당분배금내역 (getDivInfo) — 종목별 배정비율·금액·시가배당율. Isin 으로 Stock 조인");
+
+            migrationBuilder.CreateTable(
+                name: "DividendSchedule",
+                columns: table => new
+                {
+                    ID = table.Column<int>(type: "int", nullable: false)
+                        .Annotation("SqlServer:Identity", "1, 1"),
+                    IssucoCustno = table.Column<int>(type: "int", nullable: false, comment: "발행회사 고객번호 (ISSUCO_CUSTNO)"),
+                    RepSecnNm = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false, comment: "대표종목명 (REP_SECN_NM)"),
+                    RgtRacd = table.Column<string>(type: "nvarchar(3)", maxLength: 3, nullable: true, comment: "권리사유코드 (RGT_RACD) — 103 배당/분배"),
+                    RgtRsnDetailSortCd = table.Column<string>(type: "nvarchar(2)", maxLength: 2, nullable: false, comment: "권리사유세부유형코드 — 01주식 02현금 03동시 04무배당"),
+                    RgtStdDt = table.Column<DateOnly>(type: "date", nullable: false, comment: "권리기준일자 (RGT_STD_DT)"),
+                    AllocWhcd = table.Column<string>(type: "nvarchar(1)", maxLength: 1, nullable: true, comment: "배정방법코드 (ALOC_WHCD)"),
+                    SetaccTpcd = table.Column<string>(type: "nvarchar(1)", maxLength: 1, nullable: true, comment: "결산구분코드 (SETACC_TPCD)"),
+                    FixTpcd = table.Column<string>(type: "nvarchar(1)", maxLength: 1, nullable: true, comment: "확정구분코드 (FIX_TPCD)"),
+                    RostCloseBeginDt = table.Column<DateOnly>(type: "date", nullable: true, comment: "명부폐쇄시작일자 (ROST_CLOSE_BEGIN_DT)"),
+                    RostCloseExpryDt = table.Column<DateOnly>(type: "date", nullable: true, comment: "명부폐쇄종료일자 (ROST_CLOSE_EXPRY_DT)"),
+                    XrgtDt = table.Column<DateOnly>(type: "date", nullable: true, comment: "권리락일자 (XRGT_DT)"),
+                    IsElectronicSecurity = table.Column<bool>(type: "bit", nullable: true, comment: "전자증권 여부 (ELTSC_YN)"),
+                    UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_DividendSchedule", x => x.ID);
+                },
+                comment: "SEIBro 배당일정 (getDivSchedulInfo) — 현금/주식/동시/무배당 일정·권리락일");
+
+            migrationBuilder.CreateTable(
+                name: "RightsBaseDate",
+                columns: table => new
+                {
+                    ID = table.Column<int>(type: "int", nullable: false)
+                        .Annotation("SqlServer:Identity", "1, 1"),
+                    IssucoCustno = table.Column<int>(type: "int", nullable: false, comment: "발행회사 고객번호 (ISSUCO_CUSTNO)"),
+                    RepSecnNm = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false, comment: "대표종목명 (REP_SECN_NM)"),
+                    RgtStdDt = table.Column<DateOnly>(type: "date", nullable: false, comment: "권리기준일자 (RGT_STD_DT)"),
+                    RgtRacd = table.Column<string>(type: "nvarchar(3)", maxLength: 3, nullable: false, comment: "권리사유코드 (RGT_RACD)"),
+                    RgtRacdNm = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: true, comment: "권리사유명 (RGT_RACD_NM)"),
+                    RgtRsnDetailSortCd = table.Column<string>(type: "nvarchar(2)", maxLength: 2, nullable: false, comment: "권리사유세부유형코드 (RGT_RSN_DTAIL_SORT_CD)"),
+                    UpdatedAt = table.Column<DateTime>(type: "datetime2", nullable: false)
+                },
+                constraints: table =>
+                {
+                    table.PrimaryKey("PK_RightsBaseDate", x => x.ID);
+                },
+                comment: "SEIBro 권리기준일 (getStddtInfo) — Wave 3 기업행위 이벤트 발견 소스");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_Dividend_Isin_RgtStdDt",
+                table: "Dividend",
+                columns: new[] { "Isin", "RgtStdDt" },
+                unique: true);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_Dividend_RgtStdDt",
+                table: "Dividend",
+                column: "RgtStdDt");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_DividendSchedule_IssucoCustno_RgtStdDt_RgtRsnDetailSortCd",
+                table: "DividendSchedule",
+                columns: new[] { "IssucoCustno", "RgtStdDt", "RgtRsnDetailSortCd" },
+                unique: true);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_DividendSchedule_RgtStdDt",
+                table: "DividendSchedule",
+                column: "RgtStdDt");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_DividendSchedule_XrgtDt",
+                table: "DividendSchedule",
+                column: "XrgtDt");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_RightsBaseDate_IssucoCustno_RgtStdDt_RgtRacd_RgtRsnDetailSortCd",
+                table: "RightsBaseDate",
+                columns: new[] { "IssucoCustno", "RgtStdDt", "RgtRacd", "RgtRsnDetailSortCd" },
+                unique: true);
+
+            migrationBuilder.CreateIndex(
+                name: "IX_RightsBaseDate_RgtRacd",
+                table: "RightsBaseDate",
+                column: "RgtRacd");
+
+            migrationBuilder.CreateIndex(
+                name: "IX_RightsBaseDate_RgtStdDt",
+                table: "RightsBaseDate",
+                column: "RgtStdDt");
+        }
+
+        /// <inheritdoc />
+        protected override void Down(MigrationBuilder migrationBuilder)
+        {
+            migrationBuilder.DropTable(
+                name: "Dividend");
+
+            migrationBuilder.DropTable(
+                name: "DividendSchedule");
+
+            migrationBuilder.DropTable(
+                name: "RightsBaseDate");
+        }
+    }
+}

+ 384 - 6
Infrastructure/Persistence/Migrations/AppDbContextModelSnapshot.cs

@@ -1322,6 +1322,40 @@ namespace Infrastructure.Persistence.Migrations
                         });
                 });
 
+            modelBuilder.Entity("Domain.Entities.Forum.Briefings.DailyBriefing", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int")
+                        .HasComment("PK");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<DateOnly>("BriefingDate")
+                        .HasColumnType("date")
+                        .HasComment("브리핑 대상 일자 (KST, UNIQUE)");
+
+                    b.Property<DateTime>("GeneratedAt")
+                        .HasColumnType("datetime2")
+                        .HasComment("생성 일시");
+
+                    b.Property<int>("PostID")
+                        .HasColumnType("int")
+                        .HasComment("발행된 게시글 ID (FK Post)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("BriefingDate")
+                        .IsUnique();
+
+                    b.HasIndex("PostID");
+
+                    b.ToTable("DailyBriefing", null, t =>
+                        {
+                            t.HasComment("장전 브리핑 발행 기록 (중복 발행 방지)");
+                        });
+                });
+
             modelBuilder.Entity("Domain.Entities.Forum.Comments.Comment", b =>
                 {
                     b.Property<int>("ID")
@@ -6366,6 +6400,195 @@ namespace Infrastructure.Persistence.Migrations
                         });
                 });
 
+            modelBuilder.Entity("Domain.Entities.Stocks.Dividend", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<decimal?>("CashAllocAmt")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("현금배정금액 (CASH_ALOC_AMT) — 1주당 현금배당");
+
+                    b.Property<decimal?>("CashAllocRatio")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("현금배정비율 (CASH_ALOC_RATIO)");
+
+                    b.Property<decimal?>("CashDiffDiviAmt")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("현금차등배당금액 (CASH_DIFF_DIVIAMT_VAL)");
+
+                    b.Property<decimal?>("CashDiffDiviRate")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("현금차등배당율 (CASH_DIFF_DIVI_RATE)");
+
+                    b.Property<DateOnly?>("DeliDt")
+                        .HasColumnType("date")
+                        .HasComment("교부일자(주식, DELI_DT)");
+
+                    b.Property<string>("Isin")
+                        .IsRequired()
+                        .HasMaxLength(12)
+                        .HasColumnType("nchar(12)")
+                        .IsFixedLength()
+                        .HasComment("종목번호 (ISIN)");
+
+                    b.Property<string>("KorSecnNm")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("한글종목명 (KOR_SECN_NM)");
+
+                    b.Property<bool?>("MajshrEtcDiffAllocYn")
+                        .HasColumnType("bit")
+                        .HasComment("대주주기타차등배정여부 (MAJSHR_ETC_DIFF_ALOC_YN)");
+
+                    b.Property<decimal?>("MartpDiffDiviRate")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("시가차등배당율 (MARTP_DIFF_DIVI_RATE)");
+
+                    b.Property<decimal?>("MartpDivRate")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("시가배당율 (MARTP_DIV_RATE)");
+
+                    b.Property<decimal?>("Pval")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("액면가 (PVAL)");
+
+                    b.Property<DateOnly>("RgtStdDt")
+                        .HasColumnType("date")
+                        .HasComment("권리기준일자 (RGT_STD_DT)");
+
+                    b.Property<string>("SecnKacdNm")
+                        .HasMaxLength(20)
+                        .HasColumnType("nvarchar(20)")
+                        .HasComment("종목종류 (SECN_KACD_NM) — 보통주/우선주…");
+
+                    b.Property<decimal?>("StkAllocRatio")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("주식배정비율 (STK_ALOC_RATIO)");
+
+                    b.Property<decimal?>("StkDiffDiviRate")
+                        .HasPrecision(28, 10)
+                        .HasColumnType("decimal(28,10)")
+                        .HasComment("주식차등배당율 (STK_DIFF_DIVI_RATE)");
+
+                    b.Property<DateOnly?>("Th1PayTermBeginDt")
+                        .HasColumnType("date")
+                        .HasComment("배당지급일(현금, TH1_PAY_TERM_BEGIN_DT)");
+
+                    b.Property<bool?>("TstkNoagnYn")
+                        .HasColumnType("bit")
+                        .HasComment("자사주무배정여부 (TSTK_NOAGN_YN)");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("RgtStdDt");
+
+                    b.HasIndex("Isin", "RgtStdDt")
+                        .IsUnique();
+
+                    b.ToTable("Dividend", null, t =>
+                        {
+                            t.HasComment("SEIBro 배당분배금내역 (getDivInfo) — 종목별 배정비율·금액·시가배당율. Isin 으로 Stock 조인");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.DividendSchedule", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<string>("AllocWhcd")
+                        .HasMaxLength(1)
+                        .HasColumnType("nvarchar(1)")
+                        .HasComment("배정방법코드 (ALOC_WHCD)");
+
+                    b.Property<string>("FixTpcd")
+                        .HasMaxLength(1)
+                        .HasColumnType("nvarchar(1)")
+                        .HasComment("확정구분코드 (FIX_TPCD)");
+
+                    b.Property<bool?>("IsElectronicSecurity")
+                        .HasColumnType("bit")
+                        .HasComment("전자증권 여부 (ELTSC_YN)");
+
+                    b.Property<int>("IssucoCustno")
+                        .HasColumnType("int")
+                        .HasComment("발행회사 고객번호 (ISSUCO_CUSTNO)");
+
+                    b.Property<string>("RepSecnNm")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("대표종목명 (REP_SECN_NM)");
+
+                    b.Property<string>("RgtRacd")
+                        .HasMaxLength(3)
+                        .HasColumnType("nvarchar(3)")
+                        .HasComment("권리사유코드 (RGT_RACD) — 103 배당/분배");
+
+                    b.Property<string>("RgtRsnDetailSortCd")
+                        .IsRequired()
+                        .HasMaxLength(2)
+                        .HasColumnType("nvarchar(2)")
+                        .HasComment("권리사유세부유형코드 — 01주식 02현금 03동시 04무배당");
+
+                    b.Property<DateOnly>("RgtStdDt")
+                        .HasColumnType("date")
+                        .HasComment("권리기준일자 (RGT_STD_DT)");
+
+                    b.Property<DateOnly?>("RostCloseBeginDt")
+                        .HasColumnType("date")
+                        .HasComment("명부폐쇄시작일자 (ROST_CLOSE_BEGIN_DT)");
+
+                    b.Property<DateOnly?>("RostCloseExpryDt")
+                        .HasColumnType("date")
+                        .HasComment("명부폐쇄종료일자 (ROST_CLOSE_EXPRY_DT)");
+
+                    b.Property<string>("SetaccTpcd")
+                        .HasMaxLength(1)
+                        .HasColumnType("nvarchar(1)")
+                        .HasComment("결산구분코드 (SETACC_TPCD)");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.Property<DateOnly?>("XrgtDt")
+                        .HasColumnType("date")
+                        .HasComment("권리락일자 (XRGT_DT)");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("RgtStdDt");
+
+                    b.HasIndex("XrgtDt");
+
+                    b.HasIndex("IssucoCustno", "RgtStdDt", "RgtRsnDetailSortCd")
+                        .IsUnique();
+
+                    b.ToTable("DividendSchedule", null, t =>
+                        {
+                            t.HasComment("SEIBro 배당일정 (getDivSchedulInfo) — 현금/주식/동시/무배당 일정·권리락일");
+                        });
+                });
+
             modelBuilder.Entity("Domain.Entities.Stocks.EsgIndexDailyPrice", b =>
                 {
                     b.Property<long>("ID")
@@ -6726,6 +6949,12 @@ namespace Infrastructure.Persistence.Migrations
                         .HasColumnType("nvarchar(100)")
                         .HasComment("상품구분 (PROD_NM)");
 
+                    b.Property<byte>("Session")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("tinyint")
+                        .HasDefaultValue((byte)1)
+                        .HasComment("매매 세션 (1=정규, 2=야간)");
+
                     b.Property<decimal?>("SettlePrice")
                         .HasPrecision(18, 2)
                         .HasColumnType("decimal(18,2)")
@@ -6749,11 +6978,11 @@ namespace Infrastructure.Persistence.Migrations
 
                     b.HasKey("ID");
 
-                    b.HasIndex("FuturesKind", "IsuCode", "TradeDate")
+                    b.HasIndex("FuturesKind", "IsuCode", "TradeDate", "Session")
                         .IsUnique();
 
-                    b.HasIndex("FuturesKind", "TradeDate", "TradeValue")
-                        .IsDescending(false, false, true);
+                    b.HasIndex("FuturesKind", "TradeDate", "Session", "TradeValue")
+                        .IsDescending(false, false, false, true);
 
                     b.ToTable("FuturesDailyTrade", null, t =>
                         {
@@ -7056,6 +7285,12 @@ namespace Infrastructure.Persistence.Migrations
                         .HasColumnType("tinyint")
                         .HasComment("권리유형 (RGHT_TP_NM — 1=Call, 2=Put)");
 
+                    b.Property<byte>("Session")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("tinyint")
+                        .HasDefaultValue((byte)1)
+                        .HasComment("매매 세션 (1=정규, 2=야간)");
+
                     b.Property<decimal?>("StrikePrice")
                         .HasPrecision(18, 2)
                         .HasColumnType("decimal(18,2)")
@@ -7074,11 +7309,11 @@ namespace Infrastructure.Persistence.Migrations
 
                     b.HasKey("ID");
 
-                    b.HasIndex("OptionsKind", "IsuCode", "TradeDate")
+                    b.HasIndex("OptionsKind", "IsuCode", "TradeDate", "Session")
                         .IsUnique();
 
-                    b.HasIndex("OptionsKind", "TradeDate", "TradeValue")
-                        .IsDescending(false, false, true);
+                    b.HasIndex("OptionsKind", "TradeDate", "Session", "TradeValue")
+                        .IsDescending(false, false, false, true);
 
                     b.ToTable("OptionsDailyTrade", null, t =>
                         {
@@ -7086,6 +7321,110 @@ namespace Infrastructure.Persistence.Migrations
                         });
                 });
 
+            modelBuilder.Entity("Domain.Entities.Stocks.RightsBaseDate", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("IssucoCustno")
+                        .HasColumnType("int")
+                        .HasComment("발행회사 고객번호 (ISSUCO_CUSTNO)");
+
+                    b.Property<string>("RepSecnNm")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("대표종목명 (REP_SECN_NM)");
+
+                    b.Property<string>("RgtRacd")
+                        .IsRequired()
+                        .HasMaxLength(3)
+                        .HasColumnType("nvarchar(3)")
+                        .HasComment("권리사유코드 (RGT_RACD)");
+
+                    b.Property<string>("RgtRacdNm")
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("권리사유명 (RGT_RACD_NM)");
+
+                    b.Property<string>("RgtRsnDetailSortCd")
+                        .IsRequired()
+                        .HasMaxLength(2)
+                        .HasColumnType("nvarchar(2)")
+                        .HasComment("권리사유세부유형코드 (RGT_RSN_DTAIL_SORT_CD)");
+
+                    b.Property<DateOnly>("RgtStdDt")
+                        .HasColumnType("date")
+                        .HasComment("권리기준일자 (RGT_STD_DT)");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("RgtRacd");
+
+                    b.HasIndex("RgtStdDt");
+
+                    b.HasIndex("IssucoCustno", "RgtStdDt", "RgtRacd", "RgtRsnDetailSortCd")
+                        .IsUnique();
+
+                    b.ToTable("RightsBaseDate", null, t =>
+                        {
+                            t.HasComment("SEIBro 권리기준일 (getStddtInfo) — Wave 3 기업행위 이벤트 발견 소스");
+                        });
+                });
+
+            modelBuilder.Entity("Domain.Entities.Stocks.SeibroIssuerCode", b =>
+                {
+                    b.Property<int>("ID")
+                        .ValueGeneratedOnAdd()
+                        .HasColumnType("int");
+
+                    SqlServerPropertyBuilderExtensions.UseIdentityColumn(b.Property<int>("ID"));
+
+                    b.Property<int>("IssucoCustno")
+                        .HasColumnType("int")
+                        .HasComment("발행회사 고객번호 (ISSUCO_CUSTNO)");
+
+                    b.Property<string>("Market")
+                        .IsRequired()
+                        .HasMaxLength(2)
+                        .HasColumnType("nchar(2)")
+                        .IsFixedLength()
+                        .HasComment("시장구분 (MART_TPCD) — 11유가/12코스닥/13K-OTC/14코넥스/50기타");
+
+                    b.Property<string>("Name")
+                        .IsRequired()
+                        .HasMaxLength(100)
+                        .HasColumnType("nvarchar(100)")
+                        .HasComment("종목명 (KOR_SECN_NM)");
+
+                    b.Property<string>("ShortCode")
+                        .IsRequired()
+                        .HasMaxLength(12)
+                        .HasColumnType("nvarchar(12)")
+                        .HasComment("단축코드 (SHOTN_ISIN)");
+
+                    b.Property<DateTime>("UpdatedAt")
+                        .HasColumnType("datetime2");
+
+                    b.HasKey("ID");
+
+                    b.HasIndex("IssucoCustno");
+
+                    b.HasIndex("Market", "ShortCode")
+                        .IsUnique();
+
+                    b.ToTable("SeibroIssuerCode", null, t =>
+                        {
+                            t.HasComment("SEIBro 시장별 단축코드↔발행회사번호 매핑 (getShotnByMart)");
+                        });
+                });
+
             modelBuilder.Entity("Domain.Entities.Stocks.SriBond", b =>
                 {
                     b.Property<long>("ID")
@@ -7198,6 +7537,11 @@ namespace Infrastructure.Persistence.Migrations
                         .HasMaxLength(200)
                         .HasColumnType("nvarchar(200)");
 
+                    b.Property<decimal?>("FaceValue")
+                        .HasPrecision(15, 4)
+                        .HasColumnType("decimal(15,4)")
+                        .HasComment("액면가 (SEIBro PVAL)");
+
                     b.Property<string>("ISIN")
                         .HasMaxLength(12)
                         .HasColumnType("nchar(12)")
@@ -7207,6 +7551,14 @@ namespace Infrastructure.Persistence.Migrations
                     b.Property<bool>("IsActive")
                         .HasColumnType("bit");
 
+                    b.Property<bool?>("IsElectronicSecurity")
+                        .HasColumnType("bit")
+                        .HasComment("전자증권 여부 (SEIBro ELTSC_YN)");
+
+                    b.Property<int?>("IssucoCustno")
+                        .HasColumnType("int")
+                        .HasComment("SEIBro 발행회사 고객번호 (ISSUCO_CUSTNO) — 기업정보 API 조인키");
+
                     b.Property<decimal?>("LastChangeRate")
                         .HasPrecision(7, 2)
                         .HasColumnType("decimal(7,2)");
@@ -7236,6 +7588,10 @@ namespace Infrastructure.Persistence.Migrations
                         .HasMaxLength(100)
                         .HasColumnType("nvarchar(100)");
 
+                    b.Property<long?>("TotalIssuedShares")
+                        .HasColumnType("bigint")
+                        .HasComment("총발행주식수 (SEIBro TOTAL_STK_CNT)");
+
                     b.Property<byte>("TradingStatus")
                         .HasColumnType("tinyint")
                         .HasComment("거래 상태 (0=정상, 1=거래정지, 2=관리종목)");
@@ -7243,6 +7599,11 @@ namespace Infrastructure.Persistence.Migrations
                     b.Property<DateTime?>("UpdatedAt")
                         .HasColumnType("datetime2");
 
+                    b.Property<decimal?>("VotingRights")
+                        .HasPrecision(5, 2)
+                        .HasColumnType("decimal(5,2)")
+                        .HasComment("1주당 의결권수 (SEIBro VOTRNO)");
+
                     b.HasKey("ID");
 
                     b.HasIndex("Code")
@@ -7254,6 +7615,8 @@ namespace Infrastructure.Persistence.Migrations
                         .IsUnique()
                         .HasFilter("[ISIN] IS NOT NULL");
 
+                    b.HasIndex("IssucoCustno");
+
                     b.HasIndex("Name");
 
                     b.HasIndex("Market", "IsActive");
@@ -10602,6 +10965,10 @@ namespace Infrastructure.Persistence.Migrations
                                 .HasColumnType("tinyint")
                                 .HasColumnName("Write_MediaUploadLimit");
 
+                            b1.Property<bool>("RequireImage")
+                                .HasColumnType("bit")
+                                .HasColumnName("Write_RequireImage");
+
                             b1.Property<bool>("RequiredPrefix")
                                 .HasColumnType("bit")
                                 .HasColumnName("Write_RequiredPrefix");
@@ -10665,6 +11032,17 @@ namespace Infrastructure.Persistence.Migrations
                     b.Navigation("Board");
                 });
 
+            modelBuilder.Entity("Domain.Entities.Forum.Briefings.DailyBriefing", b =>
+                {
+                    b.HasOne("Domain.Entities.Forum.Posts.Post", "Post")
+                        .WithMany()
+                        .HasForeignKey("PostID")
+                        .OnDelete(DeleteBehavior.Cascade)
+                        .IsRequired();
+
+                    b.Navigation("Post");
+                });
+
             modelBuilder.Entity("Domain.Entities.Forum.Comments.Comment", b =>
                 {
                     b.HasOne("Domain.Entities.Forum.Boards.Board", "Board")

+ 69 - 0
Infrastructure/StockData/SeibroDivInfoParser.cs

@@ -0,0 +1,69 @@
+namespace Infrastructure.StockData;
+
+/// <summary>
+/// SEIBro getDivInfo(배당분배금내역) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
+/// ⚠️ 응답엔 ISSUCO_CUSTNO 가 없다(샘플 확인) — 종목 조인은 ISIN 으로 한다.
+/// 자연키(ISIN, RGT_STD_DT) 가 없거나 비형식인 행은 건너뛴다. 소수/율은 콤마 제거 후 decimal, 날짜는 YYYYMMDD→DateOnly.
+/// 차등배당 4필드는 대부분 빈값(무차등) → null. TH1_PAY_TERM_BEGIN_DT 는 스펙·샘플 모두 존재하나 미제공 시 null 방어.
+/// </summary>
+public static class SeibroDivInfoParser
+{
+    public sealed record Row(
+        string Isin,
+        string KorSecnNm,
+        string? SecnKacdNm,
+        DateOnly RgtStdDt,
+        decimal? Pval,
+        decimal? StkAllocRatio,
+        decimal? CashAllocRatio,
+        decimal? CashAllocAmt,
+        decimal? MartpDivRate,
+        DateOnly? Th1PayTermBeginDt,
+        DateOnly? DeliDt,
+        bool? MajshrEtcDiffAllocYn,
+        bool? TstkNoagnYn,
+        decimal? CashDiffDiviAmt,
+        decimal? CashDiffDiviRate,
+        decimal? StkDiffDiviRate,
+        decimal? MartpDiffDiviRate
+    );
+
+    public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
+    {
+        var rows = new List<Row>();
+
+        foreach (var fields in envelope.Rows)
+        {
+            var isin = SeibroXml.GetOrNull(fields, "ISIN")?.Trim();
+            var korSecnNm = SeibroXml.GetOrNull(fields, "KOR_SECN_NM")?.Trim();
+            var rgtStdDt = SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "RGT_STD_DT"));
+
+            if (string.IsNullOrEmpty(isin) || string.IsNullOrEmpty(korSecnNm) || rgtStdDt is null)
+            {
+                continue;
+            }
+
+            rows.Add(new Row(
+                isin,
+                korSecnNm,
+                SeibroXml.GetOrNull(fields, "SECN_KACD_NM")?.Trim(),
+                rgtStdDt.Value,
+                SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "PVAL")),
+                SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "STK_ALOC_RATIO")),
+                SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "CASH_ALOC_RATIO")),
+                SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "CASH_ALOC_AMT")),
+                SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "MARTP_DIV_RATE")),
+                SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "TH1_PAY_TERM_BEGIN_DT")),
+                SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "DELI_DT")),
+                SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "MAJSHR_ETC_DIFF_ALOC_YN")),
+                SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "TSTK_NOAGN_YN")),
+                SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "CASH_DIFF_DIVIAMT_VAL")),
+                SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "CASH_DIFF_DIVI_RATE")),
+                SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "STK_DIFF_DIVI_RATE")),
+                SeibroFieldParse.Decimal(SeibroXml.GetOrNull(fields, "MARTP_DIFF_DIVI_RATE"))
+            ));
+        }
+
+        return rows;
+    }
+}

+ 59 - 0
Infrastructure/StockData/SeibroDivSchedulParser.cs

@@ -0,0 +1,59 @@
+namespace Infrastructure.StockData;
+
+/// <summary>
+/// SEIBro getDivSchedulInfo(배당일정) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
+/// 자연키(ISSUCO_CUSTNO, RGT_STD_DT, RGT_RSN_DTAIL_SORT_CD) 중 하나라도 없거나 회사번호 비숫자·기준일 비형식이면 건너뛴다.
+/// 날짜 필드는 YYYYMMDD→DateOnly (빈값 null), ELTSC_YN 은 Y/N→bool (그 외 null).
+/// </summary>
+public static class SeibroDivSchedulParser
+{
+    public sealed record Row(
+        int IssucoCustno,
+        string RepSecnNm,
+        string? RgtRacd,
+        string RgtRsnDetailSortCd,
+        DateOnly RgtStdDt,
+        string? AllocWhcd,
+        string? SetaccTpcd,
+        string? FixTpcd,
+        DateOnly? RostCloseBeginDt,
+        DateOnly? RostCloseExpryDt,
+        DateOnly? XrgtDt,
+        bool? IsElectronicSecurity
+    );
+
+    public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
+    {
+        var rows = new List<Row>();
+
+        foreach (var fields in envelope.Rows)
+        {
+            var custno = SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO"));
+            var repSecnNm = SeibroXml.GetOrNull(fields, "REP_SECN_NM")?.Trim();
+            var sortCd = SeibroXml.GetOrNull(fields, "RGT_RSN_DTAIL_SORT_CD")?.Trim();
+            var rgtStdDt = SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "RGT_STD_DT"));
+
+            if (custno is null || string.IsNullOrEmpty(repSecnNm) || string.IsNullOrEmpty(sortCd) || rgtStdDt is null)
+            {
+                continue;
+            }
+
+            rows.Add(new Row(
+                custno.Value,
+                repSecnNm,
+                SeibroXml.GetOrNull(fields, "RGT_RACD")?.Trim(),
+                sortCd,
+                rgtStdDt.Value,
+                SeibroXml.GetOrNull(fields, "ALOC_WHCD")?.Trim(),
+                SeibroXml.GetOrNull(fields, "SETACC_TPCD")?.Trim(),
+                SeibroXml.GetOrNull(fields, "FIX_TPCD")?.Trim(),
+                SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "ROST_CLOSE_BEGIN_DT")),
+                SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "ROST_CLOSE_EXPRY_DT")),
+                SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "XRGT_DT")),
+                SeibroFieldParse.Yn(SeibroXml.GetOrNull(fields, "ELTSC_YN"))
+            ));
+        }
+
+        return rows;
+    }
+}

+ 140 - 0
Infrastructure/StockData/SeibroDividendImport.cs

@@ -0,0 +1,140 @@
+using Application.Abstractions.Data;
+using Domain.Entities.Stocks;
+using Microsoft.EntityFrameworkCore;
+
+namespace Infrastructure.StockData;
+
+/// <summary>
+/// SeibroDividendSyncService 의 DB 반영 로직 분리 (테스트 가능) — HTTP 없이 파서 출력(fixture)으로 검증한다
+/// (SeibroIssuerImport 패턴 미러링). 세 엔티티(DividendSchedule/Dividend/RightsBaseDate) upsert 를 담당한다.
+/// </summary>
+public static class SeibroDividendImport
+{
+    /// <summary>
+    /// getDivSchedulInfo 결과를 DividendSchedule 로 upsert — UQ (IssucoCustno, RgtStdDt, RgtRsnDetailSortCd).
+    /// 한 번의 호출로 들어온 rows 를 한 트랜잭션으로 반영한다 (날짜 스윕: 그날 여러 회사·유형).
+    /// </summary>
+    public static async Task<(int Inserted, int Updated)> UpsertSchedulesAsync(IAppDbContext db, IReadOnlyList<SeibroDivSchedulParser.Row> rows, CancellationToken ct)
+    {
+        if (rows.Count == 0)
+        {
+            return (0, 0);
+        }
+
+        var custnos = rows.Select(c => c.IssucoCustno).Distinct().ToList();
+        var existing = await db.DividendSchedule.Where(c => custnos.Contains(c.IssucoCustno)).ToListAsync(ct);
+        var byKey = existing.ToDictionary(c => (c.IssucoCustno, c.RgtStdDt, c.RgtRsnDetailSortCd));
+        var inserted = 0;
+        var updated = 0;
+
+        foreach (var row in rows)
+        {
+            var key = (row.IssucoCustno, row.RgtStdDt, row.RgtRsnDetailSortCd);
+
+            if (byKey.TryGetValue(key, out var entity))
+            {
+                var was = entity.UpdatedAt;
+                entity.Update(row.RepSecnNm, row.RgtRacd, row.AllocWhcd, row.SetaccTpcd, row.FixTpcd, row.RostCloseBeginDt, row.RostCloseExpryDt, row.XrgtDt, row.IsElectronicSecurity);
+                if (entity.UpdatedAt != was)
+                {
+                    updated++;
+                }
+            }
+            else
+            {
+                var created = DividendSchedule.Create(row.IssucoCustno, row.RepSecnNm, row.RgtRacd, row.RgtRsnDetailSortCd, row.RgtStdDt, row.AllocWhcd, row.SetaccTpcd, row.FixTpcd, row.RostCloseBeginDt, row.RostCloseExpryDt, row.XrgtDt, row.IsElectronicSecurity);
+                await db.DividendSchedule.AddAsync(created, ct);
+                byKey[key] = created;
+                inserted++;
+            }
+        }
+
+        await db.SaveChangesAsync(ct);
+        return (inserted, updated);
+    }
+
+    /// <summary>
+    /// getDivInfo 결과를 Dividend 로 upsert — UQ (Isin, RgtStdDt). rows 는 한 회사(회사번호) 3년치 배당 이력.
+    /// </summary>
+    public static async Task<(int Inserted, int Updated)> UpsertDividendsAsync(IAppDbContext db, IReadOnlyList<SeibroDivInfoParser.Row> rows, CancellationToken ct)
+    {
+        if (rows.Count == 0)
+        {
+            return (0, 0);
+        }
+
+        var isins = rows.Select(c => c.Isin).Distinct().ToList();
+        var existing = await db.Dividend.Where(c => isins.Contains(c.Isin)).ToListAsync(ct);
+        var byKey = existing.ToDictionary(c => (c.Isin, c.RgtStdDt));
+        var inserted = 0;
+        var updated = 0;
+
+        foreach (var row in rows)
+        {
+            var key = (row.Isin, row.RgtStdDt);
+
+            if (byKey.TryGetValue(key, out var entity))
+            {
+                var was = entity.UpdatedAt;
+                entity.Update(row.KorSecnNm, row.SecnKacdNm, row.Pval, row.StkAllocRatio, row.CashAllocRatio, row.CashAllocAmt, row.MartpDivRate, row.Th1PayTermBeginDt, row.DeliDt, row.MajshrEtcDiffAllocYn, row.TstkNoagnYn, row.CashDiffDiviAmt, row.CashDiffDiviRate, row.StkDiffDiviRate, row.MartpDiffDiviRate);
+                if (entity.UpdatedAt != was)
+                {
+                    updated++;
+                }
+            }
+            else
+            {
+                var created = Dividend.Create(row.Isin, row.KorSecnNm, row.SecnKacdNm, row.RgtStdDt, row.Pval, row.StkAllocRatio, row.CashAllocRatio, row.CashAllocAmt, row.MartpDivRate, row.Th1PayTermBeginDt, row.DeliDt, row.MajshrEtcDiffAllocYn, row.TstkNoagnYn, row.CashDiffDiviAmt, row.CashDiffDiviRate, row.StkDiffDiviRate, row.MartpDiffDiviRate);
+                await db.Dividend.AddAsync(created, ct);
+                byKey[key] = created;
+                inserted++;
+            }
+        }
+
+        await db.SaveChangesAsync(ct);
+        return (inserted, updated);
+    }
+
+    /// <summary>
+    /// getStddtInfo 결과를 RightsBaseDate 로 upsert — UQ (IssucoCustno, RgtStdDt, RgtRacd, RgtRsnDetailSortCd).
+    /// rows 는 한 회사 3년치 권리기준일.
+    /// </summary>
+    public static async Task<(int Inserted, int Updated)> UpsertRightsBaseDatesAsync(IAppDbContext db, IReadOnlyList<SeibroStddtParser.Row> rows, CancellationToken ct)
+    {
+        if (rows.Count == 0)
+        {
+            return (0, 0);
+        }
+
+        var custnos = rows.Select(c => c.IssucoCustno).Distinct().ToList();
+        var existing = await db.RightsBaseDate.Where(c => custnos.Contains(c.IssucoCustno)).ToListAsync(ct);
+        var byKey = existing.ToDictionary(c => (c.IssucoCustno, c.RgtStdDt, c.RgtRacd, c.RgtRsnDetailSortCd));
+        var inserted = 0;
+        var updated = 0;
+
+        foreach (var row in rows)
+        {
+            var key = (row.IssucoCustno, row.RgtStdDt, row.RgtRacd, row.RgtRsnDetailSortCd);
+
+            if (byKey.TryGetValue(key, out var entity))
+            {
+                var was = entity.UpdatedAt;
+                entity.Update(row.RepSecnNm, row.RgtRacdNm);
+                if (entity.UpdatedAt != was)
+                {
+                    updated++;
+                }
+            }
+            else
+            {
+                var created = RightsBaseDate.Create(row.IssucoCustno, row.RepSecnNm, row.RgtStdDt, row.RgtRacd, row.RgtRacdNm, row.RgtRsnDetailSortCd);
+                await db.RightsBaseDate.AddAsync(created, ct);
+                byKey[key] = created;
+                inserted++;
+            }
+        }
+
+        await db.SaveChangesAsync(ct);
+        return (inserted, updated);
+    }
+}

+ 221 - 0
Infrastructure/StockData/SeibroDividendSyncService.cs

@@ -0,0 +1,221 @@
+using Application.Abstractions.Data;
+using Application.Helpers;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+using SharedKernel;
+
+namespace Infrastructure.StockData;
+
+/// <summary>
+/// SEIBro 배당·권리 수집 (Wave 1 ★P0) — 기본 06:40 KST(IssuerSync 06:30 다음 슬롯), `Seibro:DividendSync` 게이트.
+/// 세 단계가 하나의 기업(Corp) 카테고리 예산(SeibroQuota, Seibro:CorpBudget)을 공유한다.
+///
+/// a) DividendSchedule 날짜 스윕: getDivSchedulInfo(BEGIN_STD_DT=day, EXPRY 생략 → 그날만, custno 미지정 → 전체 회사).
+///    3년 창을 최신일→과거로 훑으며 미적재일만 수집한다.
+///    ⚠️ 날짜 스윕에 KrxBackfill(영업일·휴장 스킵)을 쓰지 않는다 — 배당 권리기준일 상당수가 분기말/연말(0331·0630·0930·1231)이며
+///    이 날짜가 토·일(예: 20161231 토, 20180331 토, 20180630 토)인 경우가 실제 샘플에 존재한다. 영업일만 훑으면 이런 기준일을 통째로 놓친다.
+///    → 주말·휴장 포함 전 캘린더일을 훑는다(3년 ≈ 1,095콜, Corp 예산 40,000 내 충분).
+/// b) Dividend rolling: 대상 = DividendSchedule 에 등장한 DISTINCT IssucoCustno 중 Dividend 미수집(우선)·stale 순.
+///    getDivInfo(ISSUCO_CUSTNO, BEGIN_STD_DT=3년전, EXPRY_STD_DT=오늘) 1콜 → 여러 배당 반환 → Dividend upsert(Isin+RgtStdDt).
+///    getDivInfo 응답엔 ISSUCO_CUSTNO 가 없으므로(샘플 확인) Isin 으로만 upsert 한다.
+/// c) RightsBaseDate rolling: 대상 = Stock.IssucoCustno non-null 중 RightsBaseDate 미수집(우선)·stale 순.
+///    getStddtInfo(ISSUCO_CUSTNO, BEGIN_STD_DT=3년전, EXPRY_STD_DT=오늘) → RightsBaseDate upsert.
+///
+/// 실패/0행 = 정상 빈결과(다음 실행 재시도). HTTP·파싱 오류 = 경고 + false(RetryDelay 후 재시도).
+/// quota 소진 = 정상 종료(true) — 일일 예산은 KST 자정 롤오버로만 회복. ApiKey 미설정 시 로그만 남기고 skip.
+/// </summary>
+internal sealed class SeibroDividendSyncService(
+    IServiceScopeFactory scopeFactory,
+    IHttpClientFactory httpClientFactory,
+    SeibroQuota quota,
+    IOptions<AppSettings> settings,
+    ILogger<SeibroDividendSyncService> logger
+) : DailyScheduledService(logger)
+{
+    protected override string JobName => "SeibroDividendSync";
+
+    protected override TimeOnly TargetTime => ParseTime(settings.Value.Seibro.DividendSyncTime, new TimeOnly(6, 40));
+
+    protected override int MaxRetryCount => 2;
+
+    protected override TimeSpan RetryDelay => TimeSpan.FromHours(2);
+
+    protected override async Task<bool> RunOnceAsync(DateOnly todayKst, CancellationToken ct)
+    {
+        var cfg = settings.Value.Seibro;
+        if (string.IsNullOrWhiteSpace(cfg.ApiKey))
+        {
+            Logger.LogWarning("[{Job}] Seibro:ApiKey 미설정 — 수집 skip", JobName);
+            return true;
+        }
+
+        using var scope = scopeFactory.CreateScope();
+        var db = scope.ServiceProvider.GetRequiredService<IAppDbContext>();
+        var client = httpClientFactory.CreateClient(SeibroHttp.ClientName);
+
+        var years = cfg.BackfillYears > 0 ? cfg.BackfillYears : 3;
+        var startDate = todayKst.AddYears(-years);
+
+        try
+        {
+            if (!await SweepSchedulesAsync(db, client, cfg, startDate, todayKst, ct))
+            {
+                return true; // quota 소진 — 오늘은 더 진행 불가 (정상 종료)
+            }
+
+            if (!await RollDividendsAsync(db, client, cfg, startDate, todayKst, ct))
+            {
+                return true;
+            }
+
+            await RollRightsBaseDatesAsync(db, client, cfg, startDate, todayKst, ct);
+            return true;
+        }
+        catch (Exception ex) when (ex is HttpRequestException or System.Xml.XmlException or FormatException)
+        {
+            Logger.LogWarning(ex, "[{Job}] SEIBro 호출/파싱 실패 — run 중단, {Delay} 후 재시도 (최대 {Max}회)", JobName, RetryDelay, MaxRetryCount);
+            return false;
+        }
+    }
+
+    /// <summary>a) getDivSchedulInfo 날짜 스윕 (전 캘린더일, 최신일→과거) — 미적재일만 수집. quota 소진 시 false.</summary>
+    private async Task<bool> SweepSchedulesAsync(IAppDbContext db, HttpClient client, AppSettings.SeibroSection cfg, DateOnly startDate, DateOnly today, CancellationToken ct)
+    {
+        var fetched = 0;
+        var first = true;
+
+        for (var day = today; day >= startDate; day = day.AddDays(-1))
+        {
+            ct.ThrowIfCancellationRequested();
+
+            if (await db.DividendSchedule.AsNoTracking().AnyAsync(c => c.RgtStdDt == day, ct))
+            {
+                continue; // 이미 적재된 날 — resumable
+            }
+
+            if (!quota.TryConsume(SeibroCategory.Corp, 1, cfg.CorpBudget))
+            {
+                Logger.LogWarning("[{Job}] 기업 카테고리 일일 예산({Budget}) 소진 — getDivSchedulInfo {Day} 부터 중단", JobName, cfg.CorpBudget, day);
+                return false;
+            }
+
+            if (!first && cfg.DelayMs > 0)
+            {
+                await Task.Delay(cfg.DelayMs, ct);
+            }
+
+            first = false;
+
+            var xml = await SeibroHttp.GetStringWithRetryAsync(client, cfg.BaseUrl, cfg.ApiKey, "getDivSchedulInfo", [new("BEGIN_STD_DT", day.ToString("yyyyMMdd"))], Logger, ct);
+            var rows = SeibroDivSchedulParser.Parse(SeibroXml.Parse(xml));
+            var (inserted, updated) = await SeibroDividendImport.UpsertSchedulesAsync(db, rows, ct);
+
+            Logger.LogInformation("[{Job}] getDivSchedulInfo {Day} rows={Rows} — inserted={Inserted}, updated={Updated}", JobName, day, rows.Count, inserted, updated);
+            fetched++;
+        }
+
+        Logger.LogInformation("[{Job}] 배당일정 스윕 완료 — 창=[{Start}~{End}], fetch={Fetched}일", JobName, startDate, today, fetched);
+        return true;
+    }
+
+    /// <summary>b) getDivInfo rolling — DividendSchedule 에 등장한 회사번호 중 미수집·stale 우선. quota 잔여분 내. 예산 소진 시 false.</summary>
+    private async Task<bool> RollDividendsAsync(IAppDbContext db, HttpClient client, AppSettings.SeibroSection cfg, DateOnly startDate, DateOnly today, CancellationToken ct)
+    {
+        var scheduleCustnos = await db.DividendSchedule.AsNoTracking().Select(c => c.IssucoCustno).Distinct().ToListAsync(ct);
+
+        if (scheduleCustnos.Count == 0)
+        {
+            Logger.LogInformation("[{Job}] getDivInfo 대상 없음 (DividendSchedule 비어 있음)", JobName);
+            return true;
+        }
+
+        // 회사번호 → 해당 회사 ISIN 들의 Dividend 최신 UpdatedAt (미수집이면 null → 최우선)
+        var custnoIsins = await db.Stock.AsNoTracking().Where(c => c.IssucoCustno != null && c.ISIN != null)
+            .Select(c => new { Custno = c.IssucoCustno!.Value, c.ISIN })
+            .ToListAsync(ct);
+        var isinsByCustno = custnoIsins.GroupBy(c => c.Custno).ToDictionary(g => g.Key, g => g.Select(c => c.ISIN!).ToList());
+
+        var dividendUpdatedByIsin = await db.Dividend.AsNoTracking().GroupBy(c => c.Isin).Select(g => new { Isin = g.Key, Last = g.Max(c => c.UpdatedAt) }).ToDictionaryAsync(c => c.Isin, c => c.Last, ct);
+
+        var targets = scheduleCustnos.Select(custno => {
+            DateTime? last = null;
+            if (isinsByCustno.TryGetValue(custno, out var isins))
+            {
+                var times = isins.Where(dividendUpdatedByIsin.ContainsKey).Select(i => dividendUpdatedByIsin[i]).ToList();
+                // 회사의 모든 ISIN 이 최소 1회 수집됐을 때만 stale(가장 오래된 시각) 로 본다 — 하나라도 미수집이면 미수집(null=최우선)
+                last = isins.Count > 0 && times.Count == isins.Count ? times.Min() : null;
+            }
+
+            return (Key: custno, LastUpdatedAt: last);
+        }).ToList();
+
+        var maxPerRun = quota.Remaining(SeibroCategory.Corp, cfg.CorpBudget);
+        var beginStr = startDate.ToString("yyyyMMdd");
+        var expiryStr = today.ToString("yyyyMMdd");
+        var quotaExhausted = false;
+
+        var processed = await SeibroRollingSweep.RunAsync(
+            targets: targets,
+            fetchAndUpsert: async (custno, token) => {
+                if (!quota.TryConsume(SeibroCategory.Corp, 1, cfg.CorpBudget))
+                {
+                    quotaExhausted = true;
+                    return;
+                }
+
+                var xml = await SeibroHttp.GetStringWithRetryAsync(client, cfg.BaseUrl, cfg.ApiKey, "getDivInfo", [new("ISSUCO_CUSTNO", custno.ToString()), new("BEGIN_STD_DT", beginStr), new("EXPRY_STD_DT", expiryStr)], Logger, token);
+                var rows = SeibroDivInfoParser.Parse(SeibroXml.Parse(xml));
+                var (inserted, updated) = await SeibroDividendImport.UpsertDividendsAsync(db, rows, token);
+
+                Logger.LogInformation("[{Job}] getDivInfo ISSUCO_CUSTNO={Custno} rows={Rows} — inserted={Inserted}, updated={Updated}", JobName, custno, rows.Count, inserted, updated);
+            },
+            maxPerRun: maxPerRun,
+            delayMs: cfg.DelayMs,
+            ct: ct);
+
+        Logger.LogInformation("[{Job}] getDivInfo rolling 완료 — 대상={Targets}, 호출={Processed} (maxPerRun={Max})", JobName, targets.Count, processed, maxPerRun);
+        return !quotaExhausted;
+    }
+
+    /// <summary>c) getStddtInfo rolling — Stock.IssucoCustno non-null 중 미수집·stale 우선. quota 잔여분 내.</summary>
+    private async Task RollRightsBaseDatesAsync(IAppDbContext db, HttpClient client, AppSettings.SeibroSection cfg, DateOnly startDate, DateOnly today, CancellationToken ct)
+    {
+        var custnos = await db.Stock.AsNoTracking().Where(c => c.IssucoCustno != null).Select(c => c.IssucoCustno!.Value).Distinct().ToListAsync(ct);
+
+        if (custnos.Count == 0)
+        {
+            Logger.LogInformation("[{Job}] getStddtInfo 대상 없음 (Stock.IssucoCustno 미스탬핑)", JobName);
+            return;
+        }
+
+        var lastByCustno = await db.RightsBaseDate.AsNoTracking().GroupBy(c => c.IssucoCustno).Select(g => new { Custno = g.Key, Last = g.Max(c => c.UpdatedAt) }).ToDictionaryAsync(c => c.Custno, c => c.Last, ct);
+
+        var targets = custnos.Select(custno => (Key: custno, LastUpdatedAt: lastByCustno.TryGetValue(custno, out var last) ? (DateTime?)last : null)).ToList();
+
+        var maxPerRun = quota.Remaining(SeibroCategory.Corp, cfg.CorpBudget);
+        var beginStr = startDate.ToString("yyyyMMdd");
+        var expiryStr = today.ToString("yyyyMMdd");
+
+        var processed = await SeibroRollingSweep.RunAsync(
+            targets: targets,
+            fetchAndUpsert: async (custno, token) => {
+                if (!quota.TryConsume(SeibroCategory.Corp, 1, cfg.CorpBudget))
+                {
+                    return;
+                }
+
+                var xml = await SeibroHttp.GetStringWithRetryAsync(client, cfg.BaseUrl, cfg.ApiKey, "getStddtInfo", [new("ISSUCO_CUSTNO", custno.ToString()), new("BEGIN_STD_DT", beginStr), new("EXPRY_STD_DT", expiryStr)], Logger, token);
+                var rows = SeibroStddtParser.Parse(SeibroXml.Parse(xml));
+                var (inserted, updated) = await SeibroDividendImport.UpsertRightsBaseDatesAsync(db, rows, token);
+
+                Logger.LogInformation("[{Job}] getStddtInfo ISSUCO_CUSTNO={Custno} rows={Rows} — inserted={Inserted}, updated={Updated}", JobName, custno, rows.Count, inserted, updated);
+            },
+            maxPerRun: maxPerRun,
+            delayMs: cfg.DelayMs,
+            ct: ct);
+
+        Logger.LogInformation("[{Job}] getStddtInfo rolling 완료 — 대상={Targets}, 호출={Processed} (maxPerRun={Max})", JobName, targets.Count, processed, maxPerRun);
+    }
+}

+ 55 - 0
Infrastructure/StockData/SeibroFieldParse.cs

@@ -0,0 +1,55 @@
+using System.Globalization;
+
+namespace Infrastructure.StockData;
+
+/// <summary>
+/// SEIBro 파서 공용 필드 변환 헬퍼 — 순수 C#. YYYYMMDD→DateOnly, 콤마 포함 숫자→decimal/long/int, Y/N→bool.
+/// 값 없음/""/비형식 = null (SeibroXml 이 빈 value 를 이미 키 제외 처리하므로 여기 들어오는 raw 는 대개 비어있지 않지만 방어적으로 처리).
+/// Wave 0 파서들(SeibroStkStatParser 등)의 로컬 헬퍼와 동일 규칙을 한 곳에 모아 Wave 1+ 파서가 재사용한다.
+/// </summary>
+internal static class SeibroFieldParse
+{
+    /// <summary>YYYYMMDD 8자리 → DateOnly. 그 외(빈값/형식 불일치)는 null.</summary>
+    public static DateOnly? Date(string? raw)
+    {
+        var value = raw?.Trim();
+
+        if (string.IsNullOrEmpty(value) || value.Length != 8)
+        {
+            return null;
+        }
+
+        return DateOnly.TryParseExact(value, "yyyyMMdd", CultureInfo.InvariantCulture, DateTimeStyles.None, out var date) ? date : null;
+    }
+
+    /// <summary>콤마 제거 후 decimal. 빈값/비숫자는 null (0 과 구분).</summary>
+    public static decimal? Decimal(string? raw)
+    {
+        var value = raw?.Replace(",", string.Empty, StringComparison.Ordinal);
+        return decimal.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out var parsed) ? parsed : null;
+    }
+
+    public static int? Int(string? raw)
+    {
+        var value = raw?.Replace(",", string.Empty, StringComparison.Ordinal);
+        return int.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var parsed) ? parsed : null;
+    }
+
+    /// <summary>NUMBER(15,4) 등 소수 표기 정수 → long (decimal 로 읽고 절사). 빈값/비숫자는 null.</summary>
+    public static long? Long(string? raw)
+    {
+        var value = raw?.Replace(",", string.Empty, StringComparison.Ordinal);
+        return decimal.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out var parsed) ? (long)parsed : null;
+    }
+
+    /// <summary>Y→true, N→false, 그 외(빈값/미제공)→null.</summary>
+    public static bool? Yn(string? raw)
+    {
+        return raw?.Trim().ToUpperInvariant() switch
+        {
+            "Y" => true,
+            "N" => false,
+            _ => null
+        };
+    }
+}

+ 99 - 0
Infrastructure/StockData/SeibroHttp.cs

@@ -0,0 +1,99 @@
+using System.Text;
+using Microsoft.Extensions.Logging;
+
+namespace Infrastructure.StockData;
+
+/// <summary>
+/// SEIBro OpenAPI(seibro.or.kr/OpenPlatform/callOpenAPI.jsp) 호출 공통 — query param key 인증 + 간단 3회 재시도 (2s/4s 백오프).
+/// GET {BaseUrl}?key={ApiKey}&amp;apiId={apiId}&amp;params={K:V,K2:V2}
+///  • params 는 콜론(:)/콤마(,) 구분 단일 문자열 — SEIBro 비표준 규격이라 구분자(콜론·콤마)는 raw 로 보내고,
+///    키·값만 개별 Uri.EscapeDataString 처리한다. 근거: KRX(KrxCoKrHttp)는 값이 전부 코드/날짜라 raw 조립이지만
+///    SEIBro 도 값이 코드/날짜/ISIN 이라 escape 는 사실상 no-op — 다만 향후 예약문자(&amp; 공백 등)가 값에 들어와도
+///    query 가 깨지지 않도록 방어한다. 구분자까지 escape 하면(%3A/%2C) SEIBro 가 params 를 못 읽으므로 절대 금지 (docs/SEIBro/readme.md §1).
+///  • https 연결 실패(재시도 소진) 시 http 로 1회 fallback — SEIBro 가이드 원문이 http 엔드포인트라 환경에 따라 https 미지원 가능성 대비.
+///  • 응답 Content-Type charset 감지 디코딩 — EUC-KR 가능성 대비 CodePagesEncodingProvider 등록
+///    (.NET 에서 euc-kr 등 코드페이지 인코딩은 기본 미등록 — System.Text.Encoding.CodePages 는 shared framework 포함).
+///  • 로그에 인증 key 는 절대 남기지 않는다 — apiId·params 만 기록 (KrxCoKrHttp 의 key 비로깅 정책과 동일).
+/// </summary>
+internal static class SeibroHttp
+{
+    public const string ClientName = "Seibro";
+
+    private const int MaxAttempts = 3;
+
+    static SeibroHttp()
+    {
+        // euc-kr/ks_c_5601-1987 등 한국어 코드페이지 디코딩 지원 (idempotent)
+        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
+    }
+
+    /// <summary>호출 URL 조립 — key 는 마지막에 붙여 로그용 문자열과 분리하기 쉽게 한다. 값 단위 escape, 구분자 raw.</summary>
+    public static string BuildParams(IReadOnlyList<KeyValuePair<string, string>> parameters)
+    {
+        return string.Join(',', parameters.Select(c => $"{Uri.EscapeDataString(c.Key)}:{Uri.EscapeDataString(c.Value)}"));
+    }
+
+    public static async Task<string> GetStringWithRetryAsync(HttpClient client, string baseUrl, string apiKey, string apiId, IReadOnlyList<KeyValuePair<string, string>> parameters, ILogger logger, CancellationToken ct)
+    {
+        var paramString = BuildParams(parameters);
+        var url = $"{baseUrl}?key={Uri.EscapeDataString(apiKey)}&apiId={Uri.EscapeDataString(apiId)}&params={paramString}";
+
+        try
+        {
+            return await GetWithRetryAsync(client, url, apiId, paramString, logger, ct);
+        }
+        catch (HttpRequestException ex) when (url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
+        {
+            // https 연결 불가 → http 로 1회 fallback (공개 데이터 + 재시도 소진 후 최후 수단)
+            var httpUrl = string.Concat("http://", url.AsSpan("https://".Length));
+            logger.LogWarning(ex, "[Seibro] https 실패 — http fallback 1회 시도 (apiId={ApiId}, params={Params})", apiId, paramString);
+
+            using var request = new HttpRequestMessage(HttpMethod.Get, httpUrl);
+            using var response = await client.SendAsync(request, ct);
+            response.EnsureSuccessStatusCode();
+            return await ReadContentAsync(response, logger, ct);
+        }
+    }
+
+    private static async Task<string> GetWithRetryAsync(HttpClient client, string url, string apiId, string paramString, ILogger logger, CancellationToken ct)
+    {
+        for (var attempt = 1; ; attempt++)
+        {
+            try
+            {
+                using var request = new HttpRequestMessage(HttpMethod.Get, url);
+                using var response = await client.SendAsync(request, ct);
+                response.EnsureSuccessStatusCode();
+                return await ReadContentAsync(response, logger, ct);
+            }
+            catch (Exception ex) when (ex is not OperationCanceledException && attempt < MaxAttempts)
+            {
+                // key 마스킹: URL 대신 apiId/params 만 로깅
+                logger.LogWarning(ex, "[Seibro] HTTP 실패 — 재시도 {Attempt}/{Max} (apiId={ApiId}, params={Params})", attempt, MaxAttempts, apiId, paramString);
+                await Task.Delay(TimeSpan.FromSeconds(2 * attempt), ct);
+            }
+        }
+    }
+
+    /// <summary>Content-Type charset 감지 디코딩 — charset 미표기/미지원이면 UTF-8 (샘플 실응답 기준 기본값)</summary>
+    private static async Task<string> ReadContentAsync(HttpResponseMessage response, ILogger logger, CancellationToken ct)
+    {
+        var bytes = await response.Content.ReadAsByteArrayAsync(ct);
+        var charset = response.Content.Headers.ContentType?.CharSet?.Trim('"', '\'');
+        var encoding = Encoding.UTF8;
+
+        if (!string.IsNullOrWhiteSpace(charset))
+        {
+            try
+            {
+                encoding = Encoding.GetEncoding(charset);
+            }
+            catch (ArgumentException)
+            {
+                logger.LogWarning("[Seibro] 미지원 charset '{Charset}' — UTF-8 로 디코딩", charset);
+            }
+        }
+
+        return encoding.GetString(bytes);
+    }
+}

+ 31 - 0
Infrastructure/StockData/SeibroIssucoCustnoParser.cs

@@ -0,0 +1,31 @@
+using System.Globalization;
+
+namespace Infrastructure.StockData;
+
+/// <summary>
+/// SEIBro getIssucoCustnoByIsin(발행종목→발행회사번호 조회) 응답 파서 — 순수 C#.
+/// 단건 fallback 용 (배치 미사용) — getShotnByMart 스냅샷에 없는 종목의 ISSUCO_CUSTNO 를 ISIN/단축코드로 개별 조회할 때 쓴다.
+/// 행 필드: ISSUCO_CUSTNO(발행회사번호, 필수) / REP_SECN_NM(대표종목명, 선택). 회사번호 없는/비숫자 행은 건너뛴다.
+/// </summary>
+public static class SeibroIssucoCustnoParser
+{
+    /// <summary>발행회사번호 1행</summary>
+    public sealed record Row(int IssucoCustno, string? RepSecnName);
+
+    public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
+    {
+        var rows = new List<Row>();
+
+        foreach (var fields in envelope.Rows)
+        {
+            if (!int.TryParse(SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO"), NumberStyles.Integer, CultureInfo.InvariantCulture, out var custno))
+            {
+                continue;
+            }
+
+            rows.Add(new Row(custno, SeibroXml.GetOrNull(fields, "REP_SECN_NM")?.Trim()));
+        }
+
+        return rows;
+    }
+}

+ 71 - 0
Infrastructure/StockData/SeibroIssuerImport.cs

@@ -0,0 +1,71 @@
+using Application.Abstractions.Data;
+using Domain.Entities.Stocks;
+using Microsoft.EntityFrameworkCore;
+
+namespace Infrastructure.StockData;
+
+/// <summary>
+/// SeibroIssuerSyncService 의 DB 반영 로직 분리 (테스트 가능) — HTTP 없이 파서 출력(fixture)으로 검증한다
+/// (KRX 테스트들이 파서/로직을 분리 검증하는 방식 미러링).
+/// </summary>
+public static class SeibroIssuerImport
+{
+    /// <summary>
+    /// getShotnByMart 결과를 SeibroIssuerCode 로 upsert — UQ (Market, ShortCode) 기준.
+    /// 동일 단축코드 중복 행은 마지막 행 우선. 무변경 행은 no-op (UpdatedAt 미갱신).
+    /// </summary>
+    public static async Task<(int Inserted, int Updated)> UpsertIssuerCodesAsync(IAppDbContext db, string market, IReadOnlyList<SeibroShotnByMartParser.Row> rows, CancellationToken ct)
+    {
+        var existing = await db.SeibroIssuerCode.Where(c => c.Market == market).ToListAsync(ct);
+        var byShortCode = existing.ToDictionary(c => c.ShortCode);
+        var inserted = 0;
+        var updated = 0;
+
+        foreach (var row in rows)
+        {
+            if (byShortCode.TryGetValue(row.ShortCode, out var code))
+            {
+                var was = code.UpdatedAt;
+                code.Update(row.Name, row.IssucoCustno);
+                if (code.UpdatedAt != was)
+                {
+                    updated++;
+                }
+            }
+            else
+            {
+                var created = SeibroIssuerCode.Create(market, row.ShortCode, row.Name, row.IssucoCustno);
+                await db.SeibroIssuerCode.AddAsync(created, ct);
+                byShortCode[row.ShortCode] = created;
+                inserted++;
+            }
+        }
+
+        await db.SaveChangesAsync(ct);
+        return (inserted, updated);
+    }
+
+    /// <summary>
+    /// Stock.IssucoCustno 스탬핑 — Stock.Code = 단축코드 조인. 이미 같은 값이면 무변경. 반환 = 실제 스탬핑된 종목 수.
+    /// KRX Stock 은 KOSPI/KOSDAQ/KONEX 만 커버하므로 K-OTC(13) 등 미커버 시장 코드는 자연히 매칭되지 않는다.
+    /// </summary>
+    public static async Task<int> StampStockIssucoCustnoAsync(IAppDbContext db, IReadOnlyDictionary<string, int> custnoByShortCode, CancellationToken ct)
+    {
+        var stocks = await db.Stock.ToListAsync(ct);
+        var stamped = 0;
+
+        foreach (var stock in stocks)
+        {
+            if (!custnoByShortCode.TryGetValue(stock.Code, out var custno) || stock.IssucoCustno == custno)
+            {
+                continue;
+            }
+
+            stock.SetIssucoCustno(custno);
+            stamped++;
+        }
+
+        await db.SaveChangesAsync(ct);
+        return stamped;
+    }
+}

+ 154 - 0
Infrastructure/StockData/SeibroIssuerSyncService.cs

@@ -0,0 +1,154 @@
+using Application.Abstractions.Data;
+using Application.Helpers;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Options;
+using SharedKernel;
+
+namespace Infrastructure.StockData;
+
+/// <summary>
+/// SEIBro 발행회사번호(ISSUCO_CUSTNO) 조인키 부트스트랩 + 종목 보강 (Wave 0) — 기본 06:30 KST, `Seibro:IssuerSync` 게이트.
+/// a) getShotnByMart × MART_TPCD {11,12,13,14} (주식 예산 4콜) → SeibroIssuerCode upsert(UQ Market+ShortCode)
+///    → Stock.IssucoCustno 스탬핑 (Code=단축코드 조인, 이미 같은 값이면 무변경)
+/// b) getStkStatInfo per-키 rolling — IssucoCustno 는 있는데 FaceValue 가 null 인 활성 Stock 우선(미보강 우선),
+///    SeibroRollingSweep + SeibroQuota(Stock 카테고리) 상한 내 SHOTN_ISIN 단건 호출 → Stock.EnrichFromSeibro.
+///    resultCount=0 은 정상 빈 결과(해당 종목만 미보강 유지 — 다음 실행에서 재시도), 종목별 SaveChanges 로 중단 시에도 진행분 보존.
+/// 실패 처리: HTTP·파싱 오류는 경고 로그 + 해당 run 중단(false 반환) → DailyScheduledService 가 RetryDelay 후 재시도.
+/// quota 소진은 정상 종료(true) — 일일 예산은 KST 자정 롤오버로만 회복되므로 재시도가 무의미하다.
+/// ApiKey 미설정 시 로그만 남기고 skip (다른 수집 배치와 동일 정책).
+/// </summary>
+internal sealed class SeibroIssuerSyncService(
+    IServiceScopeFactory scopeFactory,
+    IHttpClientFactory httpClientFactory,
+    SeibroQuota quota,
+    IOptions<AppSettings> settings,
+    ILogger<SeibroIssuerSyncService> logger
+) : DailyScheduledService(logger)
+{
+    // 시장구분(MART_TPCD) — [11]유가 [12]코스닥 [13]K-OTC [14]코넥스. K-OTC 는 KRX Stock 미커버 시장의 유일 마스터.
+    private static readonly string[] Markets = ["11", "12", "13", "14"];
+
+    protected override string JobName => "SeibroIssuerSync";
+
+    protected override TimeOnly TargetTime => ParseTime(settings.Value.Seibro.IssuerSyncTime, new TimeOnly(6, 30));
+
+    protected override int MaxRetryCount => 2;
+
+    protected override TimeSpan RetryDelay => TimeSpan.FromHours(2);
+
+    protected override async Task<bool> RunOnceAsync(DateOnly todayKst, CancellationToken ct)
+    {
+        var cfg = settings.Value.Seibro;
+        if (string.IsNullOrWhiteSpace(cfg.ApiKey))
+        {
+            Logger.LogWarning("[{Job}] Seibro:ApiKey 미설정 — 수집 skip", JobName);
+            return true;
+        }
+
+        using var scope = scopeFactory.CreateScope();
+        var db = scope.ServiceProvider.GetRequiredService<IAppDbContext>();
+        var client = httpClientFactory.CreateClient(SeibroHttp.ClientName);
+
+        try
+        {
+            if (!await SyncIssuerCodesAsync(db, client, cfg, ct))
+            {
+                return true; // quota 소진 — 오늘은 더 진행 불가 (정상 종료)
+            }
+
+            await EnrichStocksAsync(db, client, cfg, ct);
+            return true;
+        }
+        catch (Exception ex) when (ex is HttpRequestException or System.Xml.XmlException or FormatException)
+        {
+            Logger.LogWarning(ex, "[{Job}] SEIBro 호출/파싱 실패 — run 중단, {Delay} 후 재시도 (최대 {Max}회)", JobName, RetryDelay, MaxRetryCount);
+            return false;
+        }
+    }
+
+    /// <summary>a) 시장별 단축코드 스냅샷 4콜 → SeibroIssuerCode upsert + Stock.IssucoCustno 스탬핑. quota 소진 시 false.</summary>
+    private async Task<bool> SyncIssuerCodesAsync(IAppDbContext db, HttpClient client, AppSettings.SeibroSection cfg, CancellationToken ct)
+    {
+        var custnoByShortCode = new Dictionary<string, int>();
+        var first = true;
+
+        foreach (var market in Markets)
+        {
+            if (!quota.TryConsume(SeibroCategory.Stock, 1, cfg.StockBudget))
+            {
+                Logger.LogWarning("[{Job}] 주식 카테고리 일일 예산({Budget}) 소진 — getShotnByMart {Market} 부터 중단", JobName, cfg.StockBudget, market);
+                return false;
+            }
+
+            if (!first && cfg.DelayMs > 0)
+            {
+                await Task.Delay(cfg.DelayMs, ct);
+            }
+
+            first = false;
+
+            var xml = await SeibroHttp.GetStringWithRetryAsync(client, cfg.BaseUrl, cfg.ApiKey, "getShotnByMart", [new("MART_TPCD", market)], Logger, ct);
+            var envelope = SeibroXml.Parse(xml);
+            var rows = SeibroShotnByMartParser.Parse(envelope);
+            var (inserted, updated) = await SeibroIssuerImport.UpsertIssuerCodesAsync(db, market, rows, ct);
+
+            Logger.LogInformation("[{Job}] getShotnByMart MART_TPCD={Market} rows={Rows} (result={Result}) — inserted={Inserted}, updated={Updated}",
+                JobName, market, rows.Count, envelope.ResultCount, inserted, updated);
+
+            foreach (var row in rows)
+            {
+                custnoByShortCode[row.ShortCode] = row.IssucoCustno;
+            }
+        }
+
+        var stamped = await SeibroIssuerImport.StampStockIssucoCustnoAsync(db, custnoByShortCode, ct);
+        Logger.LogInformation("[{Job}] Stock.IssucoCustno 스탬핑 — {Stamped}건 (스냅샷 {Snapshot}코드)", JobName, stamped, custnoByShortCode.Count);
+        return true;
+    }
+
+    /// <summary>b) getStkStatInfo rolling — 미보강(FaceValue null) 활성 종목부터 quota 잔여분 내에서 보강</summary>
+    private async Task EnrichStocksAsync(IAppDbContext db, HttpClient client, AppSettings.SeibroSection cfg, CancellationToken ct)
+    {
+        var targets = await db.Stock.Where(c => c.IsActive && c.IssucoCustno != null && c.FaceValue == null).OrderBy(c => c.ID).ToListAsync(ct);
+
+        if (targets.Count == 0)
+        {
+            Logger.LogInformation("[{Job}] getStkStatInfo 보강 대상 없음", JobName);
+            return;
+        }
+
+        var maxPerRun = quota.Remaining(SeibroCategory.Stock, cfg.StockBudget);
+        var enriched = 0;
+
+        var processed = await SeibroRollingSweep.RunAsync(
+            targets: targets.Select(c => (Key: c, LastUpdatedAt: (DateTime?)null)).ToList(),
+            fetchAndUpsert: async (stock, token) => {
+                if (!quota.TryConsume(SeibroCategory.Stock, 1, cfg.StockBudget))
+                {
+                    return; // 예산 경합 방어 — maxPerRun 산정 이후 다른 배치가 소비한 경우 skip
+                }
+
+                var xml = await SeibroHttp.GetStringWithRetryAsync(client, cfg.BaseUrl, cfg.ApiKey, "getStkStatInfo", [new("SHOTN_ISIN", stock.Code)], Logger, token);
+                var rows = SeibroStkStatParser.Parse(SeibroXml.Parse(xml));
+
+                if (rows.Count == 0)
+                {
+                    Logger.LogInformation("[{Job}] getStkStatInfo SHOTN_ISIN={Code} 0행 — 미보강 유지 (다음 실행 재시도)", JobName, stock.Code);
+                    return;
+                }
+
+                var row = rows[0];
+                stock.EnrichFromSeibro(row.IssucoCustno, row.FaceValue, row.VotingRights, row.TotalIssuedShares, row.IsElectronicSecurity);
+                await db.SaveChangesAsync(token);
+                enriched++;
+            },
+            maxPerRun: maxPerRun,
+            delayMs: cfg.DelayMs,
+            ct: ct);
+
+        Logger.LogInformation("[{Job}] getStkStatInfo rolling 완료 — 대상={Targets}, 호출={Processed} (maxPerRun={Max}), 보강={Enriched}",
+            JobName, targets.Count, processed, maxPerRun, enriched);
+    }
+}

+ 35 - 0
Infrastructure/StockData/SeibroShotnByMartParser.cs

@@ -0,0 +1,35 @@
+using System.Globalization;
+
+namespace Infrastructure.StockData;
+
+/// <summary>
+/// SEIBro getShotnByMart(시장별 단축코드 조회) 응답 파서 — 순수 C#. "SEIBro 발행회사번호 부트스트랩" (Wave 0).
+/// 입력: 공용 SeibroXml envelope. 행 필드: SHOTN_ISIN(단축코드) / KOR_SECN_NM(종목명) / ISSUCO_CUSTNO(발행회사번호).
+/// 세 필드 중 하나라도 없거나 회사번호가 비숫자인 행은 건너뛴다 (매핑 불가 행 — upsert 자연키가 성립하지 않음).
+/// </summary>
+public static class SeibroShotnByMartParser
+{
+    /// <summary>시장별 단축코드 1행</summary>
+    public sealed record Row(string ShortCode, string Name, int IssucoCustno);
+
+    public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
+    {
+        var rows = new List<Row>();
+
+        foreach (var fields in envelope.Rows)
+        {
+            var shortCode = SeibroXml.GetOrNull(fields, "SHOTN_ISIN")?.Trim();
+            var name = SeibroXml.GetOrNull(fields, "KOR_SECN_NM")?.Trim();
+            var custnoRaw = SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO");
+
+            if (string.IsNullOrEmpty(shortCode) || string.IsNullOrEmpty(name) || !int.TryParse(custnoRaw, NumberStyles.Integer, CultureInfo.InvariantCulture, out var custno))
+            {
+                continue;
+            }
+
+            rows.Add(new Row(shortCode, name, custno));
+        }
+
+        return rows;
+    }
+}

+ 48 - 0
Infrastructure/StockData/SeibroStddtParser.cs

@@ -0,0 +1,48 @@
+namespace Infrastructure.StockData;
+
+/// <summary>
+/// SEIBro getStddtInfo(기준일 정보) 응답 파서 — 순수 C#. 공용 SeibroXml envelope 입력.
+/// 자연키(ISSUCO_CUSTNO, RGT_STD_DT, RGT_RACD, RGT_RSN_DTAIL_SORT_CD) 중 하나라도 없거나 회사번호 비숫자·기준일 비형식이면 건너뛴다.
+/// Wave 3 기업행위(총회·상호변경 등) 이벤트 발견 소스로 RGT_RACD 를 그대로 저장한다.
+/// </summary>
+public static class SeibroStddtParser
+{
+    public sealed record Row(
+        int IssucoCustno,
+        string RepSecnNm,
+        DateOnly RgtStdDt,
+        string RgtRacd,
+        string? RgtRacdNm,
+        string RgtRsnDetailSortCd
+    );
+
+    public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
+    {
+        var rows = new List<Row>();
+
+        foreach (var fields in envelope.Rows)
+        {
+            var custno = SeibroFieldParse.Int(SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO"));
+            var repSecnNm = SeibroXml.GetOrNull(fields, "REP_SECN_NM")?.Trim();
+            var rgtStdDt = SeibroFieldParse.Date(SeibroXml.GetOrNull(fields, "RGT_STD_DT"));
+            var rgtRacd = SeibroXml.GetOrNull(fields, "RGT_RACD")?.Trim();
+            var sortCd = SeibroXml.GetOrNull(fields, "RGT_RSN_DTAIL_SORT_CD")?.Trim();
+
+            if (custno is null || string.IsNullOrEmpty(repSecnNm) || rgtStdDt is null || string.IsNullOrEmpty(rgtRacd) || string.IsNullOrEmpty(sortCd))
+            {
+                continue;
+            }
+
+            rows.Add(new Row(
+                custno.Value,
+                repSecnNm,
+                rgtStdDt.Value,
+                rgtRacd,
+                SeibroXml.GetOrNull(fields, "RGT_RACD_NM")?.Trim(),
+                sortCd
+            ));
+        }
+
+        return rows;
+    }
+}

+ 69 - 0
Infrastructure/StockData/SeibroStkStatParser.cs

@@ -0,0 +1,69 @@
+using System.Globalization;
+
+namespace Infrastructure.StockData;
+
+/// <summary>
+/// SEIBro getStkStatInfo(주식 종목 정보) 응답 파서 — 순수 C#. "SEIBro 종목 보강" (Wave 0, Stock.EnrichFromSeibro 입력).
+/// 행 필드(사용분): ISSUCO_CUSTNO / ISIN / SHOTN_ISIN / PVAL(액면가) / VOTRNO(1주당 의결권수) /
+/// TOTAL_STK_CNT(총발행주식수) / ELTSC_YN([Y]전자 [N]예탁 → bool, 그 외 null).
+/// 숫자 필드는 생략/빈 값/비숫자 시 null (0 과 구분). TOTAL_STK_CNT 는 스펙상 NUMBER(15,4) 라 decimal 로 읽어 long 절사.
+/// </summary>
+public static class SeibroStkStatParser
+{
+    /// <summary>주식 종목 정보 1행 — 전 필드 nullable (SEIBro 는 필드 생략 가능)</summary>
+    public sealed record Row(
+        int? IssucoCustno,
+        string? Isin,
+        string? ShortCode,
+        decimal? FaceValue,
+        decimal? VotingRights,
+        long? TotalIssuedShares,
+        bool? IsElectronicSecurity
+    );
+
+    public static IReadOnlyList<Row> Parse(SeibroXml.Envelope envelope)
+    {
+        var rows = new List<Row>();
+
+        foreach (var fields in envelope.Rows)
+        {
+            rows.Add(new Row(
+                ParseNullableInt(SeibroXml.GetOrNull(fields, "ISSUCO_CUSTNO")),
+                SeibroXml.GetOrNull(fields, "ISIN")?.Trim(),
+                SeibroXml.GetOrNull(fields, "SHOTN_ISIN")?.Trim(),
+                ParseNullableDecimal(SeibroXml.GetOrNull(fields, "PVAL")),
+                ParseNullableDecimal(SeibroXml.GetOrNull(fields, "VOTRNO")),
+                ParseNullableLong(SeibroXml.GetOrNull(fields, "TOTAL_STK_CNT")),
+                ParseYn(SeibroXml.GetOrNull(fields, "ELTSC_YN"))
+            ));
+        }
+
+        return rows;
+    }
+
+    private static int? ParseNullableInt(string? raw)
+    {
+        return int.TryParse(raw, NumberStyles.Integer, CultureInfo.InvariantCulture, out var value) ? value : null;
+    }
+
+    private static decimal? ParseNullableDecimal(string? raw)
+    {
+        return decimal.TryParse(raw, NumberStyles.Float, CultureInfo.InvariantCulture, out var value) ? value : null;
+    }
+
+    /// <summary>총발행주식수 — 스펙 NUMBER(15,4) 대비 decimal 로 읽고 정수 절사</summary>
+    private static long? ParseNullableLong(string? raw)
+    {
+        return decimal.TryParse(raw, NumberStyles.Float, CultureInfo.InvariantCulture, out var value) ? (long)value : null;
+    }
+
+    private static bool? ParseYn(string? raw)
+    {
+        return raw?.Trim().ToUpperInvariant() switch
+        {
+            "Y" => true,
+            "N" => false,
+            _ => null
+        };
+    }
+}

+ 76 - 0
Infrastructure/StockData/SeibroXml.cs

@@ -0,0 +1,76 @@
+using System.Xml.Linq;
+
+namespace Infrastructure.StockData;
+
+/// <summary>
+/// SEIBro OpenAPI 공용 응답 envelope 파서 — 순수 C# (System.Xml.Linq), 37개 API 전 공통 (docs/SEIBro/readme.md §1 확정 규칙).
+/// 응답 골격:
+///   &lt;vector result="N"&gt;                          ← result 속성 = 행 수 (0 = 빈 결과, data 없음)
+///     &lt;data vectorkey="i" type="Document"&gt;
+///       &lt;result&gt; 또는 &lt;RESULT&gt;                  ← ⚠️ 래퍼 대소문자가 API 개별로 다름 (파생결합 5종만 대문자)
+///         &lt;FIELD value="..."/&gt;                   ← 필드 값은 element 텍스트가 아니라 value 속성
+///       &lt;/result&gt;
+///     &lt;/data&gt;
+///   &lt;/vector&gt;
+/// 파서 규칙:
+///  • 래퍼는 data 의 "첫 자식 element" 를 이름·대소문자 무관하게 취한다 (result/RESULT 둘 다 실재).
+///  • value="" 또는 element 자체 생략 = null → 행 딕셔너리에서 키 자체를 뺀다 (조회는 GetOrNull 사용).
+///  • 필드명 조회는 대소문자 무시 (OrdinalIgnoreCase).
+///  • 비XML 응답은 XmlException, envelope 구조 위반(vector/result 속성/래퍼 부재)은 FormatException —
+///    silent 빈 결과 금지 (수집 배치가 오류를 인지하고 run 을 중단·재시도해야 한다).
+/// </summary>
+public static class SeibroXml
+{
+    /// <summary>파싱된 envelope — ResultCount 는 vector@result 원문 값 (샘플 파일은 truncate 되어 Rows.Count 와 다를 수 있음)</summary>
+    public sealed record Envelope(int ResultCount, IReadOnlyList<IReadOnlyDictionary<string, string>> Rows);
+
+    public static Envelope Parse(string xml)
+    {
+        var doc = XDocument.Parse(xml);
+        var root = doc.Root;
+
+        if (root is null || !root.Name.LocalName.Equals("vector", StringComparison.OrdinalIgnoreCase))
+        {
+            throw new FormatException($"SEIBro 응답 루트가 <vector> 가 아님: <{root?.Name.LocalName}>");
+        }
+
+        var resultAttr = root.Attributes().FirstOrDefault(c => c.Name.LocalName.Equals("result", StringComparison.OrdinalIgnoreCase));
+
+        if (resultAttr is null || !int.TryParse(resultAttr.Value, out var resultCount))
+        {
+            throw new FormatException($"SEIBro 응답 <vector> 에 result 행수 속성 없음/비숫자: '{resultAttr?.Value}'");
+        }
+
+        var rows = new List<IReadOnlyDictionary<string, string>>();
+        var dataIndex = 0;
+
+        foreach (var data in root.Elements().Where(c => c.Name.LocalName.Equals("data", StringComparison.OrdinalIgnoreCase)))
+        {
+            // 행 래퍼 = data 의 첫 자식 element (이름·대소문자 무관 — result/RESULT 혼재)
+            var wrapper = data.Elements().FirstOrDefault() ?? throw new FormatException($"SEIBro 응답 data[{dataIndex}] 에 행 래퍼 element 없음");
+            var fields = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
+
+            foreach (var field in wrapper.Elements())
+            {
+                var value = field.Attributes().FirstOrDefault(c => c.Name.LocalName.Equals("value", StringComparison.OrdinalIgnoreCase))?.Value;
+
+                // value="" 는 null 취급 → 키 자체를 넣지 않는다 (element 생략과 동일 의미)
+                if (!string.IsNullOrEmpty(value))
+                {
+                    fields[field.Name.LocalName] = value;
+                }
+            }
+
+            rows.Add(fields);
+            dataIndex++;
+        }
+
+        return new Envelope(resultCount, rows);
+    }
+
+    /// <summary>행 딕셔너리에서 필드 조회 — 생략/빈 값 필드는 null (파서 공용 헬퍼)</summary>
+    public static string? GetOrNull(IReadOnlyDictionary<string, string> row, string field)
+    {
+        return row.TryGetValue(field, out var value) ? value : null;
+    }
+}

+ 82 - 6
SharedKernel/AppSetting.cs

@@ -17,6 +17,7 @@ public sealed class AppSettings
     public KRXCoKrSection KRXCoKr { get; init; } = new();
     public OpenDartSection OpenDart { get; init; } = new();
     public KoreaEximSection KoreaExim { get; init; } = new();
+    public SeibroSection Seibro { get; init; } = new();
     public OAuthSection OAuth { get; init; } = new();
 
     public sealed class AppSection
@@ -103,6 +104,9 @@ public sealed class AppSettings
 
         /// <summary>예측 채점 배치 (PredictionSettlementService — d2 M4). Web.Api 전용, 기본 false (StockData T+1 종가 적재 가동 후 활성화).</summary>
         public bool PredictionSettlement { get; init; } = false;
+
+        /// <summary>장전 브리핑 자동 발행 배치 (DailyBriefingPublisher — d2 M3, 07:30 KST). Web.Api 전용, 기본 false (StockData 지수·공시 적재 가동 후 활성화).</summary>
+        public bool DailyBriefing { get; init; } = false;
     }
 
     /// <summary>
@@ -241,20 +245,20 @@ public sealed class AppSettings
         /// <summary>파생상품(선물 3 + 옵션 3) 일별매매 수집 배치 (KrxDerivativeSyncService) 활성화 — fut/eqsfu/eqkfu + opt/eqsop/eqkop 6개 엔드포인트</summary>
         public bool DerivativeSync { get; init; } = false;
 
-        /// <summary>파생상품 일별매매 수집 실행 시각 (KST, "HH:mm") — 채권 수집(18:40) 뒤 여유 두고 18:45</summary>
-        public string DerivativeSyncTime { get; init; } = "18:45";
+        /// <summary>파생상품 일별매매 수집 실행 시각 (KST, "HH:mm") — 채권 수집(18:40, 3ep×백필)이 5분 슬롯을 넘을 수 있어 여유 두고 19:00</summary>
+        public string DerivativeSyncTime { get; init; } = "19:00";
 
         /// <summary>일반상품(석유/금/배출권) 일별매매 수집 배치 (KrxCommoditySyncService) 활성화 — gen/oil+gold+ets_bydd_trd 3개 엔드포인트</summary>
         public bool CommoditySync { get; init; } = false;
 
-        /// <summary>일반상품 일별매매 수집 실행 시각 (KST, "HH:mm") — 파생상품 수집(18:45) 뒤 여유 두고 18:50</summary>
-        public string CommoditySyncTime { get; init; } = "18:50";
+        /// <summary>일반상품 일별매매 수집 실행 시각 (KST, "HH:mm") — 파생상품 수집(19:00, 6ep×백필)이 무거워 여유 두고 19:15</summary>
+        public string CommoditySyncTime { get; init; } = "19:15";
 
         /// <summary>ESG 데이터(ESG 증권상품 + ESG 지수 + 사회책임투자채권) 수집 배치 (KrxEsgSyncService) 활성화 — esg/esg_etp_info+esg_index_info+sri_bond_info 3개 엔드포인트</summary>
         public bool EsgSync { get; init; } = false;
 
-        /// <summary>ESG 데이터 수집 실행 시각 (KST, "HH:mm") — 일반상품 수집(18:50) 뒤 여유 두고 18:55</summary>
-        public string EsgSyncTime { get; init; } = "18:55";
+        /// <summary>ESG 데이터 수집 실행 시각 (KST, "HH:mm") — 일반상품 수집(19:15) 뒤 여유 두고 19:30</summary>
+        public string EsgSyncTime { get; init; } = "19:30";
 
         /// <summary>백필 대상 기간(연) — endDate 로부터 과거로 이만큼 채운다 (기본 3년). KrxBackfill 공용 헬퍼가 사용</summary>
         public int BackfillYears { get; init; } = 3;
@@ -317,4 +321,76 @@ public sealed class AppSettings
         /// <summary>1회 실행당 최대 백필 fetch 수 — quota 보호용 상한 (기본 60). 여러 날에 걸쳐 나눠 채운다</summary>
         public int BackfillMaxPerRun { get; init; } = 60;
     }
+
+    /// <summary>
+    /// SEIBro OpenAPI(한국예탁결제원 seibro.or.kr) 수집 설정 (개미투자 D1). KRX/data.go.kr/OpenDART 와 별개 시스템 —
+    /// 인증은 query param key, 응답은 XML(value 속성). 일일 호출 한도는 카테고리 단위(기업/주식/채권/파생/외화)로 관리되며
+    /// 배치 예산(*Budget)은 실한도의 80% 헤드룸 (docs/SEIBro/readme.md §1). 모든 *Sync 플래그 기본 false —
+    /// API 키 발급/운영 결정 후 활성화. tracked 파일엔 ApiKey 빈 값만 (실키는 gitignore 된 appsettings.Development.json / Jenkins Secret File).
+    /// </summary>
+    public class SeibroSection
+    {
+        /// <summary>SEIBro OpenAPI 인증 키 (key query param). 비어 있으면 배치는 로그만 남기고 skip.</summary>
+        public string ApiKey { get; init; } = string.Empty;
+
+        /// <summary>SEIBro OpenPlatform 엔드포인트 — https 연결 불가 시 SeibroHttp 가 http 로 1회 fallback</summary>
+        public string BaseUrl { get; init; } = "https://seibro.or.kr/OpenPlatform/callOpenAPI.jsp";
+
+        /// <summary>Wave 0 — 발행회사번호(ISSUCO_CUSTNO) 조인키 부트스트랩 + 종목 보강 배치 (SeibroIssuerSyncService)</summary>
+        public bool IssuerSync { get; init; } = false;
+
+        /// <summary>Wave 1 — 배당·권리 수집 배치</summary>
+        public bool DividendSync { get; init; } = false;
+
+        /// <summary>Wave 2 — 수급 이벤트(대차·보호예수·증감·유통변경·비상장) 수집 배치</summary>
+        public bool SupplySync { get; init; } = false;
+
+        /// <summary>Wave 3 — 기업행위(총회·상호변경·대금·단주·CB/BW 행사) 수집 배치</summary>
+        public bool CorpActionSync { get; init; } = false;
+
+        /// <summary>Wave 4 — 채권·단기금융 수집 배치</summary>
+        public bool BondSync { get; init; } = false;
+
+        /// <summary>Wave 5 — 파생결합증권(ELS/DLS) 수집 배치</summary>
+        public bool DerivSync { get; init; } = false;
+
+        /// <summary>Wave 6 — 외화증권 수집 배치</summary>
+        public bool ForeignSync { get; init; } = false;
+
+        /// <summary>호출 사이 지연(ms) — quota·서버 보호</summary>
+        public int DelayMs { get; init; } = 200;
+
+        /// <summary>백필 대상 기간(연) — 날짜 스윕 배치가 과거로 이만큼 채운다</summary>
+        public int BackfillYears { get; init; } = 3;
+
+        /// <summary>기업 정보 카테고리 일일 예산 (실한도 50,000 의 80%)</summary>
+        public int CorpBudget { get; init; } = 40000;
+
+        /// <summary>주식 카테고리 일일 예산 (실한도 10,000 의 80%) — getXrcStk*(CB/BW 행사)도 주식 소속</summary>
+        public int StockBudget { get; init; } = 8000;
+
+        /// <summary>채권 카테고리 일일 예산 (실한도 10,000 의 80%)</summary>
+        public int BondBudget { get; init; } = 8000;
+
+        /// <summary>파생결합증권 카테고리 일일 예산 (실한도 10,000 의 80%)</summary>
+        public int DerivBudget { get; init; } = 8000;
+
+        /// <summary>외화증권 카테고리 일일 예산 (실한도 20,000 의 80%)</summary>
+        public int ForeignBudget { get; init; } = 15000;
+
+        /// <summary>대차거래 3년 백필 대상 종목 수 (시가총액 상위 N) — 당일 수집은 전 상장종목</summary>
+        public int LendingBackfillTopN { get; init; } = 300;
+
+        /// <summary>외화증권 국가별 수집 대상 국가코드 (Wave 6)</summary>
+        public string[] ForeignNations { get; init; } = ["US", "JP", "HK", "CN", "E1"];
+
+        /// <summary>외화증권 종목별 수집 seed ISIN (기본 빈 = 국가별만 수집)</summary>
+        public string[] ForeignIsins { get; init; } = [];
+
+        /// <summary>발행회사번호 부트스트랩 실행 시각 (KST, "HH:mm") — SEIBro 는 T+1 새벽 갱신 추정, KRX(18시대)와 분리해 06:30</summary>
+        public string IssuerSyncTime { get; init; } = "06:30";
+
+        /// <summary>배당·권리 수집 실행 시각 (KST, "HH:mm") — IssuerSync(06:30) 다음 슬롯 06:40 (wave 당 10분 간격 스태거)</summary>
+        public string DividendSyncTime { get; init; } = "06:40";
+    }
 }

+ 5 - 0
Tests/Application.Tests/Application.Tests.csproj

@@ -19,4 +19,9 @@
     <Using Include="Microsoft.VisualStudio.TestTools.UnitTesting" />
   </ItemGroup>
 
+  <ItemGroup>
+    <!-- SEIBro 실응답 fixture (docs/SEIBro/samples 복사본, 37종) — 폴더 구조 유지 출력 복사 -->
+    <Content Include="Fixtures\**\*.xml" CopyToOutputDirectory="PreserveNewest" />
+  </ItemGroup>
+
 </Project>

+ 1366 - 0
Tests/Application.Tests/Fixtures/Seibro/기업/getCostPaySchedul.xml

@@ -0,0 +1,1366 @@
+<vector beforeServletCall="1783404870417" beforeEJBCall="1783404870440" afterServletCall="1783404870520" afterEJBCall="1783404870519" result="124">
+<data vectorkey="0" type="Document">
+<result>
+<ISSUCO_CUSTNO value="8176"/>
+<ISIN value="KR7066980004"/>
+<KOR_SECN_NM value="한성크린텍"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180625"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="1" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7854"/>
+<ISIN value="KR7064090004"/>
+<KOR_SECN_NM value="인크레더블버즈"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180628"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="2" type="Document">
+<result>
+<ISSUCO_CUSTNO value="14896"/>
+<ISIN value="KR7120110002"/>
+<KOR_SECN_NM value="코오롱인더스트리"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180628"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="3" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4631"/>
+<ISIN value="KR7046310009"/>
+<KOR_SECN_NM value="백금티앤에이"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180604"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="4" type="Document">
+<result>
+<ISSUCO_CUSTNO value="25944"/>
+<ISIN value="KR7206560005"/>
+<KOR_SECN_NM value="덱스터스튜디오"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180607"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="5" type="Document">
+<result>
+<ISSUCO_CUSTNO value="13350"/>
+<ISIN value="KR7106080005"/>
+<KOR_SECN_NM value="케이이엠텍"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180608"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="6" type="Document">
+<result>
+<ISSUCO_CUSTNO value="13303"/>
+<ISIN value="KR7115480006"/>
+<KOR_SECN_NM value="씨유메디칼시스템"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180611"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="7" type="Document">
+<result>
+<ISSUCO_CUSTNO value="16100"/>
+<ISIN value="KR7131760001"/>
+<KOR_SECN_NM value="파인텍"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180611"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="8" type="Document">
+<result>
+<ISSUCO_CUSTNO value="11214"/>
+<ISIN value="KR7068240001"/>
+<KOR_SECN_NM value="다원시스"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180612"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="9" type="Document">
+<result>
+<ISSUCO_CUSTNO value="8710"/>
+<ISIN value="KR7069110005"/>
+<KOR_SECN_NM value="주식회사 유한코스메틱"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180615"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="10" type="Document">
+<result>
+<ISSUCO_CUSTNO value="25944"/>
+<ISIN value="KR7206560005"/>
+<KOR_SECN_NM value="덱스터스튜디오"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180615"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="11" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3364"/>
+<ISIN value="KR7033640004"/>
+<KOR_SECN_NM value="네패스"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180615"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="12" type="Document">
+<result>
+<ISSUCO_CUSTNO value="14896"/>
+<ISIN value="KR7120110002"/>
+<KOR_SECN_NM value="코오롱인더스트리"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180627"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="13" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7854"/>
+<ISIN value="KR7064090004"/>
+<KOR_SECN_NM value="인크레더블버즈"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180629"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="14" type="Document">
+<result>
+<ISSUCO_CUSTNO value="13303"/>
+<ISIN value="KR7115480006"/>
+<KOR_SECN_NM value="씨유메디칼시스템"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180608"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="15" type="Document">
+<result>
+<ISSUCO_CUSTNO value="8690"/>
+<ISIN value="KR7071850002"/>
+<KOR_SECN_NM value="캐스텍코리아"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180611"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="16" type="Document">
+<result>
+<ISSUCO_CUSTNO value="1116"/>
+<ISIN value="KR7011160009"/>
+<KOR_SECN_NM value="두산건설"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180611"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="17" type="Document">
+<result>
+<ISSUCO_CUSTNO value="9988"/>
+<ISIN value="KR7082800004"/>
+<KOR_SECN_NM value="비보존제약"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180611"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="18" type="Document">
+<result>
+<ISSUCO_CUSTNO value="23355"/>
+<ISIN value="KR7196490007"/>
+<KOR_SECN_NM value="디에이테크놀로지"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180612"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="19" type="Document">
+<result>
+<ISSUCO_CUSTNO value="1116"/>
+<ISIN value="KR7011160009"/>
+<KOR_SECN_NM value="두산건설"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180614"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="20" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4125"/>
+<ISIN value="KR7034020008"/>
+<KOR_SECN_NM value="두산에너빌리티"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180618"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="21" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4893"/>
+<ISIN value="KR7046940003"/>
+<KOR_SECN_NM value="우원개발"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180621"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="22" type="Document">
+<result>
+<ISSUCO_CUSTNO value="23355"/>
+<ISIN value="KR7196490007"/>
+<KOR_SECN_NM value="디에이테크놀로지"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180626"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="23" type="Document">
+<result>
+<ISSUCO_CUSTNO value="23355"/>
+<ISIN value="KR7196490007"/>
+<KOR_SECN_NM value="디에이테크놀로지"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180629"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="24" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4264"/>
+<ISIN value="KR7054340005"/>
+<KOR_SECN_NM value="피앤텔"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180423"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="25" type="Document">
+<result>
+<ISSUCO_CUSTNO value="9988"/>
+<ISIN value="KR7082800004"/>
+<KOR_SECN_NM value="비보존제약"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180601"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="26" type="Document">
+<result>
+<ISSUCO_CUSTNO value="2396"/>
+<ISIN value="KR7023960008"/>
+<KOR_SECN_NM value="에쓰씨엔지니어링"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180611"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="27" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3318"/>
+<ISIN value="KR7033180001"/>
+<KOR_SECN_NM value="케이에이치필룩스"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180615"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="28" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7854"/>
+<ISIN value="KR7064090004"/>
+<KOR_SECN_NM value="인크레더블버즈"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180618"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="29" type="Document">
+<result>
+<ISSUCO_CUSTNO value="826"/>
+<ISIN value="KR7008260002"/>
+<KOR_SECN_NM value="엔아이스틸"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180621"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="30" type="Document">
+<result>
+<ISSUCO_CUSTNO value="25944"/>
+<ISIN value="KR7206560005"/>
+<KOR_SECN_NM value="덱스터스튜디오"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180622"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="31" type="Document">
+<result>
+<ISSUCO_CUSTNO value="636"/>
+<ISIN value="KR7006360002"/>
+<KOR_SECN_NM value="지에스건설"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180626"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="32" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3258"/>
+<ISIN value="KR7032580003"/>
+<KOR_SECN_NM value="피델릭스"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180626"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="33" type="Document">
+<result>
+<ISSUCO_CUSTNO value="636"/>
+<ISIN value="KR7006360002"/>
+<KOR_SECN_NM value="지에스건설"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180604"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="34" type="Document">
+<result>
+<ISSUCO_CUSTNO value="636"/>
+<ISIN value="KR7006360002"/>
+<KOR_SECN_NM value="지에스건설"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180608"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="35" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4631"/>
+<ISIN value="KR7046310009"/>
+<KOR_SECN_NM value="백금티앤에이"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180608"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="36" type="Document">
+<result>
+<ISSUCO_CUSTNO value="6598"/>
+<ISIN value="KR7042040006"/>
+<KOR_SECN_NM value="케이피엠테크"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180608"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="37" type="Document">
+<result>
+<ISSUCO_CUSTNO value="23355"/>
+<ISIN value="KR7196490007"/>
+<KOR_SECN_NM value="디에이테크놀로지"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180611"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="38" type="Document">
+<result>
+<ISSUCO_CUSTNO value="6598"/>
+<ISIN value="KR7042040006"/>
+<KOR_SECN_NM value="케이피엠테크"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180611"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="39" type="Document">
+<result>
+<ISSUCO_CUSTNO value="636"/>
+<ISIN value="KR7006360002"/>
+<KOR_SECN_NM value="지에스건설"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180612"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="40" type="Document">
+<result>
+<ISSUCO_CUSTNO value="1829"/>
+<ISIN value="KR7018290007"/>
+<KOR_SECN_NM value="브이티"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180614"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="41" type="Document">
+<result>
+<ISSUCO_CUSTNO value="8690"/>
+<ISIN value="KR7071850002"/>
+<KOR_SECN_NM value="캐스텍코리아"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180614"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="42" type="Document">
+<result>
+<ISSUCO_CUSTNO value="16100"/>
+<ISIN value="KR7131760001"/>
+<KOR_SECN_NM value="파인텍"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180614"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="43" type="Document">
+<result>
+<ISSUCO_CUSTNO value="2396"/>
+<ISIN value="KR7023960008"/>
+<KOR_SECN_NM value="에쓰씨엔지니어링"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180615"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="44" type="Document">
+<result>
+<ISSUCO_CUSTNO value="9988"/>
+<ISIN value="KR7082800004"/>
+<KOR_SECN_NM value="비보존제약"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180615"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="45" type="Document">
+<result>
+<ISSUCO_CUSTNO value="13350"/>
+<ISIN value="KR7106080005"/>
+<KOR_SECN_NM value="케이이엠텍"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180615"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="46" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3072"/>
+<ISIN value="KR7030720007"/>
+<KOR_SECN_NM value="동원수산"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180619"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="47" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7854"/>
+<ISIN value="KR7064090004"/>
+<KOR_SECN_NM value="인크레더블버즈"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180619"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="48" type="Document">
+<result>
+<ISSUCO_CUSTNO value="1133"/>
+<ISIN value="KR7011330008"/>
+<KOR_SECN_NM value="유니켐"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180621"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="49" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7854"/>
+<ISIN value="KR7064090004"/>
+<KOR_SECN_NM value="인크레더블버즈"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180621"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="50" type="Document">
+<result>
+<ISSUCO_CUSTNO value="23152"/>
+<ISIN value="KR7197210008"/>
+<KOR_SECN_NM value="리드"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180622"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="51" type="Document">
+<result>
+<ISSUCO_CUSTNO value="23355"/>
+<ISIN value="KR7196490007"/>
+<KOR_SECN_NM value="디에이테크놀로지"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180625"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="52" type="Document">
+<result>
+<ISSUCO_CUSTNO value="15671"/>
+<ISIN value="KR7127160000"/>
+<KOR_SECN_NM value="매직마이크로"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180628"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="53" type="Document">
+<result>
+<ISSUCO_CUSTNO value="542"/>
+<ISIN value="KR7005420005"/>
+<KOR_SECN_NM value="코스모화학"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180629"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="54" type="Document">
+<result>
+<ISSUCO_CUSTNO value="15671"/>
+<ISIN value="KR7127160000"/>
+<KOR_SECN_NM value="매직마이크로"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180629"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="55" type="Document">
+<result>
+<ISSUCO_CUSTNO value="6702"/>
+<ISIN value="KR7039560008"/>
+<KOR_SECN_NM value="다산네트웍스"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180601"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="56" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3072"/>
+<ISIN value="KR7030720007"/>
+<KOR_SECN_NM value="동원수산"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180605"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="57" type="Document">
+<result>
+<ISSUCO_CUSTNO value="1116"/>
+<ISIN value="KR7011160009"/>
+<KOR_SECN_NM value="두산건설"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180605"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="58" type="Document">
+<result>
+<ISSUCO_CUSTNO value="1829"/>
+<ISIN value="KR7018290007"/>
+<KOR_SECN_NM value="브이티"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180607"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="59" type="Document">
+<result>
+<ISSUCO_CUSTNO value="22361"/>
+<ISIN value="KR7191410000"/>
+<KOR_SECN_NM value="육일씨엔에쓰"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180607"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="60" type="Document">
+<result>
+<ISSUCO_CUSTNO value="532"/>
+<ISIN value="KR7005320007"/>
+<KOR_SECN_NM value="온타이드"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180608"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="61" type="Document">
+<result>
+<ISSUCO_CUSTNO value="6874"/>
+<ISIN value="KR7045890001"/>
+<KOR_SECN_NM value="금빛"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180608"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="62" type="Document">
+<result>
+<ISSUCO_CUSTNO value="15671"/>
+<ISIN value="KR7127160000"/>
+<KOR_SECN_NM value="매직마이크로"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180611"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="63" type="Document">
+<result>
+<ISSUCO_CUSTNO value="222"/>
+<ISIN value="KR7002220002"/>
+<KOR_SECN_NM value="한일철강"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180615"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="64" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7854"/>
+<ISIN value="KR7064090004"/>
+<KOR_SECN_NM value="인크레더블버즈"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180615"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="65" type="Document">
+<result>
+<ISSUCO_CUSTNO value="501"/>
+<ISIN value="KR7005010004"/>
+<KOR_SECN_NM value="휴스틸"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180618"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="66" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4893"/>
+<ISIN value="KR7046940003"/>
+<KOR_SECN_NM value="우원개발"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180618"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="67" type="Document">
+<result>
+<ISSUCO_CUSTNO value="16100"/>
+<ISIN value="KR7131760001"/>
+<KOR_SECN_NM value="파인텍"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180619"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="68" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4893"/>
+<ISIN value="KR7046940003"/>
+<KOR_SECN_NM value="우원개발"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180620"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="69" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4909"/>
+<ISIN value="KR7060720000"/>
+<KOR_SECN_NM value="KH바텍"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180629"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="70" type="Document">
+<result>
+<ISSUCO_CUSTNO value="14896"/>
+<ISIN value="KR7120110002"/>
+<KOR_SECN_NM value="코오롱인더스트리"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180629"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="71" type="Document">
+<result>
+<ISSUCO_CUSTNO value="18693"/>
+<ISIN value="KR7156100000"/>
+<KOR_SECN_NM value="엘앤케이바이오메드"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180605"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="72" type="Document">
+<result>
+<ISSUCO_CUSTNO value="9988"/>
+<ISIN value="KR7082800004"/>
+<KOR_SECN_NM value="비보존제약"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180608"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="73" type="Document">
+<result>
+<ISSUCO_CUSTNO value="23152"/>
+<ISIN value="KR7197210008"/>
+<KOR_SECN_NM value="리드"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180619"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="74" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3364"/>
+<ISIN value="KR7033640004"/>
+<KOR_SECN_NM value="네패스"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180619"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="75" type="Document">
+<result>
+<ISSUCO_CUSTNO value="636"/>
+<ISIN value="KR7006360002"/>
+<KOR_SECN_NM value="지에스건설"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180621"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="76" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3258"/>
+<ISIN value="KR7032580003"/>
+<KOR_SECN_NM value="피델릭스"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180621"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="77" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3853"/>
+<ISIN value="KR7038530002"/>
+<KOR_SECN_NM value="케이바이오랩스"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180622"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="78" type="Document">
+<result>
+<ISSUCO_CUSTNO value="636"/>
+<ISIN value="KR7006360002"/>
+<KOR_SECN_NM value="지에스건설"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180627"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="79" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4909"/>
+<ISIN value="KR7060720000"/>
+<KOR_SECN_NM value="KH바텍"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180627"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="80" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3318"/>
+<ISIN value="KR7033180001"/>
+<KOR_SECN_NM value="케이에이치필룩스"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180628"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="81" type="Document">
+<result>
+<ISSUCO_CUSTNO value="263"/>
+<ISIN value="KR7002630002"/>
+<KOR_SECN_NM value="오리엔트바이오"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180628"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="82" type="Document">
+<result>
+<ISSUCO_CUSTNO value="2758"/>
+<ISIN value="KR7027580000"/>
+<KOR_SECN_NM value="상보"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180629"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="83" type="Document">
+<result>
+<ISSUCO_CUSTNO value="2165"/>
+<ISIN value="KR7021650007"/>
+<KOR_SECN_NM value="한국큐빅"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180601"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="84" type="Document">
+<result>
+<ISSUCO_CUSTNO value="1116"/>
+<ISIN value="KR7011160009"/>
+<KOR_SECN_NM value="두산건설"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180601"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="85" type="Document">
+<result>
+<ISSUCO_CUSTNO value="25944"/>
+<ISIN value="KR7206560005"/>
+<KOR_SECN_NM value="덱스터스튜디오"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180604"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="86" type="Document">
+<result>
+<ISSUCO_CUSTNO value="16709"/>
+<ISIN value="KR7137400008"/>
+<KOR_SECN_NM value="피엔티"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180607"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="87" type="Document">
+<result>
+<ISSUCO_CUSTNO value="14896"/>
+<ISIN value="KR7120110002"/>
+<KOR_SECN_NM value="코오롱인더스트리"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180607"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="88" type="Document">
+<result>
+<ISSUCO_CUSTNO value="501"/>
+<ISIN value="KR7005010004"/>
+<KOR_SECN_NM value="휴스틸"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180608"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="89" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4894"/>
+<ISIN value="KR7060560000"/>
+<KOR_SECN_NM value="에이치씨홈센타"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180608"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="90" type="Document">
+<result>
+<ISSUCO_CUSTNO value="23355"/>
+<ISIN value="KR7196490007"/>
+<KOR_SECN_NM value="디에이테크놀로지"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180608"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="91" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4631"/>
+<ISIN value="KR7046310009"/>
+<KOR_SECN_NM value="백금티앤에이"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180612"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="92" type="Document">
+<result>
+<ISSUCO_CUSTNO value="14896"/>
+<ISIN value="KR7120110002"/>
+<KOR_SECN_NM value="코오롱인더스트리"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180612"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="93" type="Document">
+<result>
+<ISSUCO_CUSTNO value="13350"/>
+<ISIN value="KR7106080005"/>
+<KOR_SECN_NM value="케이이엠텍"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180614"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="94" type="Document">
+<result>
+<ISSUCO_CUSTNO value="23152"/>
+<ISIN value="KR7197210008"/>
+<KOR_SECN_NM value="리드"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180620"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="95" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3853"/>
+<ISIN value="KR7038530002"/>
+<KOR_SECN_NM value="케이바이오랩스"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180621"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="96" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7854"/>
+<ISIN value="KR7064090004"/>
+<KOR_SECN_NM value="인크레더블버즈"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180622"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="97" type="Document">
+<result>
+<ISSUCO_CUSTNO value="23355"/>
+<ISIN value="KR7196490007"/>
+<KOR_SECN_NM value="디에이테크놀로지"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180622"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="98" type="Document">
+<result>
+<ISSUCO_CUSTNO value="23152"/>
+<ISIN value="KR7197210008"/>
+<KOR_SECN_NM value="리드"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180625"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="99" type="Document">
+<result>
+<ISSUCO_CUSTNO value="636"/>
+<ISIN value="KR7006360002"/>
+<KOR_SECN_NM value="지에스건설"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180629"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="100" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4125"/>
+<ISIN value="KR7034020008"/>
+<KOR_SECN_NM value="두산에너빌리티"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180629"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="101" type="Document">
+<result>
+<ISSUCO_CUSTNO value="480"/>
+<ISIN value="KR7004800009"/>
+<KOR_SECN_NM value="효성"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180531"/>
+<RGT_RACD_NM value="회사분할"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="102" type="Document">
+<result>
+<ISSUCO_CUSTNO value="2488"/>
+<ISIN value="KR7024880007"/>
+<KOR_SECN_NM value="케이피에프"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180601"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="103" type="Document">
+<result>
+<ISSUCO_CUSTNO value="1078"/>
+<ISIN value="KR7010780005"/>
+<KOR_SECN_NM value="아이에스동서"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180604"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="104" type="Document">
+<result>
+<ISSUCO_CUSTNO value="2488"/>
+<ISIN value="KR7024880007"/>
+<KOR_SECN_NM value="케이피에프"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180604"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="105" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3853"/>
+<ISIN value="KR7038530002"/>
+<KOR_SECN_NM value="케이바이오랩스"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180605"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="106" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7213"/>
+<ISIN value="KR7050110006"/>
+<KOR_SECN_NM value="캠시스"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180605"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="107" type="Document">
+<result>
+<ISSUCO_CUSTNO value="14896"/>
+<ISIN value="KR7120110002"/>
+<KOR_SECN_NM value="코오롱인더스트리"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180605"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="108" type="Document">
+<result>
+<ISSUCO_CUSTNO value="636"/>
+<ISIN value="KR7006360002"/>
+<KOR_SECN_NM value="지에스건설"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180607"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="109" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4925"/>
+<ISIN value="KR7060310000"/>
+<KOR_SECN_NM value="삼에스코리아"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180607"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="110" type="Document">
+<result>
+<ISSUCO_CUSTNO value="6598"/>
+<ISIN value="KR7042040006"/>
+<KOR_SECN_NM value="케이피엠테크"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180607"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="111" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4925"/>
+<ISIN value="KR7060310000"/>
+<KOR_SECN_NM value="삼에스코리아"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180608"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="112" type="Document">
+<result>
+<ISSUCO_CUSTNO value="14730"/>
+<ISIN value="KR7109610006"/>
+<KOR_SECN_NM value="에스와이"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180608"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="113" type="Document">
+<result>
+<ISSUCO_CUSTNO value="22361"/>
+<ISIN value="KR7191410000"/>
+<KOR_SECN_NM value="육일씨엔에쓰"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180608"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="114" type="Document">
+<result>
+<ISSUCO_CUSTNO value="14896"/>
+<ISIN value="KR7120110002"/>
+<KOR_SECN_NM value="코오롱인더스트리"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180608"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="115" type="Document">
+<result>
+<ISSUCO_CUSTNO value="10822"/>
+<ISIN value="KR7090370008"/>
+<KOR_SECN_NM value="메타랩스"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180611"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="116" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7699"/>
+<ISIN value="KR7048870000"/>
+<KOR_SECN_NM value="시너지이노베이션"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180612"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="117" type="Document">
+<result>
+<ISSUCO_CUSTNO value="1116"/>
+<ISIN value="KR7011160009"/>
+<KOR_SECN_NM value="두산건설"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180612"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="118" type="Document">
+<result>
+<ISSUCO_CUSTNO value="16100"/>
+<ISIN value="KR7131760001"/>
+<KOR_SECN_NM value="파인텍"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180612"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="119" type="Document">
+<result>
+<ISSUCO_CUSTNO value="6598"/>
+<ISIN value="KR7042040006"/>
+<KOR_SECN_NM value="케이피엠테크"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180614"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="120" type="Document">
+<result>
+<ISSUCO_CUSTNO value="1116"/>
+<ISIN value="KR7011160009"/>
+<KOR_SECN_NM value="두산건설"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180615"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="121" type="Document">
+<result>
+<ISSUCO_CUSTNO value="501"/>
+<ISIN value="KR7005010004"/>
+<KOR_SECN_NM value="휴스틸"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180619"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="122" type="Document">
+<result>
+<ISSUCO_CUSTNO value="23355"/>
+<ISIN value="KR7196490007"/>
+<KOR_SECN_NM value="디에이테크놀로지"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180620"/>
+<RGT_RACD_NM value="국내CB행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="123" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3364"/>
+<ISIN value="KR7033640004"/>
+<KOR_SECN_NM value="네패스"/>
+<SECN_KACD value="0101"/>
+<RGT_STD_DT value="20180621"/>
+<RGT_RACD_NM value="국내BW행사"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+</vector>

+ 380 - 0
Tests/Application.Tests/Fixtures/Seibro/기업/getDivInfo.xml

@@ -0,0 +1,380 @@
+<vector beforeServletCall="1783404885168" beforeEJBCall="1783404885172" afterServletCall="1783404885192" afterEJBCall="1783404885192" result="18">
+<data vectorkey="0" type="Document">
+<result>
+<ISIN value="KR7005930003"/>
+<KOR_SECN_NM value="삼성전자"/>
+<SECN_KACD_NM value="보통주"/>
+<RGT_STD_DT value="20161231"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="550"/>
+<CASH_ALOC_AMT value="27500"/>
+<MARTP_DIV_RATE value="1.53"/>
+<TH1_PAY_TERM_BEGIN_DT value="20170424"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="1" type="Document">
+<result>
+<ISIN value="KR7005931001"/>
+<KOR_SECN_NM value="삼성전자1우"/>
+<SECN_KACD_NM value="우선주"/>
+<RGT_STD_DT value="20161231"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="551"/>
+<CASH_ALOC_AMT value="27550"/>
+<MARTP_DIV_RATE value="1.94"/>
+<TH1_PAY_TERM_BEGIN_DT value="20170424"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="2" type="Document">
+<result>
+<ISIN value="KR7005930003"/>
+<KOR_SECN_NM value="삼성전자"/>
+<SECN_KACD_NM value="보통주"/>
+<RGT_STD_DT value="20170331"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="140"/>
+<CASH_ALOC_AMT value="7000"/>
+<MARTP_DIV_RATE value=".34"/>
+<TH1_PAY_TERM_BEGIN_DT value="20170517"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="3" type="Document">
+<result>
+<ISIN value="KR7005931001"/>
+<KOR_SECN_NM value="삼성전자1우"/>
+<SECN_KACD_NM value="우선주"/>
+<RGT_STD_DT value="20170331"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="140"/>
+<CASH_ALOC_AMT value="7000"/>
+<MARTP_DIV_RATE value=".44"/>
+<TH1_PAY_TERM_BEGIN_DT value="20170517"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="4" type="Document">
+<result>
+<ISIN value="KR7005930003"/>
+<KOR_SECN_NM value="삼성전자"/>
+<SECN_KACD_NM value="보통주"/>
+<RGT_STD_DT value="20170630"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="140"/>
+<CASH_ALOC_AMT value="7000"/>
+<MARTP_DIV_RATE value=".29"/>
+<TH1_PAY_TERM_BEGIN_DT value="20170816"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="5" type="Document">
+<result>
+<ISIN value="KR7005931001"/>
+<KOR_SECN_NM value="삼성전자1우"/>
+<SECN_KACD_NM value="우선주"/>
+<RGT_STD_DT value="20170630"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="140"/>
+<CASH_ALOC_AMT value="7000"/>
+<MARTP_DIV_RATE value=".37"/>
+<TH1_PAY_TERM_BEGIN_DT value="20170816"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="6" type="Document">
+<result>
+<ISIN value="KR7005930003"/>
+<KOR_SECN_NM value="삼성전자"/>
+<SECN_KACD_NM value="보통주"/>
+<RGT_STD_DT value="20170930"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="140"/>
+<CASH_ALOC_AMT value="7000"/>
+<MARTP_DIV_RATE value=".27"/>
+<TH1_PAY_TERM_BEGIN_DT value="20171120"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="7" type="Document">
+<result>
+<ISIN value="KR7005931001"/>
+<KOR_SECN_NM value="삼성전자1우"/>
+<SECN_KACD_NM value="우선주"/>
+<RGT_STD_DT value="20170930"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="140"/>
+<CASH_ALOC_AMT value="7000"/>
+<MARTP_DIV_RATE value=".33"/>
+<TH1_PAY_TERM_BEGIN_DT value="20171120"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="8" type="Document">
+<result>
+<ISIN value="KR7005930003"/>
+<KOR_SECN_NM value="삼성전자"/>
+<SECN_KACD_NM value="보통주"/>
+<RGT_STD_DT value="20171231"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="430"/>
+<CASH_ALOC_AMT value="21500"/>
+<MARTP_DIV_RATE value=".9"/>
+<TH1_PAY_TERM_BEGIN_DT value="20180423"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="9" type="Document">
+<result>
+<ISIN value="KR7005931001"/>
+<KOR_SECN_NM value="삼성전자1우"/>
+<SECN_KACD_NM value="우선주"/>
+<RGT_STD_DT value="20171231"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="431"/>
+<CASH_ALOC_AMT value="21550"/>
+<MARTP_DIV_RATE value="1.1"/>
+<TH1_PAY_TERM_BEGIN_DT value="20180423"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="10" type="Document">
+<result>
+<ISIN value="KR7005930003"/>
+<KOR_SECN_NM value="삼성전자"/>
+<SECN_KACD_NM value="보통주"/>
+<RGT_STD_DT value="20180331"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="354"/>
+<CASH_ALOC_AMT value="17700"/>
+<MARTP_DIV_RATE value=".7"/>
+<TH1_PAY_TERM_BEGIN_DT value="20180516"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="11" type="Document">
+<result>
+<ISIN value="KR7005931001"/>
+<KOR_SECN_NM value="삼성전자1우"/>
+<SECN_KACD_NM value="우선주"/>
+<RGT_STD_DT value="20180331"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="354"/>
+<CASH_ALOC_AMT value="17700"/>
+<MARTP_DIV_RATE value=".9"/>
+<TH1_PAY_TERM_BEGIN_DT value="20180516"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="12" type="Document">
+<result>
+<ISIN value="KR7005930003"/>
+<KOR_SECN_NM value="삼성전자"/>
+<SECN_KACD_NM value="보통주"/>
+<RGT_STD_DT value="20180630"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="354"/>
+<CASH_ALOC_AMT value="354"/>
+<MARTP_DIV_RATE value=".8"/>
+<TH1_PAY_TERM_BEGIN_DT value="20180820"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="13" type="Document">
+<result>
+<ISIN value="KR7005931001"/>
+<KOR_SECN_NM value="삼성전자1우"/>
+<SECN_KACD_NM value="우선주"/>
+<RGT_STD_DT value="20180630"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="354"/>
+<CASH_ALOC_AMT value="354"/>
+<MARTP_DIV_RATE value=".9"/>
+<TH1_PAY_TERM_BEGIN_DT value="20180820"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="14" type="Document">
+<result>
+<ISIN value="KR7005930003"/>
+<KOR_SECN_NM value="삼성전자"/>
+<SECN_KACD_NM value="보통주"/>
+<RGT_STD_DT value="20180930"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="354"/>
+<CASH_ALOC_AMT value="354"/>
+<MARTP_DIV_RATE value=".8"/>
+<TH1_PAY_TERM_BEGIN_DT value="20181120"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="15" type="Document">
+<result>
+<ISIN value="KR7005931001"/>
+<KOR_SECN_NM value="삼성전자1우"/>
+<SECN_KACD_NM value="우선주"/>
+<RGT_STD_DT value="20180930"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="354"/>
+<CASH_ALOC_AMT value="354"/>
+<MARTP_DIV_RATE value="1"/>
+<TH1_PAY_TERM_BEGIN_DT value="20181120"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="Y"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="16" type="Document">
+<result>
+<ISIN value="KR7005930003"/>
+<KOR_SECN_NM value="삼성전자"/>
+<SECN_KACD_NM value="보통주"/>
+<RGT_STD_DT value="20181231"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="354"/>
+<CASH_ALOC_AMT value="354"/>
+<MARTP_DIV_RATE value=".9"/>
+<TH1_PAY_TERM_BEGIN_DT value="20190419"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="N"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+<data vectorkey="17" type="Document">
+<result>
+<ISIN value="KR7005931001"/>
+<KOR_SECN_NM value="삼성전자1우"/>
+<SECN_KACD_NM value="우선주"/>
+<RGT_STD_DT value="20181231"/>
+<PVAL value="100"/>
+<STK_ALOC_RATIO value="0"/>
+<CASH_ALOC_RATIO value="355"/>
+<CASH_ALOC_AMT value="355"/>
+<MARTP_DIV_RATE value="1.1"/>
+<TH1_PAY_TERM_BEGIN_DT value="20190419"/>
+<DELI_DT value=""/>
+<MAJSHR_ETC_DIFF_ALOC_YN value="N"/>
+<TSTK_NOAGN_YN value="N"/>
+<CASH_DIFF_DIVIAMT_VAL value=""/>
+<CASH_DIFF_DIVI_RATE value=""/>
+<STK_DIFF_DIVI_RATE value=""/>
+<MARTP_DIFF_DIVI_RATE value=""/>
+</result>
+</data>
+</vector>

+ 146 - 0
Tests/Application.Tests/Fixtures/Seibro/기업/getDivSchedulInfo.xml

@@ -0,0 +1,146 @@
+<vector beforeServletCall="1783404878172" beforeEJBCall="1783404878180" afterServletCall="1783404878234" afterEJBCall="1783404878233" result="9">
+<data vectorkey="0" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<REP_SECN_NM value="삼성전자"/>
+<RGT_RACD value="103"/>
+<RGT_RSN_DTAIL_SORT_CD value="02"/>
+<RGT_STD_DT value="20180331"/>
+<ALOC_WHCD value="2"/>
+<SETACC_TPCD value="3"/>
+<FIX_TPCD value="1"/>
+<ROST_CLOSE_BEGIN_DT value="20180401"/>
+<ROST_CLOSE_EXPRY_DT value="20180414"/>
+<XRGT_DT value="20180329"/>
+<ELTSC_YN value="N"/>
+</result>
+</data>
+<data vectorkey="1" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<REP_SECN_NM value="삼성전자"/>
+<RGT_RACD value="103"/>
+<RGT_RSN_DTAIL_SORT_CD value="02"/>
+<RGT_STD_DT value="20180630"/>
+<ALOC_WHCD value="2"/>
+<SETACC_TPCD value="3"/>
+<FIX_TPCD value="1"/>
+<ROST_CLOSE_BEGIN_DT value="20180701"/>
+<ROST_CLOSE_EXPRY_DT value="20180714"/>
+<XRGT_DT value="20180628"/>
+<ELTSC_YN value="N"/>
+</result>
+</data>
+<data vectorkey="2" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<REP_SECN_NM value="삼성전자"/>
+<RGT_RACD value="103"/>
+<RGT_RSN_DTAIL_SORT_CD value="02"/>
+<RGT_STD_DT value="20170331"/>
+<ALOC_WHCD value="2"/>
+<SETACC_TPCD value="3"/>
+<FIX_TPCD value="1"/>
+<ROST_CLOSE_BEGIN_DT value="20170401"/>
+<ROST_CLOSE_EXPRY_DT value="20170414"/>
+<XRGT_DT value="20170330"/>
+<ELTSC_YN value="N"/>
+</result>
+</data>
+<data vectorkey="3" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<REP_SECN_NM value="삼성전자"/>
+<RGT_RACD value="103"/>
+<RGT_RSN_DTAIL_SORT_CD value="02"/>
+<RGT_STD_DT value="20181231"/>
+<ALOC_WHCD value="2"/>
+<SETACC_TPCD value="1"/>
+<FIX_TPCD value="1"/>
+<ROST_CLOSE_BEGIN_DT value="20190101"/>
+<ROST_CLOSE_EXPRY_DT value="20190131"/>
+<XRGT_DT value="20181227"/>
+<ELTSC_YN value="N"/>
+</result>
+</data>
+<data vectorkey="4" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<REP_SECN_NM value="삼성전자"/>
+<RGT_RACD value="103"/>
+<RGT_RSN_DTAIL_SORT_CD value="02"/>
+<RGT_STD_DT value="20171231"/>
+<ALOC_WHCD value="2"/>
+<SETACC_TPCD value="1"/>
+<FIX_TPCD value="1"/>
+<ROST_CLOSE_BEGIN_DT value="20180101"/>
+<ROST_CLOSE_EXPRY_DT value="20180131"/>
+<XRGT_DT value="20171227"/>
+<ELTSC_YN value="N"/>
+</result>
+</data>
+<data vectorkey="5" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<REP_SECN_NM value="삼성전자"/>
+<RGT_RACD value="103"/>
+<RGT_RSN_DTAIL_SORT_CD value="02"/>
+<RGT_STD_DT value="20170930"/>
+<ALOC_WHCD value="2"/>
+<SETACC_TPCD value="3"/>
+<FIX_TPCD value="1"/>
+<ROST_CLOSE_BEGIN_DT value="20171001"/>
+<ROST_CLOSE_EXPRY_DT value="20171014"/>
+<XRGT_DT value="20170928"/>
+<ELTSC_YN value="N"/>
+</result>
+</data>
+<data vectorkey="6" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<REP_SECN_NM value="삼성전자"/>
+<RGT_RACD value="103"/>
+<RGT_RSN_DTAIL_SORT_CD value="02"/>
+<RGT_STD_DT value="20180930"/>
+<ALOC_WHCD value="2"/>
+<SETACC_TPCD value="3"/>
+<FIX_TPCD value="1"/>
+<ROST_CLOSE_BEGIN_DT value="20181001"/>
+<ROST_CLOSE_EXPRY_DT value="20181014"/>
+<XRGT_DT value="20180927"/>
+<ELTSC_YN value="N"/>
+</result>
+</data>
+<data vectorkey="7" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<REP_SECN_NM value="삼성전자"/>
+<RGT_RACD value="103"/>
+<RGT_RSN_DTAIL_SORT_CD value="02"/>
+<RGT_STD_DT value="20161231"/>
+<ALOC_WHCD value="2"/>
+<SETACC_TPCD value="1"/>
+<FIX_TPCD value="1"/>
+<ROST_CLOSE_BEGIN_DT value="20170101"/>
+<ROST_CLOSE_EXPRY_DT value="20170131"/>
+<XRGT_DT value="20161228"/>
+<ELTSC_YN value="N"/>
+</result>
+</data>
+<data vectorkey="8" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<REP_SECN_NM value="삼성전자"/>
+<RGT_RACD value="103"/>
+<RGT_RSN_DTAIL_SORT_CD value="02"/>
+<RGT_STD_DT value="20170630"/>
+<ALOC_WHCD value="2"/>
+<SETACC_TPCD value="3"/>
+<FIX_TPCD value="1"/>
+<ROST_CLOSE_BEGIN_DT value="20170701"/>
+<ROST_CLOSE_EXPRY_DT value="20170714"/>
+<XRGT_DT value="20170629"/>
+<ELTSC_YN value="N"/>
+</result>
+</data>
+</vector>

+ 15 - 0
Tests/Application.Tests/Fixtures/Seibro/기업/getFmnmAltInfo.xml

@@ -0,0 +1,15 @@
+<vector beforeServletCall="1783404863448" beforeEJBCall="1783404863453" afterServletCall="1783404863465" afterEJBCall="1783404863465" result="1">
+<data vectorkey="0" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3572"/>
+<RGT_STD_DT value="20151001"/>
+<FMNM_BFALT_KOR_NM value="(주)다음카카오"/>
+<FMNM_BFALT_ENG_NM value="Daum Kakao"/>
+<FMNM_ALT_KOR_NM value="(주)카카오"/>
+<FMNM_ALT_ENG_NM value="Kakao Corp."/>
+<MIXUS_CIRCL_BEGIN_DT value="20151012"/>
+<MIXUS_CIRCL_EXPRY_DT value="20151019"/>
+<UNI_CIRCL_DT value="20151020"/>
+</result>
+</data>
+</vector>

+ 24 - 0
Tests/Application.Tests/Fixtures/Seibro/기업/getGmeetInfo.xml

@@ -0,0 +1,24 @@
+<vector beforeServletCall="1783404844214" beforeEJBCall="1783404844218" afterServletCall="1783404844247" afterEJBCall="1783404844246" result="1">
+<data vectorkey="0" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<ISSUIN_NO value="00593"/>
+<GMET_KACD value="001"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+<ROST_CLOSE_BEGIN_DT value="20180101"/>
+<ROST_CLOSE_EXPRY_DT value="20180131"/>
+<GMET_OMEET_YN value="Y"/>
+<GMET_PLACE_TPCD value="1"/>
+<COUNCL_DTERMIN_PUBN_DT value=""/>
+<GMET_PLACE value="서울특별시 서초구 서초대로 74길 11 (서초동) 삼성전자빌딩 5층 다목적홀"/>
+<STK_BUYREQ_RL_YN value="N"/>
+<RGT_STD_DT value="20171231"/>
+<GMET_DT value="20180323"/>
+<GMET_TTM value="0900"/>
+<NOTC_DLINE_DT value="20180308"/>
+<DFER_YN value="N"/>
+<EVOTE_YN value="N"/>
+<ELTSC_YN value="N"/>
+</result>
+</data>
+</vector>

+ 222 - 0
Tests/Application.Tests/Fixtures/Seibro/기업/getGmeetMeasureInfo.xml

@@ -0,0 +1,222 @@
+<vector beforeServletCall="1783404853248" beforeEJBCall="1783404853253" afterServletCall="1783404853289" afterEJBCall="1783404853288" result="11">
+<data vectorkey="0" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<ISSUIN_NO value="00593"/>
+<RGT_STD_DT value="20171231"/>
+<GMET_DT value="20180323"/>
+<GMET_KACD value="001"/>
+<AGENDA_SEQ value="1"/>
+<AGENDA_XPRES_NO value="1"/>
+<AGENDA_SCH_SEQO value="1     "/>
+<AGENDA_NO value="001"/>
+<DTAIL_AGENDA_NO value=""/>
+<AGENDA_NM value="재무제표승인"/>
+<ENG_AGENDA_NM value="APPROVAL OF FINANCIAL STATEMENTS"/>
+<DTAIL_AGENDA_NM value=""/>
+<DTAIL_ENG_AGENDA_NM value=""/>
+<VOTE_MANN_TPCD value="9"/>
+<GMET_RESULT_TPCD value="1"/>
+</result>
+</data>
+<data vectorkey="1" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<ISSUIN_NO value="00593"/>
+<RGT_STD_DT value="20171231"/>
+<GMET_DT value="20180323"/>
+<GMET_KACD value="001"/>
+<AGENDA_SEQ value="2"/>
+<AGENDA_XPRES_NO value="2-1-1"/>
+<AGENDA_SCH_SEQO value="2     "/>
+<AGENDA_NO value="101006"/>
+<DTAIL_AGENDA_NO value=""/>
+<AGENDA_NM value="사외이사 선임"/>
+<ENG_AGENDA_NM value="ELECTION OF OUTSIDE DIRECTOR"/>
+<DTAIL_AGENDA_NM value="김종훈"/>
+<DTAIL_ENG_AGENDA_NM value="GIM JONG HUN"/>
+<VOTE_MANN_TPCD value="9"/>
+<GMET_RESULT_TPCD value="1"/>
+</result>
+</data>
+<data vectorkey="2" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<ISSUIN_NO value="00593"/>
+<RGT_STD_DT value="20171231"/>
+<GMET_DT value="20180323"/>
+<GMET_KACD value="001"/>
+<AGENDA_SEQ value="3"/>
+<AGENDA_XPRES_NO value="2-1-2"/>
+<AGENDA_SCH_SEQO value="3     "/>
+<AGENDA_NO value="101006"/>
+<DTAIL_AGENDA_NO value=""/>
+<AGENDA_NM value="사외이사 선임"/>
+<ENG_AGENDA_NM value="ELECTION OF OUTSIDE DIRECTOR"/>
+<DTAIL_AGENDA_NM value="김선욱"/>
+<DTAIL_ENG_AGENDA_NM value="GIM SEON UK"/>
+<VOTE_MANN_TPCD value="9"/>
+<GMET_RESULT_TPCD value="1"/>
+</result>
+</data>
+<data vectorkey="3" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<ISSUIN_NO value="00593"/>
+<RGT_STD_DT value="20171231"/>
+<GMET_DT value="20180323"/>
+<GMET_KACD value="001"/>
+<AGENDA_SEQ value="4"/>
+<AGENDA_XPRES_NO value="2-1-3"/>
+<AGENDA_SCH_SEQO value="4     "/>
+<AGENDA_NO value="101006"/>
+<DTAIL_AGENDA_NO value=""/>
+<AGENDA_NM value="사외이사 선임"/>
+<ENG_AGENDA_NM value="ELECTION OF OUTSIDE DIRECTOR"/>
+<DTAIL_AGENDA_NM value="박병국"/>
+<DTAIL_ENG_AGENDA_NM value="BAK BYEONG GUK"/>
+<VOTE_MANN_TPCD value="9"/>
+<GMET_RESULT_TPCD value="1"/>
+</result>
+</data>
+<data vectorkey="4" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<ISSUIN_NO value="00593"/>
+<RGT_STD_DT value="20171231"/>
+<GMET_DT value="20180323"/>
+<GMET_KACD value="001"/>
+<AGENDA_SEQ value="5"/>
+<AGENDA_XPRES_NO value="2-2-1"/>
+<AGENDA_SCH_SEQO value="5     "/>
+<AGENDA_NO value="101005"/>
+<DTAIL_AGENDA_NO value=""/>
+<AGENDA_NM value="사내이사 선임"/>
+<ENG_AGENDA_NM value="ELECTION OF INSIDE DIRECTOR"/>
+<DTAIL_AGENDA_NM value="이상훈"/>
+<DTAIL_ENG_AGENDA_NM value="I SANG HUN"/>
+<VOTE_MANN_TPCD value="9"/>
+<GMET_RESULT_TPCD value="1"/>
+</result>
+</data>
+<data vectorkey="5" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<ISSUIN_NO value="00593"/>
+<RGT_STD_DT value="20171231"/>
+<GMET_DT value="20180323"/>
+<GMET_KACD value="001"/>
+<AGENDA_SEQ value="6"/>
+<AGENDA_XPRES_NO value="2-2-2"/>
+<AGENDA_SCH_SEQO value="6     "/>
+<AGENDA_NO value="101005"/>
+<DTAIL_AGENDA_NO value=""/>
+<AGENDA_NM value="사내이사 선임"/>
+<ENG_AGENDA_NM value="ELECTION OF INSIDE DIRECTOR"/>
+<DTAIL_AGENDA_NM value="김기남"/>
+<DTAIL_ENG_AGENDA_NM value="GIM GI NAM"/>
+<VOTE_MANN_TPCD value="9"/>
+<GMET_RESULT_TPCD value="1"/>
+</result>
+</data>
+<data vectorkey="6" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<ISSUIN_NO value="00593"/>
+<RGT_STD_DT value="20171231"/>
+<GMET_DT value="20180323"/>
+<GMET_KACD value="001"/>
+<AGENDA_SEQ value="7"/>
+<AGENDA_XPRES_NO value="2-2-3"/>
+<AGENDA_SCH_SEQO value="7     "/>
+<AGENDA_NO value="101005"/>
+<DTAIL_AGENDA_NO value=""/>
+<AGENDA_NM value="사내이사 선임"/>
+<ENG_AGENDA_NM value="ELECTION OF INSIDE DIRECTOR"/>
+<DTAIL_AGENDA_NM value="김현석"/>
+<DTAIL_ENG_AGENDA_NM value="GIM HYEON SEOK"/>
+<VOTE_MANN_TPCD value="9"/>
+<GMET_RESULT_TPCD value="1"/>
+</result>
+</data>
+<data vectorkey="7" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<ISSUIN_NO value="00593"/>
+<RGT_STD_DT value="20171231"/>
+<GMET_DT value="20180323"/>
+<GMET_KACD value="001"/>
+<AGENDA_SEQ value="8"/>
+<AGENDA_XPRES_NO value="2-2-4"/>
+<AGENDA_SCH_SEQO value="8     "/>
+<AGENDA_NO value="101005"/>
+<DTAIL_AGENDA_NO value=""/>
+<AGENDA_NM value="사내이사 선임"/>
+<ENG_AGENDA_NM value="ELECTION OF INSIDE DIRECTOR"/>
+<DTAIL_AGENDA_NM value="고동진"/>
+<DTAIL_ENG_AGENDA_NM value="GO DONG JIN"/>
+<VOTE_MANN_TPCD value="9"/>
+<GMET_RESULT_TPCD value="1"/>
+</result>
+</data>
+<data vectorkey="8" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<ISSUIN_NO value="00593"/>
+<RGT_STD_DT value="20171231"/>
+<GMET_DT value="20180323"/>
+<GMET_KACD value="001"/>
+<AGENDA_SEQ value="9"/>
+<AGENDA_XPRES_NO value="2-3"/>
+<AGENDA_SCH_SEQO value="9     "/>
+<AGENDA_NO value="231"/>
+<DTAIL_AGENDA_NO value=""/>
+<AGENDA_NM value="감사위원회 위원 선임"/>
+<ENG_AGENDA_NM value="ELECTION OF AUDIT COMMITTEE MEMBER"/>
+<DTAIL_AGENDA_NM value="김선욱"/>
+<DTAIL_ENG_AGENDA_NM value="GIM SEON UK"/>
+<VOTE_MANN_TPCD value="9"/>
+<GMET_RESULT_TPCD value="1"/>
+</result>
+</data>
+<data vectorkey="9" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<ISSUIN_NO value="00593"/>
+<RGT_STD_DT value="20171231"/>
+<GMET_DT value="20180323"/>
+<GMET_KACD value="001"/>
+<AGENDA_SEQ value="10"/>
+<AGENDA_XPRES_NO value="3"/>
+<AGENDA_SCH_SEQO value="10    "/>
+<AGENDA_NO value="301"/>
+<DTAIL_AGENDA_NO value=""/>
+<AGENDA_NM value="이사 보수한도액 승인"/>
+<ENG_AGENDA_NM value="APPROVAL OF REMUNERATION FOR DIRECTOR"/>
+<DTAIL_AGENDA_NM value=""/>
+<DTAIL_ENG_AGENDA_NM value=""/>
+<VOTE_MANN_TPCD value="9"/>
+<GMET_RESULT_TPCD value="1"/>
+</result>
+</data>
+<data vectorkey="10" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<ISSUIN_NO value="00593"/>
+<RGT_STD_DT value="20171231"/>
+<GMET_DT value="20180323"/>
+<GMET_KACD value="001"/>
+<AGENDA_SEQ value="11"/>
+<AGENDA_XPRES_NO value="4"/>
+<AGENDA_SCH_SEQO value="11    "/>
+<AGENDA_NO value="002"/>
+<DTAIL_AGENDA_NO value=""/>
+<AGENDA_NM value="액면변경 및 정관변경"/>
+<ENG_AGENDA_NM value="CHANGE OF PAR VALUE &amp; AMENDMENT OF ARTICLES OF INCORP."/>
+<DTAIL_AGENDA_NM value=""/>
+<DTAIL_ENG_AGENDA_NM value=""/>
+<VOTE_MANN_TPCD value="9"/>
+<GMET_RESULT_TPCD value="1"/>
+</result>
+</data>
+</vector>

+ 8 - 0
Tests/Application.Tests/Fixtures/Seibro/기업/getIssucoCustnoByIsin.xml

@@ -0,0 +1,8 @@
+<vector beforeServletCall="1783404820918" beforeEJBCall="1783404820923" afterServletCall="1783404820926" afterEJBCall="1783404820925" result="1">
+<data vectorkey="0" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<REP_SECN_NM value="삼성전자"/>
+</result>
+</data>
+</vector>

+ 16 - 0
Tests/Application.Tests/Fixtures/Seibro/기업/getOddLotInfo.xml

@@ -0,0 +1,16 @@
+<vector beforeServletCall="1783404894917" beforeEJBCall="1783404894921" afterServletCall="1783404894953" afterEJBCall="1783404894952" result="1">
+<data vectorkey="0" type="Document">
+<result>
+<RGT_STD_DT value="20180611"/>
+<RGT_RACD value="102"/>
+<RGT_RACD_NM value="무상증자"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+<ESTM_STD_TPCD value="04"/>
+<ESTM_STD_DT value="20180702"/>
+<ESTM_STDPRC value="3175"/>
+<ROST_CLOSE_BEGIN_DT value=""/>
+<ROST_CLOSE_EXPRY_DT value=""/>
+<XRGT_DT value="20180608"/>
+</result>
+</data>
+</vector>

+ 32 - 0
Tests/Application.Tests/Fixtures/Seibro/기업/getStddtInfo.xml

@@ -0,0 +1,32 @@
+<vector beforeServletCall="1783404838289" beforeEJBCall="1783404838295" afterServletCall="1783404838317" afterEJBCall="1783404838317" result="3">
+<data vectorkey="0" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<REP_SECN_NM value="삼성전자"/>
+<RGT_STD_DT value="20161231"/>
+<RGT_RACD value="001"/>
+<RGT_RACD_NM value="정기총회"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="1" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<REP_SECN_NM value="삼성전자"/>
+<RGT_STD_DT value="20171231"/>
+<RGT_RACD value="001"/>
+<RGT_RACD_NM value="정기총회"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+<data vectorkey="2" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<REP_SECN_NM value="삼성전자"/>
+<RGT_STD_DT value="20181231"/>
+<RGT_RACD value="001"/>
+<RGT_RACD_NM value="정기총회"/>
+<RGT_RSN_DTAIL_SORT_CD value="99"/>
+</result>
+</data>
+</vector>

+ 26 - 0
Tests/Application.Tests/Fixtures/Seibro/외화 증권 정보/getNationFrsecCusInfo.xml

@@ -0,0 +1,26 @@
+<vector beforeServletCall="1783405314615" beforeEJBCall="1783405314621" afterServletCall="1783405314626" afterEJBCall="1783405314625" result="4">
+<data vectorkey="0" type="Document">
+<result>
+<SECN_TPCD value="71"/>
+<FRSEC_CUS_AMT value="5509745879.73"/>
+</result>
+</data>
+<data vectorkey="1" type="Document">
+<result>
+<SECN_TPCD value="72"/>
+<FRSEC_CUS_AMT value="31168092.65"/>
+</result>
+</data>
+<data vectorkey="2" type="Document">
+<result>
+<SECN_TPCD value="73"/>
+<FRSEC_CUS_AMT value="2550737.05"/>
+</result>
+</data>
+<data vectorkey="3" type="Document">
+<result>
+<SECN_TPCD value="75"/>
+<FRSEC_CUS_AMT value="245404525"/>
+</result>
+</data>
+</vector>

+ 58 - 0
Tests/Application.Tests/Fixtures/Seibro/외화 증권 정보/getNationFrsecSetlInfo.xml

@@ -0,0 +1,58 @@
+<vector beforeServletCall="1783405329998" beforeEJBCall="1783405330004" afterServletCall="1783405330009" afterEJBCall="1783405330009" result="7">
+<data vectorkey="0" type="Document">
+<result>
+<INTL_BIZ_CACD value="1110"/>
+<SECN_TPCD value="71"/>
+<SETL_COUNT value="1591"/>
+<FRSEC_SETL_AMT value="37289660.18"/>
+</result>
+</data>
+<data vectorkey="1" type="Document">
+<result>
+<INTL_BIZ_CACD value="1110"/>
+<SECN_TPCD value="72"/>
+<SETL_COUNT value="25"/>
+<FRSEC_SETL_AMT value="1269766.98"/>
+</result>
+</data>
+<data vectorkey="2" type="Document">
+<result>
+<INTL_BIZ_CACD value="1110"/>
+<SECN_TPCD value="75"/>
+<SETL_COUNT value="1"/>
+<FRSEC_SETL_AMT value="49957965.36"/>
+</result>
+</data>
+<data vectorkey="3" type="Document">
+<result>
+<INTL_BIZ_CACD value="1120"/>
+<SECN_TPCD value="71"/>
+<SETL_COUNT value="917"/>
+<FRSEC_SETL_AMT value="34514711.36"/>
+</result>
+</data>
+<data vectorkey="4" type="Document">
+<result>
+<INTL_BIZ_CACD value="1120"/>
+<SECN_TPCD value="72"/>
+<SETL_COUNT value="13"/>
+<FRSEC_SETL_AMT value="660483.64"/>
+</result>
+</data>
+<data vectorkey="5" type="Document">
+<result>
+<INTL_BIZ_CACD value="1120"/>
+<SECN_TPCD value="73"/>
+<SETL_COUNT value="1"/>
+<FRSEC_SETL_AMT value="2239.57"/>
+</result>
+</data>
+<data vectorkey="6" type="Document">
+<result>
+<INTL_BIZ_CACD value="1120"/>
+<SECN_TPCD value="75"/>
+<SETL_COUNT value="2"/>
+<FRSEC_SETL_AMT value="50246771.96"/>
+</result>
+</data>
+</vector>

+ 18 - 0
Tests/Application.Tests/Fixtures/Seibro/외화 증권 정보/getSecnFrsecCusInfo.xml

@@ -0,0 +1,18 @@
+<vector beforeServletCall="1783405322186" beforeEJBCall="1783405322191" afterServletCall="1783405322200" afterEJBCall="1783405322200" result="2">
+<data vectorkey="0" type="Document">
+<result>
+<NATION_CD value="DE"/>
+<SECN_TPCD value="71"/>
+<FRSEC_TOT_HOLD_AMT value="10812"/>
+<FRSEC_TOT_HOLD_QTY value="6"/>
+</result>
+</data>
+<data vectorkey="1" type="Document">
+<result>
+<NATION_CD value="US"/>
+<SECN_TPCD value="71"/>
+<FRSEC_TOT_HOLD_AMT value="737881960"/>
+<FRSEC_TOT_HOLD_QTY value="404778"/>
+</result>
+</data>
+</vector>

+ 20 - 0
Tests/Application.Tests/Fixtures/Seibro/외화 증권 정보/getSecnFrsecSetlInfo.xml

@@ -0,0 +1,20 @@
+<vector beforeServletCall="1783405337200" beforeEJBCall="1783405337213" afterServletCall="1783405337225" afterEJBCall="1783405337224" result="2">
+<data vectorkey="0" type="Document">
+<result>
+<NATION_CD value="US"/>
+<SECN_TPCD value="71"/>
+<INTL_BIZ_CACD value="1110"/>
+<SETL_ASK_QTY value="1571"/>
+<SETL_AMT value="2804130"/>
+</result>
+</data>
+<data vectorkey="1" type="Document">
+<result>
+<NATION_CD value="US"/>
+<SECN_TPCD value="71"/>
+<INTL_BIZ_CACD value="1120"/>
+<SETL_ASK_QTY value="1216"/>
+<SETL_AMT value="2169827"/>
+</result>
+</data>
+</vector>

+ 18 - 0
Tests/Application.Tests/Fixtures/Seibro/주식/getSafeDpDutyDepoStatus.xml

@@ -0,0 +1,18 @@
+<vector beforeServletCall="1783405104406" beforeEJBCall="1783405104412" afterServletCall="1783405104504" afterEJBCall="1783405104503" result="1">
+<data vectorkey="0" type="Document">
+<result>
+<ISSUCO_CUSTNO value="162"/>
+<KOR_SECN_NM value="케이비아이동국실업"/>
+<SECN_KACD value="보통주"/>
+<SHOTN_ISIN value="001620"/>
+<MART_TPCD value="11"/>
+<OCCR_SEQ value="1"/>
+<SAFEDP_DT value="20190225"/>
+<SAFEDP_QTY value="12730000"/>
+<DUTY_SAFEDP_RACD value="02"/>
+<RETURN_DT value=""/>
+<RETURN_QTY value=""/>
+<TOTAL_STK_CNT value="22258606"/>
+</result>
+</data>
+</vector>

+ 884 - 0
Tests/Application.Tests/Fixtures/Seibro/주식/getShotnByMart.xml

@@ -0,0 +1,884 @@
+<vector beforeServletCall="1783405052761" beforeEJBCall="1783405052766" afterServletCall="1783405052814" afterEJBCall="1783405052813" result="126">
+<data vectorkey="0" type="Document">
+<result>
+<SHOTN_ISIN value="000800"/>
+<KOR_SECN_NM value="경남기업"/>
+<ISSUCO_CUSTNO value="80"/>
+</result>
+</data>
+<data vectorkey="1" type="Document">
+<result>
+<SHOTN_ISIN value="001490"/>
+<KOR_SECN_NM value="천지산업"/>
+<ISSUCO_CUSTNO value="149"/>
+</result>
+</data>
+<data vectorkey="2" type="Document">
+<result>
+<SHOTN_ISIN value="001890"/>
+<KOR_SECN_NM value="에이치디씨영창"/>
+<ISSUCO_CUSTNO value="189"/>
+</result>
+</data>
+<data vectorkey="3" type="Document">
+<result>
+<SHOTN_ISIN value="001970"/>
+<KOR_SECN_NM value="에스지신성건설"/>
+<ISSUCO_CUSTNO value="197"/>
+</result>
+</data>
+<data vectorkey="4" type="Document">
+<result>
+<SHOTN_ISIN value="002470"/>
+<KOR_SECN_NM value="신영씨앤디"/>
+<ISSUCO_CUSTNO value="247"/>
+</result>
+</data>
+<data vectorkey="5" type="Document">
+<result>
+<SHOTN_ISIN value="002480"/>
+<KOR_SECN_NM value="범양사"/>
+<ISSUCO_CUSTNO value="248"/>
+</result>
+</data>
+<data vectorkey="6" type="Document">
+<result>
+<SHOTN_ISIN value="005900"/>
+<KOR_SECN_NM value="동양건설산업"/>
+<ISSUCO_CUSTNO value="590"/>
+</result>
+</data>
+<data vectorkey="7" type="Document">
+<result>
+<SHOTN_ISIN value="008120"/>
+<KOR_SECN_NM value="엠소닉"/>
+<ISSUCO_CUSTNO value="812"/>
+</result>
+</data>
+<data vectorkey="8" type="Document">
+<result>
+<SHOTN_ISIN value="008340"/>
+<KOR_SECN_NM value="대주코레스"/>
+<ISSUCO_CUSTNO value="834"/>
+</result>
+</data>
+<data vectorkey="9" type="Document">
+<result>
+<SHOTN_ISIN value="002580"/>
+<KOR_SECN_NM value="삼미"/>
+<ISSUCO_CUSTNO value="258"/>
+</result>
+</data>
+<data vectorkey="10" type="Document">
+<result>
+<SHOTN_ISIN value="003340"/>
+<KOR_SECN_NM value="SK에코플랜트"/>
+<ISSUCO_CUSTNO value="334"/>
+</result>
+</data>
+<data vectorkey="11" type="Document">
+<result>
+<SHOTN_ISIN value="036150"/>
+<KOR_SECN_NM value="에스피반도체통신"/>
+<ISSUCO_CUSTNO value="3615"/>
+</result>
+</data>
+<data vectorkey="12" type="Document">
+<result>
+<SHOTN_ISIN value="037340"/>
+<KOR_SECN_NM value="에이치씨코퍼레이션"/>
+<ISSUCO_CUSTNO value="3734"/>
+</result>
+</data>
+<data vectorkey="13" type="Document">
+<result>
+<SHOTN_ISIN value="037640"/>
+<KOR_SECN_NM value="지에스엔텍"/>
+<ISSUCO_CUSTNO value="3764"/>
+</result>
+</data>
+<data vectorkey="14" type="Document">
+<result>
+<SHOTN_ISIN value="037890"/>
+<KOR_SECN_NM value="에어미디어"/>
+<ISSUCO_CUSTNO value="3789"/>
+</result>
+</data>
+<data vectorkey="15" type="Document">
+<result>
+<SHOTN_ISIN value="038520"/>
+<KOR_SECN_NM value="오리엔트전자"/>
+<ISSUCO_CUSTNO value="3852"/>
+</result>
+</data>
+<data vectorkey="16" type="Document">
+<result>
+<SHOTN_ISIN value="040100"/>
+<KOR_SECN_NM value="케이아이티"/>
+<ISSUCO_CUSTNO value="6351"/>
+</result>
+</data>
+<data vectorkey="17" type="Document">
+<result>
+<SHOTN_ISIN value="040470"/>
+<KOR_SECN_NM value="코리아2000"/>
+<ISSUCO_CUSTNO value="6379"/>
+</result>
+</data>
+<data vectorkey="18" type="Document">
+<result>
+<SHOTN_ISIN value="040830"/>
+<KOR_SECN_NM value="롯데글로벌로지스"/>
+<ISSUCO_CUSTNO value="4334"/>
+</result>
+</data>
+<data vectorkey="19" type="Document">
+<result>
+<SHOTN_ISIN value="041500"/>
+<KOR_SECN_NM value="디비엘"/>
+<ISSUCO_CUSTNO value="6475"/>
+</result>
+</data>
+<data vectorkey="20" type="Document">
+<result>
+<SHOTN_ISIN value="041710"/>
+<KOR_SECN_NM value="씽크풀"/>
+<ISSUCO_CUSTNO value="6497"/>
+</result>
+</data>
+<data vectorkey="21" type="Document">
+<result>
+<SHOTN_ISIN value="008690"/>
+<KOR_SECN_NM value="비에스한양"/>
+<ISSUCO_CUSTNO value="869"/>
+</result>
+</data>
+<data vectorkey="22" type="Document">
+<result>
+<SHOTN_ISIN value="009280"/>
+<KOR_SECN_NM value="다함이텍"/>
+<ISSUCO_CUSTNO value="928"/>
+</result>
+</data>
+<data vectorkey="23" type="Document">
+<result>
+<SHOTN_ISIN value="011400"/>
+<KOR_SECN_NM value="아진카인텍"/>
+<ISSUCO_CUSTNO value="1140"/>
+</result>
+</data>
+<data vectorkey="24" type="Document">
+<result>
+<SHOTN_ISIN value="011870"/>
+<KOR_SECN_NM value="엘티삼보"/>
+<ISSUCO_CUSTNO value="1187"/>
+</result>
+</data>
+<data vectorkey="25" type="Document">
+<result>
+<SHOTN_ISIN value="012350"/>
+<KOR_SECN_NM value="대동모빌리티"/>
+<ISSUCO_CUSTNO value="1235"/>
+</result>
+</data>
+<data vectorkey="26" type="Document">
+<result>
+<SHOTN_ISIN value="012580"/>
+<KOR_SECN_NM value="신세계톰보이"/>
+<ISSUCO_CUSTNO value="1258"/>
+</result>
+</data>
+<data vectorkey="27" type="Document">
+<result>
+<SHOTN_ISIN value="012670"/>
+<KOR_SECN_NM value="환영철강공업"/>
+<ISSUCO_CUSTNO value="1267"/>
+</result>
+</data>
+<data vectorkey="28" type="Document">
+<result>
+<SHOTN_ISIN value="012760"/>
+<KOR_SECN_NM value="동아"/>
+<ISSUCO_CUSTNO value="1276"/>
+</result>
+</data>
+<data vectorkey="29" type="Document">
+<result>
+<SHOTN_ISIN value="013900"/>
+<KOR_SECN_NM value="두원중공업"/>
+<ISSUCO_CUSTNO value="1390"/>
+</result>
+</data>
+<data vectorkey="30" type="Document">
+<result>
+<SHOTN_ISIN value="015150"/>
+<KOR_SECN_NM value="다산"/>
+<ISSUCO_CUSTNO value="1515"/>
+</result>
+</data>
+<data vectorkey="31" type="Document">
+<result>
+<SHOTN_ISIN value="015200"/>
+<KOR_SECN_NM value="성원"/>
+<ISSUCO_CUSTNO value="1520"/>
+</result>
+</data>
+<data vectorkey="32" type="Document">
+<result>
+<SHOTN_ISIN value="018360"/>
+<KOR_SECN_NM value="삼성메디슨"/>
+<ISSUCO_CUSTNO value="1836"/>
+</result>
+</data>
+<data vectorkey="33" type="Document">
+<result>
+<SHOTN_ISIN value="020920"/>
+<KOR_SECN_NM value="코리아로터리서비스"/>
+<ISSUCO_CUSTNO value="2092"/>
+</result>
+</data>
+<data vectorkey="34" type="Document">
+<result>
+<SHOTN_ISIN value="025100"/>
+<KOR_SECN_NM value="포스코이앤씨"/>
+<ISSUCO_CUSTNO value="2510"/>
+</result>
+</data>
+<data vectorkey="35" type="Document">
+<result>
+<SHOTN_ISIN value="026710"/>
+<KOR_SECN_NM value="동진건설"/>
+<ISSUCO_CUSTNO value="2671"/>
+</result>
+</data>
+<data vectorkey="36" type="Document">
+<result>
+<SHOTN_ISIN value="026970"/>
+<KOR_SECN_NM value="대백저축은행"/>
+<ISSUCO_CUSTNO value="2697"/>
+</result>
+</data>
+<data vectorkey="37" type="Document">
+<result>
+<SHOTN_ISIN value="030010"/>
+<KOR_SECN_NM value="아이엠증권"/>
+<ISSUCO_CUSTNO value="3001"/>
+</result>
+</data>
+<data vectorkey="38" type="Document">
+<result>
+<SHOTN_ISIN value="031690"/>
+<KOR_SECN_NM value="아이디스파워텔"/>
+<ISSUCO_CUSTNO value="3169"/>
+</result>
+</data>
+<data vectorkey="39" type="Document">
+<result>
+<SHOTN_ISIN value="032040"/>
+<KOR_SECN_NM value="씨앤에스자산관리"/>
+<ISSUCO_CUSTNO value="3204"/>
+</result>
+</data>
+<data vectorkey="40" type="Document">
+<result>
+<SHOTN_ISIN value="033480"/>
+<KOR_SECN_NM value="제주국제컨벤션센터"/>
+<ISSUCO_CUSTNO value="3348"/>
+</result>
+</data>
+<data vectorkey="41" type="Document">
+<result>
+<SHOTN_ISIN value="035430"/>
+<KOR_SECN_NM value="드림라인"/>
+<ISSUCO_CUSTNO value="4411"/>
+</result>
+</data>
+<data vectorkey="42" type="Document">
+<result>
+<SHOTN_ISIN value="046290"/>
+<KOR_SECN_NM value="엠지캐피탈"/>
+<ISSUCO_CUSTNO value="4419"/>
+</result>
+</data>
+<data vectorkey="43" type="Document">
+<result>
+<SHOTN_ISIN value="049130"/>
+<KOR_SECN_NM value="하우리"/>
+<ISSUCO_CUSTNO value="7127"/>
+</result>
+</data>
+<data vectorkey="44" type="Document">
+<result>
+<SHOTN_ISIN value="049500"/>
+<KOR_SECN_NM value="케이알투자증권"/>
+<ISSUCO_CUSTNO value="6644"/>
+</result>
+</data>
+<data vectorkey="45" type="Document">
+<result>
+<SHOTN_ISIN value="050480"/>
+<KOR_SECN_NM value="마이다스아이티"/>
+<ISSUCO_CUSTNO value="7253"/>
+</result>
+</data>
+<data vectorkey="46" type="Document">
+<result>
+<SHOTN_ISIN value="052920"/>
+<KOR_SECN_NM value="케어캠프"/>
+<ISSUCO_CUSTNO value="7490"/>
+</result>
+</data>
+<data vectorkey="47" type="Document">
+<result>
+<SHOTN_ISIN value="056880"/>
+<KOR_SECN_NM value="휘라포토닉스"/>
+<ISSUCO_CUSTNO value="6252"/>
+</result>
+</data>
+<data vectorkey="48" type="Document">
+<result>
+<SHOTN_ISIN value="060910"/>
+<KOR_SECN_NM value="프리젠"/>
+<ISSUCO_CUSTNO value="4936"/>
+</result>
+</data>
+<data vectorkey="49" type="Document">
+<result>
+<SHOTN_ISIN value="066190"/>
+<KOR_SECN_NM value="삼중테크"/>
+<ISSUCO_CUSTNO value="8055"/>
+</result>
+</data>
+<data vectorkey="50" type="Document">
+<result>
+<SHOTN_ISIN value="066290"/>
+<KOR_SECN_NM value="시큐아이"/>
+<ISSUCO_CUSTNO value="8068"/>
+</result>
+</data>
+<data vectorkey="51" type="Document">
+<result>
+<SHOTN_ISIN value="066400"/>
+<KOR_SECN_NM value="하나투어리스트"/>
+<ISSUCO_CUSTNO value="8078"/>
+</result>
+</data>
+<data vectorkey="52" type="Document">
+<result>
+<SHOTN_ISIN value="066870"/>
+<KOR_SECN_NM value="비트로시스 농업회사법인"/>
+<ISSUCO_CUSTNO value="8130"/>
+</result>
+</data>
+<data vectorkey="53" type="Document">
+<result>
+<SHOTN_ISIN value="067250"/>
+<KOR_SECN_NM value="케이조선"/>
+<ISSUCO_CUSTNO value="4068"/>
+</result>
+</data>
+<data vectorkey="54" type="Document">
+<result>
+<SHOTN_ISIN value="061610"/>
+<KOR_SECN_NM value="투에버"/>
+<ISSUCO_CUSTNO value="7732"/>
+</result>
+</data>
+<data vectorkey="55" type="Document">
+<result>
+<SHOTN_ISIN value="042380"/>
+<KOR_SECN_NM value="세메스"/>
+<ISSUCO_CUSTNO value="4238"/>
+</result>
+</data>
+<data vectorkey="56" type="Document">
+<result>
+<SHOTN_ISIN value="043500"/>
+<KOR_SECN_NM value="드림텍"/>
+<ISSUCO_CUSTNO value="6648"/>
+</result>
+</data>
+<data vectorkey="57" type="Document">
+<result>
+<SHOTN_ISIN value="045020"/>
+<KOR_SECN_NM value="포앤티"/>
+<ISSUCO_CUSTNO value="6782"/>
+</result>
+</data>
+<data vectorkey="58" type="Document">
+<result>
+<SHOTN_ISIN value="094930"/>
+<KOR_SECN_NM value="코스텔"/>
+<ISSUCO_CUSTNO value="11945"/>
+</result>
+</data>
+<data vectorkey="59" type="Document">
+<result>
+<SHOTN_ISIN value="099620"/>
+<KOR_SECN_NM value="코엔스"/>
+<ISSUCO_CUSTNO value="14011"/>
+</result>
+</data>
+<data vectorkey="60" type="Document">
+<result>
+<SHOTN_ISIN value="070080"/>
+<KOR_SECN_NM value="삼보오토"/>
+<ISSUCO_CUSTNO value="8493"/>
+</result>
+</data>
+<data vectorkey="61" type="Document">
+<result>
+<SHOTN_ISIN value="070340"/>
+<KOR_SECN_NM value="서진캠"/>
+<ISSUCO_CUSTNO value="8527"/>
+</result>
+</data>
+<data vectorkey="62" type="Document">
+<result>
+<SHOTN_ISIN value="070480"/>
+<KOR_SECN_NM value="신비앤텍"/>
+<ISSUCO_CUSTNO value="11238"/>
+</result>
+</data>
+<data vectorkey="63" type="Document">
+<result>
+<SHOTN_ISIN value="072610"/>
+<KOR_SECN_NM value="티맥스소프트"/>
+<ISSUCO_CUSTNO value="8790"/>
+</result>
+</data>
+<data vectorkey="64" type="Document">
+<result>
+<SHOTN_ISIN value="073960"/>
+<KOR_SECN_NM value="씨브이네트"/>
+<ISSUCO_CUSTNO value="8950"/>
+</result>
+</data>
+<data vectorkey="65" type="Document">
+<result>
+<SHOTN_ISIN value="074750"/>
+<KOR_SECN_NM value="셀릭스"/>
+<ISSUCO_CUSTNO value="9049"/>
+</result>
+</data>
+<data vectorkey="66" type="Document">
+<result>
+<SHOTN_ISIN value="075120"/>
+<KOR_SECN_NM value="현대아산"/>
+<ISSUCO_CUSTNO value="9091"/>
+</result>
+</data>
+<data vectorkey="67" type="Document">
+<result>
+<SHOTN_ISIN value="078060"/>
+<KOR_SECN_NM value="매일방송"/>
+<ISSUCO_CUSTNO value="9421"/>
+</result>
+</data>
+<data vectorkey="68" type="Document">
+<result>
+<SHOTN_ISIN value="079180"/>
+<KOR_SECN_NM value="내일신문"/>
+<ISSUCO_CUSTNO value="9535"/>
+</result>
+</data>
+<data vectorkey="69" type="Document">
+<result>
+<SHOTN_ISIN value="080640"/>
+<KOR_SECN_NM value="미라콤아이앤씨"/>
+<ISSUCO_CUSTNO value="9708"/>
+</result>
+</data>
+<data vectorkey="70" type="Document">
+<result>
+<SHOTN_ISIN value="084820"/>
+<KOR_SECN_NM value="피케이밸브앤엔지니어링"/>
+<ISSUCO_CUSTNO value="11357"/>
+</result>
+</data>
+<data vectorkey="71" type="Document">
+<result>
+<SHOTN_ISIN value="087800"/>
+<KOR_SECN_NM value="KDB생명보험"/>
+<ISSUCO_CUSTNO value="5653"/>
+</result>
+</data>
+<data vectorkey="72" type="Document">
+<result>
+<SHOTN_ISIN value="090120"/>
+<KOR_SECN_NM value="잘만테크"/>
+<ISSUCO_CUSTNO value="11684"/>
+</result>
+</data>
+<data vectorkey="73" type="Document">
+<result>
+<SHOTN_ISIN value="110030"/>
+<KOR_SECN_NM value="완도전복"/>
+<ISSUCO_CUSTNO value="13953"/>
+</result>
+</data>
+<data vectorkey="74" type="Document">
+<result>
+<SHOTN_ISIN value="114750"/>
+<KOR_SECN_NM value="와이디생명과학"/>
+<ISSUCO_CUSTNO value="13217"/>
+</result>
+</data>
+<data vectorkey="75" type="Document">
+<result>
+<SHOTN_ISIN value="123900"/>
+<KOR_SECN_NM value="골든블루"/>
+<ISSUCO_CUSTNO value="15288"/>
+</result>
+</data>
+<data vectorkey="76" type="Document">
+<result>
+<SHOTN_ISIN value="129050"/>
+<KOR_SECN_NM value="앤알커뮤니케이션"/>
+<ISSUCO_CUSTNO value="11523"/>
+</result>
+</data>
+<data vectorkey="77" type="Document">
+<result>
+<SHOTN_ISIN value="140310"/>
+<KOR_SECN_NM value="자일자동차"/>
+<ISSUCO_CUSTNO value="17034"/>
+</result>
+</data>
+<data vectorkey="78" type="Document">
+<result>
+<SHOTN_ISIN value="102600"/>
+<KOR_SECN_NM value="메가젠임플란트"/>
+<ISSUCO_CUSTNO value="12909"/>
+</result>
+</data>
+<data vectorkey="79" type="Document">
+<result>
+<SHOTN_ISIN value="104230"/>
+<KOR_SECN_NM value="엘에스전선"/>
+<ISSUCO_CUSTNO value="14104"/>
+</result>
+</data>
+<data vectorkey="80" type="Document">
+<result>
+<SHOTN_ISIN value="104690"/>
+<KOR_SECN_NM value="제이앤드"/>
+<ISSUCO_CUSTNO value="14152"/>
+</result>
+</data>
+<data vectorkey="81" type="Document">
+<result>
+<SHOTN_ISIN value="104770"/>
+<KOR_SECN_NM value="아이비케이투자증권"/>
+<ISSUCO_CUSTNO value="14138"/>
+</result>
+</data>
+<data vectorkey="82" type="Document">
+<result>
+<SHOTN_ISIN value="105700"/>
+<KOR_SECN_NM value="동우당제약"/>
+<ISSUCO_CUSTNO value="14285"/>
+</result>
+</data>
+<data vectorkey="83" type="Document">
+<result>
+<SHOTN_ISIN value="166220"/>
+<KOR_SECN_NM value="지에스엘"/>
+<ISSUCO_CUSTNO value="19712"/>
+</result>
+</data>
+<data vectorkey="84" type="Document">
+<result>
+<SHOTN_ISIN value="168570"/>
+<KOR_SECN_NM value="포겟"/>
+<ISSUCO_CUSTNO value="19967"/>
+</result>
+</data>
+<data vectorkey="85" type="Document">
+<result>
+<SHOTN_ISIN value="179690"/>
+<KOR_SECN_NM value="셀인바이오"/>
+<ISSUCO_CUSTNO value="21129"/>
+</result>
+</data>
+<data vectorkey="86" type="Document">
+<result>
+<SHOTN_ISIN value="150840"/>
+<KOR_SECN_NM value="인트로메딕"/>
+<ISSUCO_CUSTNO value="18229"/>
+</result>
+</data>
+<data vectorkey="87" type="Document">
+<result>
+<SHOTN_ISIN value="136790"/>
+<KOR_SECN_NM value="동화일렉트로라이트"/>
+<ISSUCO_CUSTNO value="21209"/>
+</result>
+</data>
+<data vectorkey="88" type="Document">
+<result>
+<SHOTN_ISIN value="184560"/>
+<KOR_SECN_NM value="디더블유미디어홀딩스"/>
+<ISSUCO_CUSTNO value="21644"/>
+</result>
+</data>
+<data vectorkey="89" type="Document">
+<result>
+<SHOTN_ISIN value="190410"/>
+<KOR_SECN_NM value="엘에스아이앤디"/>
+<ISSUCO_CUSTNO value="22243"/>
+</result>
+</data>
+<data vectorkey="90" type="Document">
+<result>
+<SHOTN_ISIN value="192230"/>
+<KOR_SECN_NM value="아리바이오"/>
+<ISSUCO_CUSTNO value="22431"/>
+</result>
+</data>
+<data vectorkey="91" type="Document">
+<result>
+<SHOTN_ISIN value="194610"/>
+<KOR_SECN_NM value="우성아이비"/>
+<ISSUCO_CUSTNO value="22719"/>
+</result>
+</data>
+<data vectorkey="92" type="Document">
+<result>
+<SHOTN_ISIN value="200600"/>
+<KOR_SECN_NM value="데이터젠"/>
+<ISSUCO_CUSTNO value="22925"/>
+</result>
+</data>
+<data vectorkey="93" type="Document">
+<result>
+<SHOTN_ISIN value="201150"/>
+<KOR_SECN_NM value="교육혁명"/>
+<ISSUCO_CUSTNO value="23358"/>
+</result>
+</data>
+<data vectorkey="94" type="Document">
+<result>
+<SHOTN_ISIN value="206300"/>
+<KOR_SECN_NM value="엠텍비젼"/>
+<ISSUCO_CUSTNO value="23888"/>
+</result>
+</data>
+<data vectorkey="95" type="Document">
+<result>
+<SHOTN_ISIN value="208340"/>
+<KOR_SECN_NM value="파멥신"/>
+<ISSUCO_CUSTNO value="25025"/>
+</result>
+</data>
+<data vectorkey="96" type="Document">
+<result>
+<SHOTN_ISIN value="114290"/>
+<KOR_SECN_NM value="에스코어"/>
+<ISSUCO_CUSTNO value="25694"/>
+</result>
+</data>
+<data vectorkey="97" type="Document">
+<result>
+<SHOTN_ISIN value="227680"/>
+<KOR_SECN_NM value="뉴젠홀딩스"/>
+<ISSUCO_CUSTNO value="25957"/>
+</result>
+</data>
+<data vectorkey="98" type="Document">
+<result>
+<SHOTN_ISIN value="237010"/>
+<KOR_SECN_NM value="보아스에셋"/>
+<ISSUCO_CUSTNO value="26881"/>
+</result>
+</data>
+<data vectorkey="99" type="Document">
+<result>
+<SHOTN_ISIN value="241140"/>
+<KOR_SECN_NM value="한국지네틱바이오팜"/>
+<ISSUCO_CUSTNO value="27300"/>
+</result>
+</data>
+<data vectorkey="100" type="Document">
+<result>
+<SHOTN_ISIN value="252980"/>
+<KOR_SECN_NM value="대영씨엔이"/>
+<ISSUCO_CUSTNO value="28431"/>
+</result>
+</data>
+<data vectorkey="101" type="Document">
+<result>
+<SHOTN_ISIN value="268030"/>
+<KOR_SECN_NM value="스마트골프"/>
+<ISSUCO_CUSTNO value="29961"/>
+</result>
+</data>
+<data vectorkey="102" type="Document">
+<result>
+<SHOTN_ISIN value="274460"/>
+<KOR_SECN_NM value="사운드백신"/>
+<ISSUCO_CUSTNO value="30588"/>
+</result>
+</data>
+<data vectorkey="103" type="Document">
+<result>
+<SHOTN_ISIN value="276620"/>
+<KOR_SECN_NM value="비보존"/>
+<ISSUCO_CUSTNO value="30819"/>
+</result>
+</data>
+<data vectorkey="104" type="Document">
+<result>
+<SHOTN_ISIN value="279000"/>
+<KOR_SECN_NM value="서울개인택시복지법인"/>
+<ISSUCO_CUSTNO value="31066"/>
+</result>
+</data>
+<data vectorkey="105" type="Document">
+<result>
+<SHOTN_ISIN value="280140"/>
+<KOR_SECN_NM value="사우스케이프"/>
+<ISSUCO_CUSTNO value="31313"/>
+</result>
+</data>
+<data vectorkey="106" type="Document">
+<result>
+<SHOTN_ISIN value="328270"/>
+<KOR_SECN_NM value="리독스바이오"/>
+<ISSUCO_CUSTNO value="35913"/>
+</result>
+</data>
+<data vectorkey="107" type="Document">
+<result>
+<SHOTN_ISIN value="298420"/>
+<KOR_SECN_NM value="넷마블네오"/>
+<ISSUCO_CUSTNO value="33175"/>
+</result>
+</data>
+<data vectorkey="108" type="Document">
+<result>
+<SHOTN_ISIN value="141110"/>
+<KOR_SECN_NM value="에이플러스라이프"/>
+<ISSUCO_CUSTNO value="17118"/>
+</result>
+</data>
+<data vectorkey="109" type="Document">
+<result>
+<SHOTN_ISIN value="298210"/>
+<KOR_SECN_NM value="바이오스펙트럼"/>
+<ISSUCO_CUSTNO value="32943"/>
+</result>
+</data>
+<data vectorkey="110" type="Document">
+<result>
+<SHOTN_ISIN value="343990"/>
+<KOR_SECN_NM value="비즈플레이"/>
+<ISSUCO_CUSTNO value="37672"/>
+</result>
+</data>
+<data vectorkey="111" type="Document">
+<result>
+<SHOTN_ISIN value="228350"/>
+<KOR_SECN_NM value="불스원"/>
+<ISSUCO_CUSTNO value="26067"/>
+</result>
+</data>
+<data vectorkey="112" type="Document">
+<result>
+<SHOTN_ISIN value="222070"/>
+<KOR_SECN_NM value="동명스틸"/>
+<ISSUCO_CUSTNO value="38382"/>
+</result>
+</data>
+<data vectorkey="113" type="Document">
+<result>
+<SHOTN_ISIN value="354180"/>
+<KOR_SECN_NM value="와이즈에이아이"/>
+<ISSUCO_CUSTNO value="38480"/>
+</result>
+</data>
+<data vectorkey="114" type="Document">
+<result>
+<SHOTN_ISIN value="401120"/>
+<KOR_SECN_NM value="스태리그룹"/>
+<ISSUCO_CUSTNO value="44368"/>
+</result>
+</data>
+<data vectorkey="115" type="Document">
+<result>
+<SHOTN_ISIN value="146930"/>
+<KOR_SECN_NM value="코잇"/>
+<ISSUCO_CUSTNO value="17793"/>
+</result>
+</data>
+<data vectorkey="116" type="Document">
+<result>
+<SHOTN_ISIN value="01235L"/>
+<KOR_SECN_NM value="대동모빌리티2우"/>
+<ISSUCO_CUSTNO value="1235"/>
+</result>
+</data>
+<data vectorkey="117" type="Document">
+<result>
+<SHOTN_ISIN value="01235M"/>
+<KOR_SECN_NM value="대동모빌리티3우"/>
+<ISSUCO_CUSTNO value="1235"/>
+</result>
+</data>
+<data vectorkey="118" type="Document">
+<result>
+<SHOTN_ISIN value="236010"/>
+<KOR_SECN_NM value="엔드림"/>
+<ISSUCO_CUSTNO value="26795"/>
+</result>
+</data>
+<data vectorkey="119" type="Document">
+<result>
+<SHOTN_ISIN value="482390"/>
+<KOR_SECN_NM value="메디칼스탠다드"/>
+<ISSUCO_CUSTNO value="51324"/>
+</result>
+</data>
+<data vectorkey="120" type="Document">
+<result>
+<SHOTN_ISIN value="429600"/>
+<KOR_SECN_NM value="바이오템"/>
+<ISSUCO_CUSTNO value="46187"/>
+</result>
+</data>
+<data vectorkey="121" type="Document">
+<result>
+<SHOTN_ISIN value="446530"/>
+<KOR_SECN_NM value="덕인"/>
+<ISSUCO_CUSTNO value="47821"/>
+</result>
+</data>
+<data vectorkey="122" type="Document">
+<result>
+<SHOTN_ISIN value="376580"/>
+<KOR_SECN_NM value="익수제약"/>
+<ISSUCO_CUSTNO value="46183"/>
+</result>
+</data>
+<data vectorkey="123" type="Document">
+<result>
+<SHOTN_ISIN value="01235N"/>
+<KOR_SECN_NM value="대동모빌리티4우"/>
+<ISSUCO_CUSTNO value="1235"/>
+</result>
+</data>
+<data vectorkey="124" type="Document">
+<result>
+<SHOTN_ISIN value="01235K"/>
+<KOR_SECN_NM value="대동모빌리티1우"/>
+<ISSUCO_CUSTNO value="1235"/>
+</result>
+</data>
+<data vectorkey="125" type="Document">
+<result>
+<SHOTN_ISIN value="459870"/>
+<KOR_SECN_NM value="와이콘즈"/>
+<ISSUCO_CUSTNO value="49182"/>
+</result>
+</data>
+</vector>

+ 19 - 0
Tests/Application.Tests/Fixtures/Seibro/주식/getSlbDealingByIsin.xml

@@ -0,0 +1,19 @@
+<vector beforeServletCall="1783405044940" beforeEJBCall="1783405044946" afterServletCall="1783405044955" afterEJBCall="1783405044955" result="1">
+<data vectorkey="0" type="Document">
+<result>
+<TOT_ISSU_STKQTY value="232553706"/>
+<TR_QTY value="474002"/>
+<MATC_QTY value="300210"/>
+<RED_QTY value="39829"/>
+<SLB_TR_REM_QTY value="21976319"/>
+<FRINER_LEND_REM_AMT value="4179731923300"/>
+<FRINER_LEND_REM_RATIO value=".01"/>
+<NATIVE_LEND_REM_AMT value="1700699489400"/>
+<NATIVE_LEND_REM_RATIO value="0"/>
+<FRINER_BRW_REM_AMT value="4881975749000"/>
+<FRINER_BRW_REM_RATIO value=".01"/>
+<NATIVE_BRW_REM_AMT value="998455663700"/>
+<NATIVE_BRW_REM_RATIO value="0"/>
+</result>
+</data>
+</vector>

+ 44 - 0
Tests/Application.Tests/Fixtures/Seibro/주식/getStkIncdecDetails.xml

@@ -0,0 +1,44 @@
+<vector beforeServletCall="1783405093850" beforeEJBCall="1783405093855" afterServletCall="1783405093863" afterEJBCall="1783405093862" result="3">
+<data vectorkey="0" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<ISIN value="KR7005930003"/>
+<SECN_KACD value="0101"/>
+<SECN_ISSU_NTIMES value="27"/>
+<ISSU_DT value="20180130"/>
+<ISSUPRC value="0"/>
+<ISSU_QTY value="-712000"/>
+<SECN_ISSU_RACD value="907"/>
+<SECN_ISSU_NM value="이익소각"/>
+<LIST_DT value="20180208"/>
+</result>
+</data>
+<data vectorkey="1" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<ISIN value="KR7005930003"/>
+<SECN_KACD value="0101"/>
+<SECN_ISSU_NTIMES value="75"/>
+<ISSU_DT value="20180503"/>
+<ISSUPRC value="100"/>
+<ISSU_QTY value="6419324700"/>
+<SECN_ISSU_RACD value="201"/>
+<SECN_ISSU_NM value="액면분할"/>
+<LIST_DT value="20180504"/>
+</result>
+</data>
+<data vectorkey="2" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<ISIN value="KR7005930003"/>
+<SECN_KACD value="0101"/>
+<SECN_ISSU_NTIMES value="75"/>
+<ISSU_DT value="20181204"/>
+<ISSUPRC value="0"/>
+<ISSU_QTY value="-449542150"/>
+<SECN_ISSU_RACD value="907"/>
+<SECN_ISSU_NM value="이익소각"/>
+<LIST_DT value="20181212"/>
+</result>
+</data>
+</vector>

+ 2774 - 0
Tests/Application.Tests/Fixtures/Seibro/주식/getStkListInfo.xml

@@ -0,0 +1,2774 @@
+<vector beforeServletCall="1783405060008" beforeEJBCall="1783405060014" afterServletCall="1783405062681" afterEJBCall="1783405062680" result="252">
+<data vectorkey="0" type="Document">
+<result>
+<ISSUCO_CUSTNO value="229294"/>
+<ISIN value="KR7314700006"/>
+<SHOTN_ISIN value="314700"/>
+<KOR_SECN_NM value="NH-Amundi HANARO 농업융복합산업 증권 상장지수투자신탁[주식]"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="110"/>
+<APLI_DT value="20181221"/>
+</result>
+</data>
+<data vectorkey="1" type="Document">
+<result>
+<ISSUCO_CUSTNO value="22397"/>
+<ISIN value="KR7191750009"/>
+<SHOTN_ISIN value="191750"/>
+<KOR_SECN_NM value="골프업"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="2" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34603"/>
+<ISIN value="KR7314240003"/>
+<SHOTN_ISIN value="314240"/>
+<KOR_SECN_NM value="공덕개발"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="3" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34646"/>
+<ISIN value="KR7313150005"/>
+<SHOTN_ISIN value="313150"/>
+<KOR_SECN_NM value="구름"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="4" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34646"/>
+<ISIN value="KR731315K015"/>
+<SHOTN_ISIN value="31315K"/>
+<KOR_SECN_NM value="구름1우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="5" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33915"/>
+<ISIN value="KR7307750000"/>
+<SHOTN_ISIN value="307750"/>
+<KOR_SECN_NM value="국전"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181219"/>
+</result>
+</data>
+<data vectorkey="6" type="Document">
+<result>
+<ISSUCO_CUSTNO value="31489"/>
+<ISIN value="KR7282720002"/>
+<SHOTN_ISIN value="282720"/>
+<KOR_SECN_NM value="금양그린파워"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="7" type="Document">
+<result>
+<ISSUCO_CUSTNO value="31489"/>
+<ISIN value="KR728272K013"/>
+<SHOTN_ISIN value="28272K"/>
+<KOR_SECN_NM value="금양그린파워1우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="8" type="Document">
+<result>
+<ISSUCO_CUSTNO value="19867"/>
+<ISIN value="KR7167380005"/>
+<SHOTN_ISIN value="167380"/>
+<KOR_SECN_NM value="나무기술"/>
+<BFALT_CIRCL_FORM value="140"/>
+<AFALT_CIRCL_FORM value="910"/>
+<APLI_DT value="20181211"/>
+</result>
+</data>
+<data vectorkey="9" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34691"/>
+<ISIN value="KR7314000001"/>
+<SHOTN_ISIN value="314000"/>
+<KOR_SECN_NM value="날마다자라는아이"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="10" type="Document">
+<result>
+<ISSUCO_CUSTNO value="27392"/>
+<ISIN value="KR724157K028"/>
+<SHOTN_ISIN value="24157L"/>
+<KOR_SECN_NM value="넥스모스2우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181226"/>
+</result>
+</data>
+<data vectorkey="11" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34614"/>
+<ISIN value="KR7314630005"/>
+<SHOTN_ISIN value="314630"/>
+<KOR_SECN_NM value="노보셀바이오"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="12" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34692"/>
+<ISIN value="KR7234690006"/>
+<SHOTN_ISIN value="234690"/>
+<KOR_SECN_NM value="녹십자웰빙"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181220"/>
+</result>
+</data>
+<data vectorkey="13" type="Document">
+<result>
+<ISSUCO_CUSTNO value="18491"/>
+<ISIN value="KR715403K027"/>
+<SHOTN_ISIN value="15403L"/>
+<KOR_SECN_NM value="농업회사법인아시아종묘2우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181213"/>
+</result>
+</data>
+<data vectorkey="14" type="Document">
+<result>
+<ISSUCO_CUSTNO value="30257"/>
+<ISIN value="KR7270870009"/>
+<SHOTN_ISIN value="270870"/>
+<KOR_SECN_NM value="뉴트리"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181213"/>
+</result>
+</data>
+<data vectorkey="15" type="Document">
+<result>
+<ISSUCO_CUSTNO value="25211"/>
+<ISIN value="KR7219830007"/>
+<SHOTN_ISIN value="219830"/>
+<KOR_SECN_NM value="다이나트론"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="16" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3875"/>
+<ISIN value="KR7038750006"/>
+<SHOTN_ISIN value="038750"/>
+<KOR_SECN_NM value="닥스클럽"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="17" type="Document">
+<result>
+<ISSUCO_CUSTNO value="806"/>
+<ISIN value="KR700806K010"/>
+<SHOTN_ISIN value="00806K"/>
+<KOR_SECN_NM value="대덕1우"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="110"/>
+<APLI_DT value="20181219"/>
+</result>
+</data>
+<data vectorkey="18" type="Document">
+<result>
+<ISSUCO_CUSTNO value="413"/>
+<ISIN value="KR7004130001"/>
+<SHOTN_ISIN value="004130"/>
+<KOR_SECN_NM value="대덕GDS"/>
+<BFALT_CIRCL_FORM value="110"/>
+<AFALT_CIRCL_FORM value="910"/>
+<APLI_DT value="20181219"/>
+</result>
+</data>
+<data vectorkey="19" type="Document">
+<result>
+<ISSUCO_CUSTNO value="12114"/>
+<ISIN value="KR7096280003"/>
+<SHOTN_ISIN value="096280"/>
+<KOR_SECN_NM value="대양건설"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="20" type="Document">
+<result>
+<ISSUCO_CUSTNO value="17035"/>
+<ISIN value="KR714032K033"/>
+<SHOTN_ISIN value="14032M"/>
+<KOR_SECN_NM value="대우산업개발4우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="21" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34515"/>
+<ISIN value="KR7311840003"/>
+<SHOTN_ISIN value="311840"/>
+<KOR_SECN_NM value="대원모방"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="140"/>
+<APLI_DT value="20181227"/>
+</result>
+</data>
+<data vectorkey="22" type="Document">
+<result>
+<ISSUCO_CUSTNO value="18649"/>
+<ISIN value="KR7155160005"/>
+<SHOTN_ISIN value="155160"/>
+<KOR_SECN_NM value="더블업커뮤니케이션"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="23" type="Document">
+<result>
+<ISSUCO_CUSTNO value="12222"/>
+<ISIN value="KR7097160006"/>
+<SHOTN_ISIN value="097160"/>
+<KOR_SECN_NM value="더온리원"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="24" type="Document">
+<result>
+<ISSUCO_CUSTNO value="6960"/>
+<ISIN value="KR7047060009"/>
+<SHOTN_ISIN value="047060"/>
+<KOR_SECN_NM value="덴소코리아오토모티브"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181210"/>
+</result>
+</data>
+<data vectorkey="25" type="Document">
+<result>
+<ISSUCO_CUSTNO value="16972"/>
+<ISIN value="KR7139550008"/>
+<SHOTN_ISIN value="139550"/>
+<KOR_SECN_NM value="도란"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="26" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7959"/>
+<ISIN value="KR7065210007"/>
+<SHOTN_ISIN value="065210"/>
+<KOR_SECN_NM value="두리비젼"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="27" type="Document">
+<result>
+<ISSUCO_CUSTNO value="20829"/>
+<ISIN value="KR717675K085"/>
+<SHOTN_ISIN value="17675S"/>
+<KOR_SECN_NM value="듀켐바이오8우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181221"/>
+</result>
+</data>
+<data vectorkey="28" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34604"/>
+<ISIN value="KR7314550005"/>
+<SHOTN_ISIN value="314550"/>
+<KOR_SECN_NM value="디벨리"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="29" type="Document">
+<result>
+<ISSUCO_CUSTNO value="32206"/>
+<ISIN value="KR7290120005"/>
+<SHOTN_ISIN value="290120"/>
+<KOR_SECN_NM value="디에이치오토리드"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181207"/>
+</result>
+</data>
+<data vectorkey="30" type="Document">
+<result>
+<ISSUCO_CUSTNO value="6813"/>
+<ISIN value="KR7045260007"/>
+<SHOTN_ISIN value="045260"/>
+<KOR_SECN_NM value="디에이치패션"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="31" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34205"/>
+<ISIN value="KR7310870001"/>
+<SHOTN_ISIN value="310870"/>
+<KOR_SECN_NM value="디와이씨"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181220"/>
+</result>
+</data>
+<data vectorkey="32" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33616"/>
+<ISIN value="KR7290550003"/>
+<SHOTN_ISIN value="290550"/>
+<KOR_SECN_NM value="디케이티"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181221"/>
+</result>
+</data>
+<data vectorkey="33" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3042"/>
+<ISIN value="KR7030420004"/>
+<SHOTN_ISIN value="030420"/>
+<KOR_SECN_NM value="디패션"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="34" type="Document">
+<result>
+<ISSUCO_CUSTNO value="28258"/>
+<ISIN value="KR725103K047"/>
+<SHOTN_ISIN value="25103N"/>
+<KOR_SECN_NM value="레인보우84우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="35" type="Document">
+<result>
+<ISSUCO_CUSTNO value="12025"/>
+<ISIN value="KR7095690004"/>
+<SHOTN_ISIN value="095690"/>
+<KOR_SECN_NM value="로젠"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181224"/>
+</result>
+</data>
+<data vectorkey="36" type="Document">
+<result>
+<ISSUCO_CUSTNO value="42"/>
+<ISIN value="KR7000420000"/>
+<SHOTN_ISIN value="000420"/>
+<KOR_SECN_NM value="로케트전기"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="37" type="Document">
+<result>
+<ISSUCO_CUSTNO value="42"/>
+<ISIN value="KR7000421008"/>
+<SHOTN_ISIN value="000425"/>
+<KOR_SECN_NM value="로케트전기1우"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="38" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34239"/>
+<ISIN value="KR7310750005"/>
+<SHOTN_ISIN value="310750"/>
+<KOR_SECN_NM value="루넷"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181213"/>
+</result>
+</data>
+<data vectorkey="39" type="Document">
+<result>
+<ISSUCO_CUSTNO value="20071"/>
+<ISIN value="KR7169510005"/>
+<SHOTN_ISIN value="169510"/>
+<KOR_SECN_NM value="룩스노바"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="40" type="Document">
+<result>
+<ISSUCO_CUSTNO value="17569"/>
+<ISIN value="KR714108K023"/>
+<SHOTN_ISIN value="14108L"/>
+<KOR_SECN_NM value="리가켐 바이오사이언스7우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181204"/>
+</result>
+</data>
+<data vectorkey="41" type="Document">
+<result>
+<ISSUCO_CUSTNO value="32489"/>
+<ISIN value="KR729302K025"/>
+<SHOTN_ISIN value="29302L"/>
+<KOR_SECN_NM value="리버스랩2우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181227"/>
+</result>
+</data>
+<data vectorkey="42" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34638"/>
+<ISIN value="KR7314820002"/>
+<SHOTN_ISIN value="314820"/>
+<KOR_SECN_NM value="리플레이"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="43" type="Document">
+<result>
+<ISSUCO_CUSTNO value="12713"/>
+<ISIN value="KR7101130003"/>
+<SHOTN_ISIN value="101130"/>
+<KOR_SECN_NM value="매일옥션"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="44" type="Document">
+<result>
+<ISSUCO_CUSTNO value="12571"/>
+<ISIN value="KR7100590009"/>
+<SHOTN_ISIN value="100590"/>
+<KOR_SECN_NM value="머큐리"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181214"/>
+</result>
+</data>
+<data vectorkey="45" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34574"/>
+<ISIN value="KR7314170002"/>
+<SHOTN_ISIN value="314170"/>
+<KOR_SECN_NM value="메디에이지"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181207"/>
+</result>
+</data>
+<data vectorkey="46" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34574"/>
+<ISIN value="KR731417K019"/>
+<SHOTN_ISIN value="31417K"/>
+<KOR_SECN_NM value="메디에이지 1우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181207"/>
+</result>
+</data>
+<data vectorkey="47" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34777"/>
+<ISIN value="KR7316320001"/>
+<SHOTN_ISIN value="316320"/>
+<KOR_SECN_NM value="메티메디제약"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="48" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34777"/>
+<ISIN value="KR731632K013"/>
+<SHOTN_ISIN value="31632K"/>
+<KOR_SECN_NM value="메티메디제약1우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="49" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34777"/>
+<ISIN value="KR731632K021"/>
+<SHOTN_ISIN value="31632L"/>
+<KOR_SECN_NM value="메티메디제약2우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="50" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34777"/>
+<ISIN value="KR731632K039"/>
+<SHOTN_ISIN value="31632M"/>
+<KOR_SECN_NM value="메티메디제약3우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="51" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34777"/>
+<ISIN value="KR731632K047"/>
+<SHOTN_ISIN value="31632N"/>
+<KOR_SECN_NM value="메티메디제약4우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="52" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34777"/>
+<ISIN value="KR731632K054"/>
+<SHOTN_ISIN value="31632P"/>
+<KOR_SECN_NM value="메티메디제약5우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="53" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34777"/>
+<ISIN value="KR731632K062"/>
+<SHOTN_ISIN value="31632Q"/>
+<KOR_SECN_NM value="메티메디제약6우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="54" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34777"/>
+<ISIN value="KR731632K070"/>
+<SHOTN_ISIN value="31632R"/>
+<KOR_SECN_NM value="메티메디제약7우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="55" type="Document">
+<result>
+<ISSUCO_CUSTNO value="29907"/>
+<ISIN value="KR726706K061"/>
+<SHOTN_ISIN value="26706Q"/>
+<KOR_SECN_NM value="명진홀딩스6우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181211"/>
+</result>
+</data>
+<data vectorkey="56" type="Document">
+<result>
+<ISSUCO_CUSTNO value="29907"/>
+<ISIN value="KR726706K079"/>
+<SHOTN_ISIN value="26706R"/>
+<KOR_SECN_NM value="명진홀딩스7우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181205"/>
+</result>
+</data>
+<data vectorkey="57" type="Document">
+<result>
+<ISSUCO_CUSTNO value="29907"/>
+<ISIN value="KR726706K087"/>
+<SHOTN_ISIN value="26706S"/>
+<KOR_SECN_NM value="명진홀딩스8우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181224"/>
+</result>
+</data>
+<data vectorkey="58" type="Document">
+<result>
+<ISSUCO_CUSTNO value="14130"/>
+<ISIN value="KR7104570007"/>
+<SHOTN_ISIN value="104570"/>
+<KOR_SECN_NM value="명품아카데미"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="59" type="Document">
+<result>
+<ISSUCO_CUSTNO value="8131"/>
+<ISIN value="KR7066880006"/>
+<SHOTN_ISIN value="066880"/>
+<KOR_SECN_NM value="모드테크"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="60" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34305"/>
+<ISIN value="KR7311790000"/>
+<SHOTN_ISIN value="311790"/>
+<KOR_SECN_NM value="모스터일렉"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181220"/>
+</result>
+</data>
+<data vectorkey="61" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34572"/>
+<ISIN value="KR7314150004"/>
+<SHOTN_ISIN value="314150"/>
+<KOR_SECN_NM value="몬스타"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181205"/>
+</result>
+</data>
+<data vectorkey="62" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34779"/>
+<ISIN value="KR7316380005"/>
+<SHOTN_ISIN value="316380"/>
+<KOR_SECN_NM value="무지개연구소"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="63" type="Document">
+<result>
+<ISSUCO_CUSTNO value="20918"/>
+<ISIN value="KR717785K058"/>
+<SHOTN_ISIN value="17785P"/>
+<KOR_SECN_NM value="무한비트5우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181224"/>
+</result>
+</data>
+<data vectorkey="64" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34537"/>
+<ISIN value="KR7314020009"/>
+<SHOTN_ISIN value="314020"/>
+<KOR_SECN_NM value="미디어캔"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181204"/>
+</result>
+</data>
+<data vectorkey="65" type="Document">
+<result>
+<ISSUCO_CUSTNO value="175956"/>
+<ISIN value="KR7157510009"/>
+<SHOTN_ISIN value="157510"/>
+<KOR_SECN_NM value="미래에셋 TIGER 자동차 증권상장지수투자신탁(주식)"/>
+<BFALT_CIRCL_FORM value="110"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181218"/>
+</result>
+</data>
+<data vectorkey="66" type="Document">
+<result>
+<ISSUCO_CUSTNO value="175962"/>
+<ISIN value="KR7157520008"/>
+<SHOTN_ISIN value="157520"/>
+<KOR_SECN_NM value="미래에셋 TIGER 화학 증권상장지수투자신탁(주식)"/>
+<BFALT_CIRCL_FORM value="110"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181218"/>
+</result>
+</data>
+<data vectorkey="67" type="Document">
+<result>
+<ISSUCO_CUSTNO value="173730"/>
+<ISIN value="KR7152180006"/>
+<SHOTN_ISIN value="152180"/>
+<KOR_SECN_NM value="미래에셋TIGER생활필수품증권상장지수투자신탁(주식)"/>
+<BFALT_CIRCL_FORM value="110"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181218"/>
+</result>
+</data>
+<data vectorkey="68" type="Document">
+<result>
+<ISSUCO_CUSTNO value="28539"/>
+<ISIN value="KR724251K060"/>
+<SHOTN_ISIN value="24251Q"/>
+<KOR_SECN_NM value="발레앤모델에이아이6우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181224"/>
+</result>
+</data>
+<data vectorkey="69" type="Document">
+<result>
+<ISSUCO_CUSTNO value="22296"/>
+<ISIN value="KR7190750000"/>
+<SHOTN_ISIN value="190750"/>
+<KOR_SECN_NM value="범양자산관리"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="70" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34605"/>
+<ISIN value="KR7314620006"/>
+<SHOTN_ISIN value="314620"/>
+<KOR_SECN_NM value="복싱매니지먼트코리아"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181207"/>
+</result>
+</data>
+<data vectorkey="71" type="Document">
+<result>
+<ISSUCO_CUSTNO value="12256"/>
+<ISIN value="KR7097660005"/>
+<SHOTN_ISIN value="097660"/>
+<KOR_SECN_NM value="블루앤"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="72" type="Document">
+<result>
+<ISSUCO_CUSTNO value="31697"/>
+<ISIN value="KR728524K082"/>
+<SHOTN_ISIN value="28524S"/>
+<KOR_SECN_NM value="비바리퍼블리카8우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181226"/>
+</result>
+</data>
+<data vectorkey="73" type="Document">
+<result>
+<ISSUCO_CUSTNO value="12708"/>
+<ISIN value="KR7101110005"/>
+<SHOTN_ISIN value="101110"/>
+<KOR_SECN_NM value="비씨케이"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="74" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7069"/>
+<ISIN value="KR7048520001"/>
+<SHOTN_ISIN value="048520"/>
+<KOR_SECN_NM value="비케이이엔티"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="75" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33917"/>
+<ISIN value="KR7307870006"/>
+<SHOTN_ISIN value="307870"/>
+<KOR_SECN_NM value="비투엔"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="76" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33707"/>
+<ISIN value="KR7238200000"/>
+<SHOTN_ISIN value="238200"/>
+<KOR_SECN_NM value="비피도"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181226"/>
+</result>
+</data>
+<data vectorkey="77" type="Document">
+<result>
+<ISSUCO_CUSTNO value="32820"/>
+<ISIN value="KR729667K021"/>
+<SHOTN_ISIN value="29667L"/>
+<KOR_SECN_NM value="삼명텍2우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181226"/>
+</result>
+</data>
+<data vectorkey="78" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34739"/>
+<ISIN value="KR7315210005"/>
+<SHOTN_ISIN value="315210"/>
+<KOR_SECN_NM value="삼미레이저"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181226"/>
+</result>
+</data>
+<data vectorkey="79" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34261"/>
+<ISIN value="KR7311500003"/>
+<SHOTN_ISIN value="311500"/>
+<KOR_SECN_NM value="삼정하누"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181220"/>
+</result>
+</data>
+<data vectorkey="80" type="Document">
+<result>
+<ISSUCO_CUSTNO value="200"/>
+<ISIN value="KR7002000008"/>
+<SHOTN_ISIN value="002000"/>
+<KOR_SECN_NM value="생고뱅코리아홀딩스"/>
+<BFALT_CIRCL_FORM value="110"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181213"/>
+</result>
+</data>
+<data vectorkey="81" type="Document">
+<result>
+<ISSUCO_CUSTNO value="200"/>
+<ISIN value="KR7002001006"/>
+<SHOTN_ISIN value="002005"/>
+<KOR_SECN_NM value="생고뱅코리아홀딩스1우"/>
+<BFALT_CIRCL_FORM value="110"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181213"/>
+</result>
+</data>
+<data vectorkey="82" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34342"/>
+<ISIN value="KR7311520001"/>
+<SHOTN_ISIN value="311520"/>
+<KOR_SECN_NM value="샤뽀"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181213"/>
+</result>
+</data>
+<data vectorkey="83" type="Document">
+<result>
+<ISSUCO_CUSTNO value="24652"/>
+<ISIN value="KR7213750003"/>
+<SHOTN_ISIN value="213750"/>
+<KOR_SECN_NM value="서해유스호스텔"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="84" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34740"/>
+<ISIN value="KR7315590000"/>
+<SHOTN_ISIN value="315590"/>
+<KOR_SECN_NM value="성일산업"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181226"/>
+</result>
+</data>
+<data vectorkey="85" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33051"/>
+<ISIN value="KR729923K028"/>
+<SHOTN_ISIN value="29923L"/>
+<KOR_SECN_NM value="세븐브로이양평2우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181219"/>
+</result>
+</data>
+<data vectorkey="86" type="Document">
+<result>
+<ISSUCO_CUSTNO value="1324"/>
+<ISIN value="KR7013240007"/>
+<SHOTN_ISIN value="013240"/>
+<KOR_SECN_NM value="셀런"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="87" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34678"/>
+<ISIN value="KR7315090001"/>
+<SHOTN_ISIN value="315090"/>
+<KOR_SECN_NM value="쇼셜피르마"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181214"/>
+</result>
+</data>
+<data vectorkey="88" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34678"/>
+<ISIN value="KR731509K013"/>
+<SHOTN_ISIN value="31509K"/>
+<KOR_SECN_NM value="쇼셜피르마1우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181214"/>
+</result>
+</data>
+<data vectorkey="89" type="Document">
+<result>
+<ISSUCO_CUSTNO value="12936"/>
+<ISIN value="KR7102810009"/>
+<SHOTN_ISIN value="102810"/>
+<KOR_SECN_NM value="스마트에이스"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="90" type="Document">
+<result>
+<ISSUCO_CUSTNO value="12936"/>
+<ISIN value="KR7102811007"/>
+<SHOTN_ISIN value="102815"/>
+<KOR_SECN_NM value="스마트에이스1우"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="91" type="Document">
+<result>
+<ISSUCO_CUSTNO value="12936"/>
+<ISIN value="KR7102812005"/>
+<SHOTN_ISIN value="102817"/>
+<KOR_SECN_NM value="스마트에이스2우"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="92" type="Document">
+<result>
+<ISSUCO_CUSTNO value="12936"/>
+<ISIN value="KR7102813003"/>
+<SHOTN_ISIN value="102819"/>
+<KOR_SECN_NM value="스마트에이스3우"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="93" type="Document">
+<result>
+<ISSUCO_CUSTNO value="12936"/>
+<ISIN value="KR7102814001"/>
+<SHOTN_ISIN value="10281A"/>
+<KOR_SECN_NM value="스마트에이스4우"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="94" type="Document">
+<result>
+<ISSUCO_CUSTNO value="13948"/>
+<ISIN value="KR7110380003"/>
+<SHOTN_ISIN value="110380"/>
+<KOR_SECN_NM value="스타넷"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="95" type="Document">
+<result>
+<ISSUCO_CUSTNO value="6700"/>
+<ISIN value="KR7043680008"/>
+<SHOTN_ISIN value="043680"/>
+<KOR_SECN_NM value="스톰이앤에프"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="96" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7934"/>
+<ISIN value="KR706493K037"/>
+<SHOTN_ISIN value="06493M"/>
+<KOR_SECN_NM value="시그넷시스템4우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181231"/>
+</result>
+</data>
+<data vectorkey="97" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34783"/>
+<ISIN value="KR7316420009"/>
+<SHOTN_ISIN value="316420"/>
+<KOR_SECN_NM value="식스랩"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181231"/>
+</result>
+</data>
+<data vectorkey="98" type="Document">
+<result>
+<ISSUCO_CUSTNO value="18213"/>
+<ISIN value="KR715117K023"/>
+<SHOTN_ISIN value="15117L"/>
+<KOR_SECN_NM value="신우코스텍2우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181231"/>
+</result>
+</data>
+<data vectorkey="99" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34686"/>
+<ISIN value="KR7315500009"/>
+<SHOTN_ISIN value="315500"/>
+<KOR_SECN_NM value="쓰담"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="100" type="Document">
+<result>
+<ISSUCO_CUSTNO value="21758"/>
+<ISIN value="KR7185650009"/>
+<SHOTN_ISIN value="185650"/>
+<KOR_SECN_NM value="쓰리디웍스"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="101" type="Document">
+<result>
+<ISSUCO_CUSTNO value="29559"/>
+<ISIN value="KR726371K015"/>
+<SHOTN_ISIN value="26371K"/>
+<KOR_SECN_NM value="쓰리디코리아1우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181224"/>
+</result>
+</data>
+<data vectorkey="102" type="Document">
+<result>
+<ISSUCO_CUSTNO value="104"/>
+<ISIN value="KR700104K010"/>
+<SHOTN_ISIN value="00104K"/>
+<KOR_SECN_NM value="씨제이4우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181221"/>
+</result>
+</data>
+<data vectorkey="103" type="Document">
+<result>
+<ISSUCO_CUSTNO value="15916"/>
+<ISIN value="KR7130160005"/>
+<SHOTN_ISIN value="130160"/>
+<KOR_SECN_NM value="씨티엘네트웍스"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="104" type="Document">
+<result>
+<ISSUCO_CUSTNO value="19396"/>
+<ISIN value="KR7163050008"/>
+<SHOTN_ISIN value="163050"/>
+<KOR_SECN_NM value="아로마엘에스티"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="105" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33441"/>
+<ISIN value="KR729973K023"/>
+<SHOTN_ISIN value="29973L"/>
+<KOR_SECN_NM value="아베크2우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181231"/>
+</result>
+</data>
+<data vectorkey="106" type="Document">
+<result>
+<ISSUCO_CUSTNO value="19902"/>
+<ISIN value="KR7167920008"/>
+<SHOTN_ISIN value="167920"/>
+<KOR_SECN_NM value="아이리얼"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="107" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33866"/>
+<ISIN value="KR7307180000"/>
+<SHOTN_ISIN value="307180"/>
+<KOR_SECN_NM value="아이엘"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181221"/>
+</result>
+</data>
+<data vectorkey="108" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7568"/>
+<ISIN value="KR7053810008"/>
+<SHOTN_ISIN value="053810"/>
+<KOR_SECN_NM value="아이팩토리"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="109" type="Document">
+<result>
+<ISSUCO_CUSTNO value="8016"/>
+<ISIN value="KR706566K014"/>
+<SHOTN_ISIN value="06566K"/>
+<KOR_SECN_NM value="안트로젠1우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181205"/>
+</result>
+</data>
+<data vectorkey="110" type="Document">
+<result>
+<ISSUCO_CUSTNO value="15159"/>
+<ISIN value="KR7122770001"/>
+<SHOTN_ISIN value="122770"/>
+<KOR_SECN_NM value="알베코"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="111" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4505"/>
+<ISIN value="KR7046430005"/>
+<SHOTN_ISIN value="046430"/>
+<KOR_SECN_NM value="알에스넷"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="112" type="Document">
+<result>
+<ISSUCO_CUSTNO value="19110"/>
+<ISIN value="KR7160360004"/>
+<SHOTN_ISIN value="160360"/>
+<KOR_SECN_NM value="알트원"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="113" type="Document">
+<result>
+<ISSUCO_CUSTNO value="19110"/>
+<ISIN value="KR7160361002"/>
+<SHOTN_ISIN value="160365"/>
+<KOR_SECN_NM value="알트원1우"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="114" type="Document">
+<result>
+<ISSUCO_CUSTNO value="19110"/>
+<ISIN value="KR7160362000"/>
+<SHOTN_ISIN value="160367"/>
+<KOR_SECN_NM value="알트원2우"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="115" type="Document">
+<result>
+<ISSUCO_CUSTNO value="19110"/>
+<ISIN value="KR7160363008"/>
+<SHOTN_ISIN value="160369"/>
+<KOR_SECN_NM value="알트원3우"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="116" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34120"/>
+<ISIN value="KR7310200001"/>
+<SHOTN_ISIN value="310200"/>
+<KOR_SECN_NM value="애니플러스"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181221"/>
+</result>
+</data>
+<data vectorkey="117" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33510"/>
+<ISIN value="KR7299910000"/>
+<SHOTN_ISIN value="299910"/>
+<KOR_SECN_NM value="애닉"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181203"/>
+</result>
+</data>
+<data vectorkey="118" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34741"/>
+<ISIN value="KR7315550004"/>
+<SHOTN_ISIN value="315550"/>
+<KOR_SECN_NM value="애드텍"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181226"/>
+</result>
+</data>
+<data vectorkey="119" type="Document">
+<result>
+<ISSUCO_CUSTNO value="9086"/>
+<ISIN value="KR707505K011"/>
+<SHOTN_ISIN value="07505K"/>
+<KOR_SECN_NM value="에스아이플렉스1우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181211"/>
+</result>
+</data>
+<data vectorkey="120" type="Document">
+<result>
+<ISSUCO_CUSTNO value="21759"/>
+<ISIN value="KR7185660008"/>
+<SHOTN_ISIN value="185660"/>
+<KOR_SECN_NM value="에스앤지디스플레이"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="121" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34462"/>
+<ISIN value="KR8392100002"/>
+<SHOTN_ISIN value="950180"/>
+<KOR_SECN_NM value="에스앤케이 KDR"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181213"/>
+</result>
+</data>
+<data vectorkey="122" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34641"/>
+<ISIN value="KR7314710005"/>
+<SHOTN_ISIN value="314710"/>
+<KOR_SECN_NM value="에스이에이"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181214"/>
+</result>
+</data>
+<data vectorkey="123" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34602"/>
+<ISIN value="KR7314420001"/>
+<SHOTN_ISIN value="314420"/>
+<KOR_SECN_NM value="에스지오"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="124" type="Document">
+<result>
+<ISSUCO_CUSTNO value="29251"/>
+<ISIN value="KR726087K025"/>
+<SHOTN_ISIN value="26087L"/>
+<KOR_SECN_NM value="에스케이시그넷2우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181227"/>
+</result>
+</data>
+<data vectorkey="125" type="Document">
+<result>
+<ISSUCO_CUSTNO value="29251"/>
+<ISIN value="KR726087K033"/>
+<SHOTN_ISIN value="26087M"/>
+<KOR_SECN_NM value="에스케이시그넷3우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181227"/>
+</result>
+</data>
+<data vectorkey="126" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33869"/>
+<ISIN value="KR7307070003"/>
+<SHOTN_ISIN value="307070"/>
+<KOR_SECN_NM value="에스케이에이씨피씨제4호기업인수목적"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181207"/>
+</result>
+</data>
+<data vectorkey="127" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33727"/>
+<ISIN value="KR7298690009"/>
+<SHOTN_ISIN value="298690"/>
+<KOR_SECN_NM value="에어부산"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="110"/>
+<APLI_DT value="20181227"/>
+</result>
+</data>
+<data vectorkey="128" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34640"/>
+<ISIN value="KR7314850009"/>
+<SHOTN_ISIN value="314850"/>
+<KOR_SECN_NM value="에어텍"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="129" type="Document">
+<result>
+<ISSUCO_CUSTNO value="32937"/>
+<ISIN value="KR7298380007"/>
+<SHOTN_ISIN value="298380"/>
+<KOR_SECN_NM value="에이비엘바이오"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181219"/>
+</result>
+</data>
+<data vectorkey="130" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3935"/>
+<ISIN value="KR7039350004"/>
+<SHOTN_ISIN value="039350"/>
+<KOR_SECN_NM value="에이치투홀딩스"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="131" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34755"/>
+<ISIN value="KR7306360009"/>
+<SHOTN_ISIN value="306360"/>
+<KOR_SECN_NM value="에이티파머"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181227"/>
+</result>
+</data>
+<data vectorkey="132" type="Document">
+<result>
+<ISSUCO_CUSTNO value="29440"/>
+<ISIN value="KR726226K037"/>
+<SHOTN_ISIN value="26226M"/>
+<KOR_SECN_NM value="에이프로3우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181220"/>
+</result>
+</data>
+<data vectorkey="133" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34262"/>
+<ISIN value="KR7310920004"/>
+<SHOTN_ISIN value="310920"/>
+<KOR_SECN_NM value="에코웰"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181213"/>
+</result>
+</data>
+<data vectorkey="134" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34262"/>
+<ISIN value="KR731092K010"/>
+<SHOTN_ISIN value="31092K"/>
+<KOR_SECN_NM value="에코웰1우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181227"/>
+</result>
+</data>
+<data vectorkey="135" type="Document">
+<result>
+<ISSUCO_CUSTNO value="15647"/>
+<ISIN value="KR7128540002"/>
+<SHOTN_ISIN value="128540"/>
+<KOR_SECN_NM value="에코캡"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181205"/>
+</result>
+</data>
+<data vectorkey="136" type="Document">
+<result>
+<ISSUCO_CUSTNO value="10438"/>
+<ISIN value="KR7086510005"/>
+<SHOTN_ISIN value="086510"/>
+<KOR_SECN_NM value="에코프론티어"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="137" type="Document">
+<result>
+<ISSUCO_CUSTNO value="16886"/>
+<ISIN value="KR7138700000"/>
+<SHOTN_ISIN value="138700"/>
+<KOR_SECN_NM value="에프터에이비씨코리아"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="138" type="Document">
+<result>
+<ISSUCO_CUSTNO value="23911"/>
+<ISIN value="KR7206460008"/>
+<SHOTN_ISIN value="206460"/>
+<KOR_SECN_NM value="엔씨큐"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="139" type="Document">
+<result>
+<ISSUCO_CUSTNO value="23737"/>
+<ISIN value="KR7204820005"/>
+<SHOTN_ISIN value="204820"/>
+<KOR_SECN_NM value="엔앤티"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="140" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34194"/>
+<ISIN value="KR7310840004"/>
+<SHOTN_ISIN value="310840"/>
+<KOR_SECN_NM value="엔에이치기업인수목적13호"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181224"/>
+</result>
+</data>
+<data vectorkey="141" type="Document">
+<result>
+<ISSUCO_CUSTNO value="26157"/>
+<ISIN value="KR7229610001"/>
+<SHOTN_ISIN value="229610"/>
+<KOR_SECN_NM value="엘앤에스티비"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="142" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34266"/>
+<ISIN value="KR7311060008"/>
+<SHOTN_ISIN value="311060"/>
+<KOR_SECN_NM value="엘에이티"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="140"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="143" type="Document">
+<result>
+<ISSUCO_CUSTNO value="11952"/>
+<ISIN value="KR7095000006"/>
+<SHOTN_ISIN value="095000"/>
+<KOR_SECN_NM value="엘키토산코리아"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="144" type="Document">
+<result>
+<ISSUCO_CUSTNO value="8113"/>
+<ISIN value="KR7066500000"/>
+<SHOTN_ISIN value="066500"/>
+<KOR_SECN_NM value="엠씨글로벌"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="145" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7527"/>
+<ISIN value="KR7053330007"/>
+<SHOTN_ISIN value="053330"/>
+<KOR_SECN_NM value="영진코퍼레이션"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="146" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34596"/>
+<ISIN value="KR7306840000"/>
+<SHOTN_ISIN value="306840"/>
+<KOR_SECN_NM value="오존에이드"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181207"/>
+</result>
+</data>
+<data vectorkey="147" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34596"/>
+<ISIN value="KR730684K015"/>
+<SHOTN_ISIN value="30684K"/>
+<KOR_SECN_NM value="오존에이드1우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181207"/>
+</result>
+</data>
+<data vectorkey="148" type="Document">
+<result>
+<ISSUCO_CUSTNO value="32951"/>
+<ISIN value="KR729813K039"/>
+<SHOTN_ISIN value="29813M"/>
+<KOR_SECN_NM value="옥천당3우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181211"/>
+</result>
+</data>
+<data vectorkey="149" type="Document">
+<result>
+<ISSUCO_CUSTNO value="32951"/>
+<ISIN value="KR729813K047"/>
+<SHOTN_ISIN value="29813N"/>
+<KOR_SECN_NM value="옥천당4우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181211"/>
+</result>
+</data>
+<data vectorkey="150" type="Document">
+<result>
+<ISSUCO_CUSTNO value="27288"/>
+<ISIN value="KR723783K014"/>
+<SHOTN_ISIN value="23783K"/>
+<KOR_SECN_NM value="올엠1우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181220"/>
+</result>
+</data>
+<data vectorkey="151" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34772"/>
+<ISIN value="KR7316140003"/>
+<SHOTN_ISIN value="316140"/>
+<KOR_SECN_NM value="우리금융지주"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181227"/>
+</result>
+</data>
+<data vectorkey="152" type="Document">
+<result>
+<ISSUCO_CUSTNO value="13327"/>
+<ISIN value="KR7109190009"/>
+<SHOTN_ISIN value="109190"/>
+<KOR_SECN_NM value="웅진폴리실리콘"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="153" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33898"/>
+<ISIN value="KR7307280008"/>
+<SHOTN_ISIN value="307280"/>
+<KOR_SECN_NM value="원바이오젠"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181205"/>
+</result>
+</data>
+<data vectorkey="154" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3637"/>
+<ISIN value="KR7036370005"/>
+<SHOTN_ISIN value="036370"/>
+<KOR_SECN_NM value="원텔"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="155" type="Document">
+<result>
+<ISSUCO_CUSTNO value="22078"/>
+<ISIN value="KR7188460000"/>
+<SHOTN_ISIN value="188460"/>
+<KOR_SECN_NM value="위너에코텍"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181226"/>
+</result>
+</data>
+<data vectorkey="156" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33844"/>
+<ISIN value="KR7299900001"/>
+<SHOTN_ISIN value="299900"/>
+<KOR_SECN_NM value="위지윅스튜디오"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181220"/>
+</result>
+</data>
+<data vectorkey="157" type="Document">
+<result>
+<ISSUCO_CUSTNO value="22633"/>
+<ISIN value="KR719416K058"/>
+<SHOTN_ISIN value="19416P"/>
+<KOR_SECN_NM value="유비머트리얼즈5우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181220"/>
+</result>
+</data>
+<data vectorkey="158" type="Document">
+<result>
+<ISSUCO_CUSTNO value="29533"/>
+<ISIN value="KR7263050007"/>
+<SHOTN_ISIN value="263050"/>
+<KOR_SECN_NM value="유틸렉스"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181224"/>
+</result>
+</data>
+<data vectorkey="159" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33380"/>
+<ISIN value="KR7302430004"/>
+<SHOTN_ISIN value="302430"/>
+<KOR_SECN_NM value="이노메트리"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="160" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33402"/>
+<ISIN value="KR7293290003"/>
+<SHOTN_ISIN value="293290"/>
+<KOR_SECN_NM value="이노볼타"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="130"/>
+<APLI_DT value="20181227"/>
+</result>
+</data>
+<data vectorkey="161" type="Document">
+<result>
+<ISSUCO_CUSTNO value="28517"/>
+<ISIN value="KR7314080003"/>
+<SHOTN_ISIN value="314080"/>
+<KOR_SECN_NM value="이노핀"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181210"/>
+</result>
+</data>
+<data vectorkey="162" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3990"/>
+<ISIN value="KR7039900006"/>
+<SHOTN_ISIN value="039900"/>
+<KOR_SECN_NM value="이야기"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="163" type="Document">
+<result>
+<ISSUCO_CUSTNO value="31164"/>
+<ISIN value="KR728047K035"/>
+<SHOTN_ISIN value="28047M"/>
+<KOR_SECN_NM value="이케이중공업3우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181231"/>
+</result>
+</data>
+<data vectorkey="164" type="Document">
+<result>
+<ISSUCO_CUSTNO value="10715"/>
+<ISIN value="KR7089320006"/>
+<SHOTN_ISIN value="089320"/>
+<KOR_SECN_NM value="인바이런먼트리딩테크놀러지"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="165" type="Document">
+<result>
+<ISSUCO_CUSTNO value="10715"/>
+<ISIN value="KR7089321004"/>
+<SHOTN_ISIN value="089325"/>
+<KOR_SECN_NM value="인바이런먼트리딩테크놀러지1우"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="166" type="Document">
+<result>
+<ISSUCO_CUSTNO value="9617"/>
+<ISIN value="KR7079900007"/>
+<SHOTN_ISIN value="079900"/>
+<KOR_SECN_NM value="전진건설로봇"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181226"/>
+</result>
+</data>
+<data vectorkey="167" type="Document">
+<result>
+<ISSUCO_CUSTNO value="13954"/>
+<ISIN value="KR7110020005"/>
+<SHOTN_ISIN value="110020"/>
+<KOR_SECN_NM value="전진바이오팜"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181214"/>
+</result>
+</data>
+<data vectorkey="168" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34241"/>
+<ISIN value="KR7308140003"/>
+<SHOTN_ISIN value="308140"/>
+<KOR_SECN_NM value="제로웹"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="130"/>
+<APLI_DT value="20181203"/>
+</result>
+</data>
+<data vectorkey="169" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34283"/>
+<ISIN value="KR7310880000"/>
+<SHOTN_ISIN value="310880"/>
+<KOR_SECN_NM value="제이에스이엔디"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181213"/>
+</result>
+</data>
+<data vectorkey="170" type="Document">
+<result>
+<ISSUCO_CUSTNO value="22478"/>
+<ISIN value="KR7192600005"/>
+<SHOTN_ISIN value="192600"/>
+<KOR_SECN_NM value="제이엠제이브로스"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="171" type="Document">
+<result>
+<ISSUCO_CUSTNO value="24833"/>
+<ISIN value="KR721608K015"/>
+<SHOTN_ISIN value="21608K"/>
+<KOR_SECN_NM value="제테마1우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181220"/>
+</result>
+</data>
+<data vectorkey="172" type="Document">
+<result>
+<ISSUCO_CUSTNO value="24833"/>
+<ISIN value="KR721608K023"/>
+<SHOTN_ISIN value="21608L"/>
+<KOR_SECN_NM value="제테마2우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181220"/>
+</result>
+</data>
+<data vectorkey="173" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34094"/>
+<ISIN value="KR7309930006"/>
+<SHOTN_ISIN value="309930"/>
+<KOR_SECN_NM value="주식회사 조이웍스앤코"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181220"/>
+</result>
+</data>
+<data vectorkey="174" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34748"/>
+<ISIN value="KR7315830000"/>
+<SHOTN_ISIN value="315830"/>
+<KOR_SECN_NM value="지가스"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181224"/>
+</result>
+</data>
+<data vectorkey="175" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34748"/>
+<ISIN value="KR731583K018"/>
+<SHOTN_ISIN value="31583K"/>
+<KOR_SECN_NM value="지가스1우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181224"/>
+</result>
+</data>
+<data vectorkey="176" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34612"/>
+<ISIN value="KR7314130006"/>
+<SHOTN_ISIN value="314130"/>
+<KOR_SECN_NM value="지놈앤컴퍼니"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="140"/>
+<APLI_DT value="20181226"/>
+</result>
+</data>
+<data vectorkey="177" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34612"/>
+<ISIN value="KR731413K018"/>
+<SHOTN_ISIN value="31413K"/>
+<KOR_SECN_NM value="지놈앤컴퍼니1우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="178" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34612"/>
+<ISIN value="KR731413K026"/>
+<SHOTN_ISIN value="31413L"/>
+<KOR_SECN_NM value="지놈앤컴퍼니2우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="179" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34612"/>
+<ISIN value="KR731413K034"/>
+<SHOTN_ISIN value="31413M"/>
+<KOR_SECN_NM value="지놈앤컴퍼니3우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="180" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34612"/>
+<ISIN value="KR731413K042"/>
+<SHOTN_ISIN value="31413N"/>
+<KOR_SECN_NM value="지놈앤컴퍼니4우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="181" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34612"/>
+<ISIN value="KR731413K059"/>
+<SHOTN_ISIN value="31413P"/>
+<KOR_SECN_NM value="지놈앤컴퍼니5우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="182" type="Document">
+<result>
+<ISSUCO_CUSTNO value="26096"/>
+<ISIN value="KR7228990008"/>
+<SHOTN_ISIN value="228990"/>
+<KOR_SECN_NM value="지엠아이그룹"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181224"/>
+</result>
+</data>
+<data vectorkey="183" type="Document">
+<result>
+<ISSUCO_CUSTNO value="3989"/>
+<ISIN value="KR7039890009"/>
+<SHOTN_ISIN value="039890"/>
+<KOR_SECN_NM value="지오인베스트먼트"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="184" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34682"/>
+<ISIN value="KR7315390005"/>
+<SHOTN_ISIN value="315390"/>
+<KOR_SECN_NM value="진산비버리지"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="185" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34682"/>
+<ISIN value="KR731539K010"/>
+<SHOTN_ISIN value="31539K"/>
+<KOR_SECN_NM value="진산비버리지1우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="186" type="Document">
+<result>
+<ISSUCO_CUSTNO value="16031"/>
+<ISIN value="KR7131190001"/>
+<SHOTN_ISIN value="131190"/>
+<KOR_SECN_NM value="진셍케이"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="187" type="Document">
+<result>
+<ISSUCO_CUSTNO value="16031"/>
+<ISIN value="KR7131191009"/>
+<SHOTN_ISIN value="131195"/>
+<KOR_SECN_NM value="진셍케이1우"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="188" type="Document">
+<result>
+<ISSUCO_CUSTNO value="16031"/>
+<ISIN value="KR7131192007"/>
+<SHOTN_ISIN value="131197"/>
+<KOR_SECN_NM value="진셍케이2우"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="189" type="Document">
+<result>
+<ISSUCO_CUSTNO value="4858"/>
+<ISIN value="KR7053360004"/>
+<SHOTN_ISIN value="053360"/>
+<KOR_SECN_NM value="챈스아이"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="190" type="Document">
+<result>
+<ISSUCO_CUSTNO value="10961"/>
+<ISIN value="KR7091820001"/>
+<SHOTN_ISIN value="091820"/>
+<KOR_SECN_NM value="천하에너지"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="191" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34742"/>
+<ISIN value="KR7313090003"/>
+<SHOTN_ISIN value="313090"/>
+<KOR_SECN_NM value="카네비모빌리티"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181226"/>
+</result>
+</data>
+<data vectorkey="192" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34588"/>
+<ISIN value="KR7314330002"/>
+<SHOTN_ISIN value="314330"/>
+<KOR_SECN_NM value="카본디자인"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181206"/>
+</result>
+</data>
+<data vectorkey="193" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34577"/>
+<ISIN value="KR7313950008"/>
+<SHOTN_ISIN value="313950"/>
+<KOR_SECN_NM value="캐스트프로"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181210"/>
+</result>
+</data>
+<data vectorkey="194" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34577"/>
+<ISIN value="KR731395K017"/>
+<SHOTN_ISIN value="31395K"/>
+<KOR_SECN_NM value="캐스트프로1우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181210"/>
+</result>
+</data>
+<data vectorkey="195" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34540"/>
+<ISIN value="KR7313810004"/>
+<SHOTN_ISIN value="313810"/>
+<KOR_SECN_NM value="컴마트"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181203"/>
+</result>
+</data>
+<data vectorkey="196" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34549"/>
+<ISIN value="KR7307930008"/>
+<SHOTN_ISIN value="307930"/>
+<KOR_SECN_NM value="컴퍼니케이파트너스"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181204"/>
+</result>
+</data>
+<data vectorkey="197" type="Document">
+<result>
+<ISSUCO_CUSTNO value="20218"/>
+<ISIN value="KR7170880009"/>
+<SHOTN_ISIN value="170880"/>
+<KOR_SECN_NM value="케이비컨버전스"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="198" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34608"/>
+<ISIN value="KR7307090001"/>
+<SHOTN_ISIN value="307090"/>
+<KOR_SECN_NM value="케이씨씨오토그룹"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181210"/>
+</result>
+</data>
+<data vectorkey="199" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34608"/>
+<ISIN value="KR730709K010"/>
+<SHOTN_ISIN value="30709K"/>
+<KOR_SECN_NM value="케이씨씨오토그룹1우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181210"/>
+</result>
+</data>
+<data vectorkey="200" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33939"/>
+<ISIN value="KR7307940007"/>
+<SHOTN_ISIN value="307940"/>
+<KOR_SECN_NM value="케이아이오티"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181213"/>
+</result>
+</data>
+<data vectorkey="201" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33939"/>
+<ISIN value="KR730794K012"/>
+<SHOTN_ISIN value="30794K"/>
+<KOR_SECN_NM value="케이아이오티1우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181227"/>
+</result>
+</data>
+<data vectorkey="202" type="Document">
+<result>
+<ISSUCO_CUSTNO value="8073"/>
+<ISIN value="KR7066340001"/>
+<SHOTN_ISIN value="066340"/>
+<KOR_SECN_NM value="케이에스리소스"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="203" type="Document">
+<result>
+<ISSUCO_CUSTNO value="22445"/>
+<ISIN value="KR7192350007"/>
+<SHOTN_ISIN value="192350"/>
+<KOR_SECN_NM value="케이엠이씨코퍼레이션"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="204" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34766"/>
+<ISIN value="KR7315650002"/>
+<SHOTN_ISIN value="315650"/>
+<KOR_SECN_NM value="케이피엘"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181226"/>
+</result>
+</data>
+<data vectorkey="205" type="Document">
+<result>
+<ISSUCO_CUSTNO value="18840"/>
+<ISIN value="KR7157600008"/>
+<SHOTN_ISIN value="157600"/>
+<KOR_SECN_NM value="코리아세라믹"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="206" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34700"/>
+<ISIN value="KR7315570002"/>
+<SHOTN_ISIN value="315570"/>
+<KOR_SECN_NM value="코리아익스프레스에어"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181220"/>
+</result>
+</data>
+<data vectorkey="207" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7275"/>
+<ISIN value="KR705092K038"/>
+<SHOTN_ISIN value="05092M"/>
+<KOR_SECN_NM value="코스틸3우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181231"/>
+</result>
+</data>
+<data vectorkey="208" type="Document">
+<result>
+<ISSUCO_CUSTNO value="7437"/>
+<ISIN value="KR7052350006"/>
+<SHOTN_ISIN value="052350"/>
+<KOR_SECN_NM value="코아에스앤아이"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="209" type="Document">
+<result>
+<ISSUCO_CUSTNO value="22365"/>
+<ISIN value="KR7191460005"/>
+<SHOTN_ISIN value="191460"/>
+<KOR_SECN_NM value="큐빅스"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="210" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34237"/>
+<ISIN value="KR7311270003"/>
+<SHOTN_ISIN value="311270"/>
+<KOR_SECN_NM value="키움제5호기업인수목적"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="120"/>
+<APLI_DT value="20181226"/>
+</result>
+</data>
+<data vectorkey="211" type="Document">
+<result>
+<ISSUCO_CUSTNO value="22647"/>
+<ISIN value="KR7194330007"/>
+<SHOTN_ISIN value="194330"/>
+<KOR_SECN_NM value="태미세미콘"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="212" type="Document">
+<result>
+<ISSUCO_CUSTNO value="22647"/>
+<ISIN value="KR719433K012"/>
+<SHOTN_ISIN value="19433K"/>
+<KOR_SECN_NM value="태미세미콘1우"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="213" type="Document">
+<result>
+<ISSUCO_CUSTNO value="14504"/>
+<ISIN value="KR7107540007"/>
+<SHOTN_ISIN value="107540"/>
+<KOR_SECN_NM value="태화정공"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181203"/>
+</result>
+</data>
+<data vectorkey="214" type="Document">
+<result>
+<ISSUCO_CUSTNO value="14504"/>
+<ISIN value="KR710754K010"/>
+<SHOTN_ISIN value="10754K"/>
+<KOR_SECN_NM value="태화정공1우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181203"/>
+</result>
+</data>
+<data vectorkey="215" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34254"/>
+<ISIN value="KR7311340004"/>
+<SHOTN_ISIN value="311340"/>
+<KOR_SECN_NM value="테디아일랜드"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181213"/>
+</result>
+</data>
+<data vectorkey="216" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34254"/>
+<ISIN value="KR731134K010"/>
+<SHOTN_ISIN value="31134K"/>
+<KOR_SECN_NM value="테디아일랜드1우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181227"/>
+</result>
+</data>
+<data vectorkey="217" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34384"/>
+<ISIN value="KR7308700004"/>
+<SHOTN_ISIN value="308700"/>
+<KOR_SECN_NM value="테크엔"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="140"/>
+<APLI_DT value="20181221"/>
+</result>
+</data>
+<data vectorkey="218" type="Document">
+<result>
+<ISSUCO_CUSTNO value="25463"/>
+<ISIN value="KR7222510000"/>
+<SHOTN_ISIN value="222510"/>
+<KOR_SECN_NM value="템톡"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="219" type="Document">
+<result>
+<ISSUCO_CUSTNO value="22399"/>
+<ISIN value="KR7187330006"/>
+<SHOTN_ISIN value="187330"/>
+<KOR_SECN_NM value="토네이도"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="220" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34642"/>
+<ISIN value="KR7314830001"/>
+<SHOTN_ISIN value="314830"/>
+<KOR_SECN_NM value="토리컴즈"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="221" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34642"/>
+<ISIN value="KR731483K011"/>
+<SHOTN_ISIN value="31483K"/>
+<KOR_SECN_NM value="토리컴즈1우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181212"/>
+</result>
+</data>
+<data vectorkey="222" type="Document">
+<result>
+<ISSUCO_CUSTNO value="20207"/>
+<ISIN value="KR7170760003"/>
+<SHOTN_ISIN value="170760"/>
+<KOR_SECN_NM value="티비젼"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="223" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34099"/>
+<ISIN value="KR7309900009"/>
+<SHOTN_ISIN value="309900"/>
+<KOR_SECN_NM value="티티씨디펜스"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181206"/>
+</result>
+</data>
+<data vectorkey="224" type="Document">
+<result>
+<ISSUCO_CUSTNO value="25138"/>
+<ISIN value="KR721788K072"/>
+<SHOTN_ISIN value="21788R"/>
+<KOR_SECN_NM value="틸론7우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181207"/>
+</result>
+</data>
+<data vectorkey="225" type="Document">
+<result>
+<ISSUCO_CUSTNO value="32047"/>
+<ISIN value="KR728833K087"/>
+<SHOTN_ISIN value="28833S"/>
+<KOR_SECN_NM value="파라택시스코리아8우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181210"/>
+</result>
+</data>
+<data vectorkey="226" type="Document">
+<result>
+<ISSUCO_CUSTNO value="32047"/>
+<ISIN value="KR728833K095"/>
+<SHOTN_ISIN value="28833T"/>
+<KOR_SECN_NM value="파라택시스코리아9우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181218"/>
+</result>
+</data>
+<data vectorkey="227" type="Document">
+<result>
+<ISSUCO_CUSTNO value="16477"/>
+<ISIN value="KR7135080000"/>
+<SHOTN_ISIN value="135080"/>
+<KOR_SECN_NM value="파스웰드풍산레이저"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="228" type="Document">
+<result>
+<ISSUCO_CUSTNO value="8508"/>
+<ISIN value="KR7071590004"/>
+<SHOTN_ISIN value="071590"/>
+<KOR_SECN_NM value="팬지아이십일"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="229" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34598"/>
+<ISIN value="KR7314390006"/>
+<SHOTN_ISIN value="314390"/>
+<KOR_SECN_NM value="퍼플독"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181207"/>
+</result>
+</data>
+<data vectorkey="230" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34598"/>
+<ISIN value="KR731439K013"/>
+<SHOTN_ISIN value="31439K"/>
+<KOR_SECN_NM value="퍼플독1우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181207"/>
+</result>
+</data>
+<data vectorkey="231" type="Document">
+<result>
+<ISSUCO_CUSTNO value="19939"/>
+<ISIN value="KR716836K035"/>
+<SHOTN_ISIN value="16836M"/>
+<KOR_SECN_NM value="펨트론3우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181207"/>
+</result>
+</data>
+<data vectorkey="232" type="Document">
+<result>
+<ISSUCO_CUSTNO value="21180"/>
+<ISIN value="KR7180050007"/>
+<SHOTN_ISIN value="180050"/>
+<KOR_SECN_NM value="폴리에너지"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="233" type="Document">
+<result>
+<ISSUCO_CUSTNO value="32932"/>
+<ISIN value="KR729806K116"/>
+<SHOTN_ISIN value="29806W"/>
+<KOR_SECN_NM value="풍전약품11우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181203"/>
+</result>
+</data>
+<data vectorkey="234" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34255"/>
+<ISIN value="KR7308580000"/>
+<SHOTN_ISIN value="308580"/>
+<KOR_SECN_NM value="퓨처사이버"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181213"/>
+</result>
+</data>
+<data vectorkey="235" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34201"/>
+<ISIN value="KR7310950001"/>
+<SHOTN_ISIN value="310950"/>
+<KOR_SECN_NM value="프라임오토"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181226"/>
+</result>
+</data>
+<data vectorkey="236" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34327"/>
+<ISIN value="KR7303360002"/>
+<SHOTN_ISIN value="303360"/>
+<KOR_SECN_NM value="프로티아"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="140"/>
+<APLI_DT value="20181219"/>
+</result>
+</data>
+<data vectorkey="237" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34780"/>
+<ISIN value="KR7316370006"/>
+<SHOTN_ISIN value="316370"/>
+<KOR_SECN_NM value="프프"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="238" type="Document">
+<result>
+<ISSUCO_CUSTNO value="19943"/>
+<ISIN value="KR7168460004"/>
+<SHOTN_ISIN value="168460"/>
+<KOR_SECN_NM value="한국부여보석광업"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="239" type="Document">
+<result>
+<ISSUCO_CUSTNO value="2583"/>
+<ISIN value="KR7025830001"/>
+<SHOTN_ISIN value="025830"/>
+<KOR_SECN_NM value="한국합섬"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="240" type="Document">
+<result>
+<ISSUCO_CUSTNO value="10079"/>
+<ISIN value="KR7083270009"/>
+<SHOTN_ISIN value="083270"/>
+<KOR_SECN_NM value="한울옵틱스"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="241" type="Document">
+<result>
+<ISSUCO_CUSTNO value="13381"/>
+<ISIN value="KR7117930008"/>
+<SHOTN_ISIN value="117930"/>
+<KOR_SECN_NM value="한진해운"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="242" type="Document">
+<result>
+<ISSUCO_CUSTNO value="9479"/>
+<ISIN value="KR7078430006"/>
+<SHOTN_ISIN value="078430"/>
+<KOR_SECN_NM value="한창시스템"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181217"/>
+</result>
+</data>
+<data vectorkey="243" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34677"/>
+<ISIN value="KR7315080002"/>
+<SHOTN_ISIN value="315080"/>
+<KOR_SECN_NM value="핸드픽트컬렉션즈"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181214"/>
+</result>
+</data>
+<data vectorkey="244" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34677"/>
+<ISIN value="KR731508K015"/>
+<SHOTN_ISIN value="31508K"/>
+<KOR_SECN_NM value="핸드픽트컬렉션즈1우"/>
+<BFALT_CIRCL_FORM value=""/>
+<AFALT_CIRCL_FORM value="241"/>
+<APLI_DT value="20181214"/>
+</result>
+</data>
+<data vectorkey="245" type="Document">
+<result>
+<ISSUCO_CUSTNO value="1841"/>
+<ISIN value="KR7018410001"/>
+<SHOTN_ISIN value="018410"/>
+<KOR_SECN_NM value="현대금속"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="246" type="Document">
+<result>
+<ISSUCO_CUSTNO value="1841"/>
+<ISIN value="KR7018411009"/>
+<SHOTN_ISIN value="018415"/>
+<KOR_SECN_NM value="현대금속1우"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="247" type="Document">
+<result>
+<ISSUCO_CUSTNO value="1841"/>
+<ISIN value="KR7018412007"/>
+<SHOTN_ISIN value="018417"/>
+<KOR_SECN_NM value="현대금속2우"/>
+<BFALT_CIRCL_FORM value="211"/>
+<AFALT_CIRCL_FORM value="221"/>
+<APLI_DT value="20181228"/>
+</result>
+</data>
+<data vectorkey="248" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34597"/>
+<ISIN value="KR7308100007"/>
+<SHOTN_ISIN value="308100"/>
+<KOR_SECN_NM value="형지글로벌"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181211"/>
+</result>
+</data>
+<data vectorkey="249" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34744"/>
+<ISIN value="KR7315630004"/>
+<SHOTN_ISIN value="315630"/>
+<KOR_SECN_NM value="혜덕"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181226"/>
+</result>
+</data>
+<data vectorkey="250" type="Document">
+<result>
+<ISSUCO_CUSTNO value="34084"/>
+<ISIN value="KR7309610004"/>
+<SHOTN_ISIN value="309610"/>
+<KOR_SECN_NM value="홀마"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181206"/>
+</result>
+</data>
+<data vectorkey="251" type="Document">
+<result>
+<ISSUCO_CUSTNO value="32840"/>
+<ISIN value="KR721621K091"/>
+<SHOTN_ISIN value="21621T"/>
+<KOR_SECN_NM value="힐세리온9우"/>
+<BFALT_CIRCL_FORM value="241"/>
+<AFALT_CIRCL_FORM value="211"/>
+<APLI_DT value="20181207"/>
+</result>
+</data>
+</vector>

+ 20 - 0
Tests/Application.Tests/Fixtures/Seibro/주식/getStkStatInfo.xml

@@ -0,0 +1,20 @@
+<vector beforeServletCall="1783405015306" beforeEJBCall="1783405015310" afterServletCall="1783405015316" afterEJBCall="1783405015315" result="1">
+<data vectorkey="0" type="Document">
+<result>
+<ISSUCO_CUSTNO value="593"/>
+<LIST_NM value="유가증권시장"/>
+<KOR_SECN_NM value="삼성전자"/>
+<ENG_SECN_NM value="SAMSUNG ELECTRONICS"/>
+<ISIN value="KR7005930003"/>
+<SHOTN_ISIN value="005930"/>
+<ISSU_CUR_CD value="KRW"/>
+<PVAL value="100"/>
+<SECN_KACD value="0101"/>
+<NNOSTK_TPCD value="1"/>
+<ISSU_NATION_CD value="KR"/>
+<VOTRNO value="1"/>
+<TOTAL_STK_CNT value="6419324700"/>
+<ELTSC_YN value="N"/>
+</result>
+</data>
+</vector>

+ 14 - 0
Tests/Application.Tests/Fixtures/Seibro/주식/getUnlistCirclInfo.xml

@@ -0,0 +1,14 @@
+<vector beforeServletCall="1783405025025" beforeEJBCall="1783405025030" afterServletCall="1783405025157" afterEJBCall="1783405025156" result="1">
+<data vectorkey="0" type="Document">
+<result>
+<ISIN value="KR7064400005"/>
+<SHOTN_ISIN value="064400"/>
+<REP_SECN_NM value="엘지씨엔에스"/>
+<SECN_KACD_NM value="보통주"/>
+<GEN_DEPO_QTY value="0"/>
+<RTHING_RETURN_STKQTY value="0"/>
+<ACNTTR_QTY value="1400"/>
+<ELTSC_YN value="N"/>
+</result>
+</data>
+</vector>

+ 2 - 0
Tests/Application.Tests/Fixtures/Seibro/주식/getXrcStkOptionXrcInfo.xml

@@ -0,0 +1,2 @@
+<vector beforeServletCall="1783405081174" beforeEJBCall="1783405081180" afterServletCall="1783405081292" afterEJBCall="1783405081291" result="0">
+</vector>

+ 2 - 0
Tests/Application.Tests/Fixtures/Seibro/주식/getXrcStkStatInfo.xml

@@ -0,0 +1,2 @@
+<vector beforeServletCall="1783405072879" beforeEJBCall="1783405072886" afterServletCall="1783405072890" afterEJBCall="1783405072889" result="0">
+</vector>

+ 11 - 0
Tests/Application.Tests/Fixtures/Seibro/채권/getBondIssuInfo.xml

@@ -0,0 +1,11 @@
+<vector beforeServletCall="1783405233892" beforeEJBCall="1783405233896" afterServletCall="1783405233900" afterEJBCall="1783405233899" result="1">
+<data vectorkey="0" type="Document">
+<result>
+<ISSU_DT value="20180803"/>
+<ISSUCO_CUSTNO value="29998"/>
+<ISSUCO_CUST_NM value="SK해운"/>
+<ISIN value="KR6268761881"/>
+<KOR_SECN_NM value="SK해운 61"/>
+</result>
+</data>
+</vector>

+ 17 - 0
Tests/Application.Tests/Fixtures/Seibro/채권/getBondOptionXrcInfo.xml

@@ -0,0 +1,17 @@
+<vector beforeServletCall="1783405251404" beforeEJBCall="1783405251408" afterServletCall="1783405251411" afterEJBCall="1783405251411" result="1">
+<data vectorkey="0" type="Document">
+<result>
+<ISIN value="KR6225693573"/>
+<KOR_SECN_NM value="제이티캐피탈제일차유동화전문 3-1(콜/변)"/>
+<XRC_BEGIN_DT value=""/>
+<XRC_EXPRY_DT value=""/>
+<ERLY_RED_DT value="20180824"/>
+<OPTION_TPCD value="9401"/>
+<APLI_IRATE value="3.75"/>
+<ERLY_REDAMT_VAL value="2000000000"/>
+<INT_PAY_AMT value="117842465"/>
+<ISSU_REMA value="0"/>
+<XRC_RATIO value="3.08"/>
+</result>
+</data>
+</vector>

+ 42 - 0
Tests/Application.Tests/Fixtures/Seibro/채권/getBondStatInfo.xml

@@ -0,0 +1,42 @@
+<vector beforeServletCall="1783405239862" beforeEJBCall="1783405239867" afterServletCall="1783405239876" afterEJBCall="1783405239875" result="1">
+<data vectorkey="0" type="Document">
+<result>
+<ISSUCO_CUSTNO value="29998"/>
+<KOR_SECN_NM value="SK해운 61"/>
+<SECN_KACD value="1108"/>
+<ISSU_DT value="20180803"/>
+<XPIR_DT value="20200203"/>
+<ISSU_CUR_CD value="KRW"/>
+<FIRST_ISSU_AMT value="126000000000"/>
+<ISSU_REMA value="0"/>
+<PAYIN_AMT value="126000000000"/>
+<COUPON_RATE value="4.485"/>
+<XPIRED_RATE value="100"/>
+<RECU_WHCD value="11"/>
+<ISSU_WHCD value="2"/>
+<PARTICUL_BOND_KIND_TPCD value="9"/>
+<OPTION_TPCD value="0000"/>
+<FORC_ERLY_RED_YN value="N"/>
+<MR_CHG_TPCD value="1"/>
+<REGI_ORG_TPCD value="01"/>
+<GRTY_TPCD value="2"/>
+<SIGNA_TPCD value="2"/>
+<RANK_TPCD value="1"/>
+<INT_PAY_WAY_TPCD value="1"/>
+<SINT_CINT_TPCD value="1"/>
+<IRATE_CHG_TPCD value="1"/>
+<XPIR_GUAR_PRATE value="0"/>
+<XPIR_GUAR_PRATE_TPCD value="99"/>
+<PRCP_RED_WHCD value="11"/>
+<APLI_DT value="20180803"/>
+<DLIST_DT value="20200204"/>
+<KIS_VALAT_GRD_CD value="133"/>
+<NICE_VALAT_GRD_CD value=""/>
+<SCI_VALAT_GRD_CD value=""/>
+<KR_VALAT_GRD_CD value="133"/>
+<ELTSC_YN value="N"/>
+<EXER_MBODY_TPCD value="1"/>
+<INT_ESTM_MANN_TPCD value="1"/>
+</result>
+</data>
+</vector>

+ 2 - 0
Tests/Application.Tests/Fixtures/Seibro/채권/getCDInfo.xml

@@ -0,0 +1,2 @@
+<vector beforeServletCall="1783405265633" beforeEJBCall="1783405265638" afterServletCall="1783405265642" afterEJBCall="1783405265641" result="0">
+</vector>

+ 26 - 0
Tests/Application.Tests/Fixtures/Seibro/채권/getCPInfo.xml

@@ -0,0 +1,26 @@
+<vector beforeServletCall="1783405270895" beforeEJBCall="1783405270899" afterServletCall="1783405270906" afterEJBCall="1783405270906" result="1">
+<data vectorkey="0" type="Document">
+<result>
+<ISSUCO_CUSTNO value="33427"/>
+<KOR_SECN_NM value="윈케이제구차 20180702-364-10"/>
+<ISSU_CUR_CD value="KRW"/>
+<ISSU_AMT value="5000000000"/>
+<SECN_KACD value="1204"/>
+<BILL_CACD value="1"/>
+<ISSU_WHCD value="1"/>
+<SALE_DT value="20180702"/>
+<INT_PAY_MANN_TPCD value="1"/>
+<ISSU_DT value="20180702"/>
+<XPIR_DT value="20190701"/>
+<DISCN_ORG_CUSTNO value="3061"/>
+<DISCN_ORD_NM value="교보증권"/>
+<PAY_BANK_BRONO value="311"/>
+<BANK_NM value="NH농협은행은행 (NH금융PLUS파크원센터)"/>
+<WHOLD_TPCD value="1"/>
+<KIS_VALAT_GRD_CD value="112"/>
+<NICE_VALAT_GRD_CD value=""/>
+<SCI_VALAT_GRD_CD value=""/>
+<KR_VALAT_GRD_CD value="112"/>
+</result>
+</data>
+</vector>

+ 21 - 0
Tests/Application.Tests/Fixtures/Seibro/채권/getESTBInfo.xml

@@ -0,0 +1,21 @@
+<vector beforeServletCall="1783405278411" beforeEJBCall="1783405278416" afterServletCall="1783405278443" afterEJBCall="1783405278442" result="1">
+<data vectorkey="0" type="Document">
+<result>
+<ISSUCO_CUSTNO value="27597"/>
+<ESTB_KACD value="3"/>
+<KOR_SECN_NM value="디에스평택진위제일차 20180802-92-1(E)"/>
+<ISSU_CUR_CD value="KRW"/>
+<ISSU_AMT value="5000000000"/>
+<RECU_WHCD value="99"/>
+<ISSU_DT value="20180802"/>
+<XPIR_DT value="20181102"/>
+<DAYOBJ value="92"/>
+<WHOLD_YN value="Y"/>
+<GRORG_YN value="N"/>
+<KIS_VALAT_GRD_CD value=""/>
+<NICE_VALAT_GRD_CD value="112"/>
+<SCI_VALAT_GRD_CD value=""/>
+<KR_VALAT_GRD_CD value="112"/>
+</result>
+</data>
+</vector>

+ 2 - 0
Tests/Application.Tests/Fixtures/Seibro/채권/getIntPayInfo.xml

@@ -0,0 +1,2 @@
+<vector beforeServletCall="1783405245471" beforeEJBCall="1783405245475" afterServletCall="1783405245478" afterEJBCall="1783405245477" result="0">
+</vector>

+ 2322 - 0
Tests/Application.Tests/Fixtures/Seibro/채권/getShortmIssuInfo.xml

@@ -0,0 +1,2322 @@
+<vector beforeServletCall="1783405260716" beforeEJBCall="1783405260722" afterServletCall="1783405260808" afterEJBCall="1783405260808" result="290">
+<data vectorkey="0" type="Document">
+<result>
+<ISIN value="KRZF00405288"/>
+<KOR_SECN_NM value="현대오일뱅크 20180801-21-2"/>
+<ISSUCO_CUSTNO value="405"/>
+<ISSUCO_CUST_NM value="에이치디현대오일뱅크"/>
+</result>
+</data>
+<data vectorkey="1" type="Document">
+<result>
+<ISIN value="KRZF10334988"/>
+<KOR_SECN_NM value="대신에프앤아이 20180801-364-9"/>
+<ISSUCO_CUSTNO value="14006"/>
+<ISSUCO_CUST_NM value="대신에프앤아이"/>
+</result>
+</data>
+<data vectorkey="2" type="Document">
+<result>
+<ISIN value="KRZF03143188"/>
+<KOR_SECN_NM value="신세계인터내셔날 20180801-9-1"/>
+<ISSUCO_CUSTNO value="3143"/>
+<ISSUCO_CUST_NM value="신세계인터내셔날"/>
+</result>
+</data>
+<data vectorkey="3" type="Document">
+<result>
+<ISIN value="KRZF10334688"/>
+<KOR_SECN_NM value="대신에프앤아이 20180801-358-6"/>
+<ISSUCO_CUSTNO value="14006"/>
+<ISSUCO_CUST_NM value="대신에프앤아이"/>
+</result>
+</data>
+<data vectorkey="4" type="Document">
+<result>
+<ISIN value="KRZF12327288"/>
+<KOR_SECN_NM value="코리아세븐 20180801-6-2"/>
+<ISSUCO_CUSTNO value="15239"/>
+<ISSUCO_CUST_NM value="코리아세븐"/>
+</result>
+</data>
+<data vectorkey="5" type="Document">
+<result>
+<ISIN value="KRZF00405388"/>
+<KOR_SECN_NM value="현대오일뱅크 20180801-21-3"/>
+<ISSUCO_CUSTNO value="405"/>
+<ISSUCO_CUST_NM value="에이치디현대오일뱅크"/>
+</result>
+</data>
+<data vectorkey="6" type="Document">
+<result>
+<ISIN value="KRZF03271588"/>
+<KOR_SECN_NM value="신한카드 20180801-30-5"/>
+<ISSUCO_CUSTNO value="3271"/>
+<ISSUCO_CUST_NM value="신한카드"/>
+</result>
+</data>
+<data vectorkey="7" type="Document">
+<result>
+<ISIN value="KRZF03271988"/>
+<KOR_SECN_NM value="신한카드 20180801-30-9"/>
+<ISSUCO_CUSTNO value="3271"/>
+<ISSUCO_CUST_NM value="신한카드"/>
+</result>
+</data>
+<data vectorkey="8" type="Document">
+<result>
+<ISIN value="KRZF03271188"/>
+<KOR_SECN_NM value="신한카드 20180801-30-1"/>
+<ISSUCO_CUSTNO value="3271"/>
+<ISSUCO_CUST_NM value="신한카드"/>
+</result>
+</data>
+<data vectorkey="9" type="Document">
+<result>
+<ISIN value="KRZF03271888"/>
+<KOR_SECN_NM value="신한카드 20180801-30-8"/>
+<ISSUCO_CUSTNO value="3271"/>
+<ISSUCO_CUST_NM value="신한카드"/>
+</result>
+</data>
+<data vectorkey="10" type="Document">
+<result>
+<ISIN value="KRZF03271788"/>
+<KOR_SECN_NM value="신한카드 20180801-30-7"/>
+<ISSUCO_CUSTNO value="3271"/>
+<ISSUCO_CUST_NM value="신한카드"/>
+</result>
+</data>
+<data vectorkey="11" type="Document">
+<result>
+<ISIN value="KRZF00405788"/>
+<KOR_SECN_NM value="현대오일뱅크 20180801-20-7"/>
+<ISSUCO_CUSTNO value="405"/>
+<ISSUCO_CUST_NM value="에이치디현대오일뱅크"/>
+</result>
+</data>
+<data vectorkey="12" type="Document">
+<result>
+<ISIN value="KRZF03271688"/>
+<KOR_SECN_NM value="신한카드 20180801-30-6"/>
+<ISSUCO_CUSTNO value="3271"/>
+<ISSUCO_CUST_NM value="신한카드"/>
+</result>
+</data>
+<data vectorkey="13" type="Document">
+<result>
+<ISIN value="KRZF00088288"/>
+<KOR_SECN_NM value="한화 20180801-33-2"/>
+<ISSUCO_CUSTNO value="88"/>
+<ISSUCO_CUST_NM value="한화"/>
+</result>
+</data>
+<data vectorkey="14" type="Document">
+<result>
+<ISIN value="KRZF03271388"/>
+<KOR_SECN_NM value="신한카드 20180801-30-3"/>
+<ISSUCO_CUSTNO value="3271"/>
+<ISSUCO_CUST_NM value="신한카드"/>
+</result>
+</data>
+<data vectorkey="15" type="Document">
+<result>
+<ISIN value="KRZF10334788"/>
+<KOR_SECN_NM value="대신에프앤아이 20180801-364-7"/>
+<ISSUCO_CUSTNO value="14006"/>
+<ISSUCO_CUST_NM value="대신에프앤아이"/>
+</result>
+</data>
+<data vectorkey="16" type="Document">
+<result>
+<ISIN value="KRZF03271A88"/>
+<KOR_SECN_NM value="신한카드 20180801-30-10"/>
+<ISSUCO_CUSTNO value="3271"/>
+<ISSUCO_CUST_NM value="신한카드"/>
+</result>
+</data>
+<data vectorkey="17" type="Document">
+<result>
+<ISIN value="KRZF12327388"/>
+<KOR_SECN_NM value="코리아세븐 20180801-6-3"/>
+<ISSUCO_CUSTNO value="15239"/>
+<ISSUCO_CUST_NM value="코리아세븐"/>
+</result>
+</data>
+<data vectorkey="18" type="Document">
+<result>
+<ISIN value="KRZF03271288"/>
+<KOR_SECN_NM value="신한카드 20180801-30-2"/>
+<ISSUCO_CUSTNO value="3271"/>
+<ISSUCO_CUST_NM value="신한카드"/>
+</result>
+</data>
+<data vectorkey="19" type="Document">
+<result>
+<ISIN value="KRZF00405888"/>
+<KOR_SECN_NM value="현대오일뱅크 20180801-20-8"/>
+<ISSUCO_CUSTNO value="405"/>
+<ISSUCO_CUST_NM value="에이치디현대오일뱅크"/>
+</result>
+</data>
+<data vectorkey="20" type="Document">
+<result>
+<ISIN value="KRZF00088188"/>
+<KOR_SECN_NM value="한화 20180801-33-1"/>
+<ISSUCO_CUSTNO value="88"/>
+<ISSUCO_CUST_NM value="한화"/>
+</result>
+</data>
+<data vectorkey="21" type="Document">
+<result>
+<ISIN value="KRZF00405688"/>
+<KOR_SECN_NM value="현대오일뱅크 20180801-20-6"/>
+<ISSUCO_CUSTNO value="405"/>
+<ISSUCO_CUST_NM value="에이치디현대오일뱅크"/>
+</result>
+</data>
+<data vectorkey="22" type="Document">
+<result>
+<ISIN value="KRZF00088388"/>
+<KOR_SECN_NM value="한화 20180801-33-3"/>
+<ISSUCO_CUSTNO value="88"/>
+<ISSUCO_CUST_NM value="한화"/>
+</result>
+</data>
+<data vectorkey="23" type="Document">
+<result>
+<ISIN value="KRZF10334488"/>
+<KOR_SECN_NM value="대신에프앤아이 20180801-356-4"/>
+<ISSUCO_CUSTNO value="14006"/>
+<ISSUCO_CUST_NM value="대신에프앤아이"/>
+</result>
+</data>
+<data vectorkey="24" type="Document">
+<result>
+<ISIN value="KRZF00405188"/>
+<KOR_SECN_NM value="현대오일뱅크 20180801-21-1"/>
+<ISSUCO_CUSTNO value="405"/>
+<ISSUCO_CUST_NM value="에이치디현대오일뱅크"/>
+</result>
+</data>
+<data vectorkey="25" type="Document">
+<result>
+<ISIN value="KRZF00405588"/>
+<KOR_SECN_NM value="현대오일뱅크 20180801-20-5"/>
+<ISSUCO_CUSTNO value="405"/>
+<ISSUCO_CUST_NM value="에이치디현대오일뱅크"/>
+</result>
+</data>
+<data vectorkey="26" type="Document">
+<result>
+<ISIN value="KRZF00307188"/>
+<KOR_SECN_NM value="코오롱글로벌 20180801-30-1"/>
+<ISSUCO_CUSTNO value="307"/>
+<ISSUCO_CUST_NM value="코오롱글로벌"/>
+</result>
+</data>
+<data vectorkey="27" type="Document">
+<result>
+<ISIN value="KRZF10334288"/>
+<KOR_SECN_NM value="대신에프앤아이 20180801-37-2"/>
+<ISSUCO_CUSTNO value="14006"/>
+<ISSUCO_CUST_NM value="대신에프앤아이"/>
+</result>
+</data>
+<data vectorkey="28" type="Document">
+<result>
+<ISIN value="KRZF10334888"/>
+<KOR_SECN_NM value="대신에프앤아이 20180801-364-8"/>
+<ISSUCO_CUSTNO value="14006"/>
+<ISSUCO_CUST_NM value="대신에프앤아이"/>
+</result>
+</data>
+<data vectorkey="29" type="Document">
+<result>
+<ISIN value="KRZF00405488"/>
+<KOR_SECN_NM value="현대오일뱅크 20180801-21-4"/>
+<ISSUCO_CUSTNO value="405"/>
+<ISSUCO_CUST_NM value="에이치디현대오일뱅크"/>
+</result>
+</data>
+<data vectorkey="30" type="Document">
+<result>
+<ISIN value="KRZF12327488"/>
+<KOR_SECN_NM value="코리아세븐 20180801-6-4"/>
+<ISSUCO_CUSTNO value="15239"/>
+<ISSUCO_CUST_NM value="코리아세븐"/>
+</result>
+</data>
+<data vectorkey="31" type="Document">
+<result>
+<ISIN value="KRZF10334188"/>
+<KOR_SECN_NM value="대신에프앤아이 20180801-364-1"/>
+<ISSUCO_CUSTNO value="14006"/>
+<ISSUCO_CUST_NM value="대신에프앤아이"/>
+</result>
+</data>
+<data vectorkey="32" type="Document">
+<result>
+<ISIN value="KRZF03271488"/>
+<KOR_SECN_NM value="신한카드 20180801-30-4"/>
+<ISSUCO_CUSTNO value="3271"/>
+<ISSUCO_CUST_NM value="신한카드"/>
+</result>
+</data>
+<data vectorkey="33" type="Document">
+<result>
+<ISIN value="KRZF12327188"/>
+<KOR_SECN_NM value="코리아세븐 20180801-6-1"/>
+<ISSUCO_CUSTNO value="15239"/>
+<ISSUCO_CUST_NM value="코리아세븐"/>
+</result>
+</data>
+<data vectorkey="34" type="Document">
+<result>
+<ISIN value="KRZF10334588"/>
+<KOR_SECN_NM value="대신에프앤아이 20180801-358-5"/>
+<ISSUCO_CUSTNO value="14006"/>
+<ISSUCO_CUST_NM value="대신에프앤아이"/>
+</result>
+</data>
+<data vectorkey="35" type="Document">
+<result>
+<ISIN value="KRZF10334388"/>
+<KOR_SECN_NM value="대신에프앤아이 20180801-356-3"/>
+<ISSUCO_CUSTNO value="14006"/>
+<ISSUCO_CUST_NM value="대신에프앤아이"/>
+</result>
+</data>
+<data vectorkey="36" type="Document">
+<result>
+<ISIN value="KRZF01270188"/>
+<KOR_SECN_NM value="리드코프 20180801-364-1"/>
+<ISSUCO_CUSTNO value="1270"/>
+<ISSUCO_CUST_NM value="리드코프"/>
+</result>
+</data>
+<data vectorkey="37" type="Document">
+<result>
+<ISIN value="KRZF28914288"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-2"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="38" type="Document">
+<result>
+<ISIN value="KRZF30496788"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-7"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="39" type="Document">
+<result>
+<ISIN value="KRZF29032988"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-9"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="40" type="Document">
+<result>
+<ISIN value="KRZF29032E88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-14"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="41" type="Document">
+<result>
+<ISIN value="KRZF29032G8L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-49"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="42" type="Document">
+<result>
+<ISIN value="KRZF3045408L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-33"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="43" type="Document">
+<result>
+<ISIN value="KRZF30507588"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-5"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="44" type="Document">
+<result>
+<ISIN value="KRZF30496V88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-28"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="45" type="Document">
+<result>
+<ISIN value="KRZF30496488"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-4"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="46" type="Document">
+<result>
+<ISIN value="KRZF28914S88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-26"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="47" type="Document">
+<result>
+<ISIN value="KRZF28914M88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-21"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="48" type="Document">
+<result>
+<ISIN value="KRZF23821288"/>
+<KOR_SECN_NM value="써니금융제일차 20180801-92-2"/>
+<ISSUCO_CUSTNO value="26977"/>
+<ISSUCO_CUST_NM value="써니금융제일차"/>
+</result>
+</data>
+<data vectorkey="49" type="Document">
+<result>
+<ISIN value="KRZF28914P88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-23"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="50" type="Document">
+<result>
+<ISIN value="KRZF30454F88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-15"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="51" type="Document">
+<result>
+<ISIN value="KRZF24224188"/>
+<KOR_SECN_NM value="실버인베스트먼트제이차 20180801-92-1"/>
+<ISSUCO_CUSTNO value="27364"/>
+<ISSUCO_CUST_NM value="실버인베스트먼트제이차"/>
+</result>
+</data>
+<data vectorkey="52" type="Document">
+<result>
+<ISIN value="KRZF30454T88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-27"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="53" type="Document">
+<result>
+<ISIN value="KRZF29032A88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-10"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="54" type="Document">
+<result>
+<ISIN value="KRZF29032P88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-23"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="55" type="Document">
+<result>
+<ISIN value="KRZF30454788"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-7"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="56" type="Document">
+<result>
+<ISIN value="KRZF30454288"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-2"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="57" type="Document">
+<result>
+<ISIN value="KRZF30454D88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-13"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="58" type="Document">
+<result>
+<ISIN value="KRZF30496D8L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-46"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="59" type="Document">
+<result>
+<ISIN value="KRZF3050728L"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-35"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="60" type="Document">
+<result>
+<ISIN value="KRZF2903238L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-36"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="61" type="Document">
+<result>
+<ISIN value="KRZF29032K88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-19"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="62" type="Document">
+<result>
+<ISIN value="KRZF3045458L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-38"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="63" type="Document">
+<result>
+<ISIN value="KRZF3045478L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-40"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="64" type="Document">
+<result>
+<ISIN value="KRZF29032T88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-27"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="65" type="Document">
+<result>
+<ISIN value="KRZF2903228L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-35"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="66" type="Document">
+<result>
+<ISIN value="KRZF2903218L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-34"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="67" type="Document">
+<result>
+<ISIN value="KRZF30507Y88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-31"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="68" type="Document">
+<result>
+<ISIN value="KRZF30454Z88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-32"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="69" type="Document">
+<result>
+<ISIN value="KRZF28914C88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-12"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="70" type="Document">
+<result>
+<ISIN value="KRZF30507B88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-11"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="71" type="Document">
+<result>
+<ISIN value="KRZF30507F88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-15"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="72" type="Document">
+<result>
+<ISIN value="KRZF3045488L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-41"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="73" type="Document">
+<result>
+<ISIN value="KRZF30454A8L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-43"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="74" type="Document">
+<result>
+<ISIN value="KRZF30454C88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-12"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="75" type="Document">
+<result>
+<ISIN value="KRZF29032J88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-18"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="76" type="Document">
+<result>
+<ISIN value="KRZF30454G88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-16"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="77" type="Document">
+<result>
+<ISIN value="KRZF30496E8L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-47"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="78" type="Document">
+<result>
+<ISIN value="KRZF28914A88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-10"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="79" type="Document">
+<result>
+<ISIN value="KRZF28914588"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-5"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="80" type="Document">
+<result>
+<ISIN value="KRZF28914788"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-7"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="81" type="Document">
+<result>
+<ISIN value="KRZF28914G88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-16"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="82" type="Document">
+<result>
+<ISIN value="KRZF30496B88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-11"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="83" type="Document">
+<result>
+<ISIN value="KRZF30507288"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-2"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="84" type="Document">
+<result>
+<ISIN value="KRZF29032R88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-25"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="85" type="Document">
+<result>
+<ISIN value="KRZF30454K88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-19"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="86" type="Document">
+<result>
+<ISIN value="KRZF30454N88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-22"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="87" type="Document">
+<result>
+<ISIN value="KRZF30454M88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-21"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="88" type="Document">
+<result>
+<ISIN value="KRZF24224488"/>
+<KOR_SECN_NM value="실버인베스트먼트제이차 20180801-92-4"/>
+<ISSUCO_CUSTNO value="27364"/>
+<ISSUCO_CUST_NM value="실버인베스트먼트제이차"/>
+</result>
+</data>
+<data vectorkey="89" type="Document">
+<result>
+<ISIN value="KRZF2891438L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-36"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="90" type="Document">
+<result>
+<ISIN value="KRZF30496J8L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-51"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="91" type="Document">
+<result>
+<ISIN value="KRZF30507488"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-4"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="92" type="Document">
+<result>
+<ISIN value="KRZF30496E88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-14"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="93" type="Document">
+<result>
+<ISIN value="KRZF30496288"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-2"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="94" type="Document">
+<result>
+<ISIN value="KRZF30496X88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-30"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="95" type="Document">
+<result>
+<ISIN value="KRZF30454G8L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-49"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="96" type="Document">
+<result>
+<ISIN value="KRZF2891478L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-40"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="97" type="Document">
+<result>
+<ISIN value="KRZF30507388"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-3"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="98" type="Document">
+<result>
+<ISIN value="KRZF3045418L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-34"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="99" type="Document">
+<result>
+<ISIN value="KRZF30454E8L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-47"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="100" type="Document">
+<result>
+<ISIN value="KRZF29032Z88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-32"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="101" type="Document">
+<result>
+<ISIN value="KRZF30454E88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-14"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="102" type="Document">
+<result>
+<ISIN value="KRZF30496W88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-29"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="103" type="Document">
+<result>
+<ISIN value="KRZF23821388"/>
+<KOR_SECN_NM value="써니금융제일차 20180801-92-3"/>
+<ISSUCO_CUSTNO value="26977"/>
+<ISSUCO_CUST_NM value="써니금융제일차"/>
+</result>
+</data>
+<data vectorkey="104" type="Document">
+<result>
+<ISIN value="KRZF24224388"/>
+<KOR_SECN_NM value="실버인베스트먼트제이차 20180801-92-3"/>
+<ISSUCO_CUSTNO value="27364"/>
+<ISSUCO_CUST_NM value="실버인베스트먼트제이차"/>
+</result>
+</data>
+<data vectorkey="105" type="Document">
+<result>
+<ISIN value="KRZF29032A8L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-43"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="106" type="Document">
+<result>
+<ISIN value="KRZF29032F88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-15"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="107" type="Document">
+<result>
+<ISIN value="KRZF2903258L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-38"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="108" type="Document">
+<result>
+<ISIN value="KRZF29032V88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-28"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="109" type="Document">
+<result>
+<ISIN value="KRZF24224588"/>
+<KOR_SECN_NM value="실버인베스트먼트제이차 20180801-92-5"/>
+<ISSUCO_CUSTNO value="27364"/>
+<ISSUCO_CUST_NM value="실버인베스트먼트제이차"/>
+</result>
+</data>
+<data vectorkey="110" type="Document">
+<result>
+<ISIN value="KRZF30507X88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-30"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="111" type="Document">
+<result>
+<ISIN value="KRZF30496688"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-6"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="112" type="Document">
+<result>
+<ISIN value="KRZF30501188"/>
+<KOR_SECN_NM value="골든도그제사차 20180801-216-1"/>
+<ISSUCO_CUSTNO value="33618"/>
+<ISSUCO_CUST_NM value="골든도그제사차"/>
+</result>
+</data>
+<data vectorkey="113" type="Document">
+<result>
+<ISIN value="KRZF30496L88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-20"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="114" type="Document">
+<result>
+<ISIN value="KRZF2903208L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-33"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="115" type="Document">
+<result>
+<ISIN value="KRZF30496K88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-19"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="116" type="Document">
+<result>
+<ISIN value="KRZF30496M88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-21"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="117" type="Document">
+<result>
+<ISIN value="KRZF2891458L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-38"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="118" type="Document">
+<result>
+<ISIN value="KRZF30496G88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-16"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="119" type="Document">
+<result>
+<ISIN value="KRZF28914K88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-19"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="120" type="Document">
+<result>
+<ISIN value="KRZF3050788L"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-41"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="121" type="Document">
+<result>
+<ISIN value="KRZF30507N88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-22"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="122" type="Document">
+<result>
+<ISIN value="KRZF30496T88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-27"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="123" type="Document">
+<result>
+<ISIN value="KRZF3050758L"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-38"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="124" type="Document">
+<result>
+<ISIN value="KRZF30507788"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-7"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="125" type="Document">
+<result>
+<ISIN value="KRZF30507888"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-8"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="126" type="Document">
+<result>
+<ISIN value="KRZF30454S88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-26"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="127" type="Document">
+<result>
+<ISIN value="KRZF30454P88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-23"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="128" type="Document">
+<result>
+<ISIN value="KRZF24035288"/>
+<KOR_SECN_NM value="엔젤레스제팔차 20180801-92-2"/>
+<ISSUCO_CUSTNO value="27207"/>
+<ISSUCO_CUST_NM value="엔젤레스제팔차"/>
+</result>
+</data>
+<data vectorkey="129" type="Document">
+<result>
+<ISIN value="KRZF30496H88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-17"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="130" type="Document">
+<result>
+<ISIN value="KRZF30496F8L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-48"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="131" type="Document">
+<result>
+<ISIN value="KRZF29032N88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-22"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="132" type="Document">
+<result>
+<ISIN value="KRZF30507A88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-10"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="133" type="Document">
+<result>
+<ISIN value="KRZF28914488"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-4"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="134" type="Document">
+<result>
+<ISIN value="KRZF30454188"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-1"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="135" type="Document">
+<result>
+<ISIN value="KRZF30454B8L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-44"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="136" type="Document">
+<result>
+<ISIN value="KRZF30454988"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-9"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="137" type="Document">
+<result>
+<ISIN value="KRZF30496988"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-9"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="138" type="Document">
+<result>
+<ISIN value="KRZF28914N88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-22"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="139" type="Document">
+<result>
+<ISIN value="KRZF28914X88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-30"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="140" type="Document">
+<result>
+<ISIN value="KRZF30496588"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-5"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="141" type="Document">
+<result>
+<ISIN value="KRZF3045448L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-37"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="142" type="Document">
+<result>
+<ISIN value="KRZF30496Q88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-24"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="143" type="Document">
+<result>
+<ISIN value="KRZF30507K88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-19"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="144" type="Document">
+<result>
+<ISIN value="KRZF28914B88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-11"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="145" type="Document">
+<result>
+<ISIN value="KRZF2891408L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-33"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="146" type="Document">
+<result>
+<ISIN value="KRZF30496F88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-15"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="147" type="Document">
+<result>
+<ISIN value="KRZF30454888"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-8"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="148" type="Document">
+<result>
+<ISIN value="KRZF30496D88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-13"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="149" type="Document">
+<result>
+<ISIN value="KRZF28914688"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-6"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="150" type="Document">
+<result>
+<ISIN value="KRZF28914E88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-14"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="151" type="Document">
+<result>
+<ISIN value="KRZF28914D8L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-46"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="152" type="Document">
+<result>
+<ISIN value="KRZF24035388"/>
+<KOR_SECN_NM value="엔젤레스제팔차 20180801-92-3"/>
+<ISSUCO_CUSTNO value="27207"/>
+<ISSUCO_CUST_NM value="엔젤레스제팔차"/>
+</result>
+</data>
+<data vectorkey="153" type="Document">
+<result>
+<ISIN value="KRZF28914Y88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-31"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="154" type="Document">
+<result>
+<ISIN value="KRZF28914R88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-25"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="155" type="Document">
+<result>
+<ISIN value="KRZF28914A8L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-43"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="156" type="Document">
+<result>
+<ISIN value="KRZF30507R88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-25"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="157" type="Document">
+<result>
+<ISIN value="KRZF30507E88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-14"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="158" type="Document">
+<result>
+<ISIN value="KRZF3049668L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-39"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="159" type="Document">
+<result>
+<ISIN value="KRZF30507D88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-13"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="160" type="Document">
+<result>
+<ISIN value="KRZF28914F88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-15"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="161" type="Document">
+<result>
+<ISIN value="KRZF3050718L"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-34"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="162" type="Document">
+<result>
+<ISIN value="KRZF3045428L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-35"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="163" type="Document">
+<result>
+<ISIN value="KRZF2903288L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-41"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="164" type="Document">
+<result>
+<ISIN value="KRZF29032Q88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-24"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="165" type="Document">
+<result>
+<ISIN value="KRZF28914C8L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-45"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="166" type="Document">
+<result>
+<ISIN value="KRZF28914388"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-3"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="167" type="Document">
+<result>
+<ISIN value="KRZF29032588"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-5"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="168" type="Document">
+<result>
+<ISIN value="KRZF30454D8L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-46"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="169" type="Document">
+<result>
+<ISIN value="KRZF30454F8L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-48"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="170" type="Document">
+<result>
+<ISIN value="KRZF2891468L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-39"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="171" type="Document">
+<result>
+<ISIN value="KRZF30496Y88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-31"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="172" type="Document">
+<result>
+<ISIN value="KRZF2891428L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-35"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="173" type="Document">
+<result>
+<ISIN value="KRZF30496N88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-22"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="174" type="Document">
+<result>
+<ISIN value="KRZF2891498L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-42"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="175" type="Document">
+<result>
+<ISIN value="KRZF29032488"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-4"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="176" type="Document">
+<result>
+<ISIN value="KRZF30454R88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-25"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="177" type="Document">
+<result>
+<ISIN value="KRZF3045438L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-36"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="178" type="Document">
+<result>
+<ISIN value="KRZF30454C8L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-45"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="179" type="Document">
+<result>
+<ISIN value="KRZF3045498L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-42"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="180" type="Document">
+<result>
+<ISIN value="KRZF30454W88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-29"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="181" type="Document">
+<result>
+<ISIN value="KRZF29032L88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-20"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="182" type="Document">
+<result>
+<ISIN value="KRZF30454L88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-20"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="183" type="Document">
+<result>
+<ISIN value="KRZF30507988"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-9"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="184" type="Document">
+<result>
+<ISIN value="KRZF30496C88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-12"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="185" type="Document">
+<result>
+<ISIN value="KRZF3049658L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-38"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="186" type="Document">
+<result>
+<ISIN value="KRZF30454688"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-6"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="187" type="Document">
+<result>
+<ISIN value="KRZF29032388"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-3"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="188" type="Document">
+<result>
+<ISIN value="KRZF29032188"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-1"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="189" type="Document">
+<result>
+<ISIN value="KRZF29032B88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-11"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="190" type="Document">
+<result>
+<ISIN value="KRZF29032D88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-13"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="191" type="Document">
+<result>
+<ISIN value="KRZF24224788"/>
+<KOR_SECN_NM value="실버인베스트먼트제이차 20180801-92-7"/>
+<ISSUCO_CUSTNO value="27364"/>
+<ISSUCO_CUST_NM value="실버인베스트먼트제이차"/>
+</result>
+</data>
+<data vectorkey="192" type="Document">
+<result>
+<ISIN value="KRZF3050778L"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-40"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="193" type="Document">
+<result>
+<ISIN value="KRZF28914188"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-1"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="194" type="Document">
+<result>
+<ISIN value="KRZF30496388"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-3"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="195" type="Document">
+<result>
+<ISIN value="KRZF30496A8L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-43"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="196" type="Document">
+<result>
+<ISIN value="KRZF28914V88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-28"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="197" type="Document">
+<result>
+<ISIN value="KRZF30507C88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-12"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="198" type="Document">
+<result>
+<ISIN value="KRZF30496888"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-8"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="199" type="Document">
+<result>
+<ISIN value="KRZF30507S88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-26"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="200" type="Document">
+<result>
+<ISIN value="KRZF28914W88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-29"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="201" type="Document">
+<result>
+<ISIN value="KRZF3050748L"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-37"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="202" type="Document">
+<result>
+<ISIN value="KRZF30507J88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-18"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="203" type="Document">
+<result>
+<ISIN value="KRZF3049678L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-40"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="204" type="Document">
+<result>
+<ISIN value="KRZF3049638L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-36"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="205" type="Document">
+<result>
+<ISIN value="KRZF30507P88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-23"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="206" type="Document">
+<result>
+<ISIN value="KRZF30507T88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-27"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="207" type="Document">
+<result>
+<ISIN value="KRZF3045468L"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-39"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="208" type="Document">
+<result>
+<ISIN value="KRZF28914D88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-13"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="209" type="Document">
+<result>
+<ISIN value="KRZF3049608L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-33"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="210" type="Document">
+<result>
+<ISIN value="KRZF30507M88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-21"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="211" type="Document">
+<result>
+<ISIN value="KRZF30507L88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-20"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="212" type="Document">
+<result>
+<ISIN value="KRZF30454H88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-17"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="213" type="Document">
+<result>
+<ISIN value="KRZF30454V88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-28"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="214" type="Document">
+<result>
+<ISIN value="KRZF29032288"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-2"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="215" type="Document">
+<result>
+<ISIN value="KRZF30496C8L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-45"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="216" type="Document">
+<result>
+<ISIN value="KRZF28914H88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-17"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="217" type="Document">
+<result>
+<ISIN value="KRZF30496B8L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-44"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="218" type="Document">
+<result>
+<ISIN value="KRZF28914988"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-9"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="219" type="Document">
+<result>
+<ISIN value="KRZF23821188"/>
+<KOR_SECN_NM value="써니금융제일차 20180801-92-1"/>
+<ISSUCO_CUSTNO value="26977"/>
+<ISSUCO_CUST_NM value="써니금융제일차"/>
+</result>
+</data>
+<data vectorkey="220" type="Document">
+<result>
+<ISIN value="KRZF29032F8L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-48"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="221" type="Document">
+<result>
+<ISIN value="KRZF30454B88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-11"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="222" type="Document">
+<result>
+<ISIN value="KRZF2903248L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-37"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="223" type="Document">
+<result>
+<ISIN value="KRZF29032788"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-7"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="224" type="Document">
+<result>
+<ISIN value="KRZF2903298L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-42"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="225" type="Document">
+<result>
+<ISIN value="KRZF2903268L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-39"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="226" type="Document">
+<result>
+<ISIN value="KRZF29032Y88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-31"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="227" type="Document">
+<result>
+<ISIN value="KRZF29032C88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-12"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="228" type="Document">
+<result>
+<ISIN value="KRZF29032B8L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-44"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="229" type="Document">
+<result>
+<ISIN value="KRZF29032C8L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-45"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="230" type="Document">
+<result>
+<ISIN value="KRZF2891448L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-37"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="231" type="Document">
+<result>
+<ISIN value="KRZF3049698L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-42"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="232" type="Document">
+<result>
+<ISIN value="KRZF30496R88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-25"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="233" type="Document">
+<result>
+<ISIN value="KRZF29032688"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-6"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="234" type="Document">
+<result>
+<ISIN value="KRZF29032X88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-30"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="235" type="Document">
+<result>
+<ISIN value="KRZF29032M88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-21"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="236" type="Document">
+<result>
+<ISIN value="KRZF24224288"/>
+<KOR_SECN_NM value="실버인베스트먼트제이차 20180801-92-2"/>
+<ISSUCO_CUSTNO value="27364"/>
+<ISSUCO_CUST_NM value="실버인베스트먼트제이차"/>
+</result>
+</data>
+<data vectorkey="237" type="Document">
+<result>
+<ISIN value="KRZF30454Q88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-24"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="238" type="Document">
+<result>
+<ISIN value="KRZF29032S88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-26"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="239" type="Document">
+<result>
+<ISIN value="KRZF3049618L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-34"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="240" type="Document">
+<result>
+<ISIN value="KRZF3049628L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-35"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="241" type="Document">
+<result>
+<ISIN value="KRZF30496P88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-23"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="242" type="Document">
+<result>
+<ISIN value="KRZF30496A88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-10"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="243" type="Document">
+<result>
+<ISIN value="KRZF30496J88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-18"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="244" type="Document">
+<result>
+<ISIN value="KRZF30507H88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-17"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="245" type="Document">
+<result>
+<ISIN value="KRZF30507W88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-29"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="246" type="Document">
+<result>
+<ISIN value="KRZF28914Q88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-24"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="247" type="Document">
+<result>
+<ISIN value="KRZF3050708L"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-33"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="248" type="Document">
+<result>
+<ISIN value="KRZF28914Z88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-32"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="249" type="Document">
+<result>
+<ISIN value="KRZF3050768L"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-39"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="250" type="Document">
+<result>
+<ISIN value="KRZF30496Z88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-32"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="251" type="Document">
+<result>
+<ISIN value="KRZF30507G88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-16"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="252" type="Document">
+<result>
+<ISIN value="KRZF28914888"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-8"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="253" type="Document">
+<result>
+<ISIN value="KRZF28914B8L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-44"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="254" type="Document">
+<result>
+<ISIN value="KRZF30507Z88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-32"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="255" type="Document">
+<result>
+<ISIN value="KRZF30496S88"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-26"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="256" type="Document">
+<result>
+<ISIN value="KRZF28914T88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-27"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="257" type="Document">
+<result>
+<ISIN value="KRZF30496H8L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-50"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="258" type="Document">
+<result>
+<ISIN value="KRZF28914F8L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-48"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="259" type="Document">
+<result>
+<ISIN value="KRZF30454Y88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-31"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="260" type="Document">
+<result>
+<ISIN value="KRZF30454X88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-30"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="261" type="Document">
+<result>
+<ISIN value="KRZF30454588"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-5"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="262" type="Document">
+<result>
+<ISIN value="KRZF28914J88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-18"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="263" type="Document">
+<result>
+<ISIN value="KRZF29032D8L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-46"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="264" type="Document">
+<result>
+<ISIN value="KRZF30507Q88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-24"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="265" type="Document">
+<result>
+<ISIN value="KRZF30507V88"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-28"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="266" type="Document">
+<result>
+<ISIN value="KRZF28914L88"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-20"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="267" type="Document">
+<result>
+<ISIN value="KRZF30454488"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-4"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="268" type="Document">
+<result>
+<ISIN value="KRZF29032E8L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-47"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="269" type="Document">
+<result>
+<ISIN value="KRZF3049648L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-37"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="270" type="Document">
+<result>
+<ISIN value="KRZF28914G8L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-359-49"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="271" type="Document">
+<result>
+<ISIN value="KRZF29032W88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-29"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="272" type="Document">
+<result>
+<ISIN value="KRZF29032H88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-17"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="273" type="Document">
+<result>
+<ISIN value="KRZF24035188"/>
+<KOR_SECN_NM value="엔젤레스제팔차 20180801-92-1"/>
+<ISSUCO_CUSTNO value="27207"/>
+<ISSUCO_CUST_NM value="엔젤레스제팔차"/>
+</result>
+</data>
+<data vectorkey="274" type="Document">
+<result>
+<ISIN value="KRZF30507188"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-1"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="275" type="Document">
+<result>
+<ISIN value="KRZF29032888"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-8"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="276" type="Document">
+<result>
+<ISIN value="KRZF3050738L"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-36"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="277" type="Document">
+<result>
+<ISIN value="KRZF28914E8L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-47"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="278" type="Document">
+<result>
+<ISIN value="KRZF30507688"/>
+<KOR_SECN_NM value="래피드시스터제사십오차 20180801-364-6"/>
+<ISSUCO_CUSTNO value="33617"/>
+<ISSUCO_CUST_NM value="래피드시스터제사십오차"/>
+</result>
+</data>
+<data vectorkey="279" type="Document">
+<result>
+<ISIN value="KRZF3049688L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-41"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="280" type="Document">
+<result>
+<ISIN value="KRZF24224688"/>
+<KOR_SECN_NM value="실버인베스트먼트제이차 20180801-92-6"/>
+<ISSUCO_CUSTNO value="27364"/>
+<ISSUCO_CUST_NM value="실버인베스트먼트제이차"/>
+</result>
+</data>
+<data vectorkey="281" type="Document">
+<result>
+<ISIN value="KRZF29032G88"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-16"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="282" type="Document">
+<result>
+<ISIN value="KRZF30454A88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-10"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="283" type="Document">
+<result>
+<ISIN value="KRZF30454J88"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-18"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="284" type="Document">
+<result>
+<ISIN value="KRZF30454388"/>
+<KOR_SECN_NM value="에이원디에이치 20180801-364-3"/>
+<ISSUCO_CUSTNO value="33614"/>
+<ISSUCO_CUST_NM value="에이원디에이치"/>
+</result>
+</data>
+<data vectorkey="285" type="Document">
+<result>
+<ISIN value="KRZF2903278L"/>
+<KOR_SECN_NM value="도원제십이차 20180801-364-40"/>
+<ISSUCO_CUSTNO value="33615"/>
+<ISSUCO_CUST_NM value="도원제십이차"/>
+</result>
+</data>
+<data vectorkey="286" type="Document">
+<result>
+<ISIN value="KRZF2891418L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-34"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+<data vectorkey="287" type="Document">
+<result>
+<ISIN value="KRZF30496188"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-1"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="288" type="Document">
+<result>
+<ISIN value="KRZF30496G8L"/>
+<KOR_SECN_NM value="코너스톤제구차 20180801-275-49"/>
+<ISSUCO_CUSTNO value="33611"/>
+<ISSUCO_CUST_NM value="코너스톤제구차"/>
+</result>
+</data>
+<data vectorkey="289" type="Document">
+<result>
+<ISIN value="KRZF2891488L"/>
+<KOR_SECN_NM value="제이드림제4차 20180801-155-41"/>
+<ISSUCO_CUSTNO value="32088"/>
+<ISSUCO_CUST_NM value="제이드림제4차"/>
+</result>
+</data>
+</vector>

+ 62 - 0
Tests/Application.Tests/Fixtures/Seibro/파생 결합 증권/getAssetInfo.xml

@@ -0,0 +1,62 @@
+<vector beforeServletCall="1783405417543" beforeEJBCall="1783405417547" afterServletCall="1783405417554" afterEJBCall="1783405417553" result="3">
+<data vectorkey="0" type="Document">
+<RESULT>
+<ISIN value="KR6539335879"/>
+<ASSET_SEQ value="1"/>
+<STND_BASSET_CD value="KSD310000306"/>
+<STND_BASSET_NM value="Hang Seng China Enterprises Index"/>
+<XRC_STDPRC value="11073"/>
+<XRC_STOP_LOLMT_RATIO value="55"/>
+<XRC_STOP_LOLMT_PRICE value="6090.15"/>
+<XRC_STOP_UPLMT_RATIO value="0"/>
+<XRC_STOP_UPLMT_PRICE value="0"/>
+<BASSET_FIRST_VALAT_TPCD value="1"/>
+<BASSET_LAST_VALAT_TPCD value="1"/>
+<FIRST_STDPRC_DECSN_BEGIN_DT value="20180629"/>
+<FIRST_STDPRC_DECSN_EXPRY_DT value="20180629"/>
+<LAST_STDPRC_DECSN_BEGIN_DT value="20210629"/>
+<LAST_STDPRC_DECSN_EXPRY_DT value="20210629"/>
+<RVLT_SEVER_TPCD value="2"/>
+</RESULT>
+</data>
+<data vectorkey="1" type="Document">
+<RESULT>
+<ISIN value="KR6539335879"/>
+<ASSET_SEQ value="2"/>
+<STND_BASSET_CD value="KSD310000568"/>
+<STND_BASSET_NM value="S&amp;P 500 Index"/>
+<XRC_STDPRC value="2718.37"/>
+<XRC_STOP_LOLMT_RATIO value="55"/>
+<XRC_STOP_LOLMT_PRICE value="1495.1035"/>
+<XRC_STOP_UPLMT_RATIO value="0"/>
+<XRC_STOP_UPLMT_PRICE value="0"/>
+<BASSET_FIRST_VALAT_TPCD value="1"/>
+<BASSET_LAST_VALAT_TPCD value="1"/>
+<FIRST_STDPRC_DECSN_BEGIN_DT value="20180629"/>
+<FIRST_STDPRC_DECSN_EXPRY_DT value="20180629"/>
+<LAST_STDPRC_DECSN_BEGIN_DT value="20210629"/>
+<LAST_STDPRC_DECSN_EXPRY_DT value="20210629"/>
+<RVLT_SEVER_TPCD value="2"/>
+</RESULT>
+</data>
+<data vectorkey="2" type="Document">
+<RESULT>
+<ISIN value="KR6539335879"/>
+<ASSET_SEQ value="3"/>
+<STND_BASSET_CD value="KR7005930003"/>
+<STND_BASSET_NM value="삼성전자"/>
+<XRC_STDPRC value="46650"/>
+<XRC_STOP_LOLMT_RATIO value="55"/>
+<XRC_STOP_LOLMT_PRICE value="25657.5"/>
+<XRC_STOP_UPLMT_RATIO value="0"/>
+<XRC_STOP_UPLMT_PRICE value="0"/>
+<BASSET_FIRST_VALAT_TPCD value="1"/>
+<BASSET_LAST_VALAT_TPCD value="1"/>
+<FIRST_STDPRC_DECSN_BEGIN_DT value="20180629"/>
+<FIRST_STDPRC_DECSN_EXPRY_DT value="20180629"/>
+<LAST_STDPRC_DECSN_BEGIN_DT value="20210629"/>
+<LAST_STDPRC_DECSN_EXPRY_DT value="20210629"/>
+<RVLT_SEVER_TPCD value="2"/>
+</RESULT>
+</data>
+</vector>

+ 66 - 0
Tests/Application.Tests/Fixtures/Seibro/파생 결합 증권/getAssetXrcInfo.xml

@@ -0,0 +1,66 @@
+<vector beforeServletCall="1783405427389" beforeEJBCall="1783405427394" afterServletCall="1783405427401" afterEJBCall="1783405427400" result="8">
+<data vectorkey="0" type="Document">
+<RESULT>
+<ASSET_SEQ value="1"/>
+<XRC_STD_SEQ value="1"/>
+<XRC_STD_RATIO value="100"/>
+<XRC_PRICE value="278.83"/>
+</RESULT>
+</data>
+<data vectorkey="1" type="Document">
+<RESULT>
+<ASSET_SEQ value="1"/>
+<XRC_STD_SEQ value="2"/>
+<XRC_STD_RATIO value="95"/>
+<XRC_PRICE value="264.8885"/>
+</RESULT>
+</data>
+<data vectorkey="2" type="Document">
+<RESULT>
+<ASSET_SEQ value="1"/>
+<XRC_STD_SEQ value="3"/>
+<XRC_STD_RATIO value="90"/>
+<XRC_PRICE value="250.947"/>
+</RESULT>
+</data>
+<data vectorkey="3" type="Document">
+<RESULT>
+<ASSET_SEQ value="1"/>
+<XRC_STD_SEQ value="4"/>
+<XRC_STD_RATIO value="88"/>
+<XRC_PRICE value="245.3704"/>
+</RESULT>
+</data>
+<data vectorkey="4" type="Document">
+<RESULT>
+<ASSET_SEQ value="1"/>
+<XRC_STD_SEQ value="5"/>
+<XRC_STD_RATIO value="85"/>
+<XRC_PRICE value="237.0055"/>
+</RESULT>
+</data>
+<data vectorkey="5" type="Document">
+<RESULT>
+<ASSET_SEQ value="1"/>
+<XRC_STD_SEQ value="6"/>
+<XRC_STD_RATIO value="80"/>
+<XRC_PRICE value="223.064"/>
+</RESULT>
+</data>
+<data vectorkey="6" type="Document">
+<RESULT>
+<ASSET_SEQ value="1"/>
+<XRC_STD_SEQ value="7"/>
+<XRC_STD_RATIO value="75"/>
+<XRC_PRICE value="209.1225"/>
+</RESULT>
+</data>
+<data vectorkey="7" type="Document">
+<RESULT>
+<ASSET_SEQ value="1"/>
+<XRC_STD_SEQ value="8"/>
+<XRC_STD_RATIO value="65"/>
+<XRC_PRICE value="181.2395"/>
+</RESULT>
+</data>
+</vector>

+ 9 - 0
Tests/Application.Tests/Fixtures/Seibro/파생 결합 증권/getBassetUnredScale.xml

@@ -0,0 +1,9 @@
+<vector beforeServletCall="1783405401993" beforeEJBCall="1783405401997" afterServletCall="1783405403772" afterEJBCall="1783405403771" result="1">
+<data vectorkey="0" type="Document">
+<result>
+<BASSET_CONTENT value="EURO STOXX 50"/>
+<UNRED_SECNCNT value="2"/>
+<UNRED_REMA value=""/>
+</result>
+</data>
+</vector>

+ 26 - 0
Tests/Application.Tests/Fixtures/Seibro/파생 결합 증권/getDerivCombiIsinInfo.xml

@@ -0,0 +1,26 @@
+<vector beforeServletCall="1783405412478" beforeEJBCall="1783405412482" afterServletCall="1783405412489" afterEJBCall="1783405412488" result="1">
+<data vectorkey="0" type="Document">
+<RESULT>
+<KOR_SECN_NM value="삼성증권19449(사모/ELS)"/>
+<ISSUCO_CUSTNO value="1636"/>
+<SECN_KANM value="ELS"/>
+<ISSU_CUR_CD value="KRW"/>
+<RECU_WHCD value="21"/>
+<FIRST_ISSU_QTY value="132000000"/>
+<ISSU_REMQ value="0"/>
+<PAYIN_AMT_RATIO value="98.5"/>
+<PAYIN_AMT value="130020000"/>
+<ISSU_DT value="20180702"/>
+<CONT_DT value="20180629"/>
+<XPIR_DT value="20210702"/>
+<MIDRED_POSS_YN value="Y"/>
+<RED_DT value="20190703"/>
+<DERISEC_EXER_TPCD value="3"/>
+<PRCP_PRSV_TPCD value="3"/>
+<PRCP_PRSV_RATE value="0"/>
+<COLAT_SETUP_TPCD value="2"/>
+<BASSET_CNT value="3"/>
+<MM_PAY_YN value="N"/>
+</RESULT>
+</data>
+</vector>

+ 380 - 0
Tests/Application.Tests/Fixtures/Seibro/파생 결합 증권/getDerivCombiIssuInfo.xml

@@ -0,0 +1,380 @@
+<vector beforeServletCall="1783405395103" beforeEJBCall="1783405395109" afterServletCall="1783405395140" afterEJBCall="1783405395139" result="54">
+<data vectorkey="0" type="Document">
+<result>
+<ISIN value="KR6533308872"/>
+<KOR_SECN_NM value="삼성증권19370(ELS)"/>
+<ISSUCO_CUSTNO value="1636"/>
+</result>
+</data>
+<data vectorkey="1" type="Document">
+<result>
+<ISIN value="KR6703318875"/>
+<KOR_SECN_NM value="하나금융투자8627(ELS)"/>
+<ISSUCO_CUSTNO value="3075"/>
+</result>
+</data>
+<data vectorkey="2" type="Document">
+<result>
+<ISIN value="KR6573314871"/>
+<KOR_SECN_NM value="한국투자증권7133(사모/ELS)"/>
+<ISSUCO_CUSTNO value="3049"/>
+</result>
+</data>
+<data vectorkey="3" type="Document">
+<result>
+<ISIN value="KR6533307874"/>
+<KOR_SECN_NM value="삼성증권19369(ELS)"/>
+<ISSUCO_CUSTNO value="1636"/>
+</result>
+</data>
+<data vectorkey="4" type="Document">
+<result>
+<ISIN value="KR6573313873"/>
+<KOR_SECN_NM value="한국투자증권7114(사모/ELS)"/>
+<ISSUCO_CUSTNO value="3049"/>
+</result>
+</data>
+<data vectorkey="5" type="Document">
+<result>
+<ISIN value="KR6503326870"/>
+<KOR_SECN_NM value="신한금융투자16026(ELS)"/>
+<ISSUCO_CUSTNO value="867"/>
+</result>
+</data>
+<data vectorkey="6" type="Document">
+<result>
+<ISIN value="KR6533305878"/>
+<KOR_SECN_NM value="삼성증권19367(ELS)"/>
+<ISSUCO_CUSTNO value="1636"/>
+</result>
+</data>
+<data vectorkey="7" type="Document">
+<result>
+<ISIN value="KR6573301878"/>
+<KOR_SECN_NM value="한국투자증권트루10511(ELS)"/>
+<ISSUCO_CUSTNO value="3049"/>
+</result>
+</data>
+<data vectorkey="8" type="Document">
+<result>
+<ISIN value="KR6533333870"/>
+<KOR_SECN_NM value="삼성증권19356(ELS)"/>
+<ISSUCO_CUSTNO value="1636"/>
+</result>
+</data>
+<data vectorkey="9" type="Document">
+<result>
+<ISIN value="KR6533332872"/>
+<KOR_SECN_NM value="삼성증권19355(ELS)"/>
+<ISSUCO_CUSTNO value="1636"/>
+</result>
+</data>
+<data vectorkey="10" type="Document">
+<result>
+<ISIN value="KR6533313872"/>
+<KOR_SECN_NM value="삼성증권19375(ELS)"/>
+<ISSUCO_CUSTNO value="1636"/>
+</result>
+</data>
+<data vectorkey="11" type="Document">
+<result>
+<ISIN value="KR6533315877"/>
+<KOR_SECN_NM value="삼성증권19377(ELS)"/>
+<ISSUCO_CUSTNO value="1636"/>
+</result>
+</data>
+<data vectorkey="12" type="Document">
+<result>
+<ISIN value="KR6533314870"/>
+<KOR_SECN_NM value="삼성증권19376(ELS)"/>
+<ISSUCO_CUSTNO value="1636"/>
+</result>
+</data>
+<data vectorkey="13" type="Document">
+<result>
+<ISIN value="KR6703353872"/>
+<KOR_SECN_NM value="하나금융투자8598(사모/ELS)"/>
+<ISSUCO_CUSTNO value="3075"/>
+</result>
+</data>
+<data vectorkey="14" type="Document">
+<result>
+<ISIN value="KR6703354870"/>
+<KOR_SECN_NM value="하나금융투자8600(사모/ELS)"/>
+<ISSUCO_CUSTNO value="3075"/>
+</result>
+</data>
+<data vectorkey="15" type="Document">
+<result>
+<ISIN value="KR6703352874"/>
+<KOR_SECN_NM value="하나금융투자8585(사모/ELS)"/>
+<ISSUCO_CUSTNO value="3075"/>
+</result>
+</data>
+<data vectorkey="16" type="Document">
+<result>
+<ISIN value="KR6703312878"/>
+<KOR_SECN_NM value="하나금융투자8624(ELS)"/>
+<ISSUCO_CUSTNO value="3075"/>
+</result>
+</data>
+<data vectorkey="17" type="Document">
+<result>
+<ISIN value="KR6763301878"/>
+<KOR_SECN_NM value="키움증권HERO8(사모/ELS)"/>
+<ISSUCO_CUSTNO value="3949"/>
+</result>
+</data>
+<data vectorkey="18" type="Document">
+<result>
+<ISIN value="KR6763302876"/>
+<KOR_SECN_NM value="키움증권HERO11(ELS)"/>
+<ISSUCO_CUSTNO value="3949"/>
+</result>
+</data>
+<data vectorkey="19" type="Document">
+<result>
+<ISIN value="KR6763303874"/>
+<KOR_SECN_NM value="키움증권HERO10(ELS)"/>
+<ISSUCO_CUSTNO value="3949"/>
+</result>
+</data>
+<data vectorkey="20" type="Document">
+<result>
+<ISIN value="KR6703340879"/>
+<KOR_SECN_NM value="하나금융투자8595(사모/ELS)"/>
+<ISSUCO_CUSTNO value="3075"/>
+</result>
+</data>
+<data vectorkey="21" type="Document">
+<result>
+<ISIN value="KR6653313876"/>
+<KOR_SECN_NM value="한화스마트4883(사모/ELS)"/>
+<ISSUCO_CUSTNO value="353"/>
+</result>
+</data>
+<data vectorkey="22" type="Document">
+<result>
+<ISIN value="KR6653312878"/>
+<KOR_SECN_NM value="한화스마트4880(사모/ELS)"/>
+<ISSUCO_CUSTNO value="353"/>
+</result>
+</data>
+<data vectorkey="23" type="Document">
+<result>
+<ISIN value="KR6653314874"/>
+<KOR_SECN_NM value="한화스마트4888(사모/ELS)"/>
+<ISSUCO_CUSTNO value="353"/>
+</result>
+</data>
+<data vectorkey="24" type="Document">
+<result>
+<ISIN value="KR6703311870"/>
+<KOR_SECN_NM value="하나금융투자8623(ELS)"/>
+<ISSUCO_CUSTNO value="3075"/>
+</result>
+</data>
+<data vectorkey="25" type="Document">
+<result>
+<ISIN value="KR6523343871"/>
+<KOR_SECN_NM value="미래에셋대우25161(사모/ELS)"/>
+<ISSUCO_CUSTNO value="680"/>
+</result>
+</data>
+<data vectorkey="26" type="Document">
+<result>
+<ISIN value="KR6523342873"/>
+<KOR_SECN_NM value="미래에셋대우25113(사모/ELS)"/>
+<ISSUCO_CUSTNO value="680"/>
+</result>
+</data>
+<data vectorkey="27" type="Document">
+<result>
+<ISIN value="KR6663305870"/>
+<KOR_SECN_NM value="유안타증권W1471(사모/ELS)"/>
+<ISSUCO_CUSTNO value="347"/>
+</result>
+</data>
+<data vectorkey="28" type="Document">
+<result>
+<ISIN value="KR6663304873"/>
+<KOR_SECN_NM value="유안타증권W1475(사모/ELS)"/>
+<ISSUCO_CUSTNO value="347"/>
+</result>
+</data>
+<data vectorkey="29" type="Document">
+<result>
+<ISIN value="KR6663306878"/>
+<KOR_SECN_NM value="유안타증권W1472(사모/ELS)"/>
+<ISSUCO_CUSTNO value="347"/>
+</result>
+</data>
+<data vectorkey="30" type="Document">
+<result>
+<ISIN value="KR6573306877"/>
+<KOR_SECN_NM value="한국투자증권트루10516(ELS)"/>
+<ISSUCO_CUSTNO value="3049"/>
+</result>
+</data>
+<data vectorkey="31" type="Document">
+<result>
+<ISIN value="KR6513302879"/>
+<KOR_SECN_NM value="대신증권BALANCE1676(ELS)"/>
+<ISSUCO_CUSTNO value="354"/>
+</result>
+</data>
+<data vectorkey="32" type="Document">
+<result>
+<ISIN value="KR6523314872"/>
+<KOR_SECN_NM value="미래에셋대우25132(ELS)"/>
+<ISSUCO_CUSTNO value="680"/>
+</result>
+</data>
+<data vectorkey="33" type="Document">
+<result>
+<ISIN value="KR6533312874"/>
+<KOR_SECN_NM value="삼성증권19374(ELS)"/>
+<ISSUCO_CUSTNO value="1636"/>
+</result>
+</data>
+<data vectorkey="34" type="Document">
+<result>
+<ISIN value="KR6533309870"/>
+<KOR_SECN_NM value="삼성증권19371(ELS)"/>
+<ISSUCO_CUSTNO value="1636"/>
+</result>
+</data>
+<data vectorkey="35" type="Document">
+<result>
+<ISIN value="KR6533310878"/>
+<KOR_SECN_NM value="삼성증권19372(ELS)"/>
+<ISSUCO_CUSTNO value="1636"/>
+</result>
+</data>
+<data vectorkey="36" type="Document">
+<result>
+<ISIN value="KR6533311876"/>
+<KOR_SECN_NM value="삼성증권19373(ELS)"/>
+<ISSUCO_CUSTNO value="1636"/>
+</result>
+</data>
+<data vectorkey="37" type="Document">
+<result>
+<ISIN value="KR6703301871"/>
+<KOR_SECN_NM value="하나금융투자8599(ELS)"/>
+<ISSUCO_CUSTNO value="3075"/>
+</result>
+</data>
+<data vectorkey="38" type="Document">
+<result>
+<ISIN value="KR6703356875"/>
+<KOR_SECN_NM value="하나금융투자8622(사모/ELS)"/>
+<ISSUCO_CUSTNO value="3075"/>
+</result>
+</data>
+<data vectorkey="39" type="Document">
+<result>
+<ISIN value="KR6553332877"/>
+<KOR_SECN_NM value="NH투자증권16688(사모/ELS)"/>
+<ISSUCO_CUSTNO value="594"/>
+</result>
+</data>
+<data vectorkey="40" type="Document">
+<result>
+<ISIN value="KR6793302870"/>
+<KOR_SECN_NM value="하이투자증권1527(사모/ELS)"/>
+<ISSUCO_CUSTNO value="3001"/>
+</result>
+</data>
+<data vectorkey="41" type="Document">
+<result>
+<ISIN value="KR6793303878"/>
+<KOR_SECN_NM value="하이투자증권1530(사모/ELS)"/>
+<ISSUCO_CUSTNO value="3001"/>
+</result>
+</data>
+<data vectorkey="42" type="Document">
+<result>
+<ISIN value="KR6543301875"/>
+<KOR_SECN_NM value="신영증권플랜업7347(사모/ELS)"/>
+<ISSUCO_CUSTNO value="172"/>
+</result>
+</data>
+<data vectorkey="43" type="Document">
+<result>
+<ISIN value="KR6543302873"/>
+<KOR_SECN_NM value="신영증권플랜업7348(사모/ELS)"/>
+<ISSUCO_CUSTNO value="172"/>
+</result>
+</data>
+<data vectorkey="44" type="Document">
+<result>
+<ISIN value="KR6703342875"/>
+<KOR_SECN_NM value="하나금융투자8597(사모/ELS)"/>
+<ISSUCO_CUSTNO value="3075"/>
+</result>
+</data>
+<data vectorkey="45" type="Document">
+<result>
+<ISIN value="KR6703341877"/>
+<KOR_SECN_NM value="하나금융투자8596(사모/ELS)"/>
+<ISSUCO_CUSTNO value="3075"/>
+</result>
+</data>
+<data vectorkey="46" type="Document">
+<result>
+<ISIN value="KR6613301870"/>
+<KOR_SECN_NM value="메리츠종합금융증권575(ELS)"/>
+<ISSUCO_CUSTNO value="856"/>
+</result>
+</data>
+<data vectorkey="47" type="Document">
+<result>
+<ISIN value="KR6553324874"/>
+<KOR_SECN_NM value="NH투자증권16668(사모/ELS)"/>
+<ISSUCO_CUSTNO value="594"/>
+</result>
+</data>
+<data vectorkey="48" type="Document">
+<result>
+<ISIN value="KR6539335879"/>
+<KOR_SECN_NM value="삼성증권19449(사모/ELS)"/>
+<ISSUCO_CUSTNO value="1636"/>
+</result>
+</data>
+<data vectorkey="49" type="Document">
+<result>
+<ISIN value="KR6532316876"/>
+<KOR_SECN_NM value="삼성증권19378(ELS)"/>
+<ISSUCO_CUSTNO value="1636"/>
+</result>
+</data>
+<data vectorkey="50" type="Document">
+<result>
+<ISIN value="KR6553331879"/>
+<KOR_SECN_NM value="NH투자증권16658(사모/ELS)"/>
+<ISSUCO_CUSTNO value="594"/>
+</result>
+</data>
+<data vectorkey="51" type="Document">
+<result>
+<ISIN value="KR6723301877"/>
+<KOR_SECN_NM value="IBK투자증권2167(사모/ELS)"/>
+<ISSUCO_CUSTNO value="14138"/>
+</result>
+</data>
+<data vectorkey="52" type="Document">
+<result>
+<ISIN value="KR6583331873"/>
+<KOR_SECN_NM value="KB증권2018-6630(사모/ELS)"/>
+<ISSUCO_CUSTNO value="345"/>
+</result>
+</data>
+<data vectorkey="53" type="Document">
+<result>
+<ISIN value="KR6583330875"/>
+<KOR_SECN_NM value="KB증권2018-6594(사모/ELS)"/>
+<ISSUCO_CUSTNO value="345"/>
+</result>
+</data>
+</vector>

+ 112 - 0
Tests/Application.Tests/Fixtures/Seibro/파생 결합 증권/getRedCondiInfo.xml

@@ -0,0 +1,112 @@
+<vector beforeServletCall="1783405433807" beforeEJBCall="1783405433812" afterServletCall="1783405433820" afterEJBCall="1783405433820" result="10">
+<data vectorkey="0" type="Document">
+<RESULT>
+<RED_CONDI_TPCD value="1"/>
+<VALAT_NTIMES_SEQ value="1"/>
+<MID_VALAT_PAY_DT value="20181206"/>
+<MID_VALAT_BEGIN_DT value="20181203"/>
+<MID_VALAT_EXPRY_DT value="20181203"/>
+<RED_CONDI_CONTENT value="① 첫번째 자동조기상환평가일(4개월 후)에 기초자산의 자동조기상환평가가격이 최초기준가격의 [95%이상]인 경우"/>
+<RED_FORMULA_CONTENT value="액면금액의 101.7900%"/>
+</RESULT>
+</data>
+<data vectorkey="1" type="Document">
+<RESULT>
+<RED_CONDI_TPCD value="1"/>
+<VALAT_NTIMES_SEQ value="2"/>
+<MID_VALAT_PAY_DT value="20190405"/>
+<MID_VALAT_BEGIN_DT value="20190402"/>
+<MID_VALAT_EXPRY_DT value="20190402"/>
+<RED_CONDI_CONTENT value="② 두번째 자동조기상환평가일(8개월 후)에 기초자산의 자동조기상환평가가격이 최초기준가격의 [90%이상]인 경우"/>
+<RED_FORMULA_CONTENT value="액면금액의 103.5800%"/>
+</RESULT>
+</data>
+<data vectorkey="2" type="Document">
+<RESULT>
+<RED_CONDI_TPCD value="1"/>
+<VALAT_NTIMES_SEQ value="3"/>
+<MID_VALAT_PAY_DT value="20190806"/>
+<MID_VALAT_BEGIN_DT value="20190801"/>
+<MID_VALAT_EXPRY_DT value="20190801"/>
+<RED_CONDI_CONTENT value="③ 세번째 자동조기상환평가일(12개월 후)에 기초자산의 자동조기상환평가가격이 최초기준가격의 [90%이상]인 경우"/>
+<RED_FORMULA_CONTENT value="액면금액의 105.3700%"/>
+</RESULT>
+</data>
+<data vectorkey="3" type="Document">
+<RESULT>
+<RED_CONDI_TPCD value="1"/>
+<VALAT_NTIMES_SEQ value="4"/>
+<MID_VALAT_PAY_DT value="20191206"/>
+<MID_VALAT_BEGIN_DT value="20191203"/>
+<MID_VALAT_EXPRY_DT value="20191203"/>
+<RED_CONDI_CONTENT value="④ 네번째 자동조기상환평가일(16개월 후)에 기초자산의 자동조기상환평가가격이 최초기준가격의 [88%이상]인 경우"/>
+<RED_FORMULA_CONTENT value="액면금액의 107.1600%"/>
+</RESULT>
+</data>
+<data vectorkey="4" type="Document">
+<RESULT>
+<RED_CONDI_TPCD value="1"/>
+<VALAT_NTIMES_SEQ value="5"/>
+<MID_VALAT_PAY_DT value="20200406"/>
+<MID_VALAT_BEGIN_DT value="20200401"/>
+<MID_VALAT_EXPRY_DT value="20200401"/>
+<RED_CONDI_CONTENT value="⑤ 다섯번째 자동조기상환평가일(20개월 후)에 기초자산의 자동조기상환평가가격이 최초기준가격의 [85%이상]인 경우"/>
+<RED_FORMULA_CONTENT value="액면금액의 108.9500%"/>
+</RESULT>
+</data>
+<data vectorkey="5" type="Document">
+<RESULT>
+<RED_CONDI_TPCD value="1"/>
+<VALAT_NTIMES_SEQ value="6"/>
+<MID_VALAT_PAY_DT value="20200806"/>
+<MID_VALAT_BEGIN_DT value="20200803"/>
+<MID_VALAT_EXPRY_DT value="20200803"/>
+<RED_CONDI_CONTENT value="⑥ 여섯번째 자동조기상환평가일(24개월 후)에 기초자산의 자동조기상환평가가격이 최초기준가격의 [85%이상]인 경우"/>
+<RED_FORMULA_CONTENT value="액면금액의 110.7400%"/>
+</RESULT>
+</data>
+<data vectorkey="6" type="Document">
+<RESULT>
+<RED_CONDI_TPCD value="1"/>
+<VALAT_NTIMES_SEQ value="7"/>
+<MID_VALAT_PAY_DT value="20201204"/>
+<MID_VALAT_BEGIN_DT value="20201201"/>
+<MID_VALAT_EXPRY_DT value="20201201"/>
+<RED_CONDI_CONTENT value="⑦ 일곱번째 자동조기상환평가일(28개월 후)에 기초자산의 자동조기상환평가가격이 최초기준가격의 [80%이상]인 경우"/>
+<RED_FORMULA_CONTENT value="액면금액의 112.5300%"/>
+</RESULT>
+</data>
+<data vectorkey="7" type="Document">
+<RESULT>
+<RED_CONDI_TPCD value="1"/>
+<VALAT_NTIMES_SEQ value="8"/>
+<MID_VALAT_PAY_DT value="20210406"/>
+<MID_VALAT_BEGIN_DT value="20210401"/>
+<MID_VALAT_EXPRY_DT value="20210401"/>
+<RED_CONDI_CONTENT value="⑧ 여덟번째 자동조기상환평가일(32개월 후)에 기초자산의 자동조기상환평가가격이 최초기준가격의 [75%이상]인 경우"/>
+<RED_FORMULA_CONTENT value="액면금액의 114.3200%"/>
+</RESULT>
+</data>
+<data vectorkey="8" type="Document">
+<RESULT>
+<RED_CONDI_TPCD value="2"/>
+<VALAT_NTIMES_SEQ value="1"/>
+<MID_VALAT_PAY_DT value="20210806"/>
+<MID_VALAT_BEGIN_DT value="20210803"/>
+<MID_VALAT_EXPRY_DT value="20210803"/>
+<RED_CONDI_CONTENT value="⑨ 만기평가일에 기초자산의 만기평가가격이 최초기준가격의 [65% 이상]인 경우"/>
+<RED_FORMULA_CONTENT value="액면금액의 116.1100%"/>
+</RESULT>
+</data>
+<data vectorkey="9" type="Document">
+<RESULT>
+<RED_CONDI_TPCD value="2"/>
+<VALAT_NTIMES_SEQ value="2"/>
+<MID_VALAT_PAY_DT value="20210806"/>
+<MID_VALAT_BEGIN_DT value="20210803"/>
+<MID_VALAT_EXPRY_DT value="20210803"/>
+<RED_CONDI_CONTENT value="⑩ 만기평가일에 기초자산의 만기평가가격이 최초기준가격의 [65% 미만]인 경우"/>
+<RED_FORMULA_CONTENT value="액면금액 * (만기평가가격/최초기준가격)"/>
+</RESULT>
+</data>
+</vector>

+ 86 - 0
Tests/Application.Tests/Fixtures/Seibro/파생 결합 증권/getRedIsinInfo.xml

@@ -0,0 +1,86 @@
+<vector beforeServletCall="1783405443462" beforeEJBCall="1783405443468" afterServletCall="1783405443478" afterEJBCall="1783405443478" result="12">
+<data vectorkey="0" type="Document">
+<RESULT>
+<ISIN value="KR6552327845"/>
+<DERISEC_EXER_TPCD value="3"/>
+<RED_QTY value="132000000"/>
+</RESULT>
+</data>
+<data vectorkey="1" type="Document">
+<RESULT>
+<ISIN value="KR6553324825"/>
+<DERISEC_EXER_TPCD value="3"/>
+<RED_QTY value="9810870000"/>
+</RESULT>
+</data>
+<data vectorkey="2" type="Document">
+<RESULT>
+<ISIN value="KR6553361843"/>
+<DERISEC_EXER_TPCD value="3"/>
+<RED_QTY value="610000000"/>
+</RESULT>
+</data>
+<data vectorkey="3" type="Document">
+<RESULT>
+<ISIN value="KR6573342823"/>
+<DERISEC_EXER_TPCD value="3"/>
+<RED_QTY value="215000000"/>
+</RESULT>
+</data>
+<data vectorkey="4" type="Document">
+<RESULT>
+<ISIN value="KR6573344845"/>
+<DERISEC_EXER_TPCD value="3"/>
+<RED_QTY value="884000000"/>
+</RESULT>
+</data>
+<data vectorkey="5" type="Document">
+<RESULT>
+<ISIN value="KR6573395847"/>
+<DERISEC_EXER_TPCD value="3"/>
+<RED_QTY value="1000000000"/>
+</RESULT>
+</data>
+<data vectorkey="6" type="Document">
+<RESULT>
+<ISIN value="KR6652321821"/>
+<DERISEC_EXER_TPCD value="3"/>
+<RED_QTY value="200000000"/>
+</RESULT>
+</data>
+<data vectorkey="7" type="Document">
+<RESULT>
+<ISIN value="KR6652323827"/>
+<DERISEC_EXER_TPCD value="3"/>
+<RED_QTY value="250000000"/>
+</RESULT>
+</data>
+<data vectorkey="8" type="Document">
+<RESULT>
+<ISIN value="KR6703309858"/>
+<DERISEC_EXER_TPCD value="3"/>
+<RED_QTY value="9399329200"/>
+</RESULT>
+</data>
+<data vectorkey="9" type="Document">
+<RESULT>
+<ISIN value="KR6732309820"/>
+<DERISEC_EXER_TPCD value="3"/>
+<RED_QTY value="676500000"/>
+</RESULT>
+</data>
+<data vectorkey="10" type="Document">
+<RESULT>
+<ISIN value="KR6733301859"/>
+<DERISEC_EXER_TPCD value="3"/>
+<RED_QTY value="14999400000"/>
+</RESULT>
+</data>
+<data vectorkey="11" type="Document">
+<RESULT>
+<ISIN value="KR6733302857"/>
+<DERISEC_EXER_TPCD value="3"/>
+<RED_QTY value="19850000000"/>
+</RESULT>
+</data>
+</vector>

+ 64 - 0
Tests/Application.Tests/SeibroDivInfoParserTests.cs

@@ -0,0 +1,64 @@
+using Infrastructure.StockData;
+
+namespace Application.Tests;
+
+[TestClass]
+public sealed class SeibroDivInfoParserTests
+{
+    [TestMethod]
+    public void Parse_FromSampleXml_MapsFields_AndNoIssucoCustno()
+    {
+        // SEIBro getDivInfo 실응답 fixture (삼성전자/삼성전자1우) — 18행. ISSUCO_CUSTNO 는 응답에 없어 Isin 으로만 조인.
+        var rows = SeibroDivInfoParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getDivInfo.xml")));
+
+        Assert.AreEqual(18, rows.Count);
+
+        var first = rows.Single(c => c.Isin == "KR7005930003" && c.RgtStdDt == new DateOnly(2016, 12, 31));
+        Assert.AreEqual("삼성전자", first.KorSecnNm);
+        Assert.AreEqual("보통주", first.SecnKacdNm);
+        Assert.AreEqual(100m, first.Pval, "액면가 PVAL");
+        Assert.AreEqual(0m, first.StkAllocRatio, "주식배정비율 0 (현금배당)");
+        Assert.AreEqual(550m, first.CashAllocRatio);
+        Assert.AreEqual(27500m, first.CashAllocAmt, "1주당 현금배당금");
+        Assert.AreEqual(1.53m, first.MartpDivRate, "시가배당율");
+        Assert.AreEqual(new DateOnly(2017, 4, 24), first.Th1PayTermBeginDt, "배당지급일 — 스펙·샘플 모두 존재");
+        Assert.IsNull(first.DeliDt, "DELI_DT value=\"\" → null");
+        Assert.IsFalse(first.MajshrEtcDiffAllocYn!.Value, "MAJSHR_ETC_DIFF_ALOC_YN=N");
+        Assert.IsTrue(first.TstkNoagnYn!.Value, "TSTK_NOAGN_YN=Y");
+    }
+
+    [TestMethod]
+    public void Parse_DifferentialDividendFields_Null_WhenEmpty()
+    {
+        // 기대 행위: 차등배당 4필드(CASH_DIFF_*, STK_DIFF_*, MARTP_DIFF_*)는 무차등 종목에서 빈값 → null
+        var rows = SeibroDivInfoParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getDivInfo.xml")));
+
+        var row = rows[0];
+        Assert.IsNull(row.CashDiffDiviAmt);
+        Assert.IsNull(row.CashDiffDiviRate);
+        Assert.IsNull(row.StkDiffDiviRate);
+        Assert.IsNull(row.MartpDiffDiviRate);
+    }
+
+    [TestMethod]
+    public void Parse_FractionalRate_WithLeadingDot()
+    {
+        // 기대 행위: ".34" 같은 소수점 선행 표기도 decimal 파싱 (0.34)
+        const string xml = """
+        <vector result="1">
+        <data vectorkey="0" type="Document"><result>
+        <ISIN value="KR7005930003"/>
+        <KOR_SECN_NM value="삼성전자"/>
+        <RGT_STD_DT value="20170331"/>
+        <MARTP_DIV_RATE value=".34"/>
+        <CASH_DIFF_DIVI_RATE value="1.5"/>
+        </result></data>
+        </vector>
+        """;
+
+        var rows = SeibroDivInfoParser.Parse(SeibroXml.Parse(xml));
+
+        Assert.AreEqual(0.34m, rows[0].MartpDivRate);
+        Assert.AreEqual(1.5m, rows[0].CashDiffDiviRate, "차등배당 있는 종목은 값 파싱");
+    }
+}

+ 59 - 0
Tests/Application.Tests/SeibroDivSchedulParserTests.cs

@@ -0,0 +1,59 @@
+using Infrastructure.StockData;
+
+namespace Application.Tests;
+
+[TestClass]
+public sealed class SeibroDivSchedulParserTests
+{
+    [TestMethod]
+    public void Parse_FromSampleXml_MapsFields_Samsung()
+    {
+        // SEIBro getDivSchedulInfo 실응답 fixture (삼성전자) — 9행, 전부 현금배당(02) · 권리락일/명부폐쇄/전자증권 매핑
+        var rows = SeibroDivSchedulParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getDivSchedulInfo.xml")));
+
+        Assert.AreEqual(9, rows.Count);
+
+        var first = rows.Single(c => c.RgtStdDt == new DateOnly(2018, 3, 31));
+        Assert.AreEqual(593, first.IssucoCustno);
+        Assert.AreEqual("삼성전자", first.RepSecnNm);
+        Assert.AreEqual("103", first.RgtRacd, "배당/분배");
+        Assert.AreEqual("02", first.RgtRsnDetailSortCd, "현금배당");
+        Assert.AreEqual("2", first.AllocWhcd);
+        Assert.AreEqual("3", first.SetaccTpcd, "분기");
+        Assert.AreEqual("1", first.FixTpcd, "확정");
+        Assert.AreEqual(new DateOnly(2018, 4, 1), first.RostCloseBeginDt);
+        Assert.AreEqual(new DateOnly(2018, 4, 14), first.RostCloseExpryDt);
+        Assert.AreEqual(new DateOnly(2018, 3, 29), first.XrgtDt, "권리락일 YYYYMMDD 파싱");
+        Assert.IsFalse(first.IsElectronicSecurity!.Value, "ELTSC_YN=N → false");
+    }
+
+    [TestMethod]
+    public void Parse_EmptyDate_Null_AndSkipsIncompleteKey()
+    {
+        // 기대 행위: XRGT_DT 빈값 → null, 자연키(회사번호/기준일/세부유형) 미충족 행은 건너뛴다
+        const string xml = """
+        <vector result="2">
+        <data vectorkey="0" type="Document"><result>
+        <ISSUCO_CUSTNO value="593"/>
+        <REP_SECN_NM value="삼성전자"/>
+        <RGT_RSN_DTAIL_SORT_CD value="04"/>
+        <RGT_STD_DT value="20201231"/>
+        <XRGT_DT value=""/>
+        <ELTSC_YN value="Y"/>
+        </result></data>
+        <data vectorkey="1" type="Document"><result>
+        <REP_SECN_NM value="누락회사번호"/>
+        <RGT_RSN_DTAIL_SORT_CD value="02"/>
+        <RGT_STD_DT value="20201231"/>
+        </result></data>
+        </vector>
+        """;
+
+        var rows = SeibroDivSchedulParser.Parse(SeibroXml.Parse(xml));
+
+        Assert.AreEqual(1, rows.Count, "회사번호 없는 행은 skip");
+        Assert.IsNull(rows[0].XrgtDt, "value=\"\" → null");
+        Assert.AreEqual("04", rows[0].RgtRsnDetailSortCd, "무배당");
+        Assert.IsTrue(rows[0].IsElectronicSecurity!.Value, "ELTSC_YN=Y → true");
+    }
+}

+ 89 - 0
Tests/Application.Tests/SeibroDividendQueryHandlerTests.cs

@@ -0,0 +1,89 @@
+using Domain.Entities.Stocks;
+using Domain.Entities.Stocks.ValueObject;
+using Infrastructure.Persistence;
+using CalendarHandler = Application.Features.Api.Stocks.GetDividendCalendar.Handler;
+using CalendarQuery = Application.Features.Api.Stocks.GetDividendCalendar.Query;
+using StockDivHandler = Application.Features.Api.Stocks.GetStockDividends.Handler;
+using StockDivQuery = Application.Features.Api.Stocks.GetStockDividends.Query;
+
+namespace Application.Tests;
+
+[TestClass]
+public sealed class SeibroDividendQueryHandlerTests
+{
+    [TestMethod]
+    public async Task GetDividendCalendar_FiltersByPeriod_OrdersByRgtStdDtDesc()
+    {
+        // 기대 행위: from~to(RgtStdDt) 범위 필터 + 최신순 정렬. 범위 밖 일정은 제외.
+        var custno = 700100 + Random.Shared.Next(1, 800);
+
+        using var db = TestDb.Create();
+        await db.DividendSchedule.AddAsync(DividendSchedule.Create(custno, "칼렌더종목", "103", "02", new DateOnly(2025, 3, 31), "2", "1", "1", null, null, new DateOnly(2025, 3, 27), false));
+        await db.DividendSchedule.AddAsync(DividendSchedule.Create(custno, "칼렌더종목", "103", "02", new DateOnly(2025, 6, 30), "2", "3", "2", null, null, new DateOnly(2025, 6, 26), false));
+        await db.DividendSchedule.AddAsync(DividendSchedule.Create(custno, "칼렌더종목", "103", "02", new DateOnly(2024, 12, 31), "2", "1", "1", null, null, new DateOnly(2024, 12, 27), false));
+        await db.SaveChangesAsync(default);
+
+        var handler = new CalendarHandler(db);
+
+        var result = await handler.Handle(new CalendarQuery(new DateOnly(2025, 1, 1), new DateOnly(2025, 12, 31), 1, 20), default);
+
+        Assert.IsTrue(result.IsSuccess);
+        var mine = result.Value.List.Where(c => c.IssucoCustno == custno).ToList();
+        Assert.AreEqual(2, mine.Count, "2024-12-31 은 범위 밖 → 제외");
+        Assert.AreEqual(new DateOnly(2025, 6, 30), mine[0].RgtStdDt, "최신순");
+        Assert.AreEqual(new DateOnly(2025, 6, 26), mine[0].XrgtDt);
+        Assert.AreEqual("2", mine[0].FixType);
+    }
+
+    [TestMethod]
+    public async Task GetStockDividends_ByShortCode_JoinsScheduleForXrgtDt()
+    {
+        // 기대 행위: 단축코드 → Stock.ISIN·IssucoCustno 로 Dividend(Isin) + DividendSchedule(권리락일/확정구분) 결합
+        var custno = 700900 + Random.Shared.Next(1, 800);
+        var code = $"71{Random.Shared.Next(1000, 9999)}";
+        var isin = $"KR7{code}003"; // 12자 표준 ISIN (KR7 + 단축코드6 + 003)
+
+        using var db = TestDb.Create();
+        var stock = Stock.Create(code, "배당탭종목", StockMarket.KOSPI, new DateOnly(2020, 1, 2), isin: isin);
+        stock.SetIssucoCustno(custno);
+        await db.Stock.AddAsync(stock);
+        await db.Dividend.AddAsync(Dividend.Create(isin, "배당탭종목", "보통주", new DateOnly(2024, 12, 31), 100m, 0m, 400m, 20000m, 1.8m, new DateOnly(2025, 4, 20), null, false, false, null, null, null, null));
+        await db.DividendSchedule.AddAsync(DividendSchedule.Create(custno, "배당탭종목", "103", "02", new DateOnly(2024, 12, 31), "2", "1", "1", null, null, new DateOnly(2024, 12, 27), false));
+        await db.SaveChangesAsync(default);
+
+        var handler = new StockDivHandler(db);
+
+        var result = await handler.Handle(new StockDivQuery(code, 1, 20), default);
+
+        Assert.IsTrue(result.IsSuccess);
+        Assert.AreEqual(isin, result.Value.Isin);
+        Assert.AreEqual(1, result.Value.Total);
+
+        var row = result.Value.List[0];
+        Assert.AreEqual(20000m, row.CashPerShare);
+        Assert.AreEqual(1.8m, row.MarketDividendRate);
+        Assert.AreEqual(new DateOnly(2025, 4, 20), row.CashPayDate);
+        Assert.AreEqual(new DateOnly(2024, 12, 27), row.XrgtDt, "DividendSchedule 권리락일 결합");
+        Assert.AreEqual("1", row.FixType, "확정구분 결합");
+    }
+
+    [TestMethod]
+    public async Task GetStockDividends_ByIsin_WhenNoStockRow()
+    {
+        // 기대 행위: 단축코드가 Stock 에 없으면 입력을 ISIN 으로 간주해 Dividend 조회 (권리락일은 회사번호 미상이라 null)
+        var isin = $"US{Random.Shared.Next(100000, 999999)}0009";
+
+        using var db = TestDb.Create();
+        await db.Dividend.AddAsync(Dividend.Create(isin, "ISIN직접조회", "보통주", new DateOnly(2023, 12, 31), null, 0m, 300m, 15000m, 2.1m, null, null, null, null, null, null, null, null));
+        await db.SaveChangesAsync(default);
+
+        var handler = new StockDivHandler(db);
+
+        var result = await handler.Handle(new StockDivQuery(isin, 1, 20), default);
+
+        Assert.IsTrue(result.IsSuccess);
+        Assert.AreEqual(isin, result.Value.Isin);
+        Assert.AreEqual(1, result.Value.Total);
+        Assert.IsNull(result.Value.List[0].XrgtDt, "Stock·회사번호 미상 → 권리락일 결합 불가");
+    }
+}

+ 110 - 0
Tests/Application.Tests/SeibroDividendSyncTests.cs

@@ -0,0 +1,110 @@
+using Domain.Entities.Stocks;
+using Infrastructure.StockData;
+using Microsoft.EntityFrameworkCore;
+
+namespace Application.Tests;
+
+/// <summary>
+/// SeibroDividendSyncService 의 DB 반영 로직(SeibroDividendImport) 통합 검증 — HTTP 는 파서 입력을 fixture 로 대체
+/// (SeibroIssuerSyncTests 방식 미러링). 실제 SQL Server(LocalDB)로 UQ upsert 동작 확인.
+/// </summary>
+[TestClass]
+public sealed class SeibroDividendSyncTests
+{
+    [TestMethod]
+    public async Task UpsertSchedules_FromSampleXml_InsertsAll_ThenIdempotent()
+    {
+        // 기대 행위: getDivSchedulInfo fixture(9행) 전 행 insert → 동일 스냅샷 재실행은 무변경 (UQ IssucoCustno+RgtStdDt+SortCd)
+        var rows = SeibroDivSchedulParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getDivSchedulInfo.xml")));
+
+        using (var db = TestDb.Create())
+        {
+            var (inserted, updated) = await SeibroDividendImport.UpsertSchedulesAsync(db, rows, CancellationToken.None);
+            Assert.AreEqual(rows.Count, inserted, "첫 실행은 전 행 insert");
+            Assert.AreEqual(0, updated);
+        }
+
+        using (var db = TestDb.Create())
+        {
+            var (inserted, updated) = await SeibroDividendImport.UpsertSchedulesAsync(db, rows, CancellationToken.None);
+            Assert.AreEqual(0, inserted, "동일 스냅샷 재실행은 insert 없음");
+            Assert.AreEqual(0, updated, "무변경 행은 update 로 세지 않는다");
+
+            var saved = await db.DividendSchedule.AsNoTracking().Where(c => c.IssucoCustno == 593 && c.RgtStdDt == new DateOnly(2018, 3, 31)).SingleAsync();
+            Assert.AreEqual(new DateOnly(2018, 3, 29), saved.XrgtDt);
+            Assert.AreEqual("02", saved.RgtRsnDetailSortCd);
+        }
+    }
+
+    [TestMethod]
+    public async Task UpsertDividends_FromSampleXml_UpsertsByIsinAndDate()
+    {
+        // 기대 행위: getDivInfo fixture(18행) upsert(Isin+RgtStdDt). ISSUCO_CUSTNO 부재라도 Isin 으로 저장된다.
+        var rows = SeibroDivInfoParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getDivInfo.xml")));
+
+        using (var db = TestDb.Create())
+        {
+            var (inserted, _) = await SeibroDividendImport.UpsertDividendsAsync(db, rows, CancellationToken.None);
+            Assert.AreEqual(18, inserted);
+        }
+
+        using (var db = TestDb.Create())
+        {
+            var (inserted, updated) = await SeibroDividendImport.UpsertDividendsAsync(db, rows, CancellationToken.None);
+            Assert.AreEqual(0, inserted, "재실행 idempotent");
+            Assert.AreEqual(0, updated);
+
+            var saved = await db.Dividend.AsNoTracking().Where(c => c.Isin == "KR7005930003" && c.RgtStdDt == new DateOnly(2016, 12, 31)).SingleAsync();
+            Assert.AreEqual(27500m, saved.CashAllocAmt);
+            Assert.AreEqual(1.53m, saved.MartpDivRate);
+            Assert.AreEqual(new DateOnly(2017, 4, 24), saved.Th1PayTermBeginDt);
+        }
+    }
+
+    [TestMethod]
+    public async Task UpsertDividends_ChangedAmount_UpdatesRow()
+    {
+        var isin = $"KR7{Guid.NewGuid().ToString("N")[..9]}";
+        var date = new DateOnly(2022, 12, 31);
+        var original = new List<SeibroDivInfoParser.Row> { new(isin, "테스트배당", "보통주", date, 500m, 0m, 100m, 1000m, 2.5m, null, null, false, false, null, null, null, null) };
+        var changed = new List<SeibroDivInfoParser.Row> { new(isin, "테스트배당", "보통주", date, 500m, 0m, 100m, 1500m, 3.0m, null, null, false, false, null, null, null, null) };
+
+        using (var db = TestDb.Create())
+        {
+            await SeibroDividendImport.UpsertDividendsAsync(db, original, CancellationToken.None);
+        }
+
+        using (var db = TestDb.Create())
+        {
+            var (inserted, updated) = await SeibroDividendImport.UpsertDividendsAsync(db, changed, CancellationToken.None);
+            Assert.AreEqual(0, inserted);
+            Assert.AreEqual(1, updated, "현금배당금·시가배당율 변경 → update");
+
+            var saved = await db.Dividend.AsNoTracking().Where(c => c.Isin == isin).SingleAsync();
+            Assert.AreEqual(1500m, saved.CashAllocAmt);
+        }
+    }
+
+    [TestMethod]
+    public async Task UpsertRightsBaseDates_FromSampleXml_UpsertsByNaturalKey()
+    {
+        // 기대 행위: getStddtInfo fixture(3행) upsert(회사번호+기준일+사유코드+세부유형)
+        var rows = SeibroStddtParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getStddtInfo.xml")));
+
+        using (var db = TestDb.Create())
+        {
+            var (inserted, _) = await SeibroDividendImport.UpsertRightsBaseDatesAsync(db, rows, CancellationToken.None);
+            Assert.AreEqual(3, inserted);
+        }
+
+        using (var db = TestDb.Create())
+        {
+            var (inserted, updated) = await SeibroDividendImport.UpsertRightsBaseDatesAsync(db, rows, CancellationToken.None);
+            Assert.AreEqual(0, inserted, "재실행 idempotent");
+            Assert.AreEqual(0, updated);
+
+            var saved = await db.RightsBaseDate.AsNoTracking().Where(c => c.IssucoCustno == 593 && c.RgtStdDt == new DateOnly(2016, 12, 31) && c.RgtRacd == "001").SingleAsync();
+            Assert.AreEqual("정기총회", saved.RgtRacdNm);
+        }
+    }
+}

+ 18 - 0
Tests/Application.Tests/SeibroFixtures.cs

@@ -0,0 +1,18 @@
+namespace Application.Tests;
+
+/// <summary>SEIBro 실응답 fixture 로더 — docs/SEIBro/samples 복사본 (Fixtures/Seibro/**, 37종, 출력 복사)</summary>
+internal static class SeibroFixtures
+{
+    public static string Root => Path.Combine(AppContext.BaseDirectory, "Fixtures", "Seibro");
+
+    public static string[] AllXmlFiles()
+    {
+        return Directory.GetFiles(Root, "*.xml", SearchOption.AllDirectories);
+    }
+
+    /// <summary>파일명으로 카테고리 폴더 무관 조회 (예: "getShotnByMart.xml")</summary>
+    public static string Read(string fileName)
+    {
+        return File.ReadAllText(Directory.GetFiles(Root, fileName, SearchOption.AllDirectories).Single());
+    }
+}

+ 39 - 0
Tests/Application.Tests/SeibroIssucoCustnoParserTests.cs

@@ -0,0 +1,39 @@
+using Infrastructure.StockData;
+
+namespace Application.Tests;
+
+[TestClass]
+public sealed class SeibroIssucoCustnoParserTests
+{
+    [TestMethod]
+    public void Parse_FromSampleXml_MapsFields()
+    {
+        // SEIBro getIssucoCustnoByIsin 실응답 fixture (삼성전자) — 단건 fallback 파서 (배치 미사용)
+        var rows = SeibroIssucoCustnoParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getIssucoCustnoByIsin.xml")));
+
+        Assert.AreEqual(1, rows.Count);
+        Assert.AreEqual(593, rows[0].IssucoCustno);
+        Assert.AreEqual("삼성전자", rows[0].RepSecnName);
+    }
+
+    [TestMethod]
+    public void Parse_SkipsRows_WithoutCustno_AndAllowsMissingName()
+    {
+        const string xml = """
+        <vector result="2">
+        <data vectorkey="0" type="Document"><result>
+        <ISSUCO_CUSTNO value="4131"/>
+        </result></data>
+        <data vectorkey="1" type="Document"><result>
+        <REP_SECN_NM value="번호없는행"/>
+        </result></data>
+        </vector>
+        """;
+
+        var rows = SeibroIssucoCustnoParser.Parse(SeibroXml.Parse(xml));
+
+        Assert.AreEqual(1, rows.Count, "ISSUCO_CUSTNO 없는 행은 건너뛴다");
+        Assert.AreEqual(4131, rows[0].IssucoCustno);
+        Assert.IsNull(rows[0].RepSecnName, "REP_SECN_NM 은 선택 필드");
+    }
+}

+ 138 - 0
Tests/Application.Tests/SeibroIssuerSyncTests.cs

@@ -0,0 +1,138 @@
+using Domain.Entities.Stocks;
+using Domain.Entities.Stocks.ValueObject;
+using Infrastructure.StockData;
+using Microsoft.EntityFrameworkCore;
+
+namespace Application.Tests;
+
+/// <summary>
+/// SeibroIssuerSyncService 의 DB 반영 로직(SeibroIssuerImport) 통합 검증 — HTTP 는 파서 입력을 fixture 로 대체
+/// (KRX 테스트들이 파서/로직을 분리 검증하는 방식 미러링). 실제 SQL Server(LocalDB)로 UQ(Market, ShortCode)·스탬핑 동작 확인.
+/// </summary>
+[TestClass]
+public sealed class SeibroIssuerSyncTests
+{
+    [TestMethod]
+    public async Task UpsertIssuerCodes_FromSampleXml_InsertsAll_ThenIdempotent()
+    {
+        // 기대 행위: fixture 전 행 insert → 동일 스냅샷 재실행은 무변경 (UQ Market+ShortCode upsert, resumable)
+        var rows = SeibroShotnByMartParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getShotnByMart.xml")));
+
+        using (var db = TestDb.Create())
+        {
+            var (inserted, updated) = await SeibroIssuerImport.UpsertIssuerCodesAsync(db, "13", rows, CancellationToken.None);
+
+            Assert.AreEqual(rows.Count, inserted, "첫 실행은 전 행 insert");
+            Assert.AreEqual(0, updated);
+        }
+
+        using (var db = TestDb.Create())
+        {
+            var (inserted, updated) = await SeibroIssuerImport.UpsertIssuerCodesAsync(db, "13", rows, CancellationToken.None);
+
+            Assert.AreEqual(0, inserted, "동일 스냅샷 재실행은 insert 없음");
+            Assert.AreEqual(0, updated, "무변경 행은 update 로 세지 않는다 (UpdatedAt 미갱신)");
+
+            var saved = await db.SeibroIssuerCode.AsNoTracking().Where(c => c.Market == "13" && c.ShortCode == "000800").SingleAsync();
+            Assert.AreEqual("경남기업", saved.Name);
+            Assert.AreEqual(80, saved.IssucoCustno);
+        }
+    }
+
+    [TestMethod]
+    public async Task UpsertIssuerCodes_ChangedNameOrCustno_UpdatesRow()
+    {
+        var original = new List<SeibroShotnByMartParser.Row> { new("777001", "변경전상호", 91001) };
+        var renamed = new List<SeibroShotnByMartParser.Row> { new("777001", "변경후상호", 91002) };
+
+        using (var db = TestDb.Create())
+        {
+            await SeibroIssuerImport.UpsertIssuerCodesAsync(db, "11", original, CancellationToken.None);
+        }
+
+        using (var db = TestDb.Create())
+        {
+            var (inserted, updated) = await SeibroIssuerImport.UpsertIssuerCodesAsync(db, "11", renamed, CancellationToken.None);
+
+            Assert.AreEqual(0, inserted);
+            Assert.AreEqual(1, updated, "이름/회사번호 변경 행은 update");
+
+            var saved = await db.SeibroIssuerCode.AsNoTracking().Where(c => c.Market == "11" && c.ShortCode == "777001").SingleAsync();
+            Assert.AreEqual("변경후상호", saved.Name);
+            Assert.AreEqual(91002, saved.IssucoCustno);
+        }
+    }
+
+    [TestMethod]
+    public async Task UpsertIssuerCodes_SameShortCode_DifferentMarket_BothPersisted()
+    {
+        // 기대 행위: UQ 는 (Market, ShortCode) — 같은 단축코드라도 시장이 다르면 별도 행 (K-OTC 13 vs 코넥스 14)
+        var rows = new List<SeibroShotnByMartParser.Row> { new("777002", "양시장종목", 91003) };
+
+        using var db = TestDb.Create();
+        await SeibroIssuerImport.UpsertIssuerCodesAsync(db, "13", rows, CancellationToken.None);
+        await SeibroIssuerImport.UpsertIssuerCodesAsync(db, "14", rows, CancellationToken.None);
+
+        var saved = await db.SeibroIssuerCode.AsNoTracking().Where(c => c.ShortCode == "777002").ToListAsync();
+        Assert.AreEqual(2, saved.Count);
+    }
+
+    [TestMethod]
+    public async Task StampStockIssucoCustno_MatchesByCode_SkipsUnchangedAndUnmapped()
+    {
+        // 기대 행위: Stock.Code = 단축코드 조인으로 스탬핑, 이미 같은 값이면 무변경, 매핑 없는 종목은 null 유지
+        using (var db = TestDb.Create())
+        {
+            await db.Stock.AddAsync(Stock.Create("890001", "세이브로스탬핑1", StockMarket.KOSPI, new DateOnly(2020, 1, 2)));
+            await db.Stock.AddAsync(Stock.Create("890002", "세이브로스탬핑2", StockMarket.KOSDAQ, new DateOnly(2020, 1, 2)));
+            await db.SaveChangesAsync(default);
+        }
+
+        var custnoByShortCode = new Dictionary<string, int> { ["890001"] = 77001 };
+
+        using (var db = TestDb.Create())
+        {
+            var stamped = await SeibroIssuerImport.StampStockIssucoCustnoAsync(db, custnoByShortCode, CancellationToken.None);
+
+            Assert.AreEqual(1, stamped, "매핑된 종목만 스탬핑");
+        }
+
+        using (var db = TestDb.Create())
+        {
+            var stampedAgain = await SeibroIssuerImport.StampStockIssucoCustnoAsync(db, custnoByShortCode, CancellationToken.None);
+
+            Assert.AreEqual(0, stampedAgain, "이미 같은 값이면 무변경 (no-op 재실행)");
+
+            var s1 = await db.Stock.AsNoTracking().Where(c => c.Code == "890001").SingleAsync();
+            var s2 = await db.Stock.AsNoTracking().Where(c => c.Code == "890002").SingleAsync();
+            Assert.AreEqual(77001, s1.IssucoCustno);
+            Assert.IsNull(s2.IssucoCustno, "스냅샷에 없는 종목은 null 유지");
+        }
+    }
+
+    [TestMethod]
+    public async Task EnrichFromSeibro_StkStatFixture_PersistsExtensionColumns()
+    {
+        // 기대 행위: getStkStatInfo fixture 행으로 Stock 확장 5컬럼이 채워지고 DB 에 보존된다 (rolling 보강 경로)
+        var row = SeibroStkStatParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getStkStatInfo.xml")))[0];
+
+        using (var db = TestDb.Create())
+        {
+            var stock = Stock.Create("890003", "세이브로보강", StockMarket.KOSPI, new DateOnly(2020, 1, 2));
+            stock.EnrichFromSeibro(row.IssucoCustno, row.FaceValue, row.VotingRights, row.TotalIssuedShares, row.IsElectronicSecurity);
+            await db.Stock.AddAsync(stock);
+            await db.SaveChangesAsync(default);
+        }
+
+        using (var db = TestDb.Create())
+        {
+            var saved = await db.Stock.AsNoTracking().Where(c => c.Code == "890003").SingleAsync();
+
+            Assert.AreEqual(593, saved.IssucoCustno);
+            Assert.AreEqual(100m, saved.FaceValue);
+            Assert.AreEqual(1m, saved.VotingRights);
+            Assert.AreEqual(6419324700L, saved.TotalIssuedShares);
+            Assert.IsFalse(saved.IsElectronicSecurity!.Value);
+        }
+    }
+}

+ 66 - 0
Tests/Application.Tests/SeibroQuotaTests.cs

@@ -0,0 +1,66 @@
+using Application.Helpers;
+
+namespace Application.Tests;
+
+[TestClass]
+public sealed class SeibroQuotaTests
+{
+    [TestMethod]
+    public void TryConsume_WithinBudget_ConsumesAndReturnsTrue()
+    {
+        var quota = new SeibroQuota(() => new DateOnly(2026, 7, 7));
+
+        Assert.IsTrue(quota.TryConsume(SeibroCategory.Stock, 3, dailyBudget: 10));
+        Assert.IsTrue(quota.TryConsume(SeibroCategory.Stock, 7, dailyBudget: 10), "정확히 상한까지 소비 가능");
+        Assert.AreEqual(10, quota.Used(SeibroCategory.Stock));
+        Assert.AreEqual(0, quota.Remaining(SeibroCategory.Stock, dailyBudget: 10));
+    }
+
+    [TestMethod]
+    public void TryConsume_ExceedingBudget_RejectsWithoutPartialConsume()
+    {
+        var quota = new SeibroQuota(() => new DateOnly(2026, 7, 7));
+
+        Assert.IsTrue(quota.TryConsume(SeibroCategory.Corp, 9, dailyBudget: 10));
+        Assert.IsFalse(quota.TryConsume(SeibroCategory.Corp, 2, dailyBudget: 10), "상한 초과 소비는 거부");
+        Assert.AreEqual(9, quota.Used(SeibroCategory.Corp), "거부 시 부분 소비 없음");
+        Assert.AreEqual(1, quota.Remaining(SeibroCategory.Corp, dailyBudget: 10));
+    }
+
+    [TestMethod]
+    public void TryConsume_CategoriesAreIndependent()
+    {
+        var quota = new SeibroQuota(() => new DateOnly(2026, 7, 7));
+
+        Assert.IsTrue(quota.TryConsume(SeibroCategory.Stock, 10, dailyBudget: 10));
+        Assert.IsFalse(quota.TryConsume(SeibroCategory.Stock, 1, dailyBudget: 10));
+        Assert.IsTrue(quota.TryConsume(SeibroCategory.Deriv, 1, dailyBudget: 10), "카테고리별 독립 카운터");
+        Assert.AreEqual(1, quota.Used(SeibroCategory.Deriv));
+    }
+
+    [TestMethod]
+    public void TryConsume_KstDateRollover_ResetsCounters()
+    {
+        var today = new DateOnly(2026, 7, 7);
+        // KST 날짜 공급자를 주입해 자정 롤오버를 시뮬레이션
+        var quota = new SeibroQuota(() => today);
+
+        Assert.IsTrue(quota.TryConsume(SeibroCategory.Foreign, 10, dailyBudget: 10));
+        Assert.IsFalse(quota.TryConsume(SeibroCategory.Foreign, 1, dailyBudget: 10), "당일 예산 소진");
+
+        today = today.AddDays(1);
+
+        Assert.AreEqual(0, quota.Used(SeibroCategory.Foreign), "KST 날짜 변경 시 카운터 리셋");
+        Assert.IsTrue(quota.TryConsume(SeibroCategory.Foreign, 10, dailyBudget: 10), "다음 날 예산 회복");
+    }
+
+    [TestMethod]
+    public void TryConsume_ZeroOrNegativeCount_AlwaysTrue_NoConsume()
+    {
+        var quota = new SeibroQuota(() => new DateOnly(2026, 7, 7));
+
+        Assert.IsTrue(quota.TryConsume(SeibroCategory.Bond, 0, dailyBudget: 0));
+        Assert.IsTrue(quota.TryConsume(SeibroCategory.Bond, -5, dailyBudget: 0));
+        Assert.AreEqual(0, quota.Used(SeibroCategory.Bond));
+    }
+}

+ 107 - 0
Tests/Application.Tests/SeibroRollingSweepTests.cs

@@ -0,0 +1,107 @@
+using System.Diagnostics;
+using Application.Helpers;
+
+namespace Application.Tests;
+
+[TestClass]
+public sealed class SeibroRollingSweepTests
+{
+    [TestMethod]
+    public async Task RunAsync_UnprocessedFirst_ThenStaleOrder_StableForTies()
+    {
+        // 미처리(null) 우선(입력 순서 유지), 그다음 오래된(stale) 순
+        var targets = new List<(string Key, DateTime? LastUpdatedAt)>
+        {
+            ("A", new DateTime(2026, 1, 5)),
+            ("B", null),
+            ("C", new DateTime(2026, 1, 1)),
+            ("D", null)
+        };
+        var processed = new List<string>();
+
+        var count = await SeibroRollingSweep.RunAsync(
+            targets: targets,
+            fetchAndUpsert: (key, _) => { processed.Add(key); return Task.CompletedTask; },
+            maxPerRun: 100,
+            delayMs: 0,
+            ct: CancellationToken.None);
+
+        Assert.AreEqual(4, count);
+        CollectionAssert.AreEqual(new[] { "B", "D", "C", "A" }, processed, "미처리(B,D 입력순) → stale(C=1/1) → 최신(A=1/5)");
+    }
+
+    [TestMethod]
+    public async Task RunAsync_StopsAfterMaxPerRun()
+    {
+        var targets = Enumerable.Range(0, 10).Select(c => (Key: c, LastUpdatedAt: (DateTime?)null)).ToList();
+        var fetched = 0;
+
+        var count = await SeibroRollingSweep.RunAsync(
+            targets: targets,
+            fetchAndUpsert: (_, _) => { fetched++; return Task.CompletedTask; },
+            maxPerRun: 3,
+            delayMs: 0,
+            ct: CancellationToken.None);
+
+        Assert.AreEqual(3, count, "maxPerRun 도달 시 즉시 멈춤 (quota 상한)");
+        Assert.AreEqual(3, fetched);
+    }
+
+    [TestMethod]
+    public async Task RunAsync_MaxPerRunZeroOrNegative_FetchesNothing()
+    {
+        var fetched = 0;
+
+        var count = await SeibroRollingSweep.RunAsync(
+            targets: [("A", (DateTime?)null)],
+            fetchAndUpsert: (_, _) => { fetched++; return Task.CompletedTask; },
+            maxPerRun: 0,
+            delayMs: 0,
+            ct: CancellationToken.None);
+
+        Assert.AreEqual(0, count);
+        Assert.AreEqual(0, fetched, "maxPerRun<=0 이면 fetch 호출 자체가 없다");
+    }
+
+    [TestMethod]
+    public async Task RunAsync_DelaysBetweenFetches_NotBeforeFirst()
+    {
+        // 지연 계약: 호출 사이에만 delayMs — 3건 × 60ms → 최소 120ms (첫 호출 전엔 지연 없음)
+        var targets = Enumerable.Range(0, 3).Select(c => (Key: c, LastUpdatedAt: (DateTime?)null)).ToList();
+        var sw = Stopwatch.StartNew();
+
+        await SeibroRollingSweep.RunAsync(
+            targets: targets,
+            fetchAndUpsert: (_, _) => Task.CompletedTask,
+            maxPerRun: 100,
+            delayMs: 60,
+            ct: CancellationToken.None);
+
+        Assert.IsTrue(sw.ElapsedMilliseconds >= 120, $"3건이면 사이 지연 2회 ≥ 120ms (실측 {sw.ElapsedMilliseconds}ms)");
+
+        // 단건이면 지연 없음 — delayMs 가 매우 커도 즉시 끝난다
+        sw.Restart();
+
+        await SeibroRollingSweep.RunAsync(
+            targets: [(0, (DateTime?)null)],
+            fetchAndUpsert: (_, _) => Task.CompletedTask,
+            maxPerRun: 1,
+            delayMs: 30_000,
+            ct: CancellationToken.None);
+
+        Assert.IsTrue(sw.ElapsedMilliseconds < 5_000, $"첫 호출 전에는 지연이 없다 (실측 {sw.ElapsedMilliseconds}ms)");
+    }
+
+    [TestMethod]
+    public async Task RunAsync_EmptyTargets_ReturnsZero()
+    {
+        var count = await SeibroRollingSweep.RunAsync<string>(
+            targets: [],
+            fetchAndUpsert: (_, _) => Task.CompletedTask,
+            maxPerRun: 100,
+            delayMs: 0,
+            ct: CancellationToken.None);
+
+        Assert.AreEqual(0, count);
+    }
+}

+ 50 - 0
Tests/Application.Tests/SeibroShotnByMartParserTests.cs

@@ -0,0 +1,50 @@
+using Infrastructure.StockData;
+
+namespace Application.Tests;
+
+[TestClass]
+public sealed class SeibroShotnByMartParserTests
+{
+    [TestMethod]
+    public void Parse_FromSampleXml_MapsFields()
+    {
+        // SEIBro getShotnByMart 실응답 fixture — SHOTN_ISIN/KOR_SECN_NM/ISSUCO_CUSTNO 매핑
+        var envelope = SeibroXml.Parse(SeibroFixtures.Read("getShotnByMart.xml"));
+        var rows = SeibroShotnByMartParser.Parse(envelope);
+
+        Assert.AreEqual(envelope.Rows.Count, rows.Count, "샘플 전 행이 세 필드를 갖춰 전부 매핑된다");
+
+        var first = rows[0];
+        Assert.AreEqual("000800", first.ShortCode);
+        Assert.AreEqual("경남기업", first.Name);
+        Assert.AreEqual(80, first.IssucoCustno);
+    }
+
+    [TestMethod]
+    public void Parse_SkipsRows_MissingRequiredFields()
+    {
+        // 필수 3필드 중 하나라도 없거나 회사번호 비숫자인 행은 건너뛴다 (upsert 자연키 불성립)
+        const string xml = """
+        <vector result="4">
+        <data vectorkey="0" type="Document"><result>
+        <SHOTN_ISIN value="005930"/><KOR_SECN_NM value="삼성전자"/><ISSUCO_CUSTNO value="593"/>
+        </result></data>
+        <data vectorkey="1" type="Document"><result>
+        <SHOTN_ISIN value=""/><KOR_SECN_NM value="코드없음"/><ISSUCO_CUSTNO value="1"/>
+        </result></data>
+        <data vectorkey="2" type="Document"><result>
+        <SHOTN_ISIN value="000020"/><KOR_SECN_NM value="번호없음"/>
+        </result></data>
+        <data vectorkey="3" type="Document"><result>
+        <SHOTN_ISIN value="000030"/><KOR_SECN_NM value="비숫자"/><ISSUCO_CUSTNO value="ABC"/>
+        </result></data>
+        </vector>
+        """;
+
+        var rows = SeibroShotnByMartParser.Parse(SeibroXml.Parse(xml));
+
+        Assert.AreEqual(1, rows.Count);
+        Assert.AreEqual("005930", rows[0].ShortCode);
+        Assert.AreEqual(593, rows[0].IssucoCustno);
+    }
+}

+ 52 - 0
Tests/Application.Tests/SeibroStddtParserTests.cs

@@ -0,0 +1,52 @@
+using Infrastructure.StockData;
+
+namespace Application.Tests;
+
+[TestClass]
+public sealed class SeibroStddtParserTests
+{
+    [TestMethod]
+    public void Parse_FromSampleXml_MapsFields_Samsung()
+    {
+        // SEIBro getStddtInfo 실응답 fixture (삼성전자) — 3행, 전부 정기총회(001)
+        var rows = SeibroStddtParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getStddtInfo.xml")));
+
+        Assert.AreEqual(3, rows.Count);
+
+        var first = rows.Single(c => c.RgtStdDt == new DateOnly(2016, 12, 31));
+        Assert.AreEqual(593, first.IssucoCustno);
+        Assert.AreEqual("삼성전자", first.RepSecnNm);
+        Assert.AreEqual("001", first.RgtRacd, "정기총회");
+        Assert.AreEqual("정기총회", first.RgtRacdNm);
+        Assert.AreEqual("99", first.RgtRsnDetailSortCd);
+    }
+
+    [TestMethod]
+    public void Parse_SkipsRows_MissingNaturalKey()
+    {
+        // 기대 행위: 자연키(회사번호/기준일/사유코드/세부유형) 중 하나라도 없으면 건너뛴다
+        const string xml = """
+        <vector result="2">
+        <data vectorkey="0" type="Document"><result>
+        <ISSUCO_CUSTNO value="3572"/>
+        <REP_SECN_NM value="상호변경회사"/>
+        <RGT_STD_DT value="20151001"/>
+        <RGT_RACD value="204"/>
+        <RGT_RACD_NM value="상호변경"/>
+        <RGT_RSN_DTAIL_SORT_CD value="90"/>
+        </result></data>
+        <data vectorkey="1" type="Document"><result>
+        <ISSUCO_CUSTNO value="3572"/>
+        <REP_SECN_NM value="사유코드누락"/>
+        <RGT_STD_DT value="20151001"/>
+        <RGT_RSN_DTAIL_SORT_CD value="90"/>
+        </result></data>
+        </vector>
+        """;
+
+        var rows = SeibroStddtParser.Parse(SeibroXml.Parse(xml));
+
+        Assert.AreEqual(1, rows.Count, "RGT_RACD 없는 행은 skip");
+        Assert.AreEqual("204", rows[0].RgtRacd, "상호변경 — Wave 3 트리거 코드");
+    }
+}

+ 49 - 0
Tests/Application.Tests/SeibroStkStatParserTests.cs

@@ -0,0 +1,49 @@
+using Infrastructure.StockData;
+
+namespace Application.Tests;
+
+[TestClass]
+public sealed class SeibroStkStatParserTests
+{
+    [TestMethod]
+    public void Parse_FromSampleXml_MapsFields_Samsung()
+    {
+        // SEIBro getStkStatInfo 실응답 fixture (삼성전자) — PVAL/VOTRNO/TOTAL_STK_CNT/ELTSC_YN/ISSUCO_CUSTNO 매핑
+        var rows = SeibroStkStatParser.Parse(SeibroXml.Parse(SeibroFixtures.Read("getStkStatInfo.xml")));
+
+        Assert.AreEqual(1, rows.Count);
+
+        var row = rows[0];
+        Assert.AreEqual(593, row.IssucoCustno);
+        Assert.AreEqual("KR7005930003", row.Isin);
+        Assert.AreEqual("005930", row.ShortCode);
+        Assert.AreEqual(100m, row.FaceValue, "PVAL 액면가");
+        Assert.AreEqual(1m, row.VotingRights, "VOTRNO 1주당 의결권수");
+        Assert.AreEqual(6419324700L, row.TotalIssuedShares, "TOTAL_STK_CNT 총발행주식수");
+        Assert.IsFalse(row.IsElectronicSecurity!.Value, "ELTSC_YN=N → false (예탁증권)");
+    }
+
+    [TestMethod]
+    public void Parse_EltscYn_Y_True_AndMissingNumerics_Null()
+    {
+        const string xml = """
+        <vector result="1">
+        <data vectorkey="0" type="Document"><result>
+        <ISSUCO_CUSTNO value="80"/>
+        <PVAL value="500.5"/>
+        <VOTRNO value=""/>
+        <ELTSC_YN value="Y"/>
+        </result></data>
+        </vector>
+        """;
+
+        var rows = SeibroStkStatParser.Parse(SeibroXml.Parse(xml));
+
+        var row = rows[0];
+        Assert.AreEqual(500.5m, row.FaceValue, "소수 액면가 파싱");
+        Assert.IsNull(row.VotingRights, "value=\"\" → null (0 과 구분)");
+        Assert.IsNull(row.TotalIssuedShares, "element 생략 → null");
+        Assert.IsNull(row.Isin);
+        Assert.IsTrue(row.IsElectronicSecurity!.Value, "ELTSC_YN=Y → true (전자증권)");
+    }
+}

+ 128 - 0
Tests/Application.Tests/SeibroXmlTests.cs

@@ -0,0 +1,128 @@
+using System.Text.RegularExpressions;
+using System.Xml;
+using Infrastructure.StockData;
+
+namespace Application.Tests;
+
+[TestClass]
+public sealed class SeibroXmlTests
+{
+    [TestMethod]
+    public void Parse_All37Fixtures_SmokeTest_RowsMatchActualDataElements()
+    {
+        // 샘플 37종 전수 스모크 — 전부 예외 없이 파싱되고, rows 수는 파일에 실제 존재하는 <data> 수와 일치해야 한다
+        // (vector@result 는 원문 행수라 truncate 된 샘플에선 rows 보다 클 수 있음 → ResultCount 는 음수 아님만 확인)
+        var files = SeibroFixtures.AllXmlFiles();
+        Assert.AreEqual(37, files.Length, "SEIBro fixture 는 37종 전부 복사되어야 한다");
+
+        foreach (var file in files)
+        {
+            var xml = File.ReadAllText(file);
+            var envelope = SeibroXml.Parse(xml);
+
+            // 파서와 독립적인 검증용 카운트 — <data ...> 시작 태그 수 (셀프클로징 없음, 래퍼/필드 element 는 data 로 시작하지 않음)
+            var actualDataCount = Regex.Matches(xml, @"<data[\s>]", RegexOptions.IgnoreCase).Count;
+
+            Assert.AreEqual(actualDataCount, envelope.Rows.Count, $"{Path.GetFileName(file)}: rows 수는 실제 data element 수와 일치");
+            Assert.IsTrue(envelope.ResultCount >= 0, $"{Path.GetFileName(file)}: result 행수 속성 파싱");
+            Assert.IsTrue(envelope.ResultCount >= envelope.Rows.Count, $"{Path.GetFileName(file)}: result 는 원문 행수 (truncate 샘플은 rows 이상)");
+        }
+    }
+
+    [TestMethod]
+    public void Parse_UppercaseResultWrapper_GetAssetInfo_MapsFields()
+    {
+        // 파생결합 getAssetInfo 는 래퍼가 대문자 <RESULT> — 대소문자 무시 파싱 검증 (docs/SEIBro/readme.md 규칙 4)
+        var envelope = SeibroXml.Parse(SeibroFixtures.Read("getAssetInfo.xml"));
+
+        Assert.AreEqual(3, envelope.ResultCount);
+        var row = envelope.Rows[0];
+        Assert.AreEqual("KR6539335879", SeibroXml.GetOrNull(row, "ISIN"));
+        Assert.AreEqual("1", SeibroXml.GetOrNull(row, "ASSET_SEQ"));
+        Assert.AreEqual("Hang Seng China Enterprises Index", SeibroXml.GetOrNull(row, "STND_BASSET_NM"));
+        Assert.AreEqual("6090.15", SeibroXml.GetOrNull(row, "XRC_STOP_LOLMT_PRICE"));
+    }
+
+    [TestMethod]
+    public void Parse_LowercaseResultWrapper_GetShotnByMart_MapsFields()
+    {
+        // 주식 getShotnByMart 는 래퍼가 소문자 <result> — 필드값 = value 속성
+        var envelope = SeibroXml.Parse(SeibroFixtures.Read("getShotnByMart.xml"));
+
+        Assert.AreEqual(126, envelope.ResultCount, "vector@result = 원문 행수");
+        var row = envelope.Rows[0];
+        Assert.AreEqual("000800", SeibroXml.GetOrNull(row, "SHOTN_ISIN"));
+        Assert.AreEqual("경남기업", SeibroXml.GetOrNull(row, "KOR_SECN_NM"));
+        Assert.AreEqual("80", SeibroXml.GetOrNull(row, "ISSUCO_CUSTNO"));
+    }
+
+    [TestMethod]
+    public void Parse_EmptyResult_ZeroRows()
+    {
+        // result="0" + data 없음 = 정상 빈 결과 (getXrcStkStatInfo 샘플이 실제 이 형태)
+        var envelope = SeibroXml.Parse(SeibroFixtures.Read("getXrcStkStatInfo.xml"));
+
+        Assert.AreEqual(0, envelope.ResultCount);
+        Assert.AreEqual(0, envelope.Rows.Count);
+    }
+
+    [TestMethod]
+    public void Parse_EmptyValueAttribute_TreatedAsNull()
+    {
+        // value="" 는 null 취급 — 행 딕셔너리에서 키 자체가 빠진다 (element 생략과 동일 의미)
+        const string xml = """
+        <vector result="1">
+        <data vectorkey="0" type="Document">
+        <result>
+        <ISIN value="KR7005930003"/>
+        <EMPTY_FIELD value=""/>
+        </result>
+        </data>
+        </vector>
+        """;
+
+        var envelope = SeibroXml.Parse(xml);
+
+        Assert.AreEqual(1, envelope.Rows.Count);
+        Assert.AreEqual("KR7005930003", SeibroXml.GetOrNull(envelope.Rows[0], "ISIN"));
+        Assert.IsNull(SeibroXml.GetOrNull(envelope.Rows[0], "EMPTY_FIELD"), "value=\"\" → null");
+        Assert.IsNull(SeibroXml.GetOrNull(envelope.Rows[0], "OMITTED_FIELD"), "element 생략 → null");
+    }
+
+    [TestMethod]
+    public void Parse_FieldLookup_IsCaseInsensitive()
+    {
+        const string xml = """
+        <vector result="1">
+        <data vectorkey="0" type="Document">
+        <RESULT>
+        <ISSUCO_CUSTNO value="593"/>
+        </RESULT>
+        </data>
+        </vector>
+        """;
+
+        var envelope = SeibroXml.Parse(xml);
+
+        Assert.AreEqual("593", SeibroXml.GetOrNull(envelope.Rows[0], "issuco_custno"), "필드명 조회는 대소문자 무시");
+    }
+
+    [TestMethod]
+    public void Parse_NonXmlInput_Throws()
+    {
+        // 비XML 응답(에러 페이지 등)은 명시적 예외 — silent 빈 결과 금지
+        Assert.ThrowsExactly<XmlException>(() => SeibroXml.Parse("Unauthorized Key"));
+    }
+
+    [TestMethod]
+    public void Parse_NonVectorRoot_Throws()
+    {
+        Assert.ThrowsExactly<FormatException>(() => SeibroXml.Parse("<error message=\"invalid key\"/>"));
+    }
+
+    [TestMethod]
+    public void Parse_MissingResultAttribute_Throws()
+    {
+        Assert.ThrowsExactly<FormatException>(() => SeibroXml.Parse("<vector><data vectorkey=\"0\"><result/></data></vector>"));
+    }
+}

+ 30 - 0
Web.Api/Endpoints/Market/DividendCalendar.cs

@@ -0,0 +1,30 @@
+using Application.Abstractions.Messaging;
+using Web.Api.Common;
+using Web.Api.Extensions;
+
+namespace Web.Api.Endpoints.Market;
+
+/// <summary>배당 캘린더 — 기간(권리기준일 from/to) 배당 일정 목록. 권리락일·현금/주식 구분 포함 (익명 열람). SEIBro 배당 수집.</summary>
+internal sealed class DividendCalendar : IEndpoint
+{
+    public void MapEndpoint(IEndpointRouteBuilder app)
+    {
+        app.MapGet("api/market/dividend-calendar", async (
+            ISender sender,
+            DateOnly? from = null,
+            DateOnly? to = null,
+            int page = 1,
+            ushort perPage = 30,
+            CancellationToken ct = default
+        ) => {
+            var result = await sender.Send(new Application.Features.Api.Stocks.GetDividendCalendar.Query(from, to, page, perPage), ct);
+
+            return result.Match(
+                () => ApiResponse.Ok(result.Value),
+                CustomResults.Problem
+            );
+        })
+        .WithTags("Market")
+        .AllowAnonymous();
+    }
+}

+ 29 - 0
Web.Api/Endpoints/Stocks/Dividends.cs

@@ -0,0 +1,29 @@
+using Application.Abstractions.Messaging;
+using Web.Api.Common;
+using Web.Api.Extensions;
+
+namespace Web.Api.Endpoints.Stocks;
+
+/// <summary>종목 배당 이력 — 단축코드(6자리) 배당 이력. 시가배당율·주당배당금·권리락일 포함 (익명 열람). 종목 상세 배당탭.</summary>
+internal sealed class Dividends : IEndpoint
+{
+    public void MapEndpoint(IEndpointRouteBuilder app)
+    {
+        app.MapGet("api/stocks/{code:regex(^\\d{{6}}$)}/dividends", async (
+            string code,
+            ISender sender,
+            int page = 1,
+            ushort perPage = 30,
+            CancellationToken ct = default
+        ) => {
+            var result = await sender.Send(new Application.Features.Api.Stocks.GetStockDividends.Query(code, page, perPage), ct);
+
+            return result.Match(
+                () => ApiResponse.Ok(result.Value),
+                CustomResults.Problem
+            );
+        })
+        .WithTags("Stocks")
+        .AllowAnonymous();
+    }
+}