Skip to content

[ SQL 첫걸음 ] 제 1장 데이터베이스와 SQL

참고

SQL 첫걸음을 참고로 공부한 내용입니다.

01강 데이터베이스

데이터란 컴퓨터 안에 기록되어 있는 숫자를 의미하며, 이러한 데이터의 집합을 데이터베이스라고 합니다. 데이터베이스 내의 데이터는 영구적으로 보존되어야 하기 때문에 주기억장치에만 데이터를 저장한다면, 전원을 끄는 순간 모든 데이터는 사라져 버립니다. 따라서 데이터베이스의 데이터는 하드디스크나 플래시메모리(SSD) 등 비휘발성 저장장치에 저장합니다.

시스템 내의 데이터베이스

일반적으로 데이터베이스는 데이터센터의 서버에서 운용했는데 요즘은 개인용 컴퓨터 혹은 휴대용 기기 등에도 내장되어 있습니다.

POS 시스템을 사용할 경우에도 판매정보(데이터)를 데이터베이스에 저장하거나 휴대전화 속에서 전화번호부에 연락처를 저장하는 것도 데이터베이스에 저장하는 경우입니다.

DB와 DBMS

데이터베이스는 DB라는 약자로 통용됩니다. 그리고 이를 관리하는 소프트웨어를 데이터베이스 관리 시스템(Database Management System) 약자로 DBMS라 합니다.

생산성

시스템 개발 과정에서의 생산성 향상을 도모할 수 있습니다. 일반적으로 어떤 시스템에서든 CRUD(Create Read Update Delete)라 불리는 데이터 검색, 추가, 삭제, 갱신 같은 처리가 이루어지기 때문에 이런 기본적인 기능을 DBMS를 통해 쉽게 구현할 수 있습니다.

기능성

DBMS는 단순한 CRUD 외에도 대용량의 데이터를 저장하고 고속으로 검색하는 등 다양한 기능을 제공합니다. 또한 사용자가 확장할 수 있기 때문에 유연한 시스템 개발이 가능합니다.

신뢰성

대규모 데이터베이스는 많은 요청에 대응할 수 있도록 만들어져 있습니다. 이를 위해 하드웨어를 여러 대로 구성하기도 하는데 실제로 컴퓨터를 여러 대 두고 소프트웨어를 통해 확장성(Scalability)부하 분산(Load Balancing)을 구현하기도 합니다. 이를 보통 클러스터 구성 또는 스케일 아웃이라 합니다.

정보

확장에는 스케일 아웃(Scale Out)스케일 업(Scale Up)이라는 두 가지 방식이 존재합니다.

스케일 아웃의 경우 서버를 여러 대 추가하여 시스템을 확장하는 방법을 의미합니다. 여러 대의 서버를 추가해야 하기 때문에 각 서버의 부하를 균등하게 관리하기 위한 부하 분산(Load Balancing)이 필수적입니다. 서버 한 대가 장애로 인해 사용하지 못하게 되더라도 다른 서버로 서비스를 제공할 수 있다는 장점이 있습니다. 그러나 여러 대로 서버를 사용하기 때문에 데이터가 일관되지 않은 정합성 문제가 발생할 수 있습니다. 주로 웹 서버에 적합한 방식입니다.

스케일 업의 경우 서버에 CPU 또는 RAM 등을 추가하거나 고성능 부품을 통하여 확장하는 방법을 의미합니다. 스케일 아웃과 달리 서버 한 대에 모든 부하가 집중되기 때문에 장애가 발생했을 때 복구될 때까지 서비스가 중단됩니다. 그러나 부하에 대해 신경써야 하는 것들이 스케일 아웃에 비해 단순하며 무엇보다 데이터 정합성 문제에서 자유롭다는 장점이 있습니다. 주로 데이터베이스 서버에 적합한 방식입니다.

결론적으로 책에서는 스케일 아웃을 언급했지만 데이터 정합성 문제를 고려했을 때 스케일 업이 더 적절한 선택일 수 있습니다.

결론

