서점이나 인터넷을 찾아보면 이제 막 개발을 시작한 나한테 데이터베이스라는 개념은 단순히 엑셀의 행과 열과 같이 단순하게 이해하고 있었다. 하지만 백엔드 개발자를 선택했으므로 데이터베이스에 대해 좀 더 명확히 알고 사용해야 될 거 같아서 이번 주제는 데이터베이스가 어떤건지 한번 알아보고자 한다.
정리를 하다보니 좀 길어졌는데 인터넷을 검색해보면 아래에 언급한 내용외에도 다양한 자료들이 많이 있다. 다음 블로그에선 데이터베이스의 기본적인 개념을 통해 스키마가 어떤건지, 스키마를 어떻게 정의해야 하는지, 데이터베이스 설계에 대해서 알아볼 예정이다.
백엔드 개발자로써 Django를 이용해 데이터베이스를 만들고, API를 구현하고 프론트엔드의 요청에 따른 DATA를 전달해주는 역할을 하고 있는데,
1)데이터베이스가 어떤거고,
2)컴퓨터의 저장장치(하드디스크 등)를 이용해도 되는데 왜 Database가 생겼는지,
3)어떤 용어들이 있고,
4)어떻게 설계해야 하는지,
등을 정리하고 넘어가야 할 듯 하다.
기본적인 개념은 핵심만 짚고 넘어가고, 실전에서 어떻게 사용하는지에 대해 자세히 다룰 예정이다.
목차
- 데이터와 정보의 차이
- Django의 기본개념
- API란?
- 파일시스템이란?
- 데이터베이스의 유래
- 데이터베이스의 개념
- 데이터베이스의 특징
- AICD(원자성,-일관성,-고립성,-지속성)
- SQL과 NoSQL
- DBMS
데이터와 정보의 차이
- 데이터(Data): 현실세계에서 벌어지는 일들을 단순한 방법으로 관찰하고 측정해서 얻은 값
- 정보(Infomation): Data를 처리해서 얻을 수 있는 결과
- 데이터베이스에 저장되는 것은 Data이며, Database 자체가 정보를 제공하지는 않는다.
컴퓨터 시스템에서 사용하는 로그파일은 단순한 데이터이며, 이 로그파일로 유의미한 결과를 얻으면 이 결과는 정보가 된다.
Django의 기본 개념
- 고도의 데이터베이스 기반 웹사이트를 작성하는데 있어서 수고를 더는것이 장고의 주된 목표라고 한다.
- 웹 개발에서 번거로운 요소들을 새로 개발할 필요 없이 내장된 기능만을 이용해 빠른 개발을 할 수 있다.
- 관계형 데이터베이스를 구축해주는 models.py, HTTP요청을 처리해주는 웹 템플릿 시스템인 veiws.py, URL의 라우팅을 처리하는 URL컨트롤러(urls.py)로 구성된 MVC디자인 패턴을 따른다.(MTV(model, Templete, View)로 분류해 MTV 프레임워크라고도 함)
- Model은 데이터에 대한 정보를 담고 있으며, DB에 접근, 검증, 작동과 데이터 사이의 관계를 정의한다.
- 현재 구현하고 있는 Model은 서로 관련된 데이터를 하나의 Python Class로 정의하고, 각각의 Class가 데이터베이스의 Table이 된다.(ex: users테이블은 user의 이름, 아이디, 이메일, 패스워드, 주소 등이 있을 수 있음)
API란?
API(Application Programing Interface)는 어떠한 응용프로그램에서 데이터를 주고 받기 위한 방법을 의미하며, 어떤 특정 사이트에서 특정 데이터를 공유할 경우 어떠한 방식으로 정보를 요청해야 하는지, 그리고 어떠한 데이터를 제공 받을 수 있을지에 대한 규격들을 API라고 한다. API는 사용하는 방법과, 용도에 따라 오픈 API와, 비공개 API 정보가 있습니다. 오픈 API는 말 그대로 누구나 쉽게 접근하여 정보를 공유하기 위해 만들어진 규격이며, 비공개 API는 권한이 있는 일부 사용자들에게만 정보를 제공하기 위해 만들어진 규격이라고 생각하면 된다.(여기서 IT에 대해 조금 더 알고 있는 분이라면 쉽게 접하고, 들어봤을 법한 REST API가 어떤건지 궁금해 할 수 있는데, 아래 블로그를 방문해서 기본개념을 잡으면 좋을 듯 하다.) REST API란?
데이터베이스를 알기 전에 먼저 컴퓨터의 보조기억장치, 즉 파일시스템에 대해 알아보자.
파일시스템이란?
- 운영체제에서 보조 기억 장치와 그 안에 저장되는 파일을 관리하는 시스템을 말함.
- 사용자가 원하는 파일의 생성, 삭제 변경 등을 효율적으로 처리하기 위해 파일시스템이라는 것을 이용했고, 파일시스템의 개념으로 부터 중복된 정보를 효율적으로 처리하는 방법을 연구하게 되고, 이로 인해 중복이 없는 데이터의 집합을 유지하는 것을 데이터베이스 라고 한다.
데이터베이스의 유래
- 1950년대 미국에서 군비의 관리를 위해 도서관 개념을 개발하면서 데이터의 기지 라는 뜻의 데이터베이스라 일컬었다.
- 1965년에 디벨로프사가 개최한 컴퓨터 중심 데이터베이스 시스템 이라는 심포지엄에서 처음으로 사용했다고 한다. 데이터베이스의 개념
- 본래 데이터를 저장하는 컴퓨터의 기억장치들과 프로세서, 네트워크 분야의 기술이 발전됨에 따라 데이터베이스와 데이터베이스를 관리하는 프로그램인 DBMS도 같이 성장해왔다.
-
데이터베이스 기술의 발전은 데이터 모델이나 구조에 따라 현재는 세개의 시대로 나뉘며, 다음과 같다.
-
관계형 모델(1970년)
- 술어 논리와 집합론에 기반을 둔 모델
- 서로간의 상호 관련성을 가진 형태로 표현한 데이터를 말함
- 모든 데이터들은 2차원 테이블(table)로 표현되며, 각각의 테이블은 행(Column)과 열(Row)로 구성되어 있다.
- 각각의 로우는 변하지 않는 고유 값(Primary Key, 이하 PK)을 가지고 있으며, 이를 통해 해당 로우를 찾거나 사용할 수 있게 된다. 각 테이블의 고유값(PK)를 통해 각각의 테이블을 재구성하지 않고 다양한 방법으로 접근하거나 조합할 수 있다.(각각의 테이블에 PK에 Foreign Key를 달아서 사용)
ex) user테이블이 있다면 테이블의 userid값을 통해 userprofile 테이블에 접근 할 수 있도록 ForeignKey를 지정 => 만약 user테이블에 없는 user_id값을 지정하면 에러가 난다. - 테이블끼리의 연결은 크게 one to one(1:1), one to many(1:다), many to many(다:다) 3종류가 있다.
- 표준언어는 SQL을 사용하며, CREATE, INSERT, UPDATE, DELETE, SELECT 등 직관적인 문법으로 데이터베이스나 테이블을 만들거나 각각의 로우 데이터에 접근하여 CRUD할 수 있다.
- 하나의 테이블에 모든 정보를 다 넣음녀 동일한 정보들이 불필요하게 중복되어 저장되기 때문에 더 많은 디스크를 사용하게 되고, 잘못된 데이터가 저장될 가능성이 높아진다.
- 위와 같은 문제를 해소하고자 테이블을 나누어 저장한 후 필요한 테이블끼리 연결시켜서 사용한다.
- 이는 중복된 데이터를 저장하지 않아서 데이터를 더 효율적으로 사용하고, 같은데이터지만 부분적으로 틀린 데이터가 생기는 문제가 없어진다.
- 이를 normalization이라고 한다.
정형화된 데이터들, 데이터의 완전성이 중요한 데이터를 저장하는데 유리하다.(예시: 전자상거래 정보,은행 계좌 정보, 거래 정보 등등)
-
비관계형 데이터베이스(NoSQL)
- 초고용량 데이터 처리 등 성능에 특화된 목적을 위해 비 관계형 데이터 저장소에 비 구조적인 데이터를 저장하기 위한 분산저장 시스템 => 최근 각광받고 있는 빅데이터에 대한 처리에 특화되었다고 보면 될듯
비정형화된 데이터, 완전성이 상대적으로 덜 유리한 데이터를 저장하는데 유리하다.(예: 로그 데이터
-
객체지향 모델(1980년)
-
객체지향 임피던스 불일치의 불편함을 극복하고자 개발되어 짐
- OOP(객체 모델1)와 관계형 데이터베이스(관계 모델)는 같은 데이터를 표현하고 다루는 방법이 차이가 발생한다는 것이고, 이를 Object-relational impedance mismatch라고 한다. 즉, 데이터베이스 모델과 프로그래밍 언어 모델 사이의 차이점 때문에 발생하는 문제이다.
- 객체지향 프로그래밍에 쓰이는 것으로 객체의 형태로 표현하는 데이터베이스 모델이다.
- Class에 따라 데이터 구조를 표현하고, 데이터와 조적 절차를 함께 다룬다.
- 객체지향 프로그래밍 언어는 발전한데 반해, 객체지향 모델은 현재 많이 사용되고 있지 않다고 한다.
-
Python Django는 객체지향 모델 즉, Object Relational Mapping(ORM)에 의해 사용되며, Django ORM은 Database에 접근할 때 SQL문을 사용하지 않고, 쿼리셋(으로 사용된다.
- 쿼리셋: 전달받은 모델의 객체 목록, 데이터베이스로부터 데이터를 읽고, 필터를 걸거나 정렬을 할 수 있다. 즉, 데이터베이스에 접근해서 데이터 CRUD하기 위한 것
-
-
데이터베이스의 개념
- 여러 사람이 공유하고 사용할 목적으로 관리되는 정보의 집합
-
논리적으로 연관된 하나 이상의 자료의 모음으로 고도로 구조화 함으로써 검색과 갱신의 효율화를 꾀함
- 논리: 사전적 의미로는 말이나 글을 이치에 맞게 쓰는 일이라고 하며, 물리적인 형태가 없는 사고 과정을 말한다. 즉, 개념을 이해하고, 데이터들의 연관성을 생각해서 테이블 구조를 잘 설계하라는 듯(?) — 논리적으로 생각해라, 비논리적이다 라는 말은 많이 들어봤지만 논리를 명확히 정리하긴 애매모호한 것 같다. 논리를 검색하니 철학적인 내용이 많이 검색이 되는데,, 그냥 많은 사람들이 수긍할 수 있는 답을 찾아서 그거에 따른 테이블을 만들면 될 거 같다.
- 자료의 중복을 없애고 구조화하여 기억시켜 놓은 자료의 집합체
데이터베이스의 특징
- 실시간 접근성: 비정형적인 질의에 대하여 실시간 처리에 의한 응답이 가능해야 함
- 지속적인 변화: 동적인 데이터베이스의 Inssert, Delete, Update로 항상 최신의 데이터를 유지
- 동시 공유: 서로 다른 목적을 가진 사용자들이 동시에 같은 내용의 데이터를 이용할 수 있어야 함
- 내용에 대한 참조: 데이터를 찾을 때 사용자가 요구하는 데이터 내용으로 데이터를 찾는다.
- 데이터 논리적 독립성: 응용프로그램과 데이터베이스를 독립하고, 데이터의 논리적 구조를 변경시켜도 응용 프로그램은 변경되지 않는 독립적인 특성을 갖는다.
AICD
-
데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어
- 트랜잭션: 하나의 논리적 작업 단위를 구성하는 하나이상의 sql문, 일련의 작업들이 마치 하나의 작업처럼 취급되어서 모두 다 성공하거나 아니면 모두 다 실패하는 것을 이야기 한다. 즉, 한 번 질의가 실행되면 질의가 모두 수행되거나 모두 수행되지 않는 작업수행의 논리적 단위를 얘기한다.
-
원자성(Atomicity)
-
트랜잭션과 관련된 작업들이 부분적으로 실행되다가 중단되지 않는 것을 보장하는 능력
- 예시: 자금이체는 성공할수도, 실패할수도 있지만 보내는 쪽에서 돈을 뺴오는 작업만 성공하고, 받는 쪽에 돈을 넣는 작업을 실채해서는 안된다. 즉, 한번 실행했다면 중간에 멈추면 안되고, 성공과 실패의 결과까지 도출해야 한다는 의미 같음
-
-
일관성(Consistency)
-
트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미
-
무결성 제약이 모든 계좌는 잔고가 있어야 한다면 이를 위반하는 트랜잭션은 중단된다.
- 무결성 제약조건: DB에 저장된 데이터의 일관성과 정확성을 지키는 것을 말함(일관성과 정확성을 잃어버린 데이터베이스는 정보로서의 가치에 심각한 문제가 있음)
-
-
-
고립성(Isolation)
- 트랜잭션을 수행 시 다른 트랜잭션의 연산작업이 간섭하지 못하도록 보장하는 것을 의미한다.
-
지속성(Durability)
-
성공적으로 완료된 트랜잭션은 영원히 반영되어야 함을 의미한다.
- 전형적으로 모든 트랜잭션은 로그로 남고, 시스템 장애 발생 전 상태로 되돌릴 수 있다.
- 예시: 이체를 받았는데 받은 금액이 쓰지도 않았는데 없어지면 안됨(당연한 것)
-
-
병행제어: DB의 일관성을 파괴하지 않도록 트랜잭션간의 상호작용을 제어하는 것으로 다음과 같은 문제점들을 해소하고자 이용된다.
- 같은 데이터를 공유하여 갱신할 때 갱신 결과의 일부가 사라지는 현상(갱신 분실)
- 동시에 같은 데이터를 갱신할 때, 데이터의 상호 불일치가 발생하는 현상(모순성, 불일치 분석)
- 트랜잭션 중 하나에 문제가 생겨 롤백되는 경우, 다른 트랜잭션들도 함께 롤밷되는 현상(연쇄복귀)
병행제어는 트랜잭션을 안전하게 처리하고, ACID규칙을 만족시키는 기술이다.
SQL과 NoSQL
-
SQL
- 장점:
관계형 데이터베이스는 데이터를 더 효율적으로 그리고 체계적으로 저장할 수 있고 관리 할 수 있다.
미리 저장하는 데이터들의 구조(테이블 스키마)를 정의 함으로 데이터의 완전성이 보장된다. - 단점:
테이블을 미리 정의해야 함으로 테이블 구조 변화 등에 덜 유연한다.
확장성이 쉽지 않다.
역시 테이블 구조가 미리 정의 되어 있다보니 단순히 서버를 늘리는것 만으로 확장하기가 쉽지 않고 서버의 성능 자체도 높여야 한다.
서버를 늘려서 분산 저장 하는것도 쉽지 않다.
Scale up (서버의 성능을 높이는것)으로 확장성이 됨.
정형화된 데이터들 그리고 데이터의 완전성이 중요한 데이터들을 저장하는데 유리하다.
예) 전자상거래 정보. 은행 계좌 정보, 거래 정보 등등.
- 장점:
-
NoSQL
- 장점:
테이터 구조를 미리 정의하지 않아도 됨으로 저장하는 데이터의 구조 변화에 유연하다.
확장하기가 비교적 쉽다. 그냥 서버 수를 늘리면 됨(scale out)
확장하기가 쉽고 테이터의 구조도 유연하다 보니 방대한 양의 데이터를 저장하는데 유리하다. - 단점:
데이터의 완전성이 덜 보장된다.
트랜잭션이 안되거나 비교적 불안정하다.
주로 비정형화 데이터 그리고 완전성이 상대적으로 덜 유리한 데이터를 저장하는데 유리하다.
- 장점:
DBMS
-
데이터베이스를 사용자의 요구에 맞게 정보를 생성하고 DB를 관리해주는 소프트웨어를 일컫는다.(정의, 조작, 제어)
SQL의 종류
- DDL(Data Definition Language): 데이터를 정의하는 언어
- DML(Data Manipulation Language): 데이터를 조작하는 언어
- TCL(Transaction Control Language): 데이터의 안정성, 정확성을 유지하는 언어, 트랜잭션이 서로 방해하지 않도록 병행제어
DBMS의 종류
- 관계형 데이터베이스를 관리해주는 MySQL, PostreSQL 등이 있고,
- 비관계형 데이터베이스를 관리해주는 MongoDB, Redis, Cassandra 등의 서비스가 있다.