DataBase

부천대 IoT 데이터 활용을 듣는 수강생들을 위한 자료입니다.

데이터베이스란?

현대사회에서 매일 사람들은 많은 양의 데이터를 만들어내고 있다.

예를들면 FaceBook, instagram 같은 SNS에서 좋아요 , 하트를 누르거나 자신이 본 동영상이 무엇인지 나의 행위들이 모두 데이터로 저장된다. 이러한 데이터는 모두 관련된 회사의 데이터베이스에 저장된다.

그렇다면 데이터베이스란 무엇일까?

일정한 체계속에 저장된 데이터 집합을 말한다. 그리고 데이터는 데이터베이스 내에서 Table() 단위로 저장된다.

mov_id | rev_id | rev_stars | num_o_ratings
--------+--------+-----------+---------------
    901 |   9001 |      8.40 |        263575
    902 |   9002 |      7.90 |         20207
    903 |   9003 |      8.30 |        202778
    906 |   9005 |      8.20 |        484746
    924 |   9006 |      7.30 |
    908 |   9007 |      8.60 |        779489
    909 |   9008 |           |        227235
    910 |   9009 |      3.00 |        195961

위의 표는 SQL 입문자들이 가장 많이 다루는 movie 데이터의 rating 테이블이다. 위 표 형태로 저장된 집합을 테이블(Table)이라고 부른다.

데이터베이스 내에는 여러형태의 테이블이 저장된다.

아래 그림을 예시로 들면, 영화배우들의 정보는 actor에 ,영화 장르와 관련된 정보는 movie_genres에, 영화평이 담긴 정보는 reviewer에 저장된다. 이렇게 관련정보들을 table 단위로 저장해 관리하면 많은 데이터들을 체계적으로 저장할 수 있다.

그렇다면 데이터베이스를 사용하기 이전에는 어떻게 관리되고 있었을까?

데이터베이스가 발명되기 전에는 하나의 Text 파일 형태로 저장되고 관리되었다.

그리고 파일형태는 동시에 주고받고, 공유하가 어려우며 누군가가 텍스트파일을 추가하거나 수정 시 데이터가 유실되거나 혹은 잘못되는 경우가 많았다.

하지만 데이터베이스가 발명된 후 고객의 정보, 은행, 음악 등 모든 데이터가 데이터베이스로 관리되고 있다. 컴퓨터과학이 발전하면서 점점 더 대용량의 데이터를 저장하고 조회하는 요구사항이 증대되어왔다.

많은 기업에서는 고객의 디바이스로부터 많은양의 데이터를 체계적으로 데이터베이스에 저장하고 분석하여 비즈니스 가치를 창출해내고 경쟁사와의 경쟁 속에 우위를 차지한다.

그래서 데이터베이스를 잘 다루는 인재는 어느곳에서든지 환영 받을 수 밖에 없다.

데이터베이스 관리 시스템이란?

데이터베이스 관리 시스템(DataBase Management System: DBMS)이란 다수의 사용자와 데이터베이스 사이에서 정보를 생성하고, 관리해주는 소프트웨어로 우리가 흔히 알고 있는 ORACLE, MySQL, MSSQL 등의 소프트웨어 제품을 지칭한다[1].

결국 데이터베이스를 다루기 위해서는 DBMS라는 프로그램을 사용해야하고, DBMSSQL이라고 하는 언어로 조작한다.

DBMS 특징

데이터베이스 기능

기본기능

데이터베이스의 기본기능은 4가지가 있다. 조회,삽입,삭제,수정이 있는데 이러한 기능이 모두 갖춰져야 운영이 가능하다. 4가지 기능을 쇼핑몰 데이터 설명을 예시로 두고 설명을 진행하겠다.

동시성 제어

데이터베이스의 강력한 기능 중 하나인 동시성 제어가 있다. 여러 사용자가 동시에 접속해서 작업을 진행할 때 데이터의 정합성, 일관성이 어긋나지 않도록 데이터베이스는 동시성을 제어한다.

