http://sambumts.tistory.com/84?srchid=BR1http://sambumts.tistory.com/84

l = 3 ' 로그인 성공! End If End If rs.Close Set rs = Nothing doLogin = retVal End Function '// 클래스 종료 Private Sub Class_Terminate() m_Conn.Close Set m_Conn = Nothing End Sub

Class_Initialize함수와 Class_Terminate함수는 클래스가 로드/언로드 될때 자동으로 실행되는 함수이다. 여기선 Class_Initialize 함수에 DB 연결 구문을 넣어서 클래스가 로드되면 바로 DB에 연결하도록 했고 Class_Terminate함수에선 클래스 언로드 시키면 바로 DB연결 끊도록 했다. 요렇게 처리 함으로써 asp 상에선 굳이 DB연결 관련 변수를 전혀 사용할 필요가 없다.

Private Sub Class_Initialize() Dim connectStr As String connectStr = "" connectStr = connectStr & "Provider=SQLOLEDB.1;" connectStr = connectStr & "Data Source=localhost;" connectStr = connectStr & "Initial Catalog=TEST_DB;" connectStr = connectStr & "User ID=sa;" connectStr = connectStr & "Password=;" Set m_Conn = New ADODB.Connection m_Conn.ConnectionString = connectStr m_Conn.Open End Sub ... Private Sub Class_Terminate() m_Conn.Close Set m_Conn = Nothing End Sub

doLogin 메서드가 실질적으로 로그인을 처리하는 함수이다. 인자는 아이디와 비밀번호이고 반환값은 정수형으로 반환해준다. 로그인 성공 했을 경우엔 사용자 이름과 사용자 고유키값을 멤버변수(m_User_Name, m_User_Idx)에 저장한다. 코드가 그렇게 어렵지 않으므로 자세한 설명은 생략한다 -_-

Public Function doLogin(ByVal id As String, ByVal pw As String) As Integer Dim retVal As Integer Dim db_User_Pw As String Dim db_User_Name As String Dim db_User_Idx As String Dim strSql As String Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset strSql = "Select User_Idx, User_Name, User_Pw From UserBasic Where User_Id='" & id & "'" Set rs = m_Conn.Execute(strSql) If rs.EOF Then retVal = 1 ' 존재하지 않는 아이디 Else db_User_Idx = rs(0) db_User_Name = rs(1) db_User_Pw = rs(2) If CStr(db_User_Pw) <> CStr(pw) Then retVal = 2 ' 비밀번호가 일치하지 않음 Else m_User_Idx = db_User_Idx m_User_Name = db_User_Name retVal = 3 ' 로그인 성공! End If End If rs.Close Set rs = Nothing doLogin = retVal End Function

2개의 getter 속성을 추가했다. 보통 로그인 하면 그 사용자의 이름이나 고유키값들을 DB에서 읽어와서 세션으로 준다. 그 사용자 이름/ 고유키값을 세션으로 주기 위해서 값을 얻어와야 하는데 그 값을 주는 함수가 getUserIdx, getUserName이다.

Public Function getUserIdx() As Integer getUserIdx = m_User_Idx End Function Public Function getUserName() As String getUserName = m_User_Name End Function

소스 설명은 간단하게 이정도로 마치고...생성한 프로젝트를 저장하고 dll로 만든다. 그리고는 [시작]-[실행]창에서 cmd를 치면 명령어 프롬프트가 나오는데 거기서 regsvr32 mungchung.dll로 이 dll을 등록한다. (혹 regsvr32명령어가 안된다면 윈도우98/XP는 c:\windows\system32, 윈도우2000은 c:\winnt\system32 디렉토리로 이동한후에 다시 해보면된다)

2. dll을 asp 에서 이용

이제 등록한 dll파일을 asp페이지에서 이용해보자 먼저 로그인 하는 페이지이다. 엄청 간단하다 -_-. 설명 필요 없다.

[login.asp]<form name=frm method=post action=login_proc.asp> id : <input type=text name=id><br /> pw : <input type=text name=pw><br /> <input type=submit> </form>

