▶ 뭉충닷컴
 
mungchung.com login
Site Search
My Space
주절주절...
공부방
쥔장소개
Board
자유게시판
유용한 정보
자료실
Programming
강좌 & Articles
Spring 3.0
프로그래밍 Tip
   -ASP
   -PHP
   -JavaScript
   -HTML
   -Java/JSP
   -Database
   -Crystal Report
   -Visual Basic
   -이클립스
   -리눅스
   -기타
Windows API (VB)
Spread Sheet 7.0
컴퓨터활용 Tip
Other things
StarCraft 전략
StarCraft 문서
김용(金庸)
Son Q & Dieda

dll을 이용한 로그인

조회 수 22058 추천 수 0 2005.11.25 23:44:16

좀 여유가 생겨서 뭔가 적을것 없을까 하다가 dll을 이용한 로그인 방법에 대해서 적는다. 아주 간단한 구조의 dll을 이용한 로그인이지만 실제로 VB와 asp와의 연동을 많이 해보지 않은 분들은 이것 저것 꽤나 괴로운 작업이 될수 있다.

코드야 어렵지 않다. asp 몇개월만해도 이해할수 있을 정도의 코드다 하지만 실제로 적용하면 코드에서 태클걸리는 것이 아니라 VB의 특성과 시스템적인 특성들때문에 이것 저것 괴로워지고 몰라서 밤새고 그런다. (나도 마찬가지로 꽤나 괴로운적 많았다 -_-)

그래서 순전히 내 주관적인 방법으로 디버깅 하고 에러 찾아내는 방법까지 적어본다. 어떻게 보면 나도 잘 몰라서 무식하게 해결하는 방법일수도 있다. 그럴때는 좀더 좋은 방법 있으면 답글 남겨주면 고맙게 받아들이겠다.

참고로 소스코드를 만들고 보니 데브피아에서 출간한 "실전을 위한 ASP"에 나와 있는 dll을 이용한 로그인 방법과 거의 유사한 예제가 되버렸다. -_- 오죽했음 반환된 값을 에러 번호의 내용까지도 똑같다. -_- (절대 보고 베낀것이 아니다 -_-;;; )

일단 MS-SQL 2000기준으로 작성된 예제이다. 일단 테스트용 회원DB가 필요한데 첨부파일 다운받으면 example_query.sql 파일이 있는데 이 파일을 쿼리분석기에서 실행한다.

테스트 DB를 만들었다면 이제 본격적으로 시작해보자. 글 구성은 다음과 같다.

1. dll 만들기

일단 VB로 dll을 작성해보자.

1. VB 실행 시킨후에 [새 프로젝트]에서 ActiveX DLL 을 선택한다.
2. [프로젝트]-[참조] 에서 "Microsoft ActiveX Data Objects 2.x Library"을 참조시킨다.
   여기서 버젼은 2.6, 2.7, 2.8..등등 있을텐데 아무거나 해도 예제 실행시키는 데도 별 상관없겠으나
   그래도 버젼 높은것이 좋으니 높은 버젼 있음 그걸로 선택하자
3. 프로젝트를 선택한후 마우스 오른쪽 버튼을 눌러서 "프로젝트 속성"을 클릭하자
   
4. 프로젝트 속성에서 프로젝트 이름을 Mungchung로 바꾼다.
   
5. 클래스를 선택한후에 클래스 이름을 clsLogin으로 바꾼다.
   
6. 아래 소스코드를 적는다. (귀찮으면 첨부파일 다운받으면됨)

Private m_Conn As ADODB.Connection Private m_User_Idx As Integer Private m_User_Name As String '// 클래스 초기화 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 '// 사용자 고유키값 Public Function getUserIdx() As Integer getUserIdx = m_User_Idx End Function '// 사용자 이름 Public Function getUserName() As String getUserName = m_User_Name End Function '// 로그인 메서드 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 '// 클래스 종료 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을 배포마법사를 통해서 배포하라고 말하지만 요것때문에 진짜 고생했던 적이 한두번이 아니다. 간단한 개념인데도 자꾸 까먹어서 오류날때마다 '왜 날까 왜 날까' 고민한적이 한두번이 아니다 -_-

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