예를들어 Nike의 AirMax 97 올 화이트라는 신발 265 size가 1족밖에 남아있지 않다. id 1번이 그 한족밖에 없는 제품이 맘에들어 결제를 진행하려 할 때 id2번은 그 신발을 선택할 수 없다. 즉 누군가가 물품을 구매하려 할 때 다른누군가는 선택할 수 없다. 이러한 기능이 동시성 제어라 할 수 있다.

장애대응 기능

데이터베이스 내에 데이터가 손실이 됬을 시 복원이 가능해야 한다. 데이터 보호와 장애에 대한 방안이 있어야 한다.

보안기능

고객의 정보가 함부로 노출되거나 유출되지 않기 위해서 데이터베이스는 보안기능을 제공한다.

즉 데이터베이스는 사용자에게 보여줄 정보만 보여주고 보안에 위배되지 않도록 데이터를 암호화, 마스킹처리한다.

데이터베이스 종류 (DBMS종류)

데이터 저장방식에 따라 데이터베이스 종류는 다르게 쓰인다. 그중 관계형 데이터베이스가 가장많이 쓰이며 대표적인 DBMS는 ORACLE과 오픈소스 SQL인 PostgreSQL이 있다.

관계형 데이터베이스

관계형 데이터베이스(Relational Database)는 키(key)와 값(value)들의 간단한 관계를 테이블화 시킨 데이터베이스이며 보통 RDB라고 불린다.

2차원 표를 이용한 데이터 목록화 관리를 하는 것이 목적이고, 실생화의 모든 정보드를 관계형 데이터베이스로 관리가 가능하며 직관적인 이해가 가능하다.

관계형 모델

관계형 모델(relational model)은 집합론에 기반을 둔 일종의 데이터베이스 모델이다.

관계형 모델은 에드거 커드(Edgar Codd)에 의해 최초로 제안되었으며 컬럼(열)과 로우(행)를 이루는 하나 이상의 테이블이 존재하고 테이블에 데이터가 저장된다.

각각의 테이블은 각각의 로우를 식별하는 기본 키(Primary Key)가 있다. 컬럼(Column)은 필드(Field) 혹은 속성(Attribute) 라고도 불리며 , 로우(Row)는 레코드 혹은 튜플(Tuple)로 불린다.

Primary key(기본)

Primary Key에 대해 추가로 설명하면 속성을 나타내는 컬럼이 Primary Key가 됐을 때 이를 Natural Key라고 한다. 예를들어 사람의 주민등록번호나 책의 ISBN 을 Primary Key가 되면 Natural Key 가 된다.

그런데 어떤 개체의 실제 속성은 아니지만 Primary Key로 쓰기 위해 컬럼을 추가 했을 때 이 Surrogate Key라고 한다. 이런 Surrogate Key에는 주로 1부터 순차적으로 증가하는 숫자가 들어가게 된.

관계형 데이터베이스를 사용함으로써 프로그래밍 보다 SQL 언어로 직관적으로 데이터를 처리할 수 있, 사용자 편이성을 도모시킨다.

Primary Key 조건

PRIMARY KEY 제약 조건은 데이터베이스 테이블의 각 레코드를 고유하게 식별하기에 UNIQUE 값을 포함해야하며 NULL 값을 포함 할 수 없다(NOT NULL). 즉 NULL값이 있어서는 안되고 중복이 허용되서는 안된다. 테이블에는 기본 키가 하나만 있을 수 있고 기본 키는 하나 또는 여러 개의 필드로 구성 될 수 있다.

NULL 의 의미

NULL은 아직 적의되지 않은 값으로 0과 빈문자(공백 값)과도 다르다. NULL은 unknown 또는 N/A(Not applicable) 라는 의미로 알 수 없거나 값 자체가 존재하지 않다는 의미다.

UNIQUE KEY의 의미

다른 레코드들과 서로 다르다는것을 식별하는 역할로 테이블 내 항상 유일해야하는 값을 Unique Key라고 합니다. 즉, 중복을 허용하지 않는 컬럼이다.

Foreign Key