DBMS를 사용하여 굳이 데이터베이스를 관리하는 이유는 이를 통해 간접적으로 데이터베이스에 접근하여 CRUD 등과 같은 여러 기본적인 기능을 통해 생산성을 향상 시킬 수 있는 것은 물론 기능성과 신뢰성 확보 또한 가능하기 때문입니다.

데이터베이스를 조작하는 언어 SQL

이러한 DBMS를 사용하기 위해 필요한 언어가 바로 SQL(Structured Query Language)입니다. 다양한 종류의 데이터베이스가 존재하는데 SQL은 그 중에서도 관계형 데이터베이스 관리 시스템(RDBMS_Relational Database Management System)을 조작할 때 사용합니다.

SQL 명령의 종류

이러한 SQL의 명령은 아래와 같이 세 종류로 구분할 수 있습니다.

DML(Data Manipulation Language)

DML(Data Manipulation Language)의 경우 데이터베이스에 데이터를 추가, 삭제, 갱신하는 등의 기본적인 조작을 할 때 사용하는 명령어입니다.

DDL(Data Definition Language)

DDL(Data Definition Language)의 경우 단어 그대로 데이터를 정의하는 명령어로 데이터를 관리하는 객체(Object)를 만들거나 삭제하는 명령어입니다.

DCL(Data Control Language)

DCL(Data Control Language)의 경우 단어 그대로 데이터를 제어하는 명령어로 트랜잭션(Transaction)을 제어하는 명령과 데이터에 대한 접근권한을 제어하는 명령이 포함되어 있습니다.

정보

컴퓨터 공학에서 트랜잭션(Transaction)이란 더이상 쪼갤 수 없는 최소한의 업무 단위를 의미합니다.

데이터베이스에서 또한 동일한 맥락에서 데이터베이스의 상태를 변화시키는 최소한의 작업 단위를 의미합니다.

예를 들어 사용자가 새로 회원가입을 진행할 때 사용자 데이터를 저장하는 테이블에 신규 가입하는 사용자의 데이터를 저장하게 됩니다. 이때 회원가입이라는 저장 작업에 의해 사용자 데이터를 저장하는 테이블의 상태가 변화되었기 때문에 이 저장이 곧 하나의 트랜잭션이 됩니다.

더 복잡하게는 여러 단계를 거쳐서 작업이 끝나는 경우도 존재하기 때문에 일부만 존재해서는 데이터베이스에 잘못된 정보가 저장될 수도 있습니다. 그래서 등장한 개념이 바로 트랜잭션으로 이를 안정적으로 처리하기 위해 커밋(Commit)롤백(Rollback)이라는 명령어를 사용하게 됩니다.

관련해서는 추후에 다시 더 자세하게 살펴볼 예정입니다.

02강 다양한 데이터베이스

데이터베이스 종류

계층형 데이터베이스

폴더와 파일 등과 같이 계층 구조로 데이터를 저장하는 방식의 데이터베이스입니다. 하드디스크 또는 DVD 파일 시스템이 이러한 계층형 데이터베이스라고 할 수 있습니다. 현재는 잘 사용하지 않습니다.

관계형 데이터베이스

관계 대수(Relational Algebra)라는 것에 착안하여 고안한 데이터베이스입니다. 쉽게 설명하면 마치 엑셀과 같이 표 형식의 2차원 데이터를 저장하는 데이터베이스입니다. 이때 가로 방향은 , 세로 방향은 을 의미합니다.

정보

관계형 데이터베이스 모델링에는 관계 해석(Relational Calculus)관계 대수(Relational Algebra)라는 두 가지 언어가 존재합니다.

관계 해석의 경우 술어 해석(Predicate Calculus)에 기반을 두어 데이터베이스를 모델링하기 위한 언어로 원하는 정보가 무엇(What)인지만 정의하는 비절차적 특성이 있습니다. 따라서 과정은 상관없이 결과에 의존하게 됩니다.

반대로 관계 대수의 경우 원하는 정보과 그 정보를 얻기 위해서 어떤(How) 방법을 활용하는 지 기술하는 절차적 특성이 있습니다. 관계형 데이터베이스를 위한 특별한 연산으로 SELECT, JOIN 등의 연산을 사용하며 이를 순수관계 연산자라 부릅니다.

