asp로 class 이용하는 방법이다. asp의 class 기능은 상당히 미약해서 java나 닷넷처럼 간지 좔좔 흐르도록 사용할수가 없다. 그냥 어설프게 흉내내는 정도만 가능한데 이 정도만 해도 여러가지 장점을 가지게 된다.

클래스의 장점은...직접 사용해보면 안다. -_- 처음엔 귀찮지만 사용해보면 편해서 좋다는것을 안다. 보통 책을 사면 어떤 특정기능을 설명하면서 장,단점을 설명해놓는데 사실 그런 부분을 실제로 사용하기 전까지는 좋은지도 모른다. 단지 멍하니 읽고 지나치는 부분들이다. (실은 클래스의 장,단점 찾아적기 귀찮아서 안적는거다 -_- asp의 클래스에 대한 책이 거의 없다보니 -_-..)

장점은 그냥 넘어가고..클래스의 확실한 단점으론 속도 문제를 들 수 있다. 아무래도 스크립트 언어 특징상 한 페이지에 코드양이 많으면 그만큼 속도가 늘어나는데 클래스를 이용하면 기존 asp코딩방식보단 코딩량이 몇배로 늘어난다. 그래서 페이지 실행하는 양이 늘어나서 속도문제가 생긴다.

근데 이 문제는 단점중 하나긴 하지만 그렇게 큰 부하를 걸리게 하는 것은 아니다. 페이지의 속도문제를 그렇게 강조하고 싶다면 asp에서 인클루드를 사용하지 말아야하고 함수 또한 이용하지 말아야한다. 즉 가장 스크립트적인 asp 코딩을 하면 된다. 하지만 많은 개발자들은 이런식의 코딩은 안한다. 왜냐면 경험상 이렇게 코딩하다간 나중에 고칠때 개고생한다는걸 알기 때문이다. 그래서 속도좀 떨어지더라도 DB 연결 부분, 공통 함수 부분들은 인클루드 해놓고선 코딩한다. 이런 정도만 해도 페이지 코딩시 상당량 개노가다가 줄어들기 때문이다.

속도가 안나온다면 DB 이용시에 데이타 가져오는 속도가 느려서 그런것이니 DB 튜닝쪽을 생각해보는게 더 좋은 해결책을 찾을 수 있을 것이다.

말하다가 엉뚱한곳으로 흘렀는데...정리하자면 클래스를 이용하면 속도가 조금 아주 쪼금 절대 개발자가 알수 없을 정도의 속도가 느려짐이 있을수 있겠지만 개발/개선시의 편리성을 생각해본다면 그까이것 속도는 무시해도 될만한 정도이다.

참! 강좌보기전에! 샘플 코드는 첨부파일 다운 받으시오!

1. 기존 ASP 코딩 방식

클래스를 알기전에 일단 기존 asp 코딩방식부터 보자. 아래 코드는 기존 asp 코딩 방식이다.

    '// 고전 ASP 코딩 방식
    Dim DBCon : Set DBCon = Server.CreateObject("ADODB.Connection")
    Dim rs : Set rs = Server.CreateObject("ADODB.RecordSet")
    Dim strConn
    Dim db_CustomerID
    Dim db_CompanyName
    Dim db_Phone
    Dim id
    
    ' DB 연결
    strConn = strConn&"Provider=SQLOLEDB.1;Persist Security Info=True;"
    strConn = strConn&"Data Source=;"   ' Server Name
    strConn = strConn&"User ID=sa;"     ' User ID
    strConn = strConn&"Password=;"      ' User Password
    strConn = strConn&"Initial Catalog=NorthWind;" ' DataBase
    DBCon.Open strConn  
    
    id = "AROUT"
    
    strSql = "select CustomerID,CompanyName,Phone from Customers Where CustomerID='" & id & "'"
    Set rs = DBCon.Execute(strSql)
    if not rs.eof then
        db_CustomerID  = rs(0)
        db_CompanyName = rs(1)
        db_Phone       = rs(2)
    end if
    
    ' 자원해제
    rs.Close
    DBCon.Close
    Set rs = nothing
    Set DBCon = nothing

asp 입문이 아니라면 아주 쉽게 이해할 수 있는 구문이니 코드 설명은 안하겠다 -_-.. 쇼핑몰을 하나 개발한다고 가정하자. 쇼핑몰을 만들다 보면 사용자의 개인 정보를 가져오는 페이지들이 상당히 많다. 보통 개발자들은 위와같은 코드를 사용자정보 가져오는 페이지에서 코딩한다. 사용자 정보를 필요로 하는 페이지가 100개라면 100 곳에서 같은 코딩을 한다. 헌데 만약 테이블의 필드명(혹은 속성)이 변경되었다면? 그야말로 x 되는거다.