Foreign Key는 다른 테이블의 특정 row를 식별하는 컬럼으로 우리말로 외래 키라고 부른다. 외래는 참조하는 테이블에서 1개의 키(속성 또는 속성의 집합)에 해당하고, 참조하는 측의 관계 변수는 참조되는 측의 테이블의 키를 가리킨다. 참조하는 테이블의 속성의 행 1개의 값은, 참조되는 측 테이블의 행 값에 대응된다. 이 때문에 참조하는 테이블의 행에는, 참조되는 테이블에 나타나지 않는 값을 포함할 수 없다[3]. 즉 왜리키는 두개의 테이블을 연결해주는 연결 다리 역할을 하며 중복 된 값을 방지해준다[4].

그렇다면 외래키는 왜 필요할까?

예를들어 , 연봉 테이블에서 새로운 데이터를 넣고자 할때 외래키에 해당하는 사원 아이디가 없는 정보면 DBMS는 에러를 발생시켜 해당 데이터 삽입을 막는다. 이 기능은 테이블 내에 저장되어있는 데이터가 항상 참조하는 값이 있다는 것을 보장해주는 역할을 한다[4].

외래키를 사용하는 문법은 다음과 같다.

CREATE TABLE table_name (
   id    INTEGER  PRIMARY KEY,
   col2  CHARACTER VARYING(20),
   col3  INTEGER FOREIGN KEY REFERENCES other_table(column_name),
   ... )

다음은 EMPLOYEES DB에서 salary 테이블을 employees 테이블을 참조하도록 설정하는 실습을 갖겠다.

설정을 마친 후 apply를 누르면 다음과 같이 외래키 문법이 나온다.

해석하면 연봉테이블(salary)의 empno는 사원 테이블(employees)의 emp_no 컬럼을 참조하도록 한다.라고 할 수 있다.

SQL 이란?

SQL(Structured Query Language)는 관계형 데이터베이스 관리 시스템(RDBMS)의 데이터를 관리하기 위해 설계된 특수 목적의 프로그래밍 언어이다.

관계형 데이터베이스 관리 시스템에서 자료의 검색과 관리, 데이터베이스 스키마 생성과 수정, 데이터베이스 객체 접근 조정 관리를 위해 고안되었고, 많은 데이터베이스 관련 프로그램들이 SQL을 표준으로 채택하고 있다[2]. SQL의 장점은 일반 프로그래밍 언어에 비해 간결하고, 모국어로 말하는 것처럼 데이터 조회 및 갱신이 가능하다. 즉 간단한 영어 문장을 사용하는데 기본 조작 명령어로는 SELECT, INSERT, UPDATE, DELETE가 있다.

마이그레이션이란?

한 운영환경으로부터 다른 운영환경으로 옮기는 작업을 뜻한다. 하드웨어, 소프트웨어, 네트워크 등 넓은 범위에서 마이그레이션의 개념이 사용되고 있다. 예를들어 어떤 기업에서 'winodws 운영체제에서 Linux운영체제로 전환한다'. 혹은 'CISCO에서 Extreme로 대체한다'를 들 수 있다.

데이터베이스에서 데이터 마이그레이션이란, 데이터 베이스 스키마의 버전을 관리하기 위한 하나의 방법(데이터 전환)이다. 개발 시스템에는 데이터베이스 스키마가 변경되었지만, 운영시스템의 데이터베이스 스키마가 변경되지 않았을 경우 마이그레이션을 수행한다. 작게는 프로젝트 상 테이블 생성 및 변경 작업부터, 하나의 애플리케이션 또는 시스템을 옮기는 것까지 마이그레이션이다[3].

아키텍쳐(Architecture)

위키백과에서 정읳안 아키텍쳐는 시스템 목적을 달성하기 위해 시스템의 각 컴포넌트가 무엇이며 어떻게 상호작용하는지, 정보가 어떻게 교환되는지를 설명한다[4].

쉽게말해서 IDC 시스템을 구축하기 위해 물리적으로 서버를 어떻게 구축할지 결정하는 것이다.