관계 해석관계 대수의 처리 기능과 능력 자체는 동등합니다.

객체지향 데이터베이스

객체(Object) 그대로를 데이터로 저장하는 데이터베이스입니다.

XML 데이터베이슨

XML(eXtensible Markup Language)이란 태그를 이용해 마크업 문서를 작성할 수 있는 마크업 언어로 HTML과 유사합니다. XML 데이터베이스는 이러한 XML 형식으로 기록된 데이터를 저장하는 데이터베이스입니다. SQL 명령어를 사용할 수 없어 대신 XQuery라는 전용 명령어를 사용해야 합니다.

키-밸류 스토어(KVS)

키(Key)와 그에 대응하는 값(Value)으로 구성된 쌍(Pair) 형태의 데이터를 저장하는 데이터베이스입니다.

정보

키(Key)와 값(Value)의 조합은 자료구조 중 주로 연상 배열(Assoicate Array)이나 해시 테이블(Hash Table)에서 사용되는 개념입니다.

이때 연상 배열은 맵(Map) 또는 딕셔너리(Dictionary)라고 부르기도 합니다.

RDBMS 사용 시스템

이전에는 대용 범용기기(Main Frame)에서 주로 RDMBS를 사용했는데 최근에는 웹 시스템과 연동하여 사용하거나 휴대전화 자체에도 RDBMS를 내장합니다. 예를 들어 안드로이드에는 SQLite라는 RDBMS가 표준으로 기본 내장되어 있습니다.

데이터베이스 제품

RDBMS는 단어 그대로 데이터베이스를 관리하는 소프트웨어를 일컫는 말로 실제로는 여러 RDBMS 소프트웨어가 존재합니다.

Oracle

오라클에서 개발한 RDBMS로 역사가 깊어 많은 시스템에서 채택해 사용 중입니다.

DB2

IBM이 개발한 RDBMS로 Oracle과 마찬가지로 역사가 오래된 RDBMS입니다. DB2는 Oracle과 달리 IBM 컴퓨터에서만 구동이 가능했어서 시장 점유율이 현저히 낮습니다.

SQL Server

마이크로소프트가 개발한 RDBMS로 윈도우 플랫폼에서만 동작합니다.

PostgreSQL

오픈소스 커뮤니티가 개발한 RDBMS로 무료 소프트웨어이기 때문에 자유롭게 사용할 수 있습니다.

MySQL

오픈소스 커뮤니티가 개발한 RDBMS입니다. 처음 개발 당시 경량 데이터베이스를 강조하여 최소한의 기능만 갖췄었지만 현재는 여러 기능이 확장되어 다른 RDBMS와 비교해도 충분히 많은 기능을 가지고 있습니다.

SQLite

오픈소스 커뮤니티가 개발한 RDBMS로 주로 임베디드 시스템에서 사용되는 작은 RDBMS입니다.

SQL의 방언과 표준화

앞서 여러 종류의 RDBMS 소프트웨어가 존재하기 때문에 비슷한 조작을 실행하더라도 서로 다른 명령어가 필요한 상황이 발생했습니다. 예를 들어 키워드를 생략해야 하는 경우가 대표적입니다.

Oracle, SQL Server의 경우 아래와 같이 DELETE 명령어를 사용할 때 FROM 키워드를 생략할 수 있습니다.

DELETE sample1

그러나 DB2, MySQL, PostgreSQL의 경우 FROM 키워드를 생략할 수 없습니다.

DELETE FROM sample1

이러한 방언을 없애고 표준어를 사용하려는 노력으로 ISO(International Standards Organization) 또는 ANSI(American National Standards Institute)가 SQL-92와 같은 표준 SQL를 만들었습니다.

03강 데이터베이스 서버

많은 RDBMS가 클라이언트/서버 모델을 채택해 가동 중입니다. 따라서 데이터베이스를 네트워크로 연결된 서버라는 관점으로 볼 수 있습니다. 이때 클라이언트는 서버에 접속 요청 또는 SQL 명령 실행 요청을 보낼 수 있습니다. 서버는 이를 처리하고 클라이언트에 그 결과를 반환합니다.

