Database

21
Database NHN NEXT 남현욱

Transcript of Database

Database

NHN NEXT남현욱

01

ODBC

01 ODBC

•ODBCOpen DataBase Connectivity의 약자로, DBMS에 독립적인 프로그램을 작성하기 위해 마이

크로소프트에서 제공하는 API를 말한다. ODBC API를 이용하면 각 DB가 제공하는 인터페이스

를 모르더라도 일관성 있게 DB에 접근할 수 있다.

실제 DataBase는 종류가 아주 많고 사용 방법도 저마다 다르기 때문에 ODBC를 사용하지

않고 프로그램을 작성한다면 각 프로그램은 특정 종류의 DB에 종속적이게 될 수 밖에 없다.

ODBC는 각 DB간의 차이를 무시하고 프로그램을 짤 수 있게 해 주는 동시에 프로그램의 특정

DB 종류에 대한 종속성을 없애주는 역할을 하는 것이다.

하지만 ODBC는 C언어 기반이라 타 언어에서는 사용할 수 없다는 점(Java는 JDBC가 있긴 하

다), 동일 API로 처리하기 위해 거쳐 지나가는 여러 단계때문에 특정 DB에서는 성능 저하가 발

생한다는 단점도 존재한다.

01 ODBC

•ODBC구조아래 그림과 같은 구조를 갖고 있어 프로그래머가 ODBC AP에 맞춰 프로그램을 작성하면 실제

DB를 무엇을 쓰고 있느냐를 신경쓸 필요없이 코딩할 수 있는 것이다. 다만 각 DB에서 제공하는

ODBC 드라이버가 설치되어 있어야만 사용 가능하다.

DataBase 응용 프로그램

ODBC API

ODBC 드라이버 관리자

OracleODBC 드라이버

데이터 소스

Oracle DBMS

MS SQLODBC 드라이버

데이터 소스

MS SQL DBMS

기타ODBC 드라이버

데이터 소스

기타DBMS

01 ODBC

•ODBC사용법(MSSQL기준)우선 제어판 - ODBC 데이터 원본 관리자로 가서 시스템 DSN에 드라이버를 등록해야 한다.

아래 링크 참조.

SQL Server 에서 sa 계정 활성화 : http://fromyou.tistory.com/410

ODBC 등록 : http://www.icancrm.com/app/odbc/index.asp?ref=mssql

01 ODBC

•ODBC사용법(MSSQL기준)등록한 후에는 아래와 같은 코드를 통해 DB와 연결할 수 있다.(* 에러 검사 생략)

#include <sql.h>#include <sqlext.h>#define MAXBUFLEN 255#define DSN L"DRIVER={SQL Server};SERVER=MyServer;UID=sa;PWD=pwd;DA-TABASE=GameDB;"

SQLHENV hEnv = SQL_NULL_HENV;SQLHDBC hDbc = SQL_NULL_HDBC;

SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &hEnv);SQLSetEnvAttr(hEnv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);SQLAllocHandle(SQL_HANDLE_DBC, hEnv, &hDbc);

SQLWCHAR retconstring[MAXBUFLEN];ret = SQLDriverConnect(hDbc, NULL, (SQLWCHAR*)DSN, SQL_NTS, retconstring, MAXBUFLEN, NULL, SQL_DRIVER_NOPROMPT);

01 ODBC

•ODBC사용법(MSSQL기준)DB와 연결 후에는 아래 함수들을 이용해 쿼리문을 수행한다.

인자바인딩

SQLRETURN SQLBindCol(

SQLHSTMT StatementHandle, // SQL 명령문 핸들

SQLUSMALLINT ColumnNumber, // 열의 순서 (1부터 시작)

SQLSMALLINT TargetType, // 열의 데이터형

SQLPOINTER TargetValuePtr, // 바인딩될 변수 포인터

SQLINTEGER BufferLength, // 바인딩될 변수의 크기

SQLLEN* StrLen_or_Ind // 열의 길이나 상태를 반환 받을 변수

);

