X\choro 1 rok pred
rodič
commit
cc29573eee
100 zmenil súbory, kde vykonal 1664 pridanie a 483 odobranie
  1. 66 0
      economy/Controllers/BusinessController.cs
  2. 23 22
      economy/Controllers/DaysController.cs
  3. 2 2
      economy/Controllers/EmissionController.cs
  4. 16 15
      economy/Controllers/FinancialController.cs
  5. 3 2
      economy/Controllers/GoldController.cs
  6. 2 2
      economy/Controllers/OilController.cs
  7. 2 2
      economy/Controllers/PriceController.cs
  8. 97 0
      economy/Controllers/WhoisController.cs
  9. 21 1
      economy/Helpers/Common.cs
  10. 0 51
      economy/Models/AnniversaryModel.cs
  11. 63 0
      economy/Models/BusinessModel.cs
  12. 14 0
      economy/Models/Clients.cs
  13. 162 0
      economy/Models/DayModel.cs
  14. 12 0
      economy/Models/EconomyContext.cs
  15. 0 54
      economy/Models/ExchangeModel.cs
  16. 134 0
      economy/Models/FinancialModel.cs
  17. 0 51
      economy/Models/HolidayModel.cs
  18. 0 54
      economy/Models/InterestModel.cs
  19. 0 54
      economy/Models/InternationalModel.cs
  20. 1 1
      economy/Models/ProductModel.cs
  21. 1 1
      economy/Models/Request/Days/Anniversary.cs
  22. 1 1
      economy/Models/Request/Days/Holiday.cs
  23. 1 1
      economy/Models/Request/Days/Seasonal.cs
  24. 1 1
      economy/Models/Request/Days/Sundry.cs
  25. 1 1
      economy/Models/Request/Financial/Exchange.cs
  26. 1 1
      economy/Models/Request/Financial/Interest.cs
  27. 1 1
      economy/Models/Request/Financial/International.cs
  28. 2 2
      economy/Models/Request/Product/Detail.cs
  29. 71 0
      economy/Models/Response/Business/Number.cs
  30. 1 1
      economy/Models/Response/Days/Anniversary.cs
  31. 1 1
      economy/Models/Response/Days/Holiday.cs
  32. 1 1
      economy/Models/Response/Days/Seasonal.cs
  33. 1 1
      economy/Models/Response/Days/Sundry.cs
  34. 1 1
      economy/Models/Response/Financial/Exchange.cs
  35. 1 1
      economy/Models/Response/Financial/Interest.cs
  36. 1 1
      economy/Models/Response/Financial/International.cs
  37. 133 0
      economy/Models/Response/Whois/Domain.cs
  38. 154 0
      economy/Models/Response/Whois/IP.cs
  39. 0 51
      economy/Models/SeasonalModel.cs
  40. 0 51
      economy/Models/SundryModel.cs
  41. 6 0
      economy/Models/Visit.cs
  42. 90 0
      economy/Models/WhoisModel.cs
  43. 5 0
      economy/Program.cs
  44. 141 0
      economy/Views/Business/Number.cshtml
  45. 0 14
      economy/Views/Day/NavTab.cshtml
  46. 1 1
      economy/Views/Days/Anniversary.cshtml
  47. 1 1
      economy/Views/Days/Holiday.cshtml
  48. 14 0
      economy/Views/Days/NavTab.cshtml
  49. 1 1
      economy/Views/Days/Seasonal.cshtml
  50. 1 1
      economy/Views/Days/Sundry.cshtml
  51. 1 1
      economy/Views/Financial/Exchange.cshtml
  52. 1 1
      economy/Views/Financial/Interest.cshtml
  53. 1 1
      economy/Views/Financial/International.cshtml
  54. 5 3
      economy/Views/Home/Index.cshtml
  55. 5 5
      economy/Views/Lotto/Index.cshtml
  56. 2 2
      economy/Views/Price/Detail.cshtml
  57. 32 5
      economy/Views/SCSS/style.scss
  58. 41 17
      economy/Views/Shared/_Layout.cshtml
  59. 320 0
      economy/Views/Whois/Index.cshtml
  60. 4 1
      economy/appsettings.json
  61. BIN
      economy/bin/Debug/net8.0/Azure.Core.dll
  62. BIN
      economy/bin/Debug/net8.0/Azure.Identity.dll
  63. BIN
      economy/bin/Debug/net8.0/Microsoft.Bcl.AsyncInterfaces.dll
  64. BIN
      economy/bin/Debug/net8.0/Microsoft.Data.SqlClient.dll
  65. BIN
      economy/bin/Debug/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll
  66. BIN
      economy/bin/Debug/net8.0/Microsoft.EntityFrameworkCore.Relational.dll
  67. BIN
      economy/bin/Debug/net8.0/Microsoft.EntityFrameworkCore.SqlServer.dll
  68. BIN
      economy/bin/Debug/net8.0/Microsoft.EntityFrameworkCore.dll
  69. BIN
      economy/bin/Debug/net8.0/Microsoft.Extensions.Caching.Abstractions.dll
  70. BIN
      economy/bin/Debug/net8.0/Microsoft.Extensions.Caching.Memory.dll
  71. BIN
      economy/bin/Debug/net8.0/Microsoft.Extensions.Configuration.Abstractions.dll
  72. BIN
      economy/bin/Debug/net8.0/Microsoft.Extensions.Configuration.FileExtensions.dll
  73. BIN
      economy/bin/Debug/net8.0/Microsoft.Extensions.Configuration.Json.dll
  74. BIN
      economy/bin/Debug/net8.0/Microsoft.Extensions.Configuration.dll
  75. BIN
      economy/bin/Debug/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll
  76. BIN
      economy/bin/Debug/net8.0/Microsoft.Extensions.DependencyInjection.dll
  77. BIN
      economy/bin/Debug/net8.0/Microsoft.Extensions.FileProviders.Abstractions.dll
  78. BIN
      economy/bin/Debug/net8.0/Microsoft.Extensions.FileProviders.Physical.dll
  79. BIN
      economy/bin/Debug/net8.0/Microsoft.Extensions.FileSystemGlobbing.dll
  80. BIN
      economy/bin/Debug/net8.0/Microsoft.Extensions.Logging.Abstractions.dll
  81. BIN
      economy/bin/Debug/net8.0/Microsoft.Extensions.Logging.dll
  82. BIN
      economy/bin/Debug/net8.0/Microsoft.Extensions.Options.dll
  83. BIN
      economy/bin/Debug/net8.0/Microsoft.Extensions.Primitives.dll
  84. BIN
      economy/bin/Debug/net8.0/Microsoft.Identity.Client.Extensions.Msal.dll
  85. BIN
      economy/bin/Debug/net8.0/Microsoft.Identity.Client.dll
  86. BIN
      economy/bin/Debug/net8.0/Microsoft.IdentityModel.Abstractions.dll
  87. BIN
      economy/bin/Debug/net8.0/Microsoft.IdentityModel.JsonWebTokens.dll
  88. BIN
      economy/bin/Debug/net8.0/Microsoft.IdentityModel.Logging.dll
  89. BIN
      economy/bin/Debug/net8.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll
  90. BIN
      economy/bin/Debug/net8.0/Microsoft.IdentityModel.Protocols.dll
  91. BIN
      economy/bin/Debug/net8.0/Microsoft.IdentityModel.Tokens.dll
  92. BIN
      economy/bin/Debug/net8.0/Microsoft.SqlServer.Server.dll
  93. BIN
      economy/bin/Debug/net8.0/Microsoft.Win32.SystemEvents.dll
  94. BIN
      economy/bin/Debug/net8.0/System.ClientModel.dll
  95. BIN
      economy/bin/Debug/net8.0/System.Configuration.ConfigurationManager.dll
  96. BIN
      economy/bin/Debug/net8.0/System.Diagnostics.DiagnosticSource.dll
  97. BIN
      economy/bin/Debug/net8.0/System.Drawing.Common.dll
  98. BIN
      economy/bin/Debug/net8.0/System.Formats.Asn1.dll
  99. BIN
      economy/bin/Debug/net8.0/System.IO.Pipelines.dll
  100. BIN
      economy/bin/Debug/net8.0/System.IdentityModel.Tokens.Jwt.dll

+ 66 - 0
economy/Controllers/BusinessController.cs

@@ -0,0 +1,66 @@
+using Microsoft.AspNetCore.Mvc;
+using System.ComponentModel.DataAnnotations;
+using economy.Models;
+using economy.Models.Business.Number;
+
+namespace economy.Controllers
+{
+    public class BusinessController : Controller
+    {
+        [ViewData]
+        [BindProperty(Name = "query", SupportsGet = true)]
+        [Required(ErrorMessage = "검색어를 입력해주세요.")]
+        [StringLength(255, ErrorMessage = "검색어 길이를 초과하였습니다.")]
+        public required string Query { get; set; }
+
+        private readonly NTS_API _NTS_API;
+        private Dictionary<string, string> _queryString;
+
+        public BusinessController(NTS_API NTS_API)
+        {
+            _NTS_API = NTS_API;
+        }
+
+        [HttpGet]
+        public IActionResult Number()
+        {
+            ViewBag.isError = false;
+
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> Search()
+        {
+            try
+            {
+                // 유효성 검사
+                if (!ModelState.IsValid)
+                {
+                    throw new Exception(
+                        string.Join("\n", ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage))
+                    );
+                }
+
+                if (string.IsNullOrWhiteSpace(Query))
+                {
+                    throw new Exception("검색어를 입력해주세요.");                  
+                }
+
+                BusinessModel business = new BusinessModel(_NTS_API);
+
+                ViewBag.result = await business.GetNumberInfo(Query);
+                ViewBag.isError = false;
+            }
+            catch (Exception ex)
+            {
+                ViewBag.isError = true;
+                ViewBag.errorMessage = ex.Message;
+            }
+
+            ViewBag.Query = Query;
+
+            return View("Number");
+        }
+    }
+}

+ 23 - 22
economy/Controllers/DayController.cs → economy/Controllers/DaysController.cs

@@ -1,33 +1,34 @@
 using Microsoft.AspNetCore.Mvc;
 using economy.Helpers;
 using economy.Models;
-using economy.Models.Anniversary;
-using economy.Models.Holiday;
-using economy.Models.Seasonal;
-using economy.Models.Sundry;
+using economy.Models.Days;
+using Anniversary = economy.Models.Days.Anniversary;
+using Holiday = economy.Models.Days.Holiday;
+using Seasonal = economy.Models.Days.Seasonal;
+using Sundry = economy.Models.Days.Sundry;
 
 namespace economy.Controllers
 {
-    public class DayController : Controller
+    public class DaysController : Controller
     {
         private readonly DataGoKR _dataGoKR;
         private Dictionary<string, string> _queryString;
 
-        public DayController(DataGoKR dataGoKR)
+        public DaysController(DataGoKR dataGoKR)
         {
             _dataGoKR = dataGoKR;
         }
 
         // 공휴일/국경일
-        public async Task<IActionResult> Holiday(Models.Holiday.Request request)
+        public async Task<IActionResult> Holiday(Holiday.Request request)
         {
             if (!ModelState.IsValid)
             {
                 return BadRequest(ModelState);
             }
 
-            HolidayModel holiday = new HolidayModel(_dataGoKR);
-            Models.Holiday.Response itemList = await holiday.GetHoliday(request);
+            DaysModel holiday = new DaysModel(_dataGoKR);
+            Holiday.Response itemList = await holiday.GetHoliday(request);
 
             if (itemList is not null)
             {
@@ -39,7 +40,7 @@ namespace economy.Controllers
                 }).ToList();
             }
 
-            var viewModel = new View<Models.Holiday.Request, Models.Holiday.Response>();
+            var viewModel = new View<Holiday.Request, Holiday.Response>();
             viewModel.Request = request;
             viewModel.Response = itemList;
 
@@ -51,15 +52,15 @@ namespace economy.Controllers
         }
 
         // 기념일
-        public async Task<IActionResult> Anniversary(Models.Anniversary.Request request)
+        public async Task<IActionResult> Anniversary(Anniversary.Request request)
         {
             if (!ModelState.IsValid)
             {
                 return BadRequest(ModelState);
             }
 
-            AnniversaryModel anniversary = new AnniversaryModel(_dataGoKR);
-            Models.Anniversary.Response itemList = await anniversary.GetAnniversary(request);
+            DaysModel anniversary = new DaysModel(_dataGoKR);
+            Anniversary.Response itemList = await anniversary.GetAnniversary(request);
 
             if (itemList is not null)
             {
@@ -71,7 +72,7 @@ namespace economy.Controllers
                 }).ToList();
             }
 