클라이언트/서버 모델

클라이언트/서버 모델이란 사용자 조작에 따라 요청(Request)을 전달하는 클라이언트(Client)와 해당 요청을 받아 처리하고 응답(Response)하는 서버(Server)로 소프트웨어를 나누어 하나의 모델을 구현하는 시스템을 의미합니다.

웹 시스템에서의 클라이언트/서버

웹 시스템은 브라우저와 웹 서버로 구성되는 클라이언트/서버 모델의 시스템을 의미합니다. 이때 웹 시스템에서 클라이언트 기능을 하는 브라우저는 사용자가 지정한 URL과 연결된 웹 서버에 요청(Request)을 보내고 서버는 이에 맞는 처리를 하여 응답(Response)합니다. 웹은 이러한 요청과 응답이 되풀이됩니다.

RDBMS의 클라이언트/서버

RDBMS 또한 웹과 마찬가지로 클라이언트/서버 모델로 시스템이 구성되는데 이때 사용자 인증이 필요합니다. 사용자 별로 데이터베스에 대한 접근을 제한할 수 있기 때문입니다.

사용자 인증은 사용자 아이디와 비밀번호로 실행되며 인증에 성공해야 데이터베이스에 접근하여 특정 명령을 수행할 수 있습니다.

SQL 명령 실행

성공적인 사용자 인증 이후 RDBMS에 접속하면 SQL 명령을 서버에 보낼 수 있습니다. 이때 한 번 데이터베이스에 접속하면 이를 유지하여 굳이 재접속할 필요가 없으며 보통 클라이언트를 종료할 때 데이터베이스 접속도 끊깁니다.

웹 애플리케이션의 구조

웹 애플리케이션은 일반적으로 웹 서버와 데이터베이스 서버의 조합으로 구축됩니다. 이때 실제로 데이터베이스에 접속하는 것은 프로그래밍 언어로 만들어진 CGI(Common Gateway Interface) 프로그램입니다. 따라서 웹 서버의 CGI 프로그램이 데이터베이스의 클라이언트가 되어 사용자 인증을 거쳐 정상적으로 데이터베이스 서버와의 접속을 완료한 이후 필요한 SQL 명령을 전달하고 그 결과를 전달 받아 브라우저로 전달하게 됩니다.

정보

기존 웹은 컨텐츠를 그대로 전송하는 정적인 형태였습니다. 그러나 이후 규모가 점점 거치면서 사용자의 요청에 따라 원하는 페이지를 보여주는 동적인 형태가 필요해졌습니다. 이때 웹을 동적인 형태로 기능하게 해주는 프로그램 중 하나가 바로 CGI(Common Gateway Interface)입니다.

CGI란 더 구체적으로는 웹 서버와 외부 프로그램 사이에서 정보를 주고받는 방법이나 규약을 의미합니다. 많은 웹 서버, 프로그램이 존재합니다. 이 사례에서 당장 RDBMS만 생각하더라도 웹 서버 입장에서는 외부 프로그램입니다. 이러한 다양한 종류의 서버와 프로그램이 서로 입출력을 주고 받을 표준이 필요하여 등장하게 된 것입니다.

이외에도 자바에서 톰캣(Tomcat)과 같은 WAS(Web Application Server), 파이썬에서 구니콘(Gunicorn)과 같은 WSGI(Web Server Gateway Interface)** 등이 있습니다.

MySQL 서버와 mysql 클라이언트

MySQL 패키지를 PC에 설치하면 MySQL 서비스라는 데이터베이스 서버와 mysql 커맨드라는 클라이언트를 사용할 수 있게 됩니다.

PC 한 대로 클라이언트와 서버 모두 실행할 수 있지만 네트워크 기능은 필요합니다. 클라이언트에서 서버에 접속해야 하는데 이때 네트워크를 경유하여 PC의 서버로 되돌아오는 형태로 접속합니다. 이를 루프백 접속(Loopback Connection)이라 합니다.