본문 바로가기
기타

[ASP.NET Core/Devroup] TempData, ViewData에 대한 고찰

by 항붕쿤 2023. 3. 28.
HttpContext.Session.SetInt32("Id", userModel.Id);
HttpContext.Session.SetString("UserId", userModel.UserId);

TempData["UserId"] = userModel.UserId;

return RedirectToAction("Index", "Post");

로 코딩하면 뷰페이지에 TempData["UserId"]를 전달할 수 있지만

HttpContext.Session.SetInt32("Id", userModel.Id);
HttpContext.Session.SetString("UserId", userModel.UserId);

ViewData["UserId"] = userModel.UserId;

return RedirectToAction("Index", "Post");

로 코딩하면 뷰페이지에 ViewData["UserId"]를 전달할 수 없다.

왜냐하면 RedirectToAction 메서드는 새로운 요청을 생성하기 때문에 이전 요청에서 설정한 ViewData 등의 데이터가 새로운 요청에 전달되지 않는다. 이 때문에 RedirectToAction 이후에는 새로운 요청에서 해당 데이터를 다시 설정해주어야한다.

이게 무슨 소리냐,

HTTP는 클라이언트-서버 모델을 따르는 프로토콜이다. 클라이언트는 서버에 요청을 보내고, 서버는 해당 요청에 대한 응답을 클라이언트에게 보낸다. 이 때, 각 요청과 응답은 독립적으로 처리된다.

따라서 이전 요청이 처리되지 않는 것은 새로운 요청이 왔기 때문이다. 서버는 새로운 요청에 대해 응답을 준비하고 처리하면서, 이전 요청에 대한 처리를 중단하고 새로운 요청에 대한 처리를 우선시한다. 이렇게 함으로써, 서버는 더 높은 처리량과 빠른 응답 시간을 제공할 수 있다.

그러나 TempData는 Session을 이용하여 구현된다. 하지만 일반적인 Session과는 달리 TempData는 데이터를 1회 사용하고 삭제되므로 다음과 같이 코드를 구성하면 된다.

public IActionResult Index()
{
    TempData["Message"] = "Hello World";
    return RedirectToAction("About");
}

public IActionResult About()
{
    ViewData["Message"] = TempData["Message"];
    return View();
}

View()는 새로운 요청이 아닌 현재 요청에서 뷰페이지를 반환하는 것이기 때문이다.