-            var viewModel = new View<Models.Anniversary.Request, Models.Anniversary.Response>();
+            var viewModel = new View<Anniversary.Request, Anniversary.Response>();
             viewModel.Request = request;
             viewModel.Response = itemList;
 
@@ -83,15 +84,15 @@ namespace economy.Controllers
         }
 
         // 24절기
-        public async Task<IActionResult> Seasonal(Models.Seasonal.Request request)
+        public async Task<IActionResult> Seasonal(Seasonal.Request request)
         {
             if (!ModelState.IsValid)
             {
                 return BadRequest(ModelState);
             }
 
-            SeasonalModel seasonal = new SeasonalModel(_dataGoKR);
-            Models.Seasonal.Response itemList = await seasonal.GetSeasonal(request);
+            DaysModel seasonal = new DaysModel(_dataGoKR);
+            Seasonal.Response itemList = await seasonal.GetSeasonal(request);
 
             if (itemList is not null)
             {
@@ -103,7 +104,7 @@ namespace economy.Controllers
                 }).ToList();
             }
 
-            var viewModel = new View<Models.Seasonal.Request, Models.Seasonal.Response>();
+            var viewModel = new View<Seasonal.Request, Seasonal.Response>();
             viewModel.Request = request;
             viewModel.Response = itemList;
 
@@ -116,15 +117,15 @@ namespace economy.Controllers
 
 
         // 잡절
-        public async Task<IActionResult> Sundry(Models.Sundry.Request request)
+        public async Task<IActionResult> Sundry(Sundry.Request request)
         {
             if (!ModelState.IsValid)
             {
                 return BadRequest(ModelState);
             }
 
-            SundryModel sundry = new SundryModel(_dataGoKR);
-            Models.Sundry.Response itemList = await sundry.GetSundry(request);
+            DaysModel sundry = new DaysModel(_dataGoKR);
+            Sundry.Response itemList = await sundry.GetSundry(request);
 
             if (itemList is not null)
             {
@@ -136,7 +137,7 @@ namespace economy.Controllers
                 }).ToList();
             }
 
-            var viewModel = new View<Models.Sundry.Request, Models.Sundry.Response>();
+            var viewModel = new View<Sundry.Request, Sundry.Response>();
             viewModel.Request = request;
             viewModel.Response = itemList;
 

+ 2 - 2
economy/Controllers/EmissionController.cs

@@ -61,8 +61,8 @@ namespace economy.Controllers
 
             var queryString = new
             {
-                sDate = request.StartDate,
-                eDate = request.EndDate
+                sDate = request.StartDate.ToString("yyyy-MM-dd"),
+                eDate = request.EndDate.ToString("yyyy-MM-dd")
             };
 
             var pagination = new Pagination(itemList.Body?.TotalCount, request.PageNo, request.NumOfRows, queryString);

+ 16 - 15
economy/Controllers/FinancialController.cs

@@ -1,8 +1,9 @@
 using Microsoft.AspNetCore.Mvc;
 using economy.Models;
-using economy.Models.Exchange;
-using economy.Models.Interest;
-using economy.Models.International;
+using economy.Models.Financial;
+using Exchange = economy.Models.Financial.Exchange;
+using Interest = economy.Models.Financial.Interest;
+using International = economy.Models.Financial.International;
 
 namespace economy.Controllers
 {
@@ -17,17 +18,17 @@ namespace economy.Controllers
         }
 
         // 환율
-        public async Task<IActionResult> Exchange(Models.Exchange.Request request)
+        public async Task<IActionResult> Exchange(Exchange.Request request)
         {
             if (!ModelState.IsValid)
             {
                 return BadRequest(ModelState);
             }
 
-            ExchangeModel exchange = new ExchangeModel(_koreaEximGoKR);
-            Models.Exchange.Response itemList = await exchange.GetExchange(request);
+            FinancialModel exchange = new FinancialModel(_koreaEximGoKR);
+            Exchange.Response itemList = await exchange.GetExchange(request);
 
-            var viewModel = new View<Models.Exchange.Request, Models.Exchange.Response>();
+            var viewModel = new View<Exchange.Request, Exchange.Response>();
             viewModel.Request = request;
             viewModel.Response = itemList;
 
@@ -35,17 +36,17 @@ namespace economy.Controllers
         }
 
         // 대출 금리
-        public async Task<IActionResult> Interest(Models.Interest.Request request)
+        public async Task<IActionResult> Interest(Interest.Request request)
         {
             if (!ModelState.IsValid)
             {
                 return BadRequest(ModelState);
             }
 
-            InterestModel interest = new InterestModel(_koreaEximGoKR);
-            Models.Interest.Response itemList = await interest.GetInterestRate(request);
+            FinancialModel interest = new FinancialModel(_koreaEximGoKR);
+            Interest.Response itemList = await interest.GetInterestRate(request);
 
-            var viewModel = new View<Models.Interest.Request, Models.Interest.Response>();
+            var viewModel = new View<Interest.Request, Interest.Response>();
             viewModel.Request = request;
             viewModel.Response = itemList;
 
@@ -55,17 +56,17 @@ namespace economy.Controllers
         }
 
         // 국제 금리
-        public async Task<IActionResult> International(Models.International.Request request)
+        public async Task<IActionResult> International(International.Request request)
         {
             if (!ModelState.IsValid)
             {
                 return BadRequest(ModelState);
             }
 
-            InternationalModel international = new InternationalModel(_koreaEximGoKR);
-            Models.International.Response itemList = await international.GetInternationalRate(request);
+            FinancialModel international = new FinancialModel(_koreaEximGoKR);
+            International.Response itemList = await international.GetInternationalRate(request);
 
-            var viewModel = new View<Models.International.Request, Models.International.Response>();
+            var viewModel = new View<International.Request, International.Response>();
             viewModel.Request = request;
             viewModel.Response = itemList;
 

+ 3 - 2
economy/Controllers/GoldController.cs

@@ -45,6 +45,7 @@ namespace economy.Controllers
                     row.Clpr = Common.NumberFormat(row.Clpr);
                     row.Vs = Common.NumberFormat(row.Vs);
                     row.FltRt = Common.NumberFormat(row.FltRt, "0.##");
+                    row.Mkp = Common.NumberFormat(row.Mkp);
                     row.Hipr = Common.NumberFormat(row.Hipr);
                     row.Lopr = Common.NumberFormat(row.Lopr);
                     row.Trqu = Common.NumberFormat(row.Trqu);
@@ -60,8 +61,8 @@ namespace economy.Controllers
 
             var queryString = new
             {
-                sDate = request.StartDate,
-                eDate = request.EndDate
+                sDate = request.StartDate.ToString("yyyy-MM-dd"),
+                eDate = request.EndDate.ToString("yyyy-MM-dd")
             };
 
             var pagination = new Pagination(itemList.Body?.TotalCount, request.PageNo, request.NumOfRows, queryString);

+ 2 - 2
economy/Controllers/OilController.cs

@@ -58,8 +58,8 @@ namespace economy.Controllers
 
             var queryString = new
             {
-                sDate = request.StartDate,
-                eDate = request.EndDate
+                sDate = request.StartDate.ToString("yyyy-MM-dd"),
+                eDate = request.EndDate.ToString("yyyy-MM-dd")
             };
 
             var pagination = new Pagination(itemList.Body?.TotalCount, request.PageNo, request.NumOfRows, queryString);

+ 2 - 2
economy/Controllers/PriceController.cs

@@ -87,8 +87,8 @@ namespace economy.Controllers
 
             var queryString = new
             {
-                sDate = request.StartDate,
-                eDate = request.EndDate
+                sDate = request.StartDate.ToString("yyyy-MM-dd"),
+                eDate = request.EndDate.ToString("yyyy-MM-dd")
             };
 
             var pagination = new Pagination(itemInfo.Body?.TotalCount, request.PageNo, request.NumOfRows, queryString);

+ 97 - 0
economy/Controllers/WhoisController.cs

@@ -0,0 +1,97 @@
+using Microsoft.AspNetCore.Mvc;
+using System.ComponentModel.DataAnnotations;
+using economy.Helpers;
+using economy.Models;
+using economy.Models.Whois;
+
+namespace economy.Controllers
+{
+    public class WhoisController : Controller
+    {
+        [ViewData]
+        [BindProperty(Name = "query", SupportsGet = true)]
+        [Required(ErrorMessage = "검색어를 입력해주세요.")]
+        [StringLength(120, ErrorMessage = "검색어 길이를 초과하였습니다.")]
+        public required string Query { get; set; }
+
+        private readonly DataGoKR _dataGoKR;
+        private Dictionary<string, string> _queryString;
+
+        public WhoisController(DataGoKR dataGoKR)
+        {
+            _dataGoKR = dataGoKR;
+        }
+
+        [HttpGet]
+        public IActionResult Index()
+        {
+            ViewBag.isError = false;
+
+            return View();
+        }
+
+        [HttpPost]
+        public async Task<IActionResult> Search()
+        {
+            try
+            {
+                // 유효성 검사
+                if (!ModelState.IsValid)
+                {
+                    throw new Exception(
+                        string.Join("\n", ModelState.Values.SelectMany(v => v.Errors).Select(e => e.ErrorMessage))
+                    );
+                }
+
+                if (string.IsNullOrWhiteSpace(Query))
+                {
+                    throw new Exception("검색어를 입력해주세요.");                  
+                }
+
+                if (Common.IsDomain(Query))
+                {
+                    ViewBag.result = await _Domain();
+                    ViewBag.type = 1;
+                }
+                else if (Common.IsIPv4(Query) || Common.IsIPv6(Query))
+                {
+                    ViewBag.result = await _IP();
+                    ViewBag.type = 2;
+                }
+                else
+                {
+                    throw new Exception("형식이 옳지 않습니다. 올바른 도메인 또는 IP 주소를 입력해주세요.");
+                }
+
+                ViewBag.isError = false;
+            }
+            catch (Exception ex)
+            {
+                ViewBag.isError = true;
+                ViewBag.errorMessage = ex.Message;
+            }
+
+            ViewBag.Query = Query;
+
+            return View("Index");
+        }
+
+        // 도메인 검색
+        private async Task<Models.Whois.Domain.Response> _Domain()
+        {
+            WhoisModel whois = new WhoisModel(_dataGoKR);
+            Models.Whois.Domain.Response domainInfo = await whois.GetDomainInfo(Query);
+
+            return domainInfo;
+        }
+
+        // IP 검색
+        private async Task<Models.Whois.IP.Response> _IP()
+        {
+            WhoisModel whois = new WhoisModel(_dataGoKR);
+            Models.Whois.IP.Response IPInfo = await whois.GetIPInfo(Query);
+
+            return IPInfo;
+        }
+    }
+}

+ 21 - 1
economy/Helpers/Common.cs

@@ -1,4 +1,6 @@
-using System.Xml.Serialization;
+using Microsoft.AspNetCore.Mvc;
+using System.Text.RegularExpressions;
+using System.Xml.Serialization;
 
 namespace economy.Helpers
 {
@@ -45,5 +47,23 @@ namespace economy.Helpers
         {
             return DateTime.ParseExact(s, "yyyyMMdd", null).ToString(format);
         }
+
+        // 도메인 형식 여부
+        public static bool IsDomain(string input)
+        {
+            return Regex.IsMatch(input, @"^[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,}$");
+        }
+
+        // IPv4 형식 여부
+        public static bool IsIPv4(string input)
+        {
+            return Regex.IsMatch(input, @"^(\d{1,3}\.){3}\d{1,3}$");
+        }
+
+        // IPv6 형식 여부
+        public static bool IsIPv6(string input)
+        {
+            return Regex.IsMatch(input, @"^([0-9a-fA-F]{1,4}:){1,7}[0-9a-fA-F]{1,4}(/([0-9]|[1-9][0-9]|1[0-1][0-9]|12[0-8]))?$");
+        }
     }
 }

+ 0 - 51
economy/Models/AnniversaryModel.cs