100곳 열어서 존내 수정해 줘야하는거다.

그나마 이런 상황은 괜찮은 편이다. 개발자가 5명이라서 각각 개발하는 스타일도 틀려서 사용자 정보 가져오는 코딩 스타일로 틀리다. 물론 개발하기 전에 개발표준정의안에서 맞추는 경우도 있지만 실제론 잘 안맞는 경우가 대부분이다. 이런 상황에서 개발자 한명이 다른 사람이 코딩한 소스도 고칠일이 생기면 정말 괴롭게 된다. 가져오는 정보는 동일한 정보인데 페이지마다 코딩 스타일도 틀리고 가져오는 쿼리도 틀리다면 ... -_- 욕이 절로 흥이나서 나온다.

2. 클래스 이용

그래서 동일하게 가져오는 정보는 클래스로 만드는것도 괜찮은 해결책중 하나이다. 개발자들은 단지 클래스의 몇가지 메서드들만 이용하면 손쉽게 사용자 정보를 얻어올 수 있다. 아래 코드는 클래스를 통해서 고객정보를 받아오는 구문이다.

    '// Class를 이용한 ASP
    Class clsCustomer
        '// 멤버 변수
        private m_CustomerID
        private m_CompanyName
        private m_Phone
        private DBCon
        
        '// Get 속성
        public property get CustomerID()
            CustomerID = m_CustomerID
        end property

        public property get CompanyName()
            CompanyName = m_CompanyName
        end property
        
        public property get Phone()
            Phone = m_Phone
        end property
        
        ' 클래스 초기화
        Private Sub Class_Initialize 
            Dim strConn
            strConn = strConn&"Provider=SQLOLEDB.1;Persist Security Info=True;"
            strConn = strConn&"Data Source=;"   ' Server Name
            strConn = strConn&"User ID=sa;"     ' User ID
            strConn = strConn&"Password=;"      ' User Password
            strConn = strConn&"Initial Catalog=NorthWind;" ' DataBase
            
            Set DBCon = Server.CreateObject("ADODB.Connection")
            DBCon.Open strConn    
        End Sub
        ' 클래스 종료
        Private Sub Class_Terminate   ' Setup Terminate event.
            if DBCon.State = 2 then DBCon.Close
            Set DBCon = Nothing
        End Sub
        
        ' CustomerID를 인자로 주면 Customer의 정보를 반환함
        Public Sub init(id)
            Dim rs : Set rs = Server.CreateObject("ADODB.RecordSet")
            Dim strSql
            
            strSql = "select CustomerID,CompanyName,Phone from Customers Where CustomerID='" & id & "'"
            Set rs = DBCon.Execute(strSql)
            if not rs.eof then
                m_CustomerID  = rs(0)
                m_CompanyName = rs(1)
                m_Phone       = rs(2)
            end if
            rs.Close
            Set rs = nothing
        End Sub
    End Class

위의 클래스는 가장 단순한 구조의 클래스이다. Class_Initialize는 클래스 초기화로써 클래서 생성시 항상 실행되는 구문이다. asp 클래스 내장함수이다. 선언해도 되고 안해도 된다. 이 함수엔 DB 연결 구문을 넣어두었다. Class_Terminate는 클래스 종료시 실행되는 함수이다. 역시 asp 클래스 내장함수이다. 여기선 DB 연결 닫는 구문을 넣어두었다. 그 외에 CustomerID / CompanyName / Phone 정보에 대한 Get 속성과 init 프로시저를 추가해 두었다.

이런식으로 클래스를 만들어 두었으면 사용시에는 단지 아래처럼 하기만 하면 된다.

    Dim cCust
    Set cCust = New clsCustomer    ' 사용자 클래스 생성
    cCust.init "AROUT"     ' AROUT란 ID의 사용자 정보를 가져옴
    
    ' 사용자의 회사명, 전화번호를 가져온다.
    Response.Write "CustomerID : " & cCust.CustomerID & "<br>"
    Response.Write "CompanyName : " & cCust.CompanyName & "<br>"
    Response.Write "Phone : " & cCust.Phone & "<br>"

사용자 정보를 가져오기 위한 코딩이 상당히 간결하다는것을 알 수 있다. 단지 클래스 생성한 후에 클래스의 init 함수에 사용자 아이디만 인자로 넘겨주면 사용자에 대한 여러 정보를 손쉽게 반환해준다.

사용자 정보를 가져오는 페이지가 100페이지라면 개발자들은 위의 사용자 정보오는 클래스만 100 페이지에서 이용하면 된다. 이런 클래스를 이용하게 되면 개발자가 100명이라해도 개발 코딩 스타일은 거의 일률적이기 때문에 나중에 한명이 개선한다고 해도 손쉽게 수정사항을 수정 할 수 있다.

