티스토리 뷰

Web/ASP.NET Core

Application State vs 전역 Static 변수

풍요로운 해구름 2019. 8. 19. 15:55

ASP.NET 웹사이트 전역에서 사용할 값을 저장하는 방법은 여러 가지가 있습니다. 대표적으로 Application State에 저장하는 방법과 전역 Static 변수에 담는 방법, DB나 파일로 저장하는 방법 등이 있습니다. 이러한 방법들의 특징과 장단점을 파악하여 적절하게 사용하는 것이 필요합니다.

Application(혹은 Session) State에 값을 저장 

  • 저장위치: Application State에 값을 저장하면 기본적으로 메모리에 저장됩니다. 따라서 파일로 저장하거나 DB에 쓰는 것보다는 빠른 속도를 보장합니다. 하지만 방대한 데이터를 Application State로 저장할 경우 서버의 메모리가 부족해질 수 도 있습니다. 이 경우 서버는 자주 메모리의 데이터를 디스크에 페이징하려고 할 것이며 성능저하가 야기될 수 있습니다. 대량의 데이터는 ASP.NET Cache를 통해 관리하는 방법이 권장됩니다. ASP.NET Cache는 메모리에 데이터를 저장하며, 주기적으로 캐시의 데이터를 관리하고, 메모리가 부족해질 경우 사용빈도가 낮은 데이터를 삭제하도록 하여 메모리 부족이슈를 예방할 수 있습니다.
  • 휘발성: Application State에 저장된 값들은 메모리에 저장되기 때문에 웹사이트가 정지되거나 재시작될 때 모든 값들도 초기화 됩니다. 예를들어 Web.config가 변경되거나 장기간 방문자가 없을 경우 웹사이트는 재시작되거나 중지될 수 있으며 이 때 Application State에 저장된 정보도 소실됩니다. Application State 정보들이 DB에 저장되도록 설정하면 값이 소실되는 것을 방지할 수 있지만 읽고/쓰는 속도는 상대적으로 저하될 수 있습니다. Global.asax 파일에서 Application_Start 등의 이벤트를 활용하여 Application State 값이 유지되도록 할 수도 있습니다.
  • 확장성: Application State에 저장된 값은 같은 웹사이트끼리 공유되지 않습니다. 예를들어 Web Farm과 같이 하나의 웹사이트를 여러 서버에 호스팅하거나, Web Garden과 같이 하나의 웹사이트가 동일 서버에 존재하더라도 여러 Worker 프로세서로 동작하는 경우에는 Application State 값을 공유하지 않습니다. Application State를 DB에 저장하도록 설정한다면, 멀티 프로세서(Web Garden)나 멀티 서버(Web Farm) 환경에서 Application State를 공유할 수 있습니다.
  • 동시성: Application State는 Thread-safe를 보장합니다. 즉 다수의 Thread가 동시에 Application State의 값에 접근할 수 있습니다. Application State의 값을 업데이트 할 때에는 Thread-safe한 방법으로 접근해야 합니다. 이를 위해 LockUnLock 내장 메서드를 지원합니다. 이 메서드들을 통해 여러 Thread가 동시에 값을 업데이트하여 무결성을 해치는 것을 예방 할 수 있습니다.

전역 Static 변수

Application State에 값을 저장하는 대신 전역 Static 변수에 값을 저장 할 수 있습니다. Static 변수에 값을 저장하고 읽는 방법은 단순하면서 빠른 성능을 보장합니다. 다만 Static 변수에 저장된 객체는 Gabage Collection의 대상이 되지 않기 때문에 주의가 필요합니다. 또한 언제든지 웹사이트 재시작으로 인해 값이 소실될 수 있다는 점을 유의해야합니다. 만약 여러 Thread에 의해 업데이트 된다면 Thread-safe에 대한 고려도 필요합니다.

영구적인 값 유지

ASP.NET 웹사이트는 IIS에 의해 언제든지 재시작될 수 있고, 서비스가 중지되었다가 재개될 수 있습니다. 따라서 전역 변수, Session, Application, Cache와 같이 메모리에 데이터를 저장할 경우 언제든지 값이 소실될 수 있음에 주의해야 합니다. 만약 영구적으로 데이터가 유지되어야 한다면 DB나 파일에 저장하는 방법을 고려해야 합니다.

'Web > ASP.NET Core' 카테고리의 다른 글

Application State vs 전역 Static 변수  (0) 2019.08.19
ASP.NET Core Identity 에러 지역화  (0) 2019.04.08
댓글
댓글쓰기 폼