재우니 개발자 블로그

Classic Asp DB Access Framework.zip
0.06MB

[Classic ASP] ADO 코드를 확 간소화하는 DB Access Framework (DBHelper)

Classic ASP로 개발하다 보면 가장 많은 부분을 차지하는 코드 중 하나가 바로 ADO(ActiveX Data Objects)를 이용한 데이터베이스 연동 코드입니다. 하지만 개발자마다 코딩 스타일이 다르고, 최적화 요소를 놓치기 쉬워 프로젝트 전체의 코드 일관성과 성능을 유지하기가 어렵습니다.

 

오늘 소개해드릴 DB Access Framework(DBHelper.asp)는 이런 고민을 해결해주는 VBScript 클래스 컴포넌트입니다. 이 프레임워크를 사용하면 일관된 패턴으로 코드를 작성할 수 있고, Disconnected 레코드셋, 매개변수화된 쿼리 사용 등을 강제하여 웹 애플리케이션의 성능을 자연스럽게 최적화할 수 있습니다.

 

이 블로그에서는 DBHelper의 핵심 기능들을 코드 예제 중심으로 살펴보겠습니다.

 

1. 시작하기: DBHelper 포함 및 생성

 

별도의 등록 과정 없이, DBHelper.asp 파일을 프로젝트에 포함하고 필요한 ASP 페이지에서 include하여 바로 사용할 수 있습니다.

<%
    ' DBHelper 클래스 인스턴스 생성
    Dim DBHelper
    Set DBHelper = new clsDBHelper

    ' ... DBHelper를 사용한 코드 ...

    ' 모든 작업이 끝나면 리소스 해제
    DBHelper.Dispose
    Set DBHelper = Nothing
%>

 

 

2. 데이터 조회 (Recordset 반환)

2.1. 저장 프로시저 실행: ExecSPReturnRS

저장 프로시저(Stored Procedure)를 실행하고 결과로 Recordset 객체를 받아올 때 사용합니다. Input/Output 매개변수 처리도 매우 간단합니다.

 

[예제] 2개의 Input 매개변수와 1개의 Output 매개변수를 가진 저장 프로시저(TestSP2)를 호출하는 코드입니다.

SQL Server (TestSP2)

CREATE PROCEDURE TestSP2
    @Beginning_Date DateTime,
    @Ending_Date DateTime,
    @RecordCount int output
AS
BEGIN
    SELECT
        Orders.ShippedDate,
        Orders.OrderID,
        "Order Subtotals".Subtotal,
        DATENAME(yy, ShippedDate) AS Year
    FROM
        Orders
    INNER JOIN
        "Order Subtotals" ON Orders.OrderID = "Order Subtotals".OrderID
    WHERE
        Orders.ShippedDate BETWEEN @Beginning_Date AND @Ending_Date

    SELECT @RecordCount = @@rowcount
END

 

 

ASP Code

Set DBHelper = new clsDBHelper

' 매개변수 배열 생성
Dim paramInfo(2)
' MakeParam(이름, 타입, 방향, 크기, 값)
paramInfo(0) = DBHelper.MakeParam("@Beginning_Date", adDate, adParamInput, 0, "1998/01/01")
paramInfo(1) = DBHelper.MakeParam("@Ending_Date", adDate, adParamInput, 0, "1998/03/01")
paramInfo(2) = DBHelper.MakeParam("@RecordCount", adInteger, adParamOutput, , 0)

' 저장 프로시저 실행 (기본 연결 문자열 사용 시 마지막 인자는 Nothing)
Dim rs
Set rs = DBHelper.ExecSPReturnRS("TestSP2", paramInfo, Nothing)

' --- 레코드셋(rs)으로 원하는 작업 수행 ---
' While Not rs.EOF
'   Response.Write rs("OrderID") & "<br>"
'   rs.MoveNext
' Wend
' ---------------------------------------

' Output 매개변수 값 가져오기
Dim recordCount
recordCount = DBHelper.GetValue(paramInfo, "@RecordCount")
Response.Write "전체 레코드 수: " & recordCount

' 리소스 정리
rs.Close
Set rs = Nothing
DBHelper.Dispose
Set DBHelper = Nothing

Tip: MakeParam 대신 Array() 함수를 사용하여 paramInfo(0) = Array("@Beginning_Date", adDate, adParamInput, 0, "1998/01/01") 와 같이 작성할 수도 있습니다.

2.2. SQL 문 실행: ExecSQLReturnRS

SELECT 쿼리처럼 직접 SQL 문을 실행하고 Recordset을 받아올 때 사용합니다.

 

ASP Code

