다양한 프레임워크와 라이브러리를 사용하는 요즘의 프로그래밍을 하다가 보면 의례 빠지지 않고 나오는 이름이 Context 다.
웹 프로그래밍을 하는 경우에도 보면 심심찮게 등장하는 클래스들 중에 Context 라는 단어가 들어간 경우가 많다.
(Asp.Net의 HttpContext 나, Java의 ServletContext 같은 것들)
닷넷 프로그램을 하다가 보면, 조금 복잡하고 어려운 내용이다 싶으면 어김없이 Context 라는 단어가 등장하곤 하는데, 이 Context 를 도대체 어떻게 해석해야 좋을지 모르겠다.
일단 사전을 찾아보면, Context 는 '문맥, 정황, 전후관계' 이라고 나온다.
쩝... 별로 도움이 안되는거 같다.
이제부터 내 나름대로 Context 가 가지는 의미에 대해서 이야기를 할텐데,
미천한 나의 경험에서 나온 추측이기 때문에 그 의미가 정확히 들어맞지 않을 수도 있고, 틀릴 수도 있다.
아무쪼록 '저 녀석은 저렇게 생각하는 구나' 정도로 이해해 주면 좋겠다.
보통 XxxContext 라고 하는 클래스들을 보면, 일단 데이터의 집합이다. 어떤 정보의 모음이라는 말이다.
일반적으로 정보의 모음이라고 하면 XxxInfo 정도의 이름이 되는데, 이 Info 와 다른 점이라고 하면,
내가 느낀 바로는, Context 는 항상 '경계, 영역, Boundary' 와 연관되어 있다는 사실이다.
즉 '어떤 영역, 경계를 구분하는 데이터의 모음' 이거나 '어떤 영역, 경계를 넘어갈 때 전달해야 하는 데이터 모음' 의 의미가 강하다는 말이다.
예를 들어, System.Security.SecurityContext 라는 클래스에 대한 MSDN의 설명은, '실행시 보안과 관련된 정보의 묶음'이라고 되어 있다.
SecurityContext 는 ExecutionContext 에 포함되어 있다는 내용도 있는데,
System.Threading.ExecutionContext 클래스 또한, 논리 Thread의 실행에 관한 정보를 담고 있다고 되어 있다.
실제 사용되는 경우와 맞추어 보면, 일련의 프로그램 흐름이 Thread 경계를 넘어서 진행될 때, 이전 Thread와 새로 넘어간 Thread의 실행 흐름을 같게 맞추어 주도록 하기 위한 정보라고 해석 할 수 있게 된다.
예를 들어, 어떤 사용자의 요청을 접수 받는 Thread가 있고, 그 요청을 실제로 처리하는 ThreadPool 이 있다고 해보자. 요청을 접수 받은 Thread가 사용자에 맞도록 보안 관련 세팅을 마쳤더라도, 그냥 ThreadPool에 실행을 요청해 버리면, 처리에 대한 보안 설정은 결국 ThreadPool에 있는 Thread의 보안 설정을 따르게 된다.
이런 경우에, 요청을 접수 받은 Thread가 보안 세팅을 한 후에, ExecutionContext.Capture를 통해 이전 실행 흐름에 대한 정보를 수집하고, ThreadPool의 Thread는 실행시에 이 ExecutionContext.Run 을 사용하여 실행하도록 하면, 다른 Thread 경계를 넘어서도, 같은 실행 흐름을 유지 할 수 있게 되는 것이다.
Asp.Net 프로그래밍을 할 때 등장하는 System.Web.HttpContext 같은 경우에는,
어떤 하나의 HTTP Request-Response 에 대한 정보를 담고 있는 클래스가 된다. 즉 동시에 이루어 지는 여러 HTTP Request-Response 들 각각의 분리시켜 주는 정보의 모음 이라는 말이다.
뭐 당연한 이야기 겠지만, Context 는 여러 경계에서 공유되는 정보 이므로, 한 경계에서 수정한 내용은 경계를 넘어서도 볼 수 있다는 사실도 염두해 둘 필요가 있을 듯 하다.
닷넷에서 등장하는 XxxContext 이름의 클래스 들 몇가지를 나열해 보면,
- System.Runtime.Remoting.Contexts.Context
- System.Threading.ExecutionContext
- System.Security.SecurityContext
- System.Runtime.Remoting.Messing.CallContext
- System.Runtime.Remoting.Messing.LogicalCallContext
- System.Threading.SynchronizationContext
|
+- System.Windows.Forms.WindowsFormsSynchronizationContext
|
+- System.Windows.Threading.DispatcherSynchronizationContext
헉! 무슨 Context 가 이렇게 많은지...
이중에서 SynchronizationContext 와 그 자식 클래스들이 등장하는데, 이 SynchronizationContext 를 위에서 애써 설명한 Context 의 개념으로 해석해 보면, SynchronizationContext는 동기화 경계를 나타내는 정보의 묶음이며, 이 동기화 경계를 넘어 가려면 어떤 식으로든 이 SynchronizationContext를 사용해야 한다고 생각할 수 있다.
이 SynchronizationContext 는 종종 등장하는 클래스 이므로 나중에 기회가 되면 좀 더 살펴보려고 한다.
이제 두서없는 글의 결론을 내려보자.(다시 읽어보니 글이 영 정신이 없다.^^;)
나의 경우에는,
Context 가 들어간 클래스가 나오면 항상 <1.이 Context 가 구분 짓고자 하는 '경계, 영역' 이 뭔가> 를 따져보고, 이 Context 가 <2.'경계, 영역'을 구분하기 위한 용도인지, 아니면 '경계, 영역'을 넘어가기 위한 용도 인지> 살펴본 다음에, 만약 '경계, 영역'을 넘어가기 위한 용도라면 그 <3.'경계, 영역'을 넘어가기 위해 어떤 식으로 Context 를 사용해야 하는지> 살펴보는 방법으로 그 클래스를 이해하려고 한다.
[출처] 도대체 Context 가 무슨 뜻이지?|작성자 쫌조
'Programming > C#' 카테고리의 다른 글
Openning a URL containing a query string (0) | 2015.02.05 |
---|---|
String.IsNullOrEmpty 와 String.IsNullOrWhiteSpace 차이점 (0) | 2015.02.05 |
WebBrowser 컨트롤에서 Navigate 메소드 이용시 Post 데이터를 넘기는 방법 (0) | 2015.02.05 |
바로가기에 링크된 실행파일명 바꾸기 (0) | 2015.02.05 |
DLL을 regsvr32.exe로 등록하기 (0) | 2015.02.05 |