3. 클래스 이용 확장

위에서 만든 클래스 이용시 한가지 단점이 있다. 위의 클래스는 고객의 ID 값만 넘겨주면 고객 정보를 반환해주는 역할을 했는데 고객 리스트를 보여주는 화면을 구성한다면? 아래 코드처럼 기존 asp 방식대로 고객 리스트 보여주는 화면을 만들것인가? 이 코딩방식의 문제점은 위에서도 언급했지만 고객 리스트를 보여주는 페이지가 100곳이라면 100 곳 모두 아래와 같은 코딩을 해야한다.

    ... 생략
    
    strSql = "select CustomerID,CompanyName,Phone from Customers"
    Set rs = DBCon.Execute(strSql)
    do until rs.eof
        db_CustomerID  = rs(0)
        db_CompanyName = rs(1)
        db_Phone       = rs(2)
        rs.movenext
    loop
    
    ... 생략

위 코딩방식의 문제점을 해결하고자 아래와 같이 조금 편리하다 생각해서 코딩을 했다. 기존 asp 방식에 클래스를 함께 이용했다.

    ... 생략
    
    Dim cCust
    Set cCust = New clsCustomer
    strSql = "select CustomerID from Customers"
    Set rs = DBCon.Execute(strSql)
    do until rs.eof
        db_CustomerID  = rs(0)
        
        ' init 함수를 사용함으로써 쿼리문을 한번 더 날림
        cCust.Init db_CustomerID
        
        rs.movenext
    loop
    
    ... 생략

조금은 머리를 굴린 방식의 처리지만..아주 안좋은 단점이 있다. 위에서 만든 clsCustomer 클래스를 보면 init 함수 이용시에 DB를 한번 갔다와서 사용자 정보를 가져온다. 즉 init 함수를 한번 이용할때마다 db 접속량이 그만큼 늘어난다. 사용자가 만명이라면 단지 사용자 리스트를 뿌리기 위해서 만번 이상의의 쿼리문이 실행되는 것이다. 해서 위의 코딩방식은 오히려 기존 asp 코딩방식보다 못한 코딩이 되어버렸다.

사용자 정보의 리스트를 클래스 형식으로 받기 위해선 아래와 같은 방법을 이용하면 된다. 클래스를 2개로 나누었다. 첫번째 clsCustomer 클래스는 단지 사용자의 속성만 정의된 클래스로써 다른 기타 메서드는 하나도 없다. 두번째 클래스는 clsCustomerDAO 이다. 이 클래스는 DB 접속을 통해서 사용자의 정보를 반환해주는 여러 함수를 담고있다. DAO는 Data Access Object의 약자로서 MVC(Model View Controller)패턴에서 이용되는 용어인데...이 부분은 패턴 책이나. 자바/ C#관련 공부를 하면 좀 더 자세한 정보를 얻을수있다. 일단 넘어간다 -_-.. (참고로 여기선 clsCustomer/ clsCustomerDAO 이렇게 2 부분으로 클래스를 나눴는데 합쳐도 상관없다. 단지 클래스의 개념상의 분리를 위해서 나눈것이다.)

    '// Get/Let 속성만 정의된 클래스
    Class clsCustomer
        private m_CustomerID
        private m_CompanyName
        private m_Phone
        
        public property let CustomerID(p_CustomerID)
            m_CustomerID = p_CustomerID
        end property
        
        public property get CustomerID()
            CustomerID = m_CustomerID
        end property

        public property let CompanyName(p_CompanyName)
            m_CompanyName = p_CompanyName
        end property
        
        public property get CompanyName()
            CompanyName = m_CompanyName
        end property  
        
        public property let Phone(p_Phone)
            m_Phone = p_Phone
        end property
        
        public property get Phone()
            Phone = m_Phone
        end property
    End Class

    '// Customer 관련 여러 Method가 있는 클래스
    Class clsCustomerDAO
        private DBCon
        
        ' 클래스 초기화
        Private Sub Class_Initialize 
            Dim strConn
            strConn = strConn&"Provider=SQLOLEDB.1;Persist Security Info=True;"
            strConn = strConn&"Data Source=;"   ' Server Name
            strConn = strConn&"User ID=sa;"     ' User ID
            strConn = strConn&"Password=;"      ' User Password
            strConn = strConn&"Initial Catalog=NorthWind;" ' DataBase
            
            Set DBCon = Server.CreateObject("ADODB.Connection")
            DBCon.Open strConn    
        End Sub
        ' 클래스 종료
        Private Sub Class_Terminate   ' Setup Terminate event.
            if DBCon.State = 2 then DBCon.Close
            Set DBCon = Nothing
        End Sub
        
        ' CustomerID를 인자로 주면 Customer의 정보를 반환함
        Public Sub init(p_cls, id)
            Dim rs : Set rs = Server.CreateObject("ADODB.RecordSet")
            Dim strSql
            
            strSql = "select CustomerID,CompanyName,Phone from Customers Where CustomerID='" & id & "'"
            Set rs = DBCon.Execute(strSql)
            if not rs.eof then
                p_cls.CustomerID  = rs(0)
                p_cls.CompanyName = rs(1)
                p_cls.Phone       = rs(2)
            end if
            rs.Close
            Set rs = nothing
        End Sub
        
        ' Customer 정보를 모두 가져옴
        Public Function getList()
            Dim rs : Set rs = Server.CreateObject("ADODB.RecordSet")
            Dim i : i = 1
            Dim cCust
            Dim m_arrList()     ' 사용자 정보를 반환하기 위한 배열
            
            Set rs = DBCon.Execute("select CustomerID,CompanyName,Phone from Customers")
            do until rs.eof
                ReDim Preserve m_arrList(i)
                Set cCust = New clsCustomer
                
                cCust.CustomerID  = rs(0)
                cCust.CompanyName = rs(1)
                cCust.Phone       = rs(2)
                Set m_arrList(i-1) = cCust
                
                i = i + 1
                rs.movenext
            loop
            rs.Close
            Set rs = nothing
            getList = m_arrList
        End Function        
    End Class