Set DBHelper = new clsDBHelper

' SQL 쿼리를 실행하고 레코드셋을 반환
Dim rs
Set rs = DBHelper.ExecSQLReturnRS("SELECT * FROM Products", Nothing, Nothing)

' --- 레코드셋(rs)으로 원하는 작업 수행 ---

' 리소스 정리
rs.Close
Set rs = Nothing
DBHelper.Dispose
Set DBHelper = Nothing

 

 

3. 데이터 변경 (Recordset 미반환)

INSERT, UPDATE, DELETE 같이 결과셋이 필요 없는 쿼리를 실행할 때 사용합니다.

 

3.1. 저장 프로시저 실행: ExecSP

[예제] @CustomerID를 받아 고객 정보를 삭제하는 RemoveCustomer 저장 프로시저를 호출합니다.

 

ASP Code

Set DBHelper = new clsDBHelper

' 매개변수 배열 준비
Dim paramInfo(0)
paramInfo(0) = DBHelper.MakeParam("@CustomerID", adChar, adParamInput, 5, "ALFKI")

' SP를 실행 (마지막 인자가 Nothing이면 기본 연결문자열 사용)
DBHelper.ExecSP "RemoveCustomer", paramInfo, Nothing

DBHelper.Dispose
Set DBHelper = Nothing

 

 

3.2. SQL 문 실행: ExecSQL

ASP Code

Set DBHelper = new clsDBHelper

' SQL 쿼리를 실행
DBHelper.ExecSQL "DELETE FROM Customers WHERE CustomerID='ALFKI'", Nothing, Nothing

DBHelper.Dispose
Set DBHelper = Nothing

 

 

4. 트랜잭션 처리

두 개 이상의 데이터 변경 작업을 하나의 논리적인 단위로 묶어야 할 때 트랜잭션을 사용합니다. 모든 작업이 성공하면 Commit, 하나라도 실패하면 Rollback하여 데이터 일관성을 지킬 수 있습니다.

 

ASP Code

Set DBHelper = new clsDBHelper

' 트랜잭션 시작 (기본 연결문자열 사용)
Dim conn
Set conn = DBHelper.BeginTrans(Nothing)

On Error Resume Next ' 에러 발생 시 코드 중단을 막고 다음 라인으로 이동

' 트랜잭션에 포함될 쿼리들 실행 (마지막 인자로 conn 객체 전달)
DBHelper.ExecSQL "UPDATE Products SET UnitPrice = UnitPrice * 1.1 WHERE CategoryID = 1", Nothing, conn
DBHelper.ExecSQL "INSERT INTO ProductLog (LogMessage) VALUES ('Price updated for category 1')", Nothing, conn

' 에러 발생 여부 체크
If Err.Number <> 0 Then
    ' 롤백
    DBHelper.RollbackTrans conn
    Response.Write "오류가 발생하여 작업을 롤백했습니다. 에러: " & Err.Description
Else
    ' 커밋
    DBHelper.CommitTrans conn
    Response.Write "작업이 성공적으로 완료되었습니다."
End If

On Error Goto 0 ' 에러 처리 기본값으로 복원

Set conn = Nothing
DBHelper.Dispose
Set DBHelper = Nothing

 

 

중요: BeginTrans가 반환한 conn 객체를 트랜잭션에 포함시킬 ExecSQL 이나 ExecSP 메서드의 마지막 인자로 전달해야 합니다. 트랜잭션 커밋(CommitTrans) 또는 롤백(RollbackTrans) 시에도 동일한 conn 객체를 사용합니다.

5. 마무리: 리소스 해제 Dispose

DBHelper는 내부적으로 기본 연결(DefaultConnection)을 관리합니다. 페이지 마지막에서는 Dispose 메서드를 호출하여 이 연결 객체를 명시적으로 닫고 메모리에서 해제해주는 것이 중요합니다.

 

' ... 코드 ...

DBHelper.Dispose          ' DefaultConnection을 닫고, 해제
Set DBHelper = Nothing

 

 

결론

DBHelper 프레임워크를 사용하면 Classic ASP 프로젝트의 데이터 액세스 코드를 매우 깔끔하고 효율적으로 관리할 수 있습니다. 코드의 양이 줄어들 뿐만 아니라, 성능과 안정성까지 확보할 수 있으니 오래된 ASP 프로젝트를 유지보수하거나 새로 시작할 때 꼭 한번 도입을 검토해보시길 바랍니다.

 

 

 

 

https://blog.naver.com/saltynut

 

lancers's Blog : 네이버 블로그

Expat Software Development Engineer living in Seattle

blog.naver.com