댓글 '1'

ㄷㅈ

2011.01.25 11:55:33
*.208.91.6

와 진짜 정말 필요한것만 딱딱 있네요. 진짜 ㅠㅠㅠ 정말 감사합니다

문서 첨부 제한 : 0Byte/ 2.00MB
파일 크기 제한 : 2.00MB (허용 확장자 : *.*)
List of Articles
번호 제목 글쓴이 날짜 조회 수
27 keyfile을 이용한 ssh 접속 방법 뭉충닷컴 2010-10-28 13762
26 멀티 브라우저 지원하는 frame, iframe 접근 코딩 방법 [3] 뭉충닷컴 2010-07-21 26818
25 crontab을 이용한 Tomcat 서버 자동 재시작 shell 뭉충닷컴 2009-08-28 25197
24 자바스크립트로 각 form의 element(요소)에 접근 방법 file [2] 뭉충닷컴 2008-09-11 60174
23 ERwin 에서 Logical의 컬럼명을 코멘트(Comment)로 변경하기 file [2] 뭉충닷컴 2008-01-16 32017
22 Tabular Data Control 마지막 강좌! 뭉충닷컴 2007-06-14 15709
21 ASP로 웹 어플리케이션 주소 사용하기 file 뭉충닷컴 2006-12-10 17967
20 VB로 WebBrowser 컨트롤의 HTML 제어 file 뭉충닷컴 2006-12-01 21469
19 ASP 페이징 쉽게 처리하기 file [4] 뭉충닷컴 2006-08-29 24481
18 두개의 비슷한 DB를 비교해서 변경된 부분 찾아내기 file 뭉충닷컴 2006-05-03 15022
17 ASP에서 Class 를 이용해보자 file 뭉충닷컴 2006-02-26 24965
16 Hotmail의 DHTML EDITOR 편집기를 이용해보자. file [34] 뭉충닷컴 2006-02-04 30296
15 Tabular Data Control 응용 - 제목 Sort (정렬) 쉽게 하기 [3] 뭉충닷컴 2006-01-27 14145
14 스크립트(Script) 코드를 암호화 시켜보자(Encode/Decode) [2] 뭉충닷컴 2005-06-10 19134
» dll을 이용한 로그인 file [1] 뭉충닷컴 2005-11-25 22058
12 Tabular Data Control 응용 - 페이징 처리하는 3가지 방법 file [1] 뭉충닷컴 2005-11-23 16288
11 Query를 잼있고, 유용하게 사용해보자 file [3] 뭉충닷컴 2005-10-01 14736
10 Tabular Data Control 응용 - 테이블의 행 배경색이 격으로 변하게하기 뭉충닷컴 2005-09-25 15814
9 폼(Form) 검증해주는 스크립트(Script) file [15] 뭉충닷컴 2005-06-07 19484
8 asp 로 서버에 zip 압축/압축해제(풀기) 예제 file [8] 뭉충닷컴 2005-08-12 19902
7 MS-SQL의 osql.exe 이용 하기 (도스상에서 sql 구문 이용) 뭉충닷컴 2005-09-25 19355
6 SQL Script 로 ERD와 테이블 생성 손쉽게하기 뭉충닷컴 2005-09-25 22032
5 Tabular Data Control 기초 다지기 4 - 마지막! file 뭉충닷컴 2005-09-25 14722
4 Tabular Data Control 기초 다지기 3 file 뭉충닷컴 2005-09-25 14487
3 Tabular Data Control 기초 다지기 2 file 뭉충닷컴 2005-09-25 14199
2 Tabular Data Control 기초 다지기 1 file [1] 뭉충닷컴 2005-09-25 15298
1 OWC를 이용한 웹에서 엑셀 그래프 그리기 file [4] 뭉충닷컴 2007-12-19 19249