Application Domain #3 - Shadow Copy

2021. 4. 19. 16:33

 

Assembly Shadow Copy란?

  • 섀도 복사를 사용하면 애플리케이션 도메인을 언로드하지 않고 애플리케이션 도메인에서 사용되는 어셈블리를 업데이트할 수 있다.
  • 특히, 이 기능은 ASP.NET 사이트와 같이 지속적으로 제공되어야 하는 애플리케이션에 유용하다.
  • 어셈블리가 로드될 때 CLR(공용 언어 런타임)은 어셈블리 파일을 잠그므로 어셈블리가 언로드 될 때까지 파일을 업데이트할 수 없다.
  • 애플리케이션 도메인에서 어셈블리를 언로드 하는 유일한 방법은 애플리케이션 도메인을 언드로 하는 것이므로 일반적인 환경에서는 어셈블리를 사용 중인 모든 애플리케이션 도메인이 언로드 될 때까지 디스크에서 어셈블리를 업데이트할 수 없다.
  • 섀도 복사 파일에 대한 애플리케이션 도메인을 구성하면, 애플리케이션 경로의 어셈블리가 다른 위치로 복사되고 해당 위치에서 로드된다.
  • 복사본이 잠기지만 원래 어셈블리 파일은 잠금 해제되므로 업데이트할 수 있다.
  • ※섀도 복사될 수 있는 유일한 어셈블리는 애플리케이션 도메인이 구성될 때 ApplicationBase 및 PrivateBinPath 속성으로 지정된 애플리케이션 디렉터리나 하위 디렉터리에 저장된 어셈블리이다. 전역 어셈블리 캐시에 저장된 어셈블리는 섀도 복사되지 않는다.

 

 

Shadow Copy 설정 및 사용

  • AppDomainSetUp 클래스의 속성을 사용하여 섀도 복사를 사용하도록 애플리케이션을 구성할 수 있다.
  • ShadowCopyFiles 속성 "true"
    • 애플리케이션 경로의 모든 어셈블리가 로드되기 전에 다운로드 캐시로 복사된다. 이는 다른 컴퓨터에서 다운로드된 파일을 저장하도록 CLR(공용 언어 런타임)에서 유지 관리되는 것과 같은 캐시고, CLR(공용 언어 런타임)에서는 더 이상 필요하지 않을 때 자동으로 파일을 삭제한다.
  • [Option] CachePath 속성과 ApplicationName 속성을 사용하여 섀도 복사된 파일의 사용자 지정 위치를 설정
    • 사용자 지정 위치를 지정하면 더 이상 필요하지 않은 디렉터리 및 복사된 파일을 정리해야 한다. 이 항목들은 자동으로 삭제되지 않는다.
  • [Option] ShadowCopyDirectories 속성을 사용하여 새도 복사되는 어셈블리를 제한
    • 애플리케이션 도메인에 대해 섀도 복사를 사용하도록 설정하면 기본적으로 애플리케이션 경로(ApplicationBase 및 PrivateBinPath 속성을 통해 지정된 디렉터리)의 모든 어셈블리가 복사된다. 섀도 복사할 디렉터리만 포함된 문자열을 만들고 문자열을 ShadowCopyDirectories 속성에 할당함으로써, 복사를 선택된 디렉터리로 제한할 수 있다. 즉, 선택된 디렉터리의 어셈블리만 새도 복사된다.
    • 디렉터리간 구분은 세미콜론(;)을 사용하며, 세미콜론은 구분 기호 문자이므로 경로에 세미콜론을 포함하여서는 안된다.
    • ShadowCopyDirectories 속성을 "null"로 설정하면 ApplicationBase 및 PrivateBinPath 속성을 통해 지정된 디렉터리의 모든 어셈블리가 새도 복사된다.

 

 

Shadow Copy 성능

  • 섀도 복사를 사용하는 애플리케이션 도메인이 시작될 때 애플리케이션 디렉터리의 어셈블리가 섀도 복사 디렉터리로 복사되거나 이미 해당 위치에 있는지 확인되는 동안 지연이 발생한다.
  • 어셈블리가 자주 변경되지 않고 대개 어셈블리의 작은 하위 집합에서 변경이 발생하는 애플리케이션에 대한 결과 성능 향상이 크다.

 

UnUsed Function

  • 섀도 복사를 사용하도록 애플리케이션 도메인을 구성할 경우 AppDomainSetUp 클래스의 속성을 사용하는 것을 권장한다(MSDN)
  • AppDomain 클래스에는 애플리케이션 도메인에서 섀도 복사를 제어하는 데 사용될 수 있는 SetShadowCopyFiles 및 ClearShadowCopyPath와 같은 여러 가지 메서드가 있지만 이들 메서드는 . Net Framework 2.0에서 사용되지 않는 것으로 표시되었다.

BELATED ARTICLES

more