IT 업에서는 아키텍쳐를 전문적으로 하시는 TA(Techinical Architecture)분들이 있다.

그렇다면 IT 아키텍쳐를 왜 설계할?

아키텍쳐는 비지니스 요구 사항을 만족하는 시스템을 구축하기 위해서 전체 시스템에 대한 구조를 정의한 문서로, 시스템을 구성하는 컴포넌트와, 그 컴포넌트간의 관계, 그리고, 컴포넌트가 다루는 정보(데이타)를 정의한다[5]. 즉 IT 정보시스템을 효율적으로 구성하기 위해서 만든다. 목표에 부합하는 아키텍쳐를 설계함으로써 비즈니스 성공을 이끈다.

아키텍처 구성을 시스템의 목적에 맞게 결정하기 위해서는 서버, OS, 미들웨어, 저장소 등 폭넓은 지식 필요 하며 적정 비용으로 필요 시스템 구축해야 된다.

IT 아키텍쳐의 역사

2013년도 이후로 클라우드 시대를 맞이하며 다양한 IT 아키텍처가 등장하기 시작했고,서버가 존재하지 않는 것처럼 운영되는 서버리스 개념도 등장했다.

Stand-alone

Stand-alone은 서버가 네트워크 접속 없이 독립적으로 작동하는 방식으로 구축 과정이 간단하고 보안성이 우수하다. 하지만 물리적 접근이 어렵고 다수의 사용자가 동시에 작업하기 어려우며 확장성이 부족하다.

클라이언트/서버

클라이언트/서버(데이터베이)는 네트워크 연결을 통한 복수 사용자가 동시에 사용가능한 환경으로 원격지에서 사용이 가능하다. 하지만 보안이 위험하고 수정과 배포하기 어렵다.

WEB3 계층

3 tier 라 불리는 Web 3계층은 클라이언트와 데이터베이스 계층 사이에 웹서버 계층과 애플리케이션 계층이 추가되었. 웹서버는 클라이언트로부터 접속 요청을 직접 받고 그 처리를 뒷단의 애플리케이션 계층에 넘기고 그 결과를 클라이언트에 반환한다.애플리케이션의 대표적인 프로그램에는 톰캣(Tomcat)이 있다.

애플리케이션 계층은 비즈니스 로직을 구현한 애플리케이션이 동작하는 계층으로 웹 서버로부터 연계된 요청을 처리하고 필요시에 따라 데이터베이스 계층에 접속해서 데이터를 추출 및 가공한 결과를 웹서버로 반환한다[6].

가용성과 확장성

IT 시스템을 구축하고 운용할 때 가용성과 확장성을 고려해야 한다.

시스템을 이용하는 1000명의 유저가 있고 각 유저에서 1초당 작업을 요청한다고 가정해보자. 그럼 그 시스템은 초당 1000개의 요청을 받게된다. 이때 그 시스템은 유저들의 요청을 모두 다 받 처리해줄 수 있는지 확인하기 위해 고려되는 요소가 가용성이다.

가용성이란 서버와 네트워크, 프로그램 등의 정보 시스템이 정상적으로 사용 가능한 정도를 말한다. 가동률과 비슷한 의미이다.가용성을 수식으로 표현할 경우, 가용성(Availability)이란 정상적인 사용 시간(Uptime)을 전체 사용 시간(Uptime+Downtime)으로 나눈 값을 말한다. 이 값이 높을수록 "가용성이 높다"고 표현한다. 가용성이 높은 것을 고가용성(HA, High Availability)이라고 한다[7].

예를들어 정상적으로 사용한 시간 100분이라고 하자 . 그런데 장애가 10분 발생했다. 이때 전체사용시간은 110분이고 정상적으로 운영한 시간이 100분이므로 아래 공식으로 가용성을 구하면 0.90% 이다.

그렇다면 확장성이란 무엇일까?

예를들어 평소에 11번가를 이용하는 유저가 100명인데 10월13일 00시에 에 반값 이벤트가 열렸다. 그 이벤트 시간에 맞춰 10만명의 유저가 접속이 몰렸을 때 11번가 시스템이 정상적으로 처리할 수 있는 여부를 따질때 확장성을 얘기한다.

