IHttpModule.Init() 메소드는 여러번 호출될 수 있다. Computer Code

경험있는 개발자들은 이미 어떻게든 알고 있는 이슈이지만 정리차원에서 남겨본다.
자세한 내용은 아래 링크를 참고할 것.

요약을 하자면,

- 필요에 따라 HttpApplication 인스턴스는 여러 개가 생성될 수 있다.
- HttpApplication 인스턴스가 생성될 때 IHttpModule 또한 같이 생성된다. (정확하게는 HttpApplication 인스턴스가 Context 연결이 될 때 IHttpModule 또한 초기화가 된다.)
- IHttpModule이 생성될 때 IHttpModule.Init() 메소드도 호출된다.


왜 이런 점을 고려해야 하는가?

가장 문제가 되는 경우는 Init() 메소드에서 비용이 큰 작업을 할 때이다. 
HTTP 요청 상황에 따라 HttpApplication 인스턴스가 수 십 개도 생길 수가 있는데, 그만큼 Init() 메소드도 호출이 된다는 점을 고려해야 한다.

IHttpModule은 IIS가 떠 있는 동안 계속 존재하는 것이 아니다. 응용프로그램풀이 재생(Recycle) 될 때 다시 만들어질 수도 있고, 다른 이유로 언제든지 생성되었다가 해제될 수 있다. 또한 IHttpModule이 살아있는 시간도 보장되는 것이 아니기에, Init() 메소드에서 별도의 스레드를 생성하는 식의 비동기 작업은 안하는 것이 좋다. 

만약 IHttpModule의 상태값이나 환경설정값을 저장해야 한다면 static 변수를 사용하거나 HttpApplicationState를 사용하는 편이 좋다. 예를 들어 웹페이지 카운터값을 저장한다면, IHttpModule내에 멤버변수를 사용하면 안되고 static 멤버 변수나 HttpApplicationState에 저장을 해야 한다는 의미이다.
또한 static 변수나 HttpApplicationState에 저장된 값은 Application Pool이 유지되는 동안에는 계속 유지되지만, 이 역시 Application Pool이 재생되거나 재시작되면 리셋될 수 있다는 점을 염두에 두어야 한다. 


덧글

댓글 입력 영역