@@ -1,51 +0,0 @@
-using economy.Helpers;
-
-namespace economy.Models.Anniversary
-{
-    public class AnniversaryModel
-    {
-        private readonly DataGoKR _dataGoKR;
-
-        public AnniversaryModel(DataGoKR dataGoKR)
-        {
-            _dataGoKR = dataGoKR;
-        }
-
-        // 기념일 조회
-        public async Task<Response> GetAnniversary(Request request)
-        {
-            Response parseData = new();
-
-            try
-            {
-                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
-                {
-                    Path = "/B090041/openapi/service/SpcdeInfoService/getAnniversaryInfo",
-                    Query = $"ServiceKey={_dataGoKR.APIKey}&numOfRows=100&solYear={request.Year}"
-                };
-
-                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
-
-                if (response.IsSuccessStatusCode)
-                {
-                    var xmlString = await response.Content.ReadAsStringAsync();
-                    parseData = await Common.ParseXmlDataAsync<Response>(xmlString);
-
-
-                    if (parseData.Body is null)
-                    {
-                        return new Response();
-                    }
-                }
-
-                response.EnsureSuccessStatusCode();
-            }
-            catch (HttpRequestException e)
-            {
-                Console.WriteLine($"Request error: {e.Message}");
-            }
-
-            return parseData;
-        }
-    }
-}

+ 63 - 0
economy/Models/BusinessModel.cs

@@ -0,0 +1,63 @@
+using economy.Helpers;
+using System.Text;
+using System.Text.Json;
+using static Microsoft.EntityFrameworkCore.DbLoggerCategory;
+
+namespace economy.Models.Business.Number
+{
+    /**
+     * http://api.odcloud.kr/api/nts-businessman/v1/status?serviceKey=vQz8tIxrdhjerG6DE1w1hcVEli5S27LtIsCvx0axiieZmRgOpB4vToQ77VmvknAkIC9YjxlPx2gDZcl06S88Xw%3D%3D&returnType=XML
+     */
+    public class BusinessModel
+    {
+        private readonly NTS_API _NTS_API;
+
+        public BusinessModel(NTS_API NTS_API)
+        {
+            _NTS_API = NTS_API;
+        }
+
+        // 사업자 상태 조회
+        public async Task<Number.Response> GetNumberInfo(string query)
+        {
+            Number.Response parsedData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_NTS_API.APIUrl)
+                {
+                    Path = "/api/nts-businessman/v1/status",
+                    Query = $"serviceKey={_NTS_API.APIKey}&returnType=XML"
+                };
+
+                query = query.Trim().Replace("-", "");
+
+                var jsonData = JsonSerializer.Serialize(new
+                {
+                    b_no = new[] { query }
+                });
+                var content = new StringContent(jsonData, Encoding.UTF8, "application/json");
+                var response = await _NTS_API.httpClient.PostAsync(uriBuilder.Uri, content);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var xmlString = await response.Content.ReadAsStringAsync();
+                    parsedData = await Common.ParseXmlDataAsync<Number.Response>(xmlString);
+
+                    if (parsedData.StatusCode == "OK")
+                    {
+                        return parsedData;
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parsedData;
+        }
+    }
+}

+ 14 - 0
economy/Models/Clients.cs

@@ -71,4 +71,18 @@ namespace economy.Models
             httpClient.BaseAddress = new Uri(APIUrl);
         }
     }
+
+    // 국세청 API
+    public class NTS_API
+    {
+        public readonly HttpClient httpClient;
+        public readonly string APIUrl = "http://api.odcloud.kr";
+        public readonly string APIKey = "vQz8tIxrdhjerG6DE1w1hcVEli5S27LtIsCvx0axiieZmRgOpB4vToQ77VmvknAkIC9YjxlPx2gDZcl06S88Xw%3D%3D";
+
+        public NTS_API(HttpClient e)
+        {
+            httpClient = e;
+            httpClient.BaseAddress = new Uri(APIUrl);
+        }
+    }
 }

+ 162 - 0
economy/Models/DayModel.cs