확장성(Scalability)은 IT 시스템에서 대규모적인 재설계 및 재설치가 필요없이 확장이 얼마나 쉽고 가능한지에 대한 용이성을 뜻한다. 최근의 클라우드 시스템이 각광을 받는 이유 중 하나가 바로 확장성이 용이하기 떄문이다.

가용성을 높이는 전략에는 크게 스케일업(Scale-UP)과 스케일 아웃(Scale-out)이 있다.

스케일업은 컴퓨터에 CPU나 RAM을 추가하거나 고성능의 부품으로 교환하는 것을 말한다. 데이터 갱신이 빈번하게 일어나는 데이터베이스 서버에 적합한 방식으로 스케일 업으로 구성 시 신뢰성과 관리성 영역에서 혜택을 얻을 수 있다. 주로 은행권이나 통신사에서 사용하는 환경이다.

스케일아웃은 낮은 비용의 하드웨어를 기반으로 여러 서버를 사용함으로써 중복활용 하는것이다.

기성하드웨어 제품을 많이 사용하면 할수록 시스템 비용 절감 효과는 커집니다. 하지만 여러 서버를 사용하면 관리성 문제가 발생할 수 있다[8]. 주로 인터넷 커뮤니티 사이트에서 사용하는 환경이다.

서버 다중화(Redundancy)

서버를 운용해보지 않았다면 다중화란 단어가 생소할 것이다.

통신사 서비스를 이용하는 고객을 예시로 설명해보겠다. 어떤 지역에서 큰 재해로 인해 갑작스레 통신선로가 끊어졌다. 그런데 그 지역의 통신서비스를 이용하는 가맹점에서는 고객이 음식을 먹고 결제까지 진행하고 있다. 또한 그 지역에 거주하는 시민들은 아무 이상없이 배달을 주문하고 있다. 이외에도 고객들은 통신과 관련된 서비스를 이용하는데 전혀 불편함을 겪고있지 않다.

어떻게 이런일이 가능해질까? 통신사나 금융권 같이 대형 서비스를 운영하는 회사는 이런 장애를 대비해 미리 서버를 다중화했다.

다중화 장애가 발생해도 예비 운용장비로 시스템의 기능을 계속할 수 있도록 하는 것을 말한다. 즉 단일장애점(SPOF)을 없애고 무중단/고가용성 서비스를 위해 다중화 작업을 진행한다[9].

DB서버 다중화 유형

DB 서버의 다중화 유형에는 크게 3가지가 있다.

Active-Active

2대의 서버가 동시에 운영되는 서비스로 하나의 서버가 down 되더라도 다른 서버가 이를 대신 처리한다.

2대의 서버가 운영되므로 성능이 좋다. 하지만 저장소를 하나만 바라보므로 병목현상이 일어나면 서버 성에 문제가 발생하게 된다. 대표적인 DBMS 서비스의 예로는 오라클의 RAC와 티베로의 TAC가 있다.

Active-Standby

평소에는 Active 서버로만 업무를 처리하다가 Active DB서버에 장애가 일어날 때만 Standby DB서버를 사용한다. 이때 Standby 서버로 전환되기까지 Downtime이 발생한다. 그래서 Standby DB서버는 일정 간격으로 Active DB에 이상이 없는지를 조사하기 위한 통신(Heartbeat)을 한다.

평소에 1대의 서버로 운영하기에 저장소에 병목현상을 일어나지 않으나 Active-Active 구조에 비해 성능은 좋지 않다. 비용상 Active-Active 보다 유리하고 관리가 용이하다.

  • Cold-Standby : Standby DB가 작동하지 않다가 Active DB가 다운된 시점에 작동

  • Hot-Standby : 평상시 Standby DB가 작동하는 구성

Replication

앞에서 설명한 Active- Active , Active- Standby 방식은 서버부분은 다중화할 수 있지만 저장소 부분은 다중화할 수 없다. 저장소가 망가지는 경우에는 데이터를 잃게 된다.

