DB 구조

RuuNee
|2024. 8. 2. 10:17
반응형

 

DBConnection 클래스

DBConnection 클래스는 말그대로 DB와의 연결에 중점이 되어있는 클래스이다.

Connection(), Clear(), Execute(), Fetch()와 같은 중요한 함수들이 들어있다.

그리고 데이터를 읽고 쓰기 위한 BindParam(), BindCol 함수가 들어있다.

  • SQLBindParameter : StatementHandle를 통해 ParameterNumber번째 데이터를 우리가 원하는 값으로 바인딩 해주는 함수.
    • 데이터를 추가할 경우
      • 쿼리의 파라미터에 넘겨주고 싶은 값을 SQLBindParameter 함수를 통해 바인드 해줌.
      • 그 후 쿼리 실행.
  • SQLBindCol : Row 데이터 셋을 받을 때 사용. (DB에서 가져올 데이터를 현재 내 코드의 메모리에 바인드하는 함수.)
    • 데이터를 읽을 경우
      • 쿼리로 가져 올 데이터를 저장하는 변수를 SQlBindCol 함수로 바인드 해줌.
        (이 때 데이터 가져오는게 아님.)
        (쿼리에 파라미터를 지정해줘야 할 경우 SQLBindParameter 함수로 바인드.)
      • 쿼리 실행.
      • SQLFetch 함수를 반복으로 접근하여 데이터 읽어 옴.

SQLHDBC _connection : 연결할 핸들
SQLHSTMT _statement
: SQL 명령문 핸들


DBConnectionPool 클래스

DBConnection 클래스를 통해 원하는 수만큼의 연결을 생성하고 vector에 저장해준다.

그리고 db 연결이 필요하면 vector에서 pop해서 사용.

사용을 다해서 더 이상 db 연결이 필요 없어진 경우에는 다시 vector에 push 해준다.


DBBind 클래스

DBBind 클래스의 사용목적은 다음과 같다.

 

  • SQLLEN len = 0;
    SQLLEN outIdLen = 0;
    위와 같이 파라미터와 컬럼을 바인딩 할 때 마다 SQLLEN을 만들어 줘야한다.
    이 부분을 생략하기 위하여 템플릿을 이용해서 생략해주었다.

  • 쿼리에서 요구하는 파라미터 개수 또는 출력 개수가 바인딩 된 개수와 일치한지 확인해주는 기능.

  • 위 2가지의 기능을 만들어 줌으로서 DBConnection에 직접 접근해서 파라미터와 컬럼을 바인딩 해주는게 아니라
    DBBind를 생성하면서 DBConnection을 넘겨주어서 DBConnection의 바인드 함수들을 호출해준다.
    즉, DBBind를 통해 DBConnection의 바인드 함수를 호출하게 된다.

 

 

DBBind는 위와 같은 클래스 템플릿이다.

처음 DBBind를 생성할때 파라미터의 개수와 데이터를 가져올 컬럼의 개수를 정해준다.

 

 

템플릿이기 때문에 컴파일 타임에 값이 결정되므로 위와 같이 사용할 수 있다.

 

이렇게 만들어준 SQLLEN 배열을 이용하기 위해 DBConnection에 만들었던 BindParam 함수와 Bindcol 함수를 

DBBind 클래스에서 함수 템플릿으로 만들어준다.
(문자열, 일반적인 데이터(int,float 등등), 배열 등을 처리할 수 있게 여러개의 함수 템플릿 생성)

 

 

dbconnection의 BindParam 또는 BindCol 함수를 호출 해줄때 예전처럼 SQLLEN을 생성해주는게 아니라,

DBBind 클래스를 생성할 때 만들어준 SQLLEN 배열에서 해당하는 idx의 주소를 넘겨준다.

 

 

_paramFlag |= (1LL << idx);

_columFlag |= (1LL << idx);

  • 비트 플래그를 사용하여 bind한 idx 번째의 비트를 1로 변경.

bool Validate()

  • FullBits 템플릿을 사용하여 param 또는 colum의 개수만큼 재귀적으로 접근하여 플래그를 확인한다.
    확인해서 Fullbits의 value와 flag(_paramFlag, _columFlag)의 값이 모두 같아야 true를 반환.
  • true가 반환되면 정상적으로 바인딩 된 것.

FullBits 작동 방식

  • FullBits<4>::value;
    value = 8 | FullBits<3>::value

  • FullBits<3>::value
    value = 4 | FullBits<2>::value

  • FullBits<2>::value
    value = 2 | FullBits<1>::value

  • FullBits<1>::value
    value = 1
  • FullBits<2>::value = 2 | 1 = 3
    FullBits<3>::value = 4 | 3 = 7
    FullBits<4>::value = 8 | 7 = 15

DBModel 클래스

xstring name = table.GetStringAttr(L"name");

xstring desc = table.GetStringAttr(L"desc");
위에 처럼 가져온 데이터를 임시 메모리에 저장하고 날리는게 아니라
DBModel의 클래스를 만들어서 거기에 저장 해주자.

즉, DBModel 클래스는 DB 정보를 모델링하기 위한 클래스이다.

그리고 DBModel의 함수들은 DB를 업데이트 시킬 때 필요한 쿼리를 반환한다.


DBSynchronzier 클래스

DBModel 클래스에 저장하는 역할을 DBSynchronizer 클래스가 해줄것이다

 

우선 Xml을 먼저 파싱해서 DB정보를 가져온다.

 

xvector<DBModel::TableRef> _xmlTables;
xvector<DBModel::ProcedureRef> _xmlProcedures;

그리고 그 정보를 위 메모리에 저장해놓는다.

 

다음으로 현재 DB에 접근하여 쿼리를 날려서 테이블 정보와 인덱스 정보, SP 등등을 가져온다.

 

xvector<DBModel::TableRef> _dbTables;
xvector<DBModel::ProcedureRef> _dbProcedures;

그리고  그 정보를 위 메모리에 저장해놓는다.

 

이제 Xml에서 가져온 DB정보와 현재 DB 정보를 비교하여 DB를 업데이트 시켜준다.


 

반응형

'DB' 카테고리의 다른 글

ORM  (0) 2024.03.26
DB Bind  (1) 2024.01.31
데이터베이스 연결 (ODBC)  (0) 2024.01.25