APOD 시스템을 만들며 문득 한가지 생각이 떠올랐다.
"현재의 APOD 사이트는 오늘의 apod 정보만을 가져와서 게시물의 형식으로 저장하는데, 만약 특정한 날에 웹사이트에 방문한 사람이 아무도 없다면 그 날의 apod 정보는 누락된 채 사이트가 운영된다. 그렇다면 웹사이트에 접속할 떄마다 모든 날의 apod 정보를 가져와서 db에 특정날짜의 apod 정보가 없다면 저장시키는 방식으로 사이트를 만들면 되지 않을까?"
실제로 이러한 방식이 현실적으로 가능한가 알아보기 위해 postman이라는 api플랫폼을 이용해 nasa에 있는 모든 apod 정보를 가져와 보았다.
그러나..

apod의 양이 너무 많아 504 게이트웨이 타임아웃이 걸린다.
그리고 이정도의 데이터를 모두 azure db에 욱여넣게되면 내 돈이 남아나질 않게 될것이며, 그렇다고 온프레미스 방식으로 저장하게되면 내 컴퓨터의 용량이 남아나지 않을 것이다.
..일단 현실적인 요소는 제하고 이 방식이 되긴 되는지 확인하기위해 Index 메서드를
public async Task<IActionResult> Index(int? page)
{
using var httpClient = new HttpClient();
var apiKey = "qGLChofuLpstXN2oFvwUGl7nmIdKmRMSy3sEiLuR";
var apiUrl = $"https://api.nasa.gov/planetary/apod?api_key={apiKey}";
var response = await httpClient.GetAsync(apiUrl);
var responseContent = await response.Content.ReadAsStringAsync();
var json = JObject.Parse(responseContent);
var model = new APODModel
{
Hdurl = (string)json["hdurl"],
Url = (string)json["url"],
Title = (string)json["title"],
Explanation = (string)json["explanation"],
Date = (string)json["date"]
};
var apodList = _context.APODModel.Where(APOD => APOD.Title == model.Title).FirstOrDefault();
if(apodList == null)
{
_context.Add(model);
await _context.SaveChangesAsync();
}
int pageSize = 12;
int pageNumber = page ?? 1;
ViewData["CurrentPage"] = pageNumber;
ViewData["TotalPage"] = Math.Ceiling((double)_context.APODModel.Count() / pageSize); ;
return View(await _context.APODModel
.OrderByDescending(APOD => APOD.Date)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.ToListAsync());
}
에서
public async Task<IActionResult> Index(int? page)
{
using var httpClient = new HttpClient();
var apiKey = "qGLChofuLpstXN2oFvwUGl7nmIdKmRMSy3sEiLuR";
var apiUrl = $"https://api.nasa.gov/planetary/apod?api_key={apiKey}&end_date=1996-07-01&start_date=1995-06-16";
var response = await httpClient.GetAsync(apiUrl);
var responseContent = await response.Content.ReadAsStringAsync();
var array = JArray.Parse(responseContent);
foreach(var json in array)
{
var model = new APODModel
{
Hdurl = (string)json["hdurl"],
Url = (string)json["url"],
Title = (string)json["title"],
Explanation = (string)json["explanation"],
Date = (string)json["date"]
};
var apodList = _context.APODModel.Where(APOD => APOD.Title == model.Title).FirstOrDefault();
if (apodList == null)
{
_context.Add(model);
}
}
await _context.SaveChangesAsync();
int pageSize = 12;
int pageNumber = page ?? 1;
ViewData["CurrentPage"] = pageNumber;
ViewData["TotalPage"] = Math.Ceiling((double)_context.APODModel.Count() / pageSize); ;
return View(await _context.APODModel
.OrderByDescending(APOD => APOD.Date)
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.ToListAsync());
}
로 수정하였다.
그 결과



되긴하네..
일단 그럼 최대한 용량을 효율적으로 사용하기위해 Hdurl을 저장하지말고 Url만 저장하여 사용하고
가능한 많은 apod 정보를 담아봐야겠다.
'기타' 카테고리의 다른 글
| [ASP.NET Core/APOD] img의 src 속성이 이미지가 아닌 비디오일 경우 iframe의 src 속성으로 비디오를 출력하는 기능 구현 (0) | 2023.04.19 |
|---|---|
| [군대] 군전역 혹은 군휴가때 개발할 프로젝트 기록 (0) | 2023.04.18 |
| [ASP.NET Core/APOD] View와 RedirectToAction 메서드에 대한 고찰 (0) | 2023.04.11 |
| [ASP.NET Core/APOD] 댓글 저장 방식에 대한 고찰 (0) | 2023.04.10 |
| [ASP.NET Core/APOD] 댓글 기능 구현 (0) | 2023.04.08 |