이런 상황에 대응하기 위한 리플리케이션 방식이 있다. DB 서버와 저장소 세트를 복수로 준비하는 것이다.

DB엔진서버1(DB instance#1)과 DB엔진서버2(DB instance#2)가 거의 실시간으로 데이터가 동기화되므로 특수한 상황(재해, 전쟁, 정전)속에서도 서비스를 이용할 수 있으나 비용이 매우 많이 발생한다.

보통 금융기관, 공공기관, 통신사에서 Traffic 분산용으로 사용한다.

다음은 서버의 성능을 높이기 위한 다중화 방식으로 Shared Disk와 Shared Nothing 이 있다.

Shared Disk

앞서 Active- Active 구조와 같이 여러 서버가 1대의 저장소를 사용하는 방식이다. 이러한 구조는 병목현상이 발생할 수 밖에 없 DB 서버를 늘려도 저장소는 늘리기가 어려운 구조다.

Shared Nothing

Shared Nothing은 말 그대로 자원을 공유하지 않고 분리하는 구조로 1대의 서버와 1대의 저장소인 셋트를 늘려 나가는 방식이다.세트를 늘린만큼 처리율도 높아지는것이 특징이고 대표적인 기술로 Sharding(샤딩)이 있다[10].

RDBMS Driver 연동방법

  • ODBC

  • JDBC

ODBC

ODBC는 Open DataBase Connectivity의 약자이며 모든 DBMS에 독립적인 데이터베이스 애 플리케이션을 작성하기 위한 API(Application Programming Interface)의 집합으로, 특정한 DBMS를 사용하는 사람이 ODBC 드라이버를 통하여 다른 DBMS를 사용할 수 있게 한다. 따라서 DBMS에 연결하기 위해 단지 ODBC 드라이버 관리자(ODBC Driver Manager)를 호출하 여 사용하려는 드라이버를 호출하기만 하면 된다. 그러면 그 드라이버는 SQL(Structured Query Language)을 사용하여 DBMS와 교싞하게 된다. 즉, ODBC는 사용자와 각 데이터베이 스 엔 사이를 연결해 주어 사용자가 공통된 인터페이스로 각각의 다른 데이터베이스 엔짂 에 접근하게 하여 원하는 데이터를 참조할 수 있도록 한다[11].

JDBC

JDBC는 표준화된 Java 메소드를 통해 응용프로그램에 대한 데이터 액세스를 제공하는 제조 업체에 상관없는 동적 SQL 인터페이스로, JDBC 프로그램을 프리컴파일하거나 바인드 할 필요가 없다. 주로 Oracle , MySQL , MSSQL DBMS 사용할 때 JDBC 를 사용한다. 특정 제조업체에 무관한 표준으로서 JDBC 응용프로그램은 보다 증가된 이식성을 제공하며, Java의 이식성으로 여러 플랫폼의 클라이언트에 액세스가 가능하므로 Java 가능 웹 브라우저 또는 JRE(Java Runtime Environment)가 필요하다[11].

Reference

[1]https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EA%B4%80%EB%A6%AC_%EC%8B%9C%EC%8A%A4%ED%85%9C

[2]https://ko.wikipedia.org/wiki/SQL [3] https://life-with-coding.tistory.com/68

[4]https://ko.wikipedia.org/wiki/%EC%8B%9C%EC%8A%A4%ED%85%9C_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98

[5] https://bcho.tistory.com/667

[6]https://velog.io/@junek3/MySQL-0.-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4%EC%99%80-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98

[7]https://ko.wikipedia.org/wiki/%EA%B0%80%EC%9A%A9%EC%84%B1

[8] ORACLE 고-가용성을 위한 전략 가이드

[9] https://brainbackdoor.tistory.com/112

[10]https://ko.wikipedia.org/wiki/%EC%83%A4%EB%93%9C_(%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4_%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98)

[11] Tibero RDBMS Driver연결가이드 (ODBC, OLEDB, JDBC)

Last updated