01 ODBC

•ODBC사용법(MSSQL기준)DB와 연결 후에는 아래 함수들을 이용해 쿼리문을 수행한다.

쿼리문수행

SQLRETURN SQLExecDirect( SQLHSTMT StatementHandle, // SQL 명령문 핸들 SQLCHAR* StatementText, // 실행될 SQL 문 SQLINTEGER TextLength // 실행될 SQL 문의 길이

);

쿼리문수행한결과받기(fetch)

SQLRETURN SQLFetch( SQLHSTMT StatementHandle // SQL 명령문 핸들);

01 ODBC

•ADO(ActiveXDataObject)

OLEDBODBC보다 좀 더 확장된 개념으로 OLE DB가 있다. OLE DB도 ODBC와 역할은 비슷하나,

OLE DB는 관계형 DB뿐만 아니라 비관계형 DB(엑셀 파일 등)와도 통신이 가능하게 해준다.

ADO OLE DB를 사용하는 프로그램에서 DB 작업은 DB에 데이터 처리를 요청하고 그 결과를 돌려

받는 것으로 구성된다. 실제 데이터 처리 요청에 대한 처리 작업은 내부적으로 요청을 받은 드라

이버와 해당 DB 내에서 이루어지므로 프로그램 쪽에서는 신경 쓸 필요가 없기 때문이다. 이 때

프로그램에서 데이터 처리 요청 및 결과 반환에서 사용하는 것이 ADO 객체이다. connection,

command, record 등등 각 상황에 맞는 ADO 객체가 있어서 각 상황에 맞는 객체를 이용해 DB

와 통신한다. 말하자면 응용 프로그램 단에서 DB 처리를 위해 사용하는 일종의 추상화된 객체인

것이다.

01 ODBC

•ORM(ObjectRelationalMapping)OOP 개념을 지원하는 언어(C++, JAVA등)와 데이터를 다루는 RDBMS 시스템은 그 구조가 상

당히 다르다. ORM은 이 둘 사이를 적절히 매핑해줌으로써 프로그램의 생산성을 크게 향상시켜

줄 수 있는 개념이다.

회사원(worker)의 표현 방식

string nameint age

Person

string rankint salary

Worker

OOP

id : intname : stringage : intrank : stringsalary : int

Worker Table

RDBMS

같은 대상이라도 서로 표현하는 방식이 다름

01 ODBC

•ORM(ObjectRelationalMapping)ORM에서 중요한 건 OOP에서 객체 1개와 RDBMS에서의 테이블 1개가 반드시 1대1로 매칭되

지 않는다는 것이다. 상속, 포함 관계들이 얽히다보면 하나의 객체를 여러 개의 테이블로 분리해

서 저장하는 게 나을 수도 있고, 그렇지 않을 수도 있다. 이 매핑 방법에는 크게 3가지가 있다.

one-to-one

말그대로 table 하나와 OOP의 객체 하나를 1대1로 매핑하는 것이다.

SUBSETmapping

하나의 table을 하나 이상의 객체와 매핑시키는 것이다. 앞 예제에서 Person - Worker 클래스

와 Woker Table을 서로 매핑시키는 것이 이 경우에 해당한다.

SUPERSETmapping

반대로 하나 이상의 table을 하나의 객체와 매핑시키는 것이다.

각 개념에 대한 자세한 매핑 방법은 http://goo.gl/LUW40에 자세히 설명되어있으니 이 링크

를 참조하면 좋을 듯(자바지기!).

02

Stored Procedure

02 Stored Procedure

•StoredProcedureSQL 쿼리문은 일반적으로 하나의 쿼리문이 하나의 동작을 수행한다(SELECT, INSERT,

UPDATE 등). 하지만 실제 어플리케이션이 동작하는 상황에서는 데이터 처리 요청이 단

하나의 쿼리문으로 수행될 수 없는 경우가 많다. 이런 경우에 Stored Procedure가 힘을

발휘한다. Stored Procedure는 어떤 데이터 처리 요청에 필요한 쿼리문들을 하나의 실행 절차

(Procedure)로 묶어둔 것을 가리킨다.

장점서버/클라이언트 네트워크 트래픽 감소(SP 요청 - SP 수행 - 결과 반환 1번으로 가능하므로.

쿼리문으로 날릴 경우 여러 번 왔다갔다 해야하므로 트래픽이 많이 발생함), 보안 강화(외부에서

는 DB 서버에서 동작하는 SP 내부의 수행 과정을 알 수 없다), 코드 재사용

단점배포의 복잡성(응용 프로그램 배포 + SP 배포), 언어 자체의 기능 부족

02 Stored Procedure

•예제아래와 같은 테이블이 있다고 가정하고, CRUD 동작에 대한 SP 예제를 살펴보자.

CREATE TABLE [Player]( [id] INT NOT NULL PRIMARY KEY IDENTITY(1, 1), [name] VARCHAR(32) NOT NULL, [posX] FLOAT NOT NULL, [posY] FLOAT NOT NULL, [posZ] FLOAT NOT NULL);

02 Stored Procedure

•예제CREATE

CREATE PROCEDURE createPlayer @name VARCHAR(32), @posX FLOAT, @posY FLOAT, @posZ FLOATASBEGIN INSERT INTO Player (name, posX, posY, posZ) VALUES (@name, @posX, @posY, @posZ);END

02 Stored Procedure

•예제READ

CREATE PROCEDURE readPlayer @name VARCHAR(32)ASBEGIN SELECT * FROM Player WHERE name = @name;END

02 Stored Procedure

•예제UPDATE

CREATE PROCEDURE readPlayer @name VARCHAR(32), @posX FLOAT, @posY FLOAT, @posZ FLOATASBEGIN UPDATE Player SET posX = @posX, posY = @posY, posZ = @posZ WHERE name = @name;END

02 Stored Procedure

•예제DELETE

CREATE PROCEDURE deletePlayer @name VARCHAR(32)ASBEGIN DELETE FROM Player WHERE name = @name;END

03

Half Sync Half Async

03 Half Sync Half Async

•HSHA(HalfSyncHalfAsync네트워크(IO) 처리는 Async하게, 데이터(로직)의 처리는 Sync하게 처리하는 방식을 말한다.

서로 다르게 동작하는 Async, Sync 두 Layer 간의 통신을 위해 Message Queue가 필요하다.

사진 출처http://egloos.zum.com/javawork/v/1818696

SyncLayer 메시지 큐에 작업이 등록되어 있는지 확인하

고 작업이 있다면 꺼내서 처리

MessageQueueAsync Layer와 Sync Layer간의 통신을 위

한 Queue. Async Layer에서 작업을 등록

AsyncLayer외부로부터 event를 받아와 queue에 등록

03 Half Sync Half Async

•DB에서의활용DB의 경우 입력을 순차적으로 처리해야한다. 입력 순서에 따라 DB에 저장되는 결과가 달라질

수 있기 때문이다. 그런데 IOCP를 이용한 IO 작업은 멀티 스레드 환경에서 병렬적으로 일어나기

때문에 DB의 순차적 입력 처리를 보장하기가 쉽지 않다. 이럴 때 HSHA를 이용해서, DB 서버와

의 통신(데이터 처리 요청 및 결과 받기) 작업은 Async하게 처리하고, 그 결과를 Queue에 받아

서 Sync Layer에서 순차적으로 처리하는 것이다. DB 처리 요청 - 결과 받기까지 Blocking도

하지 않아도 되므로 잘 쓰면 성능적인 측면에서도 향상을 기대할 수 있을 듯?