@@ -0,0 +1,162 @@
+using economy.Helpers;
+
+namespace economy.Models.Days
+{
+    public class DaysModel
+    {
+        private readonly DataGoKR _dataGoKR;
+
+        public DaysModel(DataGoKR dataGoKR)
+        {
+            _dataGoKR = dataGoKR;
+        }
+
+        // 기념일 조회
+        public async Task<Anniversary.Response> GetAnniversary(Anniversary.Request request)
+        {
+            Anniversary.Response parseData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
+                {
+                    Path = "/B090041/openapi/service/SpcdeInfoService/getAnniversaryInfo",
+                    Query = $"ServiceKey={_dataGoKR.APIKey}&numOfRows=100&solYear={request.Year}"
+                };
+
+                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var xmlString = await response.Content.ReadAsStringAsync();
+                    parseData = await Common.ParseXmlDataAsync<Anniversary.Response>(xmlString);
+
+
+                    if (parseData.Body is null)
+                    {
+                        return new Anniversary.Response();
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parseData;
+        }
+
+        // 국경일 조회
+        public async Task<Holiday.Response> GetHoliday(Holiday.Request request)
+        {
+            Holiday.Response parseData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
+                {
+                    Path = "/B090041/openapi/service/SpcdeInfoService/getHoliDeInfo",
+                    Query = $"ServiceKey={_dataGoKR.APIKey}&numOfRows=100&solYear={request.Year}"
+                };
+
+                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var xmlString = await response.Content.ReadAsStringAsync();
+                    parseData = await Common.ParseXmlDataAsync<Holiday.Response>(xmlString);
+
+
+                    if (parseData.Body is null)
+                    {
+                        return new Holiday.Response();
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parseData;
+        }
+
+        // 기념일 조회
+        public async Task<Seasonal.Response> GetSeasonal(Seasonal.Request request)
+        {
+            Seasonal.Response parseData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
+                {
+                    Path = "/B090041/openapi/service/SpcdeInfoService/get24DivisionsInfo",
+                    Query = $"ServiceKey={_dataGoKR.APIKey}&numOfRows=100&solYear={request.Year}"
+                };
+
+                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var xmlString = await response.Content.ReadAsStringAsync();
+                    parseData = await Common.ParseXmlDataAsync<Seasonal.Response>(xmlString);
+
+
+                    if (parseData.Body is null)
+                    {
+                        return new Seasonal.Response();
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parseData;
+        }
+
+        // 잡절 조회
+        public async Task<Sundry.Response> GetSundry(Sundry.Request request)
+        {
+            Sundry.Response parseData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
+                {
+                    Path = "/B090041/openapi/service/SpcdeInfoService/getSundryDayInfo",
+                    Query = $"ServiceKey={_dataGoKR.APIKey}&numOfRows=100&solYear={request.Year}"
+                };
+
+                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var xmlString = await response.Content.ReadAsStringAsync();
+                    parseData = await Common.ParseXmlDataAsync<Sundry.Response>(xmlString);
+
+
+                    if (parseData.Body is null)
+                    {
+                        return new Sundry.Response();
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parseData;
+        }
+    }
+}

+ 12 - 0
economy/Models/EconomyContext.cs

@@ -0,0 +1,12 @@
+using Microsoft.EntityFrameworkCore;
+
+namespace economy.Models
+{
+    public class EconomyContext: DbContext
+    {
+        public EconomyContext(DbContextOptions<EconomyContext> options) : base(options)
+        {
+            System.Console.WriteLine("Complete Database");
+        }
+    }
+}

+ 0 - 54
economy/Models/ExchangeModel.cs

@@ -1,54 +0,0 @@
-using System.Text.Json;
-
-namespace economy.Models.Exchange
-{
-    public class ExchangeModel
-    {
-        private readonly KoreaEximGoKR _koreaEximGoKR;
-
-        public ExchangeModel(KoreaEximGoKR koreaEximGoKR)
-        {
-            _koreaEximGoKR = koreaEximGoKR;
-        }
-
-        // 환율 조회
-        public async Task<Response> GetExchange(Request request)
-        {
-            Response parseData = new();
-
-            try
-            {
-                var uriBuilder = new UriBuilder(_koreaEximGoKR.APIUrl)
-                {
-                    Path = "/site/program/financial/exchangeJSON",
-                    Query = $"authkey={_koreaEximGoKR.ExchangeAPIKey}&searchdate={request.Date:yyyyMMdd}&data=AP01"
-                };
-
-                var response = await _koreaEximGoKR.httpClient.GetAsync(uriBuilder.Uri);
-
-                if (response.IsSuccessStatusCode)
-                {
-                    var jsonString = await response.Content.ReadAsStringAsync();
-
-                    using (var document = JsonDocument.Parse(jsonString))
-                    {
-                        parseData.Items = JsonSerializer.Deserialize<List<Data>>(jsonString);
-                    }
-
-                    if (parseData is null)
-                    {
-                        return new Response();
-                    }
-                }
-
-                response.EnsureSuccessStatusCode();
-            }
-            catch (HttpRequestException e)
-            {
-                Console.WriteLine($"Request error: {e.Message}");
-            }
-
-            return parseData;
-        }
-    }
-}

+ 134 - 0
economy/Models/FinancialModel.cs

@@ -0,0 +1,134 @@
+using System.Text.Json;
+
+namespace economy.Models.Financial
+{
+    public class FinancialModel
+    {
+        private readonly KoreaEximGoKR _koreaEximGoKR;
+
+        public FinancialModel(KoreaEximGoKR koreaEximGoKR)
+        {
+            _koreaEximGoKR = koreaEximGoKR;
+        }
+
+        // 환율 조회
+        public async Task<Exchange.Response> GetExchange(Exchange.Request request)
+        {
+            Exchange.Response parseData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_koreaEximGoKR.APIUrl)
+                {
+                    Path = "/site/program/financial/exchangeJSON",
+                    Query = $"authkey={_koreaEximGoKR.ExchangeAPIKey}&searchdate={request.Date:yyyyMMdd}&data=AP01"
+                };
+
+                var response = await _koreaEximGoKR.httpClient.GetAsync(uriBuilder.Uri);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var jsonString = await response.Content.ReadAsStringAsync();
+
+                    using (var document = JsonDocument.Parse(jsonString))
+                    {
+                        parseData.Items = JsonSerializer.Deserialize<List<Exchange.Data>>(jsonString);
+                    }
+
+                    if (parseData is null)
+                    {
+                        return new Exchange.Response();
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parseData;
+        }
+
+        // 대출 금리 조회
+        public async Task<Interest.Response> GetInterestRate(Interest.Request request)
+        {
+            Interest.Response parseData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_koreaEximGoKR.APIUrl)
+                {
+                    Path = "/site/program/financial/interestJSON",
+                    Query = $"authkey={_koreaEximGoKR.InterestAPIKey}&searchdate={request.Date:yyyyMMdd}&data=AP02"
+                };
+
+                var response = await _koreaEximGoKR.httpClient.GetAsync(uriBuilder.Uri);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var jsonString = await response.Content.ReadAsStringAsync();
+
+                    using (var document = JsonDocument.Parse(jsonString))
+                    {
+                        parseData.Items = JsonSerializer.Deserialize<List<Interest.Data>>(jsonString);
+                    }
+
+                    if (parseData.Items is null)
+                    {
+                        return new Interest.Response();
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parseData;
+        }
+
+        // 국제 금리 조회
+        public async Task<International.Response> GetInternationalRate(International.Request request)
+        {
+            International.Response parseData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_koreaEximGoKR.APIUrl)
+                {
+                    Path = "/site/program/financial/internationalJSON",
+                    Query = $"authkey={_koreaEximGoKR.InternationalAPIKey}&searchdate={request.Date:yyyyMMdd}&data=AP03"
+                };
+
+                var response = await _koreaEximGoKR.httpClient.GetAsync(uriBuilder.Uri);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var jsonString = await response.Content.ReadAsStringAsync();
+
+                    using (var document = JsonDocument.Parse(jsonString))
+                    {
+                        parseData = JsonSerializer.Deserialize<International.Response>(jsonString);
+                    }
+
+                    if (parseData is null)
+                    {
+                        return new International.Response();
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parseData;
+        }
+    }
+}

+ 0 - 51
economy/Models/HolidayModel.cs

@@ -1,51 +0,0 @@
-using economy.Helpers;
-
-namespace economy.Models.Holiday
-{
-    public class HolidayModel
-    {
-        private readonly DataGoKR _dataGoKR;
-
-        public HolidayModel(DataGoKR dataGoKR)
-        {
-            _dataGoKR = dataGoKR;
-        }
-
-        // 국경일 조회
-        public async Task<Response> GetHoliday(Request request)
-        {
-            Response parseData = new();
-
-            try
-            {
-                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
-                {
-                    Path = "/B090041/openapi/service/SpcdeInfoService/getHoliDeInfo",
-                    Query = $"ServiceKey={_dataGoKR.APIKey}&numOfRows=100&solYear={request.Year}"
-                };
-
-                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
-
-                if (response.IsSuccessStatusCode)
-                {
-                    var xmlString = await response.Content.ReadAsStringAsync();
-                    parseData = await Common.ParseXmlDataAsync<Response>(xmlString);
-
-
-                    if (parseData.Body is null)
-                    {
-                        return new Response();
-                    }
-                }
-
-                response.EnsureSuccessStatusCode();
-            }
-            catch (HttpRequestException e)
-            {
-                Console.WriteLine($"Request error: {e.Message}");
-            }
-
-            return parseData;
-        }
-    }
-}

+ 0 - 54
economy/Models/InterestModel.cs

@@ -1,54 +0,0 @@
-using System.Text.Json;
-
-namespace economy.Models.Interest
-{
-    public class InterestModel
-    {
-        private readonly KoreaEximGoKR _koreaEximGoKR;
-
-        public InterestModel(KoreaEximGoKR koreaEximGoKR)
-        {
-            _koreaEximGoKR = koreaEximGoKR;
-        }
-
-        // 대출 금리 조회
-        public async Task<Response> GetInterestRate(Request request)
-        {
-            Response parseData = new();
-
-            try
-            {
-                var uriBuilder = new UriBuilder(_koreaEximGoKR.APIUrl)
-                {
-                    Path = "/site/program/financial/interestJSON",
-                    Query = $"authkey={_koreaEximGoKR.InterestAPIKey}&searchdate={request.Date:yyyyMMdd}&data=AP02"
-                };
-
-                var response = await _koreaEximGoKR.httpClient.GetAsync(uriBuilder.Uri);
-
-                if (response.IsSuccessStatusCode)
-                {
-                    var jsonString = await response.Content.ReadAsStringAsync();
-
-                    using (var document = JsonDocument.Parse(jsonString))
-                    {
-                        parseData.Items = JsonSerializer.Deserialize<List<Data>>(jsonString);
-                    }
-
-                    if (parseData.Items is null)
-                    {
-                        return new Response();
-                    }
-                }
-
-                response.EnsureSuccessStatusCode();
-            }
-            catch (HttpRequestException e)
-            {
-                Console.WriteLine($"Request error: {e.Message}");
-            }
-
-            return parseData;
-        }
-    }
-}

+ 0 - 54
economy/Models/InternationalModel.cs

@@ -1,54 +0,0 @@
-using System.Text.Json;
-
-namespace economy.Models.International
-{
-    public class InternationalModel
-    {
-        private readonly KoreaEximGoKR _koreaEximGoKR;
-
-        public InternationalModel(KoreaEximGoKR koreaEximGoKR)
-        {
-            _koreaEximGoKR = koreaEximGoKR;
-        }
-
-        // 국제 금리 조회
-        public async Task<Response> GetInternationalRate(Request request)
-        {
-            Response parseData = new();
-
-            try
-            {
-                var uriBuilder = new UriBuilder(_koreaEximGoKR.APIUrl)
-                {
-                    Path = "/site/program/financial/internationalJSON",
-                    Query = $"authkey={_koreaEximGoKR.InternationalAPIKey}&searchdate={request.Date:yyyyMMdd}&data=AP03"
-                };
-
-                var response = await _koreaEximGoKR.httpClient.GetAsync(uriBuilder.Uri);
-
-                if (response.IsSuccessStatusCode)
-                {
-                    var jsonString = await response.Content.ReadAsStringAsync();
-
-                    using (var document = JsonDocument.Parse(jsonString))
-                    {
-                        parseData = JsonSerializer.Deserialize<Response>(jsonString);
-                    }
-
-                    if (parseData is null)
-                    {
-                        return new Response();
-                    }
-                }
-
-                response.EnsureSuccessStatusCode();
-            }
-            catch (HttpRequestException e)
-            {
-                Console.WriteLine($"Request error: {e.Message}");
-            }
-
-            return parseData;
-        }
-    }
-}

+ 1 - 1
economy/Models/ProductModel.cs

@@ -52,7 +52,7 @@ namespace economy.Models.Product
                 var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
                 {
                     Path = "/1240000/bpp_openapi/getPriceInfo",
-                    Query = $"ServiceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}&startDate={request.StartDate}&endDate={request.EndDate}&itemCode={request.ItemCode}"
+                    Query = $"ServiceKey={_dataGoKR.APIKey}&pageNo={request.PageNo}&numOfRows={request.NumOfRows}&startDate={request.StartDate:yyyy-MM-dd}&endDate={request.EndDate:yyyy-MM-dd}&itemCode={request.ItemCode}"
                 };
 
                 var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);

+ 1 - 1
economy/Models/Request/Days/Anniversary.cs

@@ -1,7 +1,7 @@
 using Microsoft.AspNetCore.Mvc;
 using System.ComponentModel.DataAnnotations;
 
-namespace economy.Models.Anniversary
+namespace economy.Models.Days.Anniversary
 {
     /*
      * 기념일 정보

+ 1 - 1
economy/Models/Request/Days/Holiday.cs

@@ -1,7 +1,7 @@
 using Microsoft.AspNetCore.Mvc;
 using System.ComponentModel.DataAnnotations;
 
-namespace economy.Models.Holiday
+namespace economy.Models.Days.Holiday
 {
     /*
      * 국경일 정보

+ 1 - 1
economy/Models/Request/Days/Seasonal.cs

@@ -1,7 +1,7 @@
 using Microsoft.AspNetCore.Mvc;
 using System.ComponentModel.DataAnnotations;
 
-namespace economy.Models.Seasonal
+namespace economy.Models.Days.Seasonal
 {
     /*
      * 24절기 정보

+ 1 - 1
economy/Models/Request/Days/Sundry.cs

@@ -1,7 +1,7 @@
 using Microsoft.AspNetCore.Mvc;
 using System.ComponentModel.DataAnnotations;
 
-namespace economy.Models.Sundry
+namespace economy.Models.Days.Sundry
 {
     /*
      * 잡절 정보

+ 1 - 1
economy/Models/Request/Financial/Exchange.cs

@@ -1,7 +1,7 @@
 using Microsoft.AspNetCore.Mvc;
 using System.ComponentModel.DataAnnotations;
 
-namespace economy.Models.Exchange
+namespace economy.Models.Financial.Exchange
 {
     /*
      * 한국수출입은행이 제공하는 환율정보

+ 1 - 1
economy/Models/Request/Financial/Interest.cs

@@ -1,7 +1,7 @@
 using Microsoft.AspNetCore.Mvc;
 using System.ComponentModel.DataAnnotations;
 
-namespace economy.Models.Interest
+namespace economy.Models.Financial.Interest
 {
     /*
      * 한국수출입은행이 제공하는 대출금리

+ 1 - 1
economy/Models/Request/Financial/International.cs

@@ -1,7 +1,7 @@
 using Microsoft.AspNetCore.Mvc;
 using System.ComponentModel.DataAnnotations;
 
-namespace economy.Models.International
+namespace economy.Models.Financial.International
 {
     /*
      * 한국수출입은행이 제공하는 국제금리

+ 2 - 2
economy/Models/Request/Product/Detail.cs

@@ -29,12 +29,12 @@ namespace economy.Models.Product.Detail
         [Required(ErrorMessage = "검색 시작날짜를 입력해주세요.")]
         [DataType(DataType.Date)]
         [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
-        public DateOnly StartDate { get; set; } = DateOnly.FromDateTime(DateTime.Now);
+        public DateTime StartDate { get; set; } = DateTime.Now;
 
         [BindProperty(Name = "eDate", SupportsGet = true)]
         [Required(ErrorMessage = "검색 종료날짜를 입력해주세요.")]
         [DataType(DataType.Date)]
         [DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:yyyy-MM-dd}")]
-        public DateOnly EndDate { get; set; } = DateOnly.FromDateTime(DateTime.Now);
+        public DateTime EndDate { get; set; } = DateTime.Now;
     }
 }

+ 71 - 0
economy/Models/Response/Business/Number.cs

@@ -0,0 +1,71 @@
+using System.Xml.Serialization;
+
+namespace economy.Models.Business.Number
+{
+    [XmlRoot("Response")]
+    public class Response
+    {
+        [XmlElement("RequestCnt")]
+        public int RequestCnt { get; set; }
+
+        [XmlElement("StatusCode")]
+        public string StatusCode { get; set; }
+
+        [XmlArray("Data")]
+        [XmlArrayItem("Item")]
+        public List<Item> Data { get; set; } = new List<Item>();
+    }
+
+    public class Item
+    {
+        // 사업자등록번호
+        [XmlElement("BNo")]
+        public string BNo { get; set; }
+
+        // 납세자상태(명칭)
+        [XmlElement("BStt")]
+        public string? BStt { get; set; }
+
+        // 납세자상태(코드)
+        [XmlElement("BSttCd")]
+        public string? BSttCd { get; set; }
+
+        // 과세유형메세지(명칭)
+        [XmlElement("TaxType")]
+        public string? TaxType { get; set; }
+
+        // 과세유형메세지(코드)
+        [XmlElement("TaxTypeCd")]
+        public string? TaxTypeCd { get; set; }
+
+        // 폐업일
+        [XmlElement("EndDt")]
+        public string? EndDt { get; set; }
+
+        // 단위과세전환폐업여부(Y, N)
+        [XmlElement("UtccYn")]
+        public string? UtccYn { get; set; }
+
+        // 최근과세유형전환일자
+        [XmlElement("TaxTypeChangeDt")]
+        public string? TaxTypeChangeDt { get; set; }
+
+        // 세금계산서적용일자
+        [XmlElement("StaxInvoicePrintYnDt")]
+        public string? StaxInvoicePrintYnDt { get; set; }
+
+        // 직전과세유형메세지(명칭)
+        /**
+         * 01:부가가치세 일반과세자,
+         * 02:부가가치세 간이과세자,
+         * 07:부가가치세 간이과세자(세금계산서 발급사업자),
+         * 99:해당없음
+         */
+        [XmlElement("RbfTaxType")]
+        public string? RbfTaxType { get; set; }
+
+        // 직전과세유형메세지(코드)
+        [XmlElement("RbfTaxTypeCd")]
+        public string? RbfTaxTypeCd { get; set; }
+    }
+}

+ 1 - 1
economy/Models/Response/Day/Anniversary.cs → economy/Models/Response/Days/Anniversary.cs

@@ -1,6 +1,6 @@
 using System.Xml.Serialization;
 
-namespace economy.Models.Anniversary
+namespace economy.Models.Days.Anniversary
 {
     // 검색결과 변수
     [XmlRoot("response")]

+ 1 - 1
economy/Models/Response/Day/Holiday.cs → economy/Models/Response/Days/Holiday.cs

@@ -1,6 +1,6 @@
 using System.Xml.Serialization;
 
-namespace economy.Models.Holiday
+namespace economy.Models.Days.Holiday
 {
     // 검색결과 변수
     [XmlRoot("response")]

+ 1 - 1
economy/Models/Response/Day/Seasonal.cs → economy/Models/Response/Days/Seasonal.cs

@@ -1,6 +1,6 @@
 using System.Xml.Serialization;
 
-namespace economy.Models.Seasonal
+namespace economy.Models.Days.Seasonal
 {
     // 검색결과 변수
     [XmlRoot("response")]

+ 1 - 1
economy/Models/Response/Day/Sundry.cs → economy/Models/Response/Days/Sundry.cs

@@ -1,6 +1,6 @@
 using System.Xml.Serialization;
 
-namespace economy.Models.Sundry
+namespace economy.Models.Days.Sundry
 {
     // 검색결과 변수
     [XmlRoot("response")]

+ 1 - 1
economy/Models/Response/Financial/Exchange.cs

@@ -1,6 +1,6 @@
 using System.Text.Json.Serialization;
 
-namespace economy.Models.Exchange
+namespace economy.Models.Financial.Exchange
 {
     // 검색결과 변수
     public class Response

+ 1 - 1
economy/Models/Response/Financial/Interest.cs

@@ -1,6 +1,6 @@
 using System.Text.Json.Serialization;
 
-namespace economy.Models.Interest
+namespace economy.Models.Financial.Interest
 {
     // 검색결과 변수
     public class Response

+ 1 - 1
economy/Models/Response/Financial/International.cs

@@ -1,6 +1,6 @@
 using System.Text.Json.Serialization;
 
-namespace economy.Models.International
+namespace economy.Models.Financial.International
 {
     // 검색결과 변수
     public class Response

+ 133 - 0
economy/Models/Response/Whois/Domain.cs

@@ -0,0 +1,133 @@
+using System.Xml.Serialization;
+
+namespace economy.Models.Whois.Domain
+{
+    // 검색결과 변수
+    [XmlRoot(ElementName = "response")]
+    public class Response
+    {
+        [XmlElement(ElementName = "result")]
+        public Result Result { get; set; }
+
+        [XmlElement(ElementName = "whois")]
+        public Whois Whois { get; set; }
+    }
+
+    public class Result
+    {
+        // 결과코드
+        [XmlElement(ElementName = "result_code")]
+        public int ResultCode { get; set; }
+
+        // 결과 메시지
+        [XmlElement(ElementName = "result_msg")]
+        public string ResultMsg { get; set; }
+    }
+
+    public class Whois
+    {
+        [XmlElement(ElementName = "krdomain")]
+        public KrDomain? KrDomain { get; set; }
+
+        [XmlElement(ElementName = "error")]
+        public Error? Error { get; set; }
+    }
+
+    // 응답 없을 경우, 오류 발생 시
+    public class Error
+    {
+        [XmlElement(ElementName = "query")]
+        public string? Query { get; set; }
+
+        [XmlElement(ElementName = "error_code")]
+        public int? ErrorCode { get; set; }
+
+        [XmlElement(ElementName = "error_msg")]
+        public string? ErrorMsg { get; set; }
+    }
+
+    public class KrDomain
+    {
+        // 조회 요청한 주소
+        [XmlElement(ElementName = "name")]
+        public string Name { get; set; }
+
+        // 등록인 이름
+        [XmlElement(ElementName = "regName")]
+        public string RegName { get; set; }
+
+        // 관리자 이름
+        [XmlElement(ElementName = "adminName")]
+        public string AdminName { get; set; }
+
+        // 관리자 이메일
+        [XmlElement(ElementName = "adminEmail")]
+        public string AdminEmail { get; set; }
+
+        // 관리자 전화번호
+        [XmlElement(ElementName = "adminPhone")]
+        public string AdminPhone { get; set; }
+
+        // 최종수정일자
+        [XmlElement(ElementName = "lastUpdatedDate")]
+        public string LastUpdatedDate { get; set; }
+
+        // 등록일자
+        [XmlElement(ElementName = "regDate")]
+        public string RegDate { get; set; }
+
+        // 만료일자
+        [XmlElement(ElementName = "endDate")]
+        public string EndDate { get; set; }
+
+        // 정보공개여부
+        [XmlElement(ElementName = "infoYN")]
+        public string InfoYN { get; set; } = "N";
+
+        // 도메인 상태
+        [XmlElement(ElementName = "domainStatus")]
+        public string DomainStatus { get; set; }
+
+        // 등록대행자 이름
+        [XmlElement(ElementName = "agency")]
+        public string Agency { get; set; }
+
+        // 등록대행자 주소
+        [XmlElement(ElementName = "agency_url")]
+        public string AgencyUrl { get; set; }
+
+        /**
+         * 영문 정보
+         **/
+
+        // 도메인 상태
+        [XmlElement(ElementName = "e_regName")]
+        public string ERegName { get; set; }
+
+        // 도메인 상태
+        [XmlElement(ElementName = "e_addr")]
+        public string EAddr { get; set; }
+
+        // 도메인 상태
+        [XmlElement(ElementName = "e_adminName")]
+        public string EAdminName { get; set; }
+
+        // 도메인 상태
+        [XmlElement(ElementName = "e_agency")]
+        public string EAgency { get; set; }
+
+        /**
+         * 네임서버
+         **/
+
+        // DNSSEC 적용 여부
+        [XmlElement(ElementName = "dnssec")]
+        public string? DNSSEC { get; set; }
+
+        [XmlElement(ElementName = "ns1")]
+        public List<string> NameServers { get; set; } = new List<string>();
+
+        [XmlElement(ElementName = "ip1")]
+        public List<string> IPAddresses { get; set; } = new List<string>();
+    }
+}

+ 154 - 0
economy/Models/Response/Whois/IP.cs

@@ -0,0 +1,154 @@
+using System.Xml.Serialization;
+
+namespace economy.Models.Whois.IP
+{
+    [XmlRoot("response")]
+    public class Response
+    {
+        [XmlElement("result")]
+        public Result Result { get; set; }
+
+        [XmlElement("whois")]
+        public Whois Whois { get; set; }
+    }
+
+    public class Result
+    {
+        // 결과 코드
+        [XmlElement("result_code")]
+        public int ResultCode { get; set; }
+
+        // 결과 메시지
+        [XmlElement("result_msg")]
+        public string ResultMsg { get; set; }
+    }
+
+    public class Whois
+    {
+        // 질의어
+        [XmlElement("query")]
+        public string Query { get; set; }
+
+        // IP 종류
+        [XmlElement("queryType")]
+        public string QueryType { get; set; }
+
+        // 등록대행사
+        [XmlElement("registry")]
+        public string Registry { get; set; }
+
+        // 국가 코드
+        [XmlElement("countryCode")]
+        public string CountryCode { get; set; }
+
+        [XmlElement("korean")]
+        public Korean Korean { get; set; }
+
+        [XmlElement("english")]
+        public English English { get; set; }
+
+        [XmlElement("error")]
+        public Error Error { get; set; }
+    }
+
+    public class Korean
+    {
+        [XmlElement("ISP")]
+        public ISP ISP { get; set; }
+
+        [XmlElement("user")]
+        public User User { get; set; }
+    }
+
+    public class English
+    {
+        [XmlElement("ISP")]
+        public ISP ISP { get; set; }
+
+        [XmlElement("user")]
+        public User User { get; set; }
+    }
+
+    public class ISP
+    {
+        [XmlElement("netInfo")]
+        public NetInfo NetInfo { get; set; }
+
+        [XmlElement("techContact")]
+        public TechContact TechContact { get; set; }
+    }
+
+    public class User
+    {
+        [XmlElement("netInfo")]
+        public NetInfo NetInfo { get; set; }
+
+        [XmlElement("techContact")]
+        public TechContact TechContact { get; set; }
+    }
+
+    public class NetInfo
+    {
+        // IP 대역(영문)
+        [XmlElement("range")]
+        public string Range { get; set; }
+
+        // IP Prefix(영문)
+        [XmlElement("prefix")]
+        public string Prefix { get; set; }
+
+        // 기관 이름(영문)
+        [XmlElement("orgName")]
+        public string OrgName { get; set; }
+
+        // 연결 서비스 이름(영문)
+        [XmlElement("servName")]
+        public string ServName { get; set; }
+
+        // 기관 ID(영문)
+        [XmlElement("orgID")]
+        public string OrgID { get; set; }
+
+        // 주소(영문)
+        [XmlElement("addr")]
+        public string Addr { get; set; }
+
+        // 우편번호(영문)
+        [XmlElement("zipCode")]
+        public string ZipCode { get; set; }
+
+        // 등록일자(영문)
+        [XmlElement("regDate")]
+        public string RegDate { get; set; }
+
+        [XmlElement("netType")]
+        public string NetType { get; set; }
+    }
+
+    public class TechContact
+    {
+        // 네트워크 담당자 이름
+        [XmlElement("name")]
+        public string Name { get; set; }
+
+        // 네트워크 담당자 전화번호
+        [XmlElement("phone")]
+        public string Phone { get; set; }
+
+        // 네트워크 담당자 이메일 주소
+        [XmlElement("email")]
+        public string Email { get; set; }
+    }
+
+    public class Error
+    {
+        [XmlElement("query")]
+        public string Query { get; set; }
+
+        [XmlElement("error_code")]
+        public string ErrorCode { get; set; }
+
+        [XmlElement("error_msg")]
+        public string ErrorMsg { get; set; }
+    }
+}

+ 0 - 51
economy/Models/SeasonalModel.cs

@@ -1,51 +0,0 @@
-using economy.Helpers;
-
-namespace economy.Models.Seasonal
-{
-    public class SeasonalModel
-    {
-        private readonly DataGoKR _dataGoKR;
-
-        public SeasonalModel(DataGoKR dataGoKR)
-        {
-            _dataGoKR = dataGoKR;
-        }
-
-        // 기념일 조회
-        public async Task<Response> GetSeasonal(Request request)
-        {
-            Response parseData = new();
-
-            try
-            {
-                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
-                {
-                    Path = "/B090041/openapi/service/SpcdeInfoService/get24DivisionsInfo",
-                    Query = $"ServiceKey={_dataGoKR.APIKey}&numOfRows=100&solYear={request.Year}"
-                };
-
-                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
-
-                if (response.IsSuccessStatusCode)
-                {
-                    var xmlString = await response.Content.ReadAsStringAsync();
-                    parseData = await Common.ParseXmlDataAsync<Response>(xmlString);
-
-
-                    if (parseData.Body is null)
-                    {
-                        return new Response();
-                    }
-                }
-
-                response.EnsureSuccessStatusCode();
-            }
-            catch (HttpRequestException e)
-            {
-                Console.WriteLine($"Request error: {e.Message}");
-            }
-
-            return parseData;
-        }
-    }
-}

+ 0 - 51
economy/Models/SundryModel.cs

@@ -1,51 +0,0 @@
-using economy.Helpers;
-
-namespace economy.Models.Sundry
-{
-    public class SundryModel
-    {
-        private readonly DataGoKR _dataGoKR;
-
-        public SundryModel(DataGoKR dataGoKR)
-        {
-            _dataGoKR = dataGoKR;
-        }
-
-        // 잡절 조회
-        public async Task<Response> GetSundry(Request request)
-        {
-            Response parseData = new();
-
-            try
-            {
-                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
-                {
-                    Path = "/B090041/openapi/service/SpcdeInfoService/getSundryDayInfo",
-                    Query = $"ServiceKey={_dataGoKR.APIKey}&numOfRows=100&solYear={request.Year}"
-                };
-
-                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
-
-                if (response.IsSuccessStatusCode)
-                {
-                    var xmlString = await response.Content.ReadAsStringAsync();
-                    parseData = await Common.ParseXmlDataAsync<Response>(xmlString);
-
-
-                    if (parseData.Body is null)
-                    {
-                        return new Response();
-                    }
-                }
-
-                response.EnsureSuccessStatusCode();
-            }
-            catch (HttpRequestException e)
-            {
-                Console.WriteLine($"Request error: {e.Message}");
-            }
-
-            return parseData;
-        }
-    }
-}

+ 6 - 0
economy/Models/Visit.cs

@@ -0,0 +1,6 @@
+namespace economy.Models
+{
+    public class Visit
+    {
+    }
+}

+ 90 - 0
economy/Models/WhoisModel.cs

@@ -0,0 +1,90 @@
+using System.Collections.Generic;
+using System.Text.Json;
+using economy.Helpers;
+using economy.Models.Whois.Domain;
+using economy.Models.Whois.IP;
+
+namespace economy.Models.Whois
+{
+    public class WhoisModel
+    {
+        private readonly DataGoKR _dataGoKR;
+
+        public WhoisModel(DataGoKR dataGoKR)
+        {
+            _dataGoKR = dataGoKR;
+        }
+
+        // Domain 조회
+        public async Task<Domain.Response> GetDomainInfo(string query)
+        {
+            Domain.Response parsedData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
+                {
+                    Path = "/B551505/whois/domain_name",
+                    Query = $"serviceKey={_dataGoKR.APIKey}&query={query}&answer=xml"
+                };
+
+                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var xmlString = await response.Content.ReadAsStringAsync();
+                    parsedData = await Common.ParseXmlDataAsync<Domain.Response>(xmlString);
+
+                    if (parsedData.Result.ResultCode is 10000)
+                    {
+                        return parsedData;
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parsedData;
+        }
+
+        // IP 조회
+        public async Task<IP.Response> GetIPInfo(string query)
+        {
+            IP.Response parsedData = new();
+
+            try
+            {
+                var uriBuilder = new UriBuilder(_dataGoKR.APIUrl)
+                {
+                    Path = "/B551505/whois/ip_address",
+                    Query = $"serviceKey={_dataGoKR.APIKey}&query={query}&answer=xml"
+                };
+
+                var response = await _dataGoKR.httpClient.GetAsync(uriBuilder.Uri);
+
+                if (response.IsSuccessStatusCode)
+                {
+                    var xmlString = await response.Content.ReadAsStringAsync();
+                    parsedData = await Common.ParseXmlDataAsync<IP.Response>(xmlString);
+
+                    if (parsedData.Result.ResultCode is 10000)
+                    {
+                        return parsedData;
+                    }
+                }
+
+                response.EnsureSuccessStatusCode();
+            }
+            catch (HttpRequestException e)
+            {
+                Console.WriteLine($"Request error: {e.Message}");
+            }
+
+            return parsedData;
+        }
+    }
+}

+ 5 - 0
economy/Program.cs

@@ -1,4 +1,5 @@
 using economy.Models;
+using Microsoft.EntityFrameworkCore;
 using System.Text;
 
 var builder = WebApplication.CreateBuilder(args);
@@ -12,6 +13,10 @@ builder.Services.AddHttpClient<FlowerAtOrKR>();
 builder.Services.AddHttpClient<KoreaEximGoKR>();
 builder.Services.AddHttpClient<DhlotteryCoKR>();
 builder.Services.AddHttpClient<FIFA_API>();
+builder.Services.AddHttpClient<NTS_API>();
+
+// DB ¿¬°á
+builder.Services.AddDbContext<EconomyContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection")));
 
 Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); // ÀÎÄÚµù µî·Ï
 

+ 141 - 0
economy/Views/Business/Number.cshtml

@@ -0,0 +1,141 @@
+@using economy.Models.Business.Number
+
+@{
+    ViewData["Title"] = "사업자등록번호 조회";
+}
+
+<div id="businessNumber" class="container">
+    <h3>@ViewData["Title"]</h3>
+    <br/>
+    <form id="fSearch" method="post" accept-charset="UTF-8" rel="search" autocomplete="off" asp-controller="Business" asp-action="Search">
+        <div class="row justify-content-center">
+            <div class="col col-md-4">
+                <div class="input-group">
+                    <input type="text" name="query" class="form-control" value="@ViewBag?.Query" placeholder="예) 123-456-789101" aria-label="예) 123-456-789101" aria-describedby="123-456-789101" autofocus maxlength="255" />
+                    <button class="btn btn-outline-danger" type="submit"><i class="bi bi-search"></i></button>
+                </div>
+            </div>
+        </div>
+
+        @if (@ViewBag?.Query is not null && @ViewBag.isError)
+        {
+            <div class="no-data">
+                조회 결과가 없습니다.
+            </div>
+        }
+        else
+        {
+            var result = (economy.Models.Business.Number.Response)ViewBag.result;
+
+            @if (result?.Data != null && result.Data.Count > 0)
+            {
+                <div class="result w-75 m-auto mt-3 bg-transparent">
+                    <table class="table table-bordered">
+                        <colgroup>
+                            <col width="30%" />
+                            <col width="*" />
+                        </colgroup>
+                        <tbody>
+                            @if (result?.Data != null && result.Data.Any())
+                            {
+                                @foreach(var row in result.Data)
+                                {
+                                    <tr>
+                                        <th>사업자등록번호</th>
+                                        <td>@row.BNo</td>
+                                    </tr>
+                                    <tr>
+                                        <th>납세자상태</th>
+                                        <td>
+                                            @if (row.BStt != "")
+                                            {
+                                                <text>(@row.BSttCd) @row.BStt</text>
+                                            }
+                                            else
+                                            {
+                                                <text>-</text>
+                                            }
+                                        </td>
+                                    </tr>
+                                    <tr>
+                                        <th>과세유형메세지</th>
+                                        <td>
+                                            @if (row.TaxTypeCd != "")
+                                            {
+                                                <text>(@row.TaxTypeCd)</text>
+                                            }
+                                            @row.TaxType
+                                        </td>
+                                    </tr>
+                                    @if (row.EndDt != "")
+                                    {
+                                        <tr>
+                                            <th>폐업일</th>
+                                            <td>@(row?.EndDt ?? "-")</td>
+                                        </tr>
+                                    }
+                                    @if (row.UtccYn != "")
+                                    {
+                                        <tr>
+                                            <th>단위과세전환폐업여부</th>
+                                            <td>@(row?.UtccYn ?? "-")</td>
+                                        </tr>
+                                    }
+                                    @if (row.TaxTypeChangeDt != "")
+                                    {
+                                        <tr>
+                                            <th>최근과세유형전환일자</th>
+                                            <td>@(row?.TaxTypeChangeDt ?? "-")</td>
+                                        </tr>
+                                    }
+                                    @if (row.StaxInvoicePrintYnDt != "")
+                                    {
+                                        <tr>
+                                            <th>세금계산서적용일자</th>
+                                            <td>@(row?.StaxInvoicePrintYnDt ?? "-")</td>
+                                        </tr>
+                                    }
+                                    @if (row.RbfTaxType != "")
+                                    {
+                                    <tr>
+                                        <th>직전과세유형메세지</th>
+                                        <td>
+                                            @if (row.RbfTaxType != "")
+                                            {
+                                                <text>(@row.RbfTaxTypeCd) @row.RbfTaxType</text>
+                                            }
+                                        </td>
+                                    </tr>
+                                    }
+                                }
+                            }
+                        </tbody>
+                    </table>
+
+                    <blockquote>
+                        01:부가가치세 일반과세자<br/>
+                        02:부가가치세 간이과세자<br />
+                        07:부가가치세 간이과세자(세금계산서 발급사업자)<br />
+                        99:해당없음
+                    </blockquote>
+                </div>
+            }
+            else
+            {
+                <div class="row mt-2">
+                    <div class="col text-center">
+                        <small>국세청에서 제공하는 사업자등록정보 진위확인 및 사업자등록 상태조회 API 서비스입니다.</small>
+                    </div>
+                </div>
+                <br />
+            }
+        }
+    </form>
+</div>
+
+@section Scripts {
+    <script src="~/js/business.js" asp-append-version="true"></script>
+}
+@section Styles {
+    <link href="~/css/style.css" rel="stylesheet" asp-append-version="true" />
+}

+ 0 - 14
economy/Views/Day/NavTab.cshtml

@@ -1,14 +0,0 @@
-<ul class="nav nav-tabs mt-3">
-    <li class="nav-item">
-        <a class="nav-link @(ViewData["type"].ToString() == "Holiday" ? "active" : "")" asp-controller="Day" asp-action="Holiday" asp-route-year="@Model.Request.Year">공휴일</a>
-    </li>
-    <li class="nav-item">
-        <a class="nav-link @(ViewData["type"].ToString() == "Anniversary" ? "active" : "")" asp-controller="Day" asp-action="Anniversary" asp-route-year="@Model.Request.Year">기념일</a>
-    </li>
-    <li class="nav-item">
-        <a class="nav-link @(ViewData["type"].ToString() == "Seasonal" ? "active" : "")" asp-controller="Day" asp-action="Seasonal" asp-route-year="@Model.Request.Year">24절기</a>
-    </li>
-    <li class="nav-item">
-        <a class="nav-link @(ViewData["type"].ToString() == "Sundry" ? "active" : "")" asp-controller="Day" asp-action="Sundry" asp-route-year="@Model.Request.Year">잡절</a>
-    </li>
-</ul>

+ 1 - 1
economy/Views/Day/Anniversary.cshtml → economy/Views/Days/Anniversary.cshtml

@@ -1,4 +1,4 @@
-@model economy.Models.View<economy.Models.Anniversary.Request, economy.Models.Anniversary.Response>
+@model economy.Models.View<economy.Models.Days.Anniversary.Request, economy.Models.Days.Anniversary.Response>
 
 @{
     ViewData["Title"] = "기념일";

+ 1 - 1
economy/Views/Day/Holiday.cshtml → economy/Views/Days/Holiday.cshtml

@@ -1,4 +1,4 @@
-@model economy.Models.View<economy.Models.Holiday.Request, economy.Models.Holiday.Response>
+@model economy.Models.View<economy.Models.Days.Holiday.Request, economy.Models.Days.Holiday.Response>
 
 
 @{

+ 14 - 0
economy/Views/Days/NavTab.cshtml

@@ -0,0 +1,14 @@
+<ul class="nav nav-tabs mt-3">
+    <li class="nav-item">
+        <a class="nav-link @(ViewData["type"].ToString() == "Holiday" ? "active" : "")" asp-controller="Days" asp-action="Holiday" asp-route-year="@Model.Request.Year">공휴일</a>
+    </li>
+    <li class="nav-item">
+        <a class="nav-link @(ViewData["type"].ToString() == "Anniversary" ? "active" : "")" asp-controller="Days" asp-action="Anniversary" asp-route-year="@Model.Request.Year">기념일</a>
+    </li>
+    <li class="nav-item">
+        <a class="nav-link @(ViewData["type"].ToString() == "Seasonal" ? "active" : "")" asp-controller="Days" asp-action="Seasonal" asp-route-year="@Model.Request.Year">24절기</a>
+    </li>
+    <li class="nav-item">
+        <a class="nav-link @(ViewData["type"].ToString() == "Sundry" ? "active" : "")" asp-controller="Days" asp-action="Sundry" asp-route-year="@Model.Request.Year">잡절</a>
+    </li>
+</ul>

+ 1 - 1
economy/Views/Day/Seasonal.cshtml → economy/Views/Days/Seasonal.cshtml

@@ -1,4 +1,4 @@
-@model economy.Models.View<economy.Models.Seasonal.Request, economy.Models.Seasonal.Response>
+@model economy.Models.View<economy.Models.Days.Seasonal.Request, economy.Models.Days.Seasonal.Response>
 
 @{
     ViewData["Title"] = "24절기";

+ 1 - 1
economy/Views/Day/Sundry.cshtml → economy/Views/Days/Sundry.cshtml

@@ -1,4 +1,4 @@
-@model economy.Models.View<economy.Models.Sundry.Request, economy.Models.Sundry.Response>
+@model economy.Models.View<economy.Models.Days.Sundry.Request, economy.Models.Days.Sundry.Response>
 
 @{
     ViewData["Title"] = "잡절";

+ 1 - 1
economy/Views/Financial/Exchange.cshtml

@@ -1,4 +1,4 @@
-@model economy.Models.View<economy.Models.Exchange.Request, economy.Models.Exchange.Response>
+@model economy.Models.View<economy.Models.Financial.Exchange.Request, economy.Models.Financial.Exchange.Response>
 
 @{
     ViewData["Title"] = "환율";

+ 1 - 1
economy/Views/Financial/Interest.cshtml

@@ -1,4 +1,4 @@
-@model economy.Models.View<economy.Models.Interest.Request, economy.Models.Interest.Response>
+@model economy.Models.View<economy.Models.Financial.Interest.Request, economy.Models.Financial.Interest.Response>
 
 @{
     ViewData["Title"] = "대출 금리";

+ 1 - 1
economy/Views/Financial/International.cshtml

@@ -1,4 +1,4 @@
-@model economy.Models.View<economy.Models.International.Request, economy.Models.International.Response>
+@model economy.Models.View<economy.Models.Financial.International.Request, economy.Models.Financial.International.Response>
 
 @{
     ViewData["Title"] = "국제 금리";

+ 5 - 3
economy/Views/Home/Index.cshtml

@@ -2,7 +2,9 @@
     ViewData["Title"] = "Home Page";
 }
 
-<div class="text-center">
-    <h1 class="display-4">Welcome</h1>
-    <p>Learn about <a href="https://learn.microsoft.com/aspnet/core">building Web apps with ASP.NET Core</a>.</p>
+<div class="text-center align-mi">
+    <h1 class="display-4">환영합니다.</h1>
+    <p class="mb-2">본 사이트는 국내 공공기관 및 비영리 기관으로 API 지원받아 제작되었습니다.</p>
+
+    또한 개인 학습 및 편의 기능을 제공하기 위해 제작되어 비상업적으로 운영됨을 밝힙니다.
 </div>

+ 5 - 5
economy/Views/Lotto/Index.cshtml

@@ -41,7 +41,7 @@
 
     <br/>
     <div class="table-responsive">
-        <table class="table table-hover table-bordered table-nowrap">
+        <table id="lotto" class="table table-bordered table-nowrap">
             <caption class="caption-top">
                 <h5>@ViewBag.Last 회 당첨번호</h5>
                 (@result.DrawDate 추첨)
@@ -66,19 +66,19 @@
             </tbody>
             <tfoot>
                 <tr>
-                    <td colspan="4" class="text-center">1등 총 당첨금액</td>
+                    <th colspan="4" class="text-center">1등 총 당첨금액</th>
                     <td colspan="4" class="text-end">@result.FirstAccumulatedAmount.ToString("N0") 원</td>
                 </tr>
                 <tr>
-                    <td colspan="4" class="text-center">1 게임당 당첨금액</td>
+                    <th colspan="4" class="text-center">1 게임당 당첨금액</th>
                     <td colspan="4" class="text-end">@result.FirstWinAmount.ToString("N0") 원</td>
                 </tr>
                 <tr>
-                    <td colspan="4" class="text-center">당첨 인원</td>
+                    <th colspan="4" class="text-center">당첨 인원</th>
                     <td colspan="4" class="text-end">@result.FirstPrizeWinnerCount 명</td>
                 </tr>
                 <tr>
-                    <td colspan="4" class="text-center">총 판매금액</td>
+                    <th colspan="4" class="text-center">총 판매금액</th>
                     <td colspan="4" class="text-end">@result.TotalSellAmount.ToString("N0") 원</td>
                 </tr>
             </tfoot>

+ 2 - 2
economy/Views/Price/Detail.cshtml

@@ -18,10 +18,10 @@
         <div class="col-auto">
             <div class="row g-2">
                 <div class="col">
-                    <input type="date" name="sDate" id="sDate" class="form-control" value="@Model.Request.StartDate" form="fSearch" />
+                    <input type="date" name="sDate" id="sDate" class="form-control" value="@Model.Request.StartDate.ToString("yyyy-MM-dd")" form="fSearch" />
                 </div>
                 <div class="col">
-                    <input type="date" name="eDate" id="eDate" class="form-control" value="@Model.Request.EndDate" form="fSearch" />
+                    <input type="date" name="eDate" id="eDate" class="form-control" value="@Model.Request.EndDate.ToString("yyyy-MM-dd")" form="fSearch" />
                 </div>
                 <div class="col">
                     <select name="perPage" id="perPage" class="form-select" asp-for="SelectedListPerPage" asp-items="Model.ListPerPage" form="fSearch"></select>

+ 32 - 5
economy/Views/SCSS/style.scss

@@ -9,9 +9,10 @@
                 -webkit-overflow-scrolling: touch;
                 -ms-overflow-style: none;
                 scrollbar-width: none;
+                overflow: visible;
 
-                ul {
-                    li {
+                > ul {
+                    > li {
                         display: inline-block;
 
                         a {
@@ -19,10 +20,8 @@
                             -webkit-user-drag: none; /* 드래그 방지 (웹킷 브라우저용) */
                             -moz-user-select: none; /* 파이어폭스용 */
                             -ms-user-select: none; /* IE/엣지용 */
-                        }
 
-                        &:hover {
-                            a {
+                            &:hover {
                                 color: chocolate !important;
                                 text-decoration: underline;
                             }
@@ -111,6 +110,34 @@
         }
     }
 }
+ 
+#lotto {
+    thead, tfoot {
+        th {
+            text-align: center;
+            background-color: #eee;
+            vertical-align: middle;
+        }
+    }
+}
+
+#whois, #businessNumber {
+    .no-data, .result {
+        background-color: #eee;
+        border: 1px solid #bbb;
+        border-radius: 5px;
+        margin-top: 10px;
+        padding: 20px;
+    }
+
+    .no-data {
+        text-align: center;
+    }
+
+    .result {
+        text-align: left;
+    }
+}
 
 #pagination {
     justify-items: center;

+ 41 - 17
economy/Views/Shared/_Layout.cshtml

@@ -5,7 +5,7 @@
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <title>@ViewData["Title"] - Economy</title>
     
-    <meta http-equiv="refresh" content="30"/>
+    <meta http-equiv="refresh" content="3000"/>
     <meta name="description" content="다양한 국제 시세 정보를 확인할 수 있습니다."/>
     <meta name="keywords" content="각종 주요 광물, 상품 시세 정보"/>
     <meta name="author" content="김진오"/>
@@ -29,23 +29,28 @@
                 </button>
                 <div id="navMenu" class="navbar-collapse collapse d-sm-inline-flex justify-content-between">
                     <ul class="navbar-nav flex-grow-1 justify-content-center">
-                        <li class="nav-item">
-                            <a class="nav-link text-dark" asp-area="" asp-controller="Gold" asp-action="Index">금시세</a>
-                        </li>
-                        <li class="nav-item">
-                            <a class="nav-link text-dark" asp-area="" asp-controller="Oil" asp-action="Index">석유시세</a>
-                        </li>
-                        <li class="nav-item">
-                            <a class="nav-link text-dark" asp-area="" asp-controller="Emission" asp-action="Index">배출권시세</a>
-                        </li>
-                        <li class="nav-item">
-                            <a class="nav-link text-dark" asp-area="" asp-controller="Price" asp-action="List">품목별 시세</a>
-                        </li>
-                        <li class="nav-item">
-                            <a class="nav-link text-dark" asp-area="" asp-controller="Flower" asp-action="Index">화훼시세</a>
+                        <li class="nav-item dropdown">
+                            <a class="nav-link dropdown-toggle" data-bs-toggle="dropdown" href="#" role="button" aria-expanded="false">시세</a>
+                            <ul class="dropdown-menu">
+                                <li>
+                                    <a class="nav-link text-dark" asp-area="" asp-controller="Gold" asp-action="Index">금 시세</a>
+                                </li>
+                                <li>
+                                    <a class="nav-link text-dark" asp-area="" asp-controller="Oil" asp-action="Index">석유 시세</a>
+                                </li>
+                                <li>
+                                    <a class="nav-link text-dark" asp-area="" asp-controller="Emission" asp-action="Index">배출권시세</a>
+                                </li>
+                                <li>
+                                    <a class="nav-link text-dark" asp-area="" asp-controller="Price" asp-action="List">품목별 시세</a>
+                                </li>
+                                <li>
+                                    <a class="nav-link text-dark" asp-area="" asp-controller="Flower" asp-action="Index">화훼 시세</a>
+                                </li>
+                            </ul>
                         </li>
                         <li class="nav-item">
-                            <a class="nav-link text-dark" asp-area="" asp-controller="Day" asp-action="Holiday">공휴일/특일</a>
+                            <a class="nav-link text-dark" asp-area="" asp-controller="Days" asp-action="Holiday">공휴일/특일</a>
                         </li>
                         <li class="nav-item">
                             <a class="nav-link text-dark" asp-area="" asp-controller="Financial" asp-action="Exchange">환율</a>
@@ -59,6 +64,12 @@
                         <li class="nav-item">
                             <a class="nav-link text-dark" asp-area="" asp-controller="Lotto" asp-action="Index">로또 당첨결과</a>
                         </li>
+                        <li class="nav-item">
+                            <a class="nav-link text-dark" asp-area="" asp-controller="Whois" asp-action="Index">IP 조회</a>
+                        </li>
+                        <li class="nav-item">
+                            <a class="nav-link text-dark" asp-area="" asp-controller="Business" asp-action="Number">사업자등록번호</a>
+                        </li>
                     </ul>
                 </div>
             </div>
@@ -73,7 +84,14 @@
 
     <footer class="border-top footer text-muted">
         <div class="container">
-            &copy; 2023 ~ @DateTime.Now.Year - www.web.or.kr - <a href="https://web.or.kr" ref="author" target="_blank">Goto</a>
+            <div class="row">
+                <div class="col text-center text-sm-start">
+                    &copy; 2023 ~ @DateTime.Now.Year - <a href="https://web.or.kr" ref="author" target="_blank">www.web.or.kr</a>
+                </div>
+                <div class="col text-center text-sm-end">
+                    <small>※ 쿠팡 파트너스 활동을 통해 일정액의 수수료를 제공받을수 있습니다.</small>
+                </div>
+            </div>
         </div>
     </footer>
 
@@ -83,5 +101,11 @@
 
     @await RenderSectionAsync("Scripts", required: false)
 
+    @if (ViewBag != null && ViewBag.isError == true)
+    {
+        <script>
+            alert('@Html.Raw(ViewBag.errorMessage)');
+        </script>
+    }
 </body>
 </html>

+ 320 - 0
economy/Views/Whois/Index.cshtml

@@ -0,0 +1,320 @@
+@using economy.Models.Whois.Domain
+@using economy.Models.Whois.IP
+
+@{
+    ViewData["Title"] = "Whois IP/Doamin 조회";
+}
+
+<div id="whois" class="container">
+    <h3>@ViewData["Title"]</h3>
+    <br/>
+    <form id="fSearch" method="post" accept-charset="UTF-8" rel="search" autocomplete="off" asp-controller="Whois" asp-action="Search">
+        <div class="row justify-content-center">
+            <div class="col col-md-4">
+                <div class="input-group">
+                    <input type="text" name="query" class="form-control" value="@ViewBag?.Query" placeholder="예) 도메인 또는 IP" aria-label="예) 도메인 또는 IP" aria-describedby="IP or Domain Search" autofocus maxlength="120" />
+                    <button class="btn btn-outline-danger" type="submit"><i class="bi bi-search"></i></button>
+                </div>
+            </div>
+        </div>
+
+        @if (@ViewBag?.Query is not null && @ViewBag.isError)
+        {
+            <div class="no-data">
+                조회 결과가 없습니다.
+            </div>
+        }
+        else
+        {
+            @if (ViewBag.result is not null && ViewBag.result.Result.ResultCode == 10000)
+            {
+                <div class="result w-75 m-auto mt-3 bg-transparent">
+                    @switch(ViewBag.type)
+                    {
+                        // 도메인 검색
+                        case 1:
+                            var result = (economy.Models.Whois.Domain.Response)ViewBag.result;
+                        
+                            <table class="table table-bordered">
+                                <caption class="caption-top">
+                                    <h5>@result.Whois.KrDomain.Name</h5>
+                                </caption>
+                                <colgroup>
+                                    <col width="30%"/>
+                                    <col width="*"/>
+                                </colgroup>
+                                <tbody>
+                                    <tr>
+                                        <th>등록인 이름</th>
+                                        <td>@result.Whois.KrDomain.RegName<br />(@result.Whois.KrDomain.ERegName)</td>
+                                    </tr>
+                                    <tr>
+                                        <th>관리자 이름</th>
+                                        <td>@result.Whois.KrDomain.AdminName<br />(@result.Whois.KrDomain.EAdminName)</td>
+                                    </tr>
+                                    <tr>
+                                        <th>관리자 이메일</th>
+                                        <td>@(result.Whois.KrDomain?.AdminEmail ?? "-")</td>
+                                    </tr>
+                                    <tr>
+                                        <th>관리자 연락처</th>
+                                        <td>@(result.Whois.KrDomain?.AdminPhone ?? "-")</td>
+                                    </tr>
+                                    <tr>
+                                        <th>등록일자</th>
+                                        <td>@result.Whois.KrDomain.RegDate</td>
+                                    </tr>
+                                    <tr>
+                                        <th>최근 정보 변경일</th>
+                                        <td>@result.Whois.KrDomain.LastUpdatedDate</td>
+                                    </tr>
+                                    <tr>
+                                        <th>만료일자</th>
+                                        <td>@result.Whois.KrDomain.EndDate</td>
+                                    </tr>
+                                    <tr>
+                                        <th>정보공개여부</th>
+                                        <td>@result.Whois.KrDomain.InfoYN</td>
+                                    </tr>
+                                    <tr>
+                                        <th>등록대행자</th>
+                                        <td>
+                                            <a href="@result.Whois.KrDomain.AgencyUrl" target="_blank" rel="author">@result.Whois.KrDomain.Agency</a><br />(@result.Whois.KrDomain.EAgency)
+                                        </td>
+                                    </tr>
+                                    <tr>
+                                        <th>등록정보 보호</th>
+                                        <td>@result.Whois.KrDomain.DomainStatus</td>
+                                    </tr>
+                                    <tr>
+                                        <th>DNSSEC</th>
+                                        <td>
+                                            @if (@result.Whois.KrDomain.DNSSEC == "unsigned")
+                                            {
+                                                <text>미서명</text>
+                                            }
+                                            else
+                                            {
+                                                <text>서명</text>
+                                            }
+                                        </td>
+                                    </tr>
+                                </tbody>
+                            </table>
+
+                            <!-- DNS 정보 -->
+                            <table class="table table-bordered">
+                                <colgroup>
+                                    <col width="30%" />
+                                    <col width="*" />
+                                </colgroup>
+                                <tbody>
+                                    @if (@result.Whois != null
+                                       && @result.Whois.KrDomain != null
+                                       && @result.Whois.KrDomain.NameServers != null
+                                       && @result.Whois.KrDomain.IPAddresses != null)
+                                    {
+                                        int count = Math.Min(@result.Whois.KrDomain.NameServers.Count, @result.Whois.KrDomain.IPAddresses.Count);
+                                        for (int i = 0; i < count; i++)
+                                        {
+                                            <tr>
+                                                <th colspan="2">@($"{i + 1}차 네임서버")</th>
+                                            </tr>
+                                            <tr>
+                                                <td>호스트 이름</td>
+                                                <td>@result.Whois.KrDomain.NameServers[i]</td>
+                                            </tr>
+                                            <tr>
+                                                <td>IP 주소</td>
+                                                <td>@result.Whois.KrDomain.IPAddresses[i]</td>
+                                            </tr>
+                                        }
+                                    }
+                                    else
+                                    {
+                                        <tr>
+                                            <td colspan="2">네임서버 정보가 없습니다.</td>
+                                        </tr>
+                                    }
+                                </tbody>
+                            </table>
+                            break;
+                        
+                        // IP 검색
+                        case 2:
+                            var IP = (economy.Models.Whois.IP.Response)ViewBag.result;
+
+                            <h5>@IP.Whois.Query</h5>
+
+                            <small>IP 구분 : @IP.Whois.QueryType</small>
+
+                            <br />
+
+                            <small>등록대행사 : @IP.Whois.Registry</small>
+
+                            <br />
+
+                            <small>국가 코드 : @IP.Whois.CountryCode</small>
+
+                            <br />
+                            <hr/>
+
+                            <table class="table table-bordered">
+                                <caption class="caption-top ps-2">
+                                    조회하신 IPv4 주소는 한국인터넷진흥원으로 부터 아래의 관리대행자에게 할당되었으며, 할당 정보는 다음과 같습니다.
+                                </caption>
+                                <colgroup>
+                                    <col width="30%" />
+                                    <col width="*" />
+                                </colgroup>
+                                <tbody>
+                                    <tr>
+                                        <th>서비스 명</th>
+                                        <td>@IP.Whois.Korean.ISP.NetInfo.ServName</td>
+                                    </tr>
+                                    <tr>
+                                        <th>IPv4</th>
+                                        <td>@IP.Whois.Korean.ISP.NetInfo.Range</td>
+                                    </tr>
+                                    <tr>
+                                        <th>
+                                            CIDR <i class="bi bi-info-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="각각 CIDR(클래스 없는 도메인 라우팅, Classless Inter-Domain Routing) 표기법입니다. CIDR 표기법은 네트워크를 나누는 서브넷 마스크를 나타냅니다. 네트워크가 얼마나 세분화되어 있는지 나타내며, 숫자가 클수록 서브넷이 작아지고, 사용 가능한 IP 주소 수도 줄어듭니다."></i>
+                                        </th>
+                                        <td>@IP.Whois.Korean.ISP.NetInfo.Prefix</td>
+                                    </tr>
+                                    <tr>
+                                        <th>기관 ID</th>
+                                        <td>
+                                            @IP.Whois.Korean.ISP.NetInfo.OrgID
+                                        </td>
+                                    </tr>
+                                    <tr>
+                                        <th>기관 명</th>
+                                        <td>@IP.Whois.Korean.User.NetInfo.OrgName<br />(@IP.Whois.English.ISP.NetInfo.OrgName)</td>
+                                    </tr>
+                                    <tr>
+                                        <th>주소</th>
+                                        <td>
+                                            (@IP.Whois.Korean.ISP.NetInfo.ZipCode) @IP.Whois.Korean.ISP.NetInfo.Addr<br />(@IP.Whois.English.ISP.NetInfo.ZipCode) @IP.Whois.English.ISP.NetInfo.Addr
+                                        </td>
+                                    </tr>
+                                    <tr>
+                                        <th>할당일자</th>
+                                        <td>@IP.Whois.Korean.ISP.NetInfo.RegDate</td>
+                                    </tr>
+                                </tbody>
+                            </table>
+
+                            <table class="table table-bordered">
+                                <caption class="caption-top ps-2">
+                                    위의 관리대행자로 부터 아래의 사용자에게 할당되었으며, 할당 정보는 다음과 같습니다.
+                                </caption>
+                                <colgroup>
+                                    <col width="30%" />
+                                    <col width="*" />
+                                </colgroup>
+                                <tbody>
+                                    <tr>
+                                        <th>네트워크 유형</th>
+                                        <td>@IP.Whois.Korean.User.NetInfo.NetType</td>
+                                    </tr>
+                                    <tr>
+                                        <th>IPv4</th>
+                                        <td>@IP.Whois.Korean.User.NetInfo.Range</td>
+                                    </tr>
+                                    <tr>
+                                        <th>CIDR <i class="bi bi-info-circle" data-bs-toggle="tooltip" data-bs-placement="bottom" data-bs-title="각각 CIDR(클래스 없는 도메인 라우팅, Classless Inter-Domain Routing) 표기법입니다. CIDR 표기법은 네트워크를 나누는 서브넷 마스크를 나타냅니다. 네트워크가 얼마나 세분화되어 있는지 나타내며, 숫자가 클수록 서브넷이 작아지고, 사용 가능한 IP 주소 수도 줄어듭니다."></i></th>
+                                        <td>@IP.Whois.Korean.User.NetInfo.Prefix</td>
+                                    </tr>
+                                    <tr>
+                                        <th>기관 ID</th>
+                                        <td>@IP.Whois.Korean.User.NetInfo.OrgID</td>
+                                    </tr>
+                                    <tr>
+                                        <th>기관 명</th>
+                                        <td>@IP.Whois.Korean.User.NetInfo.OrgName<br />(@IP.Whois.English.ISP.NetInfo.OrgName)</td>
+                                    </tr>
+                                    <tr>
+                                        <th>주소</th>
+                                        <td>(@IP.Whois.Korean.User.NetInfo.ZipCode) @IP.Whois.Korean.User.NetInfo.Addr</td>
+                                    </tr>
+                                    <tr>
+                                        <th>할당일자</th>
+                                        <td>@IP.Whois.Korean.User.NetInfo.RegDate</td>
+                                    </tr>
+                                </tbody>
+                            </table>
+
+                            <table class="table table-bordered">
+                                <caption class="caption-top ps-2">
+                                    @IP.Whois.Korean.ISP.TechContact.Name
+                                </caption>
+                                <colgroup>
+                                    <col width="30%" />
+                                    <col width="*" />
+                                </colgroup>
+                                <tbody>
+                                    <tr>
+                                        <th>전자주소</th>
+                                        <td>@IP.Whois.Korean.ISP.TechContact.Email</td>
+                                    </tr>
+                                    <tr>
+                                        <th>연락처</th>
+                                        <td>@IP.Whois.Korean.ISP.TechContact.Phone</td>
+                                    </tr>
+                                </tbody>
+                            </table>
+                            break;
+                    }
+                </div>
+            }
+            else if (ViewBag.result is not null && ViewBag.result.Result.ResultCode != 10000)
+            {
+                <blockquote class="alert alert-danger mt-3" role="alert">
+                    @switch (ViewBag.type)
+                    {
+                        // 도메인 검색
+                        case 1:
+                            var domain = (economy.Models.Whois.Domain.Response)ViewBag.result;
+                            @domain.Result.ResultMsg;
+                            break;
+                        case 2:
+                            var ip = (economy.Models.Whois.IP.Response)ViewBag.result;
+                            @ip.Result.ResultMsg;
+                            break;
+                    }
+                </blockquote>
+            }
+            else
+            {
+                <div class="row mt-2">
+                    <div class="col text-center">
+                        <small>국가 인터넷주소관리기관인 <a href="https://xn--c79as89aj0e29b77z.xn--3e0b707e/" target="_blank">한국인터넷진흥원</a>의 API를 사용합니다.</small>
+                    </div>
+                </div>
+                <br />
+                <blockquote class="text-center">
+                    <strong>도메인 검색 예시</strong><br />
+                    <ul class="list-inline">
+                        <li class="list-inline-item">kisa.or.kr,</li>
+                        <li class="list-inline-item">ns0.kisa.or.kr,</li>
+                        <li class="list-inline-item">한국인터넷진흥원.kr</li>
+                    </ul>
+
+                    <strong>IP 검색 예시</strong><br />
+                    <ul class="list-inline">
+                        <li class="list-inline-item">202.30.50.51,</li>
+                        <li class="list-inline-item">2001:02B8::/32</li>
+                    </ul>
+                </blockquote>
+            }
+        }
+    </form>
+</div>
+
+@section Scripts {
+    <script src="~/js/whois.js" asp-append-version="true"></script>
+}
+@section Styles {
+    <link href="~/css/style.css" rel="stylesheet" asp-append-version="true" />
+}

+ 4 - 1
economy/appsettings.json

@@ -5,5 +5,8 @@
       "Microsoft.AspNetCore": "Warning"
     }
   },
-  "AllowedHosts": "*"
+  "AllowedHosts": "*",
+  "ConnectionStrings": {
+    "DefaultConnection": "Server=localhost;Database=Economy;Trusted_Connection=True;MultipleActiveResultSets=true"
+  }
 }

BIN
economy/bin/Debug/net8.0/Azure.Core.dll


BIN
economy/bin/Debug/net8.0/Azure.Identity.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Bcl.AsyncInterfaces.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Data.SqlClient.dll


BIN
economy/bin/Debug/net8.0/Microsoft.EntityFrameworkCore.Abstractions.dll


BIN
economy/bin/Debug/net8.0/Microsoft.EntityFrameworkCore.Relational.dll


BIN
economy/bin/Debug/net8.0/Microsoft.EntityFrameworkCore.SqlServer.dll


BIN
economy/bin/Debug/net8.0/Microsoft.EntityFrameworkCore.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Extensions.Caching.Abstractions.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Extensions.Caching.Memory.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Extensions.Configuration.Abstractions.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Extensions.Configuration.FileExtensions.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Extensions.Configuration.Json.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Extensions.Configuration.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Extensions.DependencyInjection.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Extensions.FileProviders.Abstractions.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Extensions.FileProviders.Physical.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Extensions.FileSystemGlobbing.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Extensions.Logging.Abstractions.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Extensions.Logging.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Extensions.Options.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Extensions.Primitives.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Identity.Client.Extensions.Msal.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Identity.Client.dll


BIN
economy/bin/Debug/net8.0/Microsoft.IdentityModel.Abstractions.dll


BIN
economy/bin/Debug/net8.0/Microsoft.IdentityModel.JsonWebTokens.dll


BIN
economy/bin/Debug/net8.0/Microsoft.IdentityModel.Logging.dll


BIN
economy/bin/Debug/net8.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll


BIN
economy/bin/Debug/net8.0/Microsoft.IdentityModel.Protocols.dll


BIN
economy/bin/Debug/net8.0/Microsoft.IdentityModel.Tokens.dll


BIN
economy/bin/Debug/net8.0/Microsoft.SqlServer.Server.dll


BIN
economy/bin/Debug/net8.0/Microsoft.Win32.SystemEvents.dll


BIN
economy/bin/Debug/net8.0/System.ClientModel.dll


BIN
economy/bin/Debug/net8.0/System.Configuration.ConfigurationManager.dll


BIN
economy/bin/Debug/net8.0/System.Diagnostics.DiagnosticSource.dll


BIN
economy/bin/Debug/net8.0/System.Drawing.Common.dll


BIN
economy/bin/Debug/net8.0/System.Formats.Asn1.dll


BIN
economy/bin/Debug/net8.0/System.IO.Pipelines.dll


BIN
economy/bin/Debug/net8.0/System.IdentityModel.Tokens.Jwt.dll


Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov