SimpleIsBest.NET

유경상의 닷넷 블로그

ASP.NET에서 오라클 프로바이더 오류

by 블로그쥔장 | 작성일자: 2005-12-21 오후 7:22:00
이 글은 오래된 전에 작성된 글입니다. 따라서 최신 버전의 기술에 알맞지 않거나 오류를 유발할 수 있습니다. 저자는 이 글에 대한 질문을 받지 않을 것입니다. 하지만 이 글이 리뉴얼 되면 이 글에 대한 질문을 하거나 토론을 할 수도 있습니다.

Oralce Access Error in ASP.NET

ASP.NET에서 오라클을 액세스 하려다 보면 종종 난감한 메시지를 만나곤 한다. 이런 메시지 중 몇 개를 살펴보고 그 원인과 해결책을 소개하고자 한다. 오라클에 대한 글을 쓸 때마다 매번 말하곤 하지만, 필자는 오라클에 대한 전문가가 아니다(뭐 다른 것에 대해선 전문가 인가? 험... 험...). 이 글 역시 닷넷의 관점에서 바라본 오라클 액세스일 뿐이지 그 내부까지 세세히 알지 못하므로 무의미한 태클이나 딴지는 사양하는 바이다. 다만 필자의 글이 잘못된 경우에는 신랄하게 비판하고 피드백을 남겨주기 바란다.

닷넷에서 오라클에 접근하는 방법은 7가지가 넘는 다양한 방법이 있다. 이들 방법에 대해서는 필자의 닷넷에서 오라클에 접근하는 7가지 방법 이란 글을 읽어 보기 바란다. 이 글에서도 지적한 바 대로, 먼저 OCI, SQL*Net 등이 포함된 오라클 클라이언트가 먼저 설치되어 있어야 한다. 닷넷에서건 닷넷 할아버지에서건 이들이 설치되어 있지 않다면 오라클 서버에 액세스하는 것은 말짱 도루묵이 된다. 따라서 먼저 이놈을 설치하고, SQLPlus 나 기타 다른 도구를 사용하여 오라클 서버에 확실히 접속이 되나 살펴보아야 한다.

일단 접속 테스트를 성공했다고 가정하고, 이렇게 접속 테스트가 성공했음에도 불구하고 ASP.NET에서 오라클을 액세스하려고 하면 오라클 클라이언트가 설치되지 않았다는 둥의 메시지가 나타날 수 있다. 메시지나 예외는 어떤 방법으로 오라클을 액세스 했는가에 따라서 다르다. 예를 들어 Microsoft의 OLEDB Provider for Oralce을 사용하면 오류 메시지는 다음과 같이 나온다.


System.Data.OleDb.OleDbException: Oracle 클라이언트 및 네트워킹 구성 요소가 없습니다. 이 구성 요소는 Oracle Corporation에서 제공하며 Oracle 버전 7.3.3 또는 그 이후 버전의 클라이언트 소프트웨어 설치의 일부입니다. 공급자가 작동하려면 이 구성 요소가 설치되어야 합니다.
 

혹은, Managed Data Provider for Oracle 을 사용하여 액세스하는 경우의 오류 메시지는 다음과 같이 나오곤 한다.


System.Exception: System.Data.OracleClient requires Oracle client software version 8.1.7 or greater.
 

다른 오라클 접속의 경우에는 어떻게 나오는지 다 테스트해 볼 순 없지만, 비슷한 오류 메시지를 뿌릴 것이라 생각된다. 어찌 되었건 이런 류의 오류 메시지가 나온다면 대부분 오라클 설치 디렉터리에 대한 PATH 설정이 잘못되어 있던가 아니면 오라클 설치 디렉터리를 ASP.NET에서 접근하지 못할 때 발생하게 된다.

PATH Problem

오라클 클라이언트가 설치되면, 오라클의 존나 많은 DLL들이 (왜 이렇게 많은 DLL들이 필요한지 모르겠다. SQL Server 2000은 그다지 많지 않은데  없는데 말이다.) 오라클의 설치 디렉터리(C:\Ora10g 라 가정하자)의 bin 디렉터리(C:\Ora10g\bin)에 설치된다. 그리고 이 디렉터리에 대한 경로가 PATH에 설정된다. 설치 프로그램에 의해 PATH가 설정되더라도 이 PATH 변경사항은 새로이 시작되는 프로세스만이 적용 받는다. 즉, 이미 수행중인 프로세스는 변경된 PATH 를 알지 못한다.

자, 그렇다면 설치 직후 IIS를 전혀 재시작 하지 않았거나 리부팅 하지 않은 상황에서 오라클을 액세스하는 ASP.NET 코드를 수행시키면? 당근 오라클의 존나 많은 DLL 들을 로드하지 못하게 될 것이고, 이는 결국 오라클 클라이언트가 설치 되지 않은 것 처럼 판단할 수 있게 되는 것이다. 참고로 SQL Server 는 왜 이 딴 현상이 발생하지 않냐면... SQL Server 를 액세스 하기 위한 DLL 개수는 그다지 많지 않은 관계로 System32 디렉터리에 설치되어 버린다. 이 디렉터리는 항상 DLL을 로드할 때 무조건 참조가 되므로 이딴 문제가 발생하지 않는다.

오라클을 설치하면 아쌀하게 리부팅을 해주는 것이 정신건강에 좋다. 만약 리부팅이 곤란하다면, 최소한 iisreset 명령을 통해 IIS를 재시작해 주는 것이 예의라면 예의가 되겠다. 그리고 오라클에서 DLL 관련된 문제가 발생하면 제일 먼저 PATH를 의심해 보는 것이 좋다. 특히, 오라클 클라이언트 버전이 2개 이상 설치된 경우에는 더욱 더 그렇다 !!!

Security Problem

PATH 설정이 유효함에도 불구하고 위와 같은 예외 메시지가 나온다면, 다음에 의심할 부분은 보안에 대한 것이다. ASP.NET이 IIS 6.0과 만나면 보안 모델은 복잡해 진다. 좋게 말하면 다양한 설정으로 유연성 높은 보안 모델을 제공하는 것이고, 나쁘게 말하면 쓸데 없이 존나 복잡하게만 만드는 것이 될 것이다. 어찌 되었건 이런 오류가 발생한다면 ASP.NET 코드를 수행하는 쓰레드의 계정이 오라클이 설치된 디렉터리를 액세스할 권한이 없기 때문이다. ASP.NET 코드를 수행하는 쓰레드의 계정에게 오라클 설치 디렉터리를 액세스할 권한을 주면 해결되는 문제인 것이다.

그런데... ASP.NET 코드를 수행하는 쓰레드의 계정은 IIS 버전, 작업 프로세스 모델, web.config 설정 등에 따라서 그때 그때 다르다는 것이다. 대개의 경우 NETWORK SERVICE, SYSTEM, IUSR_XXX, ASPNET 이 넷 중 하나인데 (물론 아닌 경우도 있다 !), 정확한 계정을 알고 싶다면 필자의 IIS 보안에 대한 글을 참조하기 바란다.

Windows 2003 이라면 대개의 경우, Users 그룹에 대해 읽기 및 수행 권한이 있으면 문제는 해결되곤 한다. Users 그룹은 SYSTEM 계정을 제외한 앞서 언급한 계정들을 포함하는 그룹이기 때문이다. 만약 문제가 여전하다면 먼저 IIS 버전, 작업 프로세스 모델, web.config 계정을 고려하여 ASP.NET이 사용하는 계정을 정확하게 먼저 파악해 내고 그 계정에 대해 권한을 주어야 할 것이다.

팁으로 오라클 설치 폴더에 권한을 변경한 이후에는 IIS 의 작업 프로세스를 다시 시작하거나 아니면 iisreset 으로 아예 IIS를 재시작 하는 것이 좋다. 일단 DLL 로드에 실패하면 다시 시도하지 않는 데이터 프로바이더들이 있기 때문이다.



Comments (read-only)
#re: ASP.NET에서 오라클 프로바이더 오류 / HOONS / 2007-10-25 오후 5:33:00
아.. 검색하다가 이걸로 해결했네요
휴~~ 이거 엔간히 삽질했어요 ㅎㅎㅎ
여튼 ㄳ ^^
#re: ASP.NET에서 오라클 프로바이더 오류 / 감사 / 2008-04-16 오후 12:32:00
감사합니다.
덕분에 정신건강에 많은 도움이 되었습니다.
#re: ASP.NET에서 오라클 프로바이더 오류 / 화랑 / 2009-11-21 오후 3:58:00
감사합니다....^^ 허락없이 퍼갔습니다...