다음은 로그인을 처리하는 페이지이다.

[login_proc.asp]<% dim req_id, req_pw dim retVal dim objLogin req_id = Request("id") req_pw = Request("pw") Set objLogin = Server.CreateObject("Mungchung.clsLogin") retVal = objLogin.doLogin(req_id, req_pw) Select Case retVal Case 0 Response.Write "알수 없는 오류 발생" Case 1 Response.Write "존재하지 않는 아이디 입니다." Case 2 Response.Write "비밀번호가 일치하지 않습니다" Case 3 Response.Write "로그인 성공!" & "<br /> " Response.Write "사용자 고유키값 : " & objLogin.getUserIdx & "<br /> " Response.Write "사용자 이름 : " & objLogin.getUserName & "<br /> " End Select Set objLogin = nothing %>

id, pw를 파라미터로 일단 가져오고 위에서 생성한 dll 모듈을 호출한다.

Set objLogin = Server.CreateObject("Mungchung.clsLogin")

내 무식한 머리로 처음엔 이해 못했는데 이 Mungchung가 위에서 만든 dll의 프로젝트 명칭이되고 clsLogin은 클래스 명이 된다. (어리고 어리던시절 이걸 몰라서 엄청 고생했다는;;;)

그 다음은 doLogn메서드에 아이디와 비밀번호를 줘서 실행시켜서 그 반환값을 retVal에 저장시켰다. 반환값이 0이면 뭔가 오류가 발생한것으로써 뭔진 나도 모른다. -_- 어떠한 이유에서 오류가 난것일것이다. 그리고 1 일경운 아이디 없는경우 2일경운 비밀번호 틀린경우 3일경우는 로그인 그래서 로그인을 하면 objLogin.getUserIdx로 사용자 키값을 얻어오가 objLogin.getUserName로 사용자의 이름을 얻어온다. 마지막엔 Set objLogin = nothing 해서 자원을 해제한다.

3. 효과적인 dll 디버깅 방법

자! 여기까지 별로 어렵지 않았다. 그러나 직접 이걸 응용해서 새로운것 만드려고 하면 굉장히 괴로워진다. 일단 괴로운게 디버깅이다. 위에서 생성한 dll모듈이 제대로 동작하는지 보려면 어떻게 해야할까?

내 경우 잘 못하던 시절에 dll에서 하나 고치고 컴파일 해서 regsvr32로 등록한후에 웹페이지에서 실행해보고 오류나면 다시 dll수정해서 컴파일하고 웹에서 실행해보고 했는데 이럴경우 dll로 컴파일 할때 "사용권한 없습니다" 라고 나오는 경우가 있었다. 이 사용권한 오류는 dll을 등록해제했더라도 웹페이지에서 일단 한번 실행을 해두었기 때문에 가끔 그 asp.dll이 그 모듈을 놓지 못하는 경우때문에 생긴다.

이때에는 대개 2가지 방법으로 처리하곤 했다. 한가지는 조용히 dll파일명을 mungchung1.dll로 바꿔서 컴파일 하던가 아니면 기존 등록된 dll파일 해제한후에 재부팅해서 그 파일 지우고 다시 컴파일 해서 등록했다. 첫번째로 파일이름 바꾼 방법은 하도 그러다 보니 mungchung23.dll까지 나오는 경우가 생겨서 도대체가 뭐가 뭐가 뭔지 모르는 경우가되버리고 두번째 방법은 재부팅을 너무 해서 기다리느라 지쳐버리고 -_-

재부팅도 안하고 파일명도 바꾸기 싫다면 아래 방법처럼 하면 된다. 관리도구의 서비스항목으로 가면 되는데 마우스 클릭클릭 귀찮으므로 [내컴퓨터]에서 마우스 오른쪽 버튼 누른후에 "관리(G)"를 클릭하자 아래 이미지처럼 서비스 항목을 간 후에 거기서 IIS Admin 항목을 선택한후에 "중지" 후에 "시작"을 다시 해준다. 이렇게 하면 웹서비스가 죽어있는데 웹서비스를 다시 시작해준다.

이러고나서 다시 mungchung.dll로 컴파일 하면 "사용권한 없습니다" 오류 안뜬다. 이방법도 좀 귀찮긴 한데...개인적인 생각으론 파일명 바꾸기나 재부팅하기보단 나은듯 싶다 -_-

4. Visual Studio에서 dll 디버깅하기

사실 가장 좋은 방법은 애초에 dll모듈을 잘 만들어서 위와 같은 방법으로 재컴파일을 수를 줄이는거다. 즉 실행환경을 asp로 하지 말고 VB로 하면 된다. VB에서 dll모듈을 충분히 테스트 하고 asp에서 이용한다면 위와 같은 귀찮은 일을 할 필요 없다.

지금까지 만든 모듈을 VB에서 이용해 보자

1. [새프로젝트]에서 "표준EXE"를 선택한다.
2. [프로젝트]-[참조] 에서 "Microsoft ActiveX Data Objects 2.x Library"을 참조시킨다.
3. 간단하게 커맨드버튼 하나 얹어 놓는다.
4. 아래 이미지처럼 클래스 모듈 하나 추가한후에 그 클래스 모듈 이름을 clsLogin으로 한다.
   
5. 위의 clsLogin 코드를 여기서 생성한 clsLogin에 붙여넣는다.
5. 커맨트 버튼에 아래 소스 추가한다.

Private Sub Command1_Click() Dim objLogin As clsLogin Set objLogin = New clsLogin MsgBox objLogin.doLogin("test1", "1") End Sub

이 커맨드 버튼 누르면 간단하게 doLogin메서드 실행한다. 요런식으로 해서 혹 clsLogin모듈에 오류가 생기면 이 Visual Studio가 아주 친절하게 에러난곳 노랭이로 칠해주니 훨씬더 디버깅하기 편해진다. 이런식으로 exe파일에서 모듈을 이용하는 방식으로 테스트 해가면서 모듈을 만든후 이용하면된다. 이 테스트한 파일도 첨부파일 다운받아보면 ext_test란 폴더안에 있다. 참고하면된다.

5. dll 배포

주의해야할점 또 한가지는 이 dll을 만들었다면 서버에 등록할때이다. 이 dll을 개발한 PC는 스튜디오가 설치되어 있기 때문에 오류날리가 없지만 실제 서버는 스튜디오 설치가 안되어 있고 꼭 필요한 프로그램만 설치되어있는 경우가 많다. 그래서 보통 VB로 만든 프로그램 서버에서 곧바로 이용하면 오류나는 경우가 종종있다. 왜냐면 VB는 VB Virtual Machine가 필요한데 그 관련 파일이 몇가지 된다. 이 파일들은 VB 배포마법사를 통해서 설치파일로 만들면 자동으로 포함되게 된다. 그래서 위에서 생성한 dll파일을 배포마법사를 통해서 설치파일로 만든후에 서버에서 그 설치파일로 설치를 하면 된다. (왠만하면 mungchung.dll파일을 서버로 가지고 간후에 바로 regsvr32 mungchung.dll하지 말자..대개 서버에는 VB버쳐머신이 설치안된경우가 많다) 아! 꼭 스튜디오 이용하면 sp6으로 업데이트 해줘라. sp6을 하면 VB버쳐머신이 조금 틀려진다.

지금이야 그냥 간단히 몇줄로 dll을 배포마법사를 통해서 배포하라고 말하지만 요것때문에 진짜 고생했던 적이 한두번이 아니다. 간단한 개념인데도 자꾸 까먹어서 오류날때마다 '왜 날까 왜 날까' 고민한적이 한두번이 아니다 -_-

처음 적을때는 뭔가 대단한 경험을 적을것처럼했는데 역시나 적고보니 별내용 없다. -_- 귀찮아서 이미지캡쳐도 많이 안했다. -_-; 그냥 그러려니하고 보시길 -_-

+ Recent posts