위의 코드를 이용해서 사용자 ID만 넘겨주면 사용자 정보를 반환해주는 코드를 보자

    Dim cCustDAO : Set cCustDAO = New clsCustomerDAO
    Dim cCust : Set cCust = New clsCustomer
        
    cCustDAO.init cCust, "AROUT"
    Response.Write "CustomerID : " & cCust.CustomerID & "<br>"
    Response.Write "CompanyName : " & cCust.CompanyName & "<br>"
    Response.Write "Phone : " & cCust.Phone & "<br>"

cCustDAO.init cCust, "AROUT" 이 부분을 보면 제일 만든 클래스의 init 함수와는 다르게 인자를 하나 더 넘겨준다. 이 인자는 clsCustomer 클래스의 인스턴스인데 이렇게 하는 이유는 asp에서 상속이 안되기 때문이다. -_-;; 상속만 된다면 clsCustomer 클래스를 clsCustomerDAO에서 상속해서 이용하면 되는데 그게 안되서 인자로 넘겨줘버리는 것이다. 머리아픈 얘긴 넘어가고...단지 init 함수의 인자가 하나 더 늘어난것만 확인하자.

자! 이제 사용자 정보를 리스트로 얻어보자 이 사용자 리스트 얻는 함수는 clsCustomerDAO 클래스 내에 getList 함수를 이용하면 된다. 사용법은 아래처럼!

    Dim datas
    datas = cCustDAO.getList()
    for i = 0 to ubound(datas) - 1
        Response.Write "CustomerID : " & datas(i).CustomerID & "<br>"
        Response.Write "CompanyName : " & datas(i).CompanyName & "<br>"
        Response.Write "Phone : " & datas(i).Phone & "<hr>"
    next

getList 함수에서 사용자 정보의 클래스를 배열로 반환 해주기 때문에 간단히 위의 코드처럼 루프 돌면서 사용자 리스트를 이용하면 된다. 이런 식으로 자주 이용하는 사용자에 관한 모든 정보를 클래스로 만들어 둔다면 개발초기 당시엔 클래스 만드느라 이리저리 고생하지만 한번 제대로 만들어 두면 나중에 개발할때나 개선할때 상당히 편리하다. 단지 인자만 '틱'하고 넘겨주면 '틱'하고 데이타가 나오니깐 말이다.

그렇다고 별로 사용되지도 않는 정보들..예를 들자면 탈퇴한 회원 목록 같은것.. 이런 거의 쓰이지도 않는 정보 때문에 '탈퇴한 회원 클래스'를 만드는 것은 정말 쓸데없는 짓이다. 그러니 이런 자주 사용되지 않는 정보들은 클래스로 만들 필요가 없다.

원래는 Class 가장 기초부터 적어볼까 했는데...기초 적는게 더 힘들다. 기초는 그냥 존내 야리면 어느순간 퍼뜩 깨달음(?)이 생긴다. 일단 사용해 보는거다 -_-... 일단 사용해보고 어느정도 개념이 생겼다면 그 때 책봐도 된다.

요 글은 뭉충닷컴에도 있습니다.

'asp' 카테고리의 다른 글

Base64 인코딩 & 디코딩  (1) 2007.05.03
VB 함수  (3) 2007.05.03
문자열 자르기 베스트 3 입니다  (0) 2007.05.03
프로시저 데이터 타입 정리  (0) 2007.05.03
ASP 오류 번호 정리  (0) 2007.05.03

+ Recent posts