API는 새로 재시작될 때마다 모든 데이터가 없어진다.
즉, 휘발성 메모리(volatile memory)이다.
데이터를 영구적으로 보존하기 위해서는 데이터베이스 시스템을 사용해서 저장해야 한다.
데이터베이스 시스템
데이터베이스 시스템: 데이터를 저장 및 보존하는 시스템
- 데이터베이스에 저장되어 있는 데이터를 읽어 들일 수 있음
- 새로운 데이터 저장
- 기존의 데이터 업데이트
데이터베이스 시스템에는 크게 2가지 종류가 있다.
- 관계형 데이터베이스 시스템(RDBMS, Relational Database Management System)
- 비관계형 데이터베이스 시스템(NoSQL, Not only SQL Database Management System)
관계형 데이터베이스
관계형 데이터베이스 : 관계형 데이터 모델에 기초를 둔 데이터베이스 시스템
관계형 데이터 : 데이터들이 서로 상호관련성을 가진 형태로 표현한 데이터
ex) MySQL, PostgreSQL
관계형 데이터베이스에 모든 데이터들은 2차원 테이블(table)로 표현됨
각각의 테이블은 칼럼(column)과 로우(row)로 구성됨
Column : 테이블의 각 항목 = 행
Row : 각 항목의 실제 값 = 열
각 Row는 저만의 고유 키(Primary Key)가 있음
이 고유 키를 통해 해당 로우를 찾거나 인용하게 됨
테이블의 상호관련성 종류
관계형 데이터베이스 시스템에서 테이블들은 서로 상호관련성을 가지고 연결될 수 있다.
그리고 그 테이블끼리의 연결에는 크게 다음과 같은 3가지 종류가 있다.
- one to one
- one to many
- many to many
▶ one to one
테이블 A의 로우와 테이블 B의 로우가 정확히 일대일 매칭되는 관계
ex) 하나의 교수가 한 학생을 지도하고 있는 경우
▶ one to many
테이블 A의 로우가 테이블 B의 여러 로우와 연결되는 관계
ex) 하나의 교수가 여러 학생을 지도하고 있는 경우
▶ many to many
테이블 A의 여러 로우가 테이블 B의 여러 로우와 연결되는 관계
ex) 한 학생은 여러 동아리를 가입할 수 있고, 동아리는 여러 학생들을 받을 수 있는 경우
정규화
정보를 나눠서 저장하지 않으면 생기는 문제
- 하나의 테이블에 모든 정보를 다 넣으면 동일한 정보들이 불필요하게 중복되어 저장
- 관계형식으로 데이터베이스 구졸르 잡지 않고 필요한 데이터를 테이블에 저장하게 되면 잘못된 데이터가 저장될 가능성 높아짐
중복을 최소화하게 데이터를 구조화하는 프로세스를 정규화 혹은 노멀리제이션(Normalization)이라고 함
관계형 데이터베이스에서는 정규화가 굉장히 중요한 부분!
트랜잭션
관계형 데이터베이스에서 중요한 기능 중 하나가 트랜잭션(Transaction)이다.
트랜잭션은 일련의 작업들이 마치 하나의 작업처럼 취급되어서 모두 다 성공하거나 아니면 모두 다 실패하는 것을 말한다.
은행의 현금 출금을 예로 들어보자.
고객이 은행 A에서 100만원을 다른 계좌로 이체하고자 한다면 은행 시스템은 다음과 같은 과정을 처리할 것이다.
- 해당 고객의 계좌를 확인하고, 충분한 잔금이 있는지 확인
- 충분한 잔금이 있다면 이체하고자 하는 금액을 계좌의 잔고에서 차감
- 이체 금액을 원하는 계좌에 전송
- 이체를 받는 계좌는 이체가 된 금액을 잔고에 더함
만일 은행 시스템에 오류가 생겨서 2번까지 처리딘 후 3번 과정에서 오류가 난다면 고객은 자신의 잔고는 줄었으나실제 돈은 이체하지 못하는 불상사를 겪게 된다.
그러므로 1번부터 4번까지 다 제대로 실행되었을 때만 시 데이터베이스에 영구적으로 반영되고, 만일 중간 과정에서 오류가 나거나 실패하는 경우 그 전 상태로 돌아가는 기능이 데이터베이스 트랜잭션이다.
관계형 데이터베이스 시스템은 트랜잭션 기능을 보장하기 위해 ACID라는 성질을 가지고 있다.
ACID는 Atomicity, Consistency, Isolation, Durability를 줄인 단어로, 원자성, 일관성, 고립성, 지속성을 의미한다.
데이터베이스 시스템은 ACID 성질을 통해 트랜잭션 기능을 보장한다.
ACID를 제공함에 따라서 트랜잭션(일련의 작업들을 한번에 하나의 unit으로 실행 하는 것)기능을 제공한다.
비관계형 데이터베이스
NoSQL 데이터베이스라고도 일반적으로 불리는 비관계형 데이터베이스 시스템은 비관계형 타입의 데이터를 저장할 때 주로 사용되는 데이터베이스로, 관계형 데이터베이스와 다르게 비관계형이므로 데이터들을 저장하기 전에 정의할 필요가 없다.
즉 관계형 데이터베이스처럼 테이블의 스키마와 테이블들의 관계를 미리 구현해야 하는 필요가 없이 데이터가 들어오는 그대로 그냥 저장하면 됨.
ex) MongDB, Redis, Cassandra
관계형 데이터베이스 VS 비관계형 데이터베이스
관계형 데이터베이스 시스템의 장점
- 데이터를 더 효율적이고 체계적으로 저장하고 관리할 수 있음
- 미리 저장하는 데이터들의 구조(테이블 스키마)를 정의함으로써 데이터의 완전성 보장
- 트랜잭션 기능 제공
관계형 데이터베이스 시스템의 단점
- 테이블을 미리 정의해야 함으로 테이블 구조 변화 등에 덜 유연
- 확장이 쉽지 않음, 테이블 구조가 미리 정의되어야 하고 ACID를 보장해야 하다보니 단순히 서버를 늘리는 것만으로 확장하기가 쉽지 않고 서버의 성능 자체도 높여야 함
- 서버를 늘려서 분산 저장하는 것도 쉽지 않음
관계형 데이터베이스 시스템은 주로 정형화된 데이터, 데이터의 완전성이 중요한 데이터들을 저장하는 데 유리
EX) 전자상거래 정보, 은행 계좌 정보, 거래 정보
비관계형 데이터베이스 시스템의 장점
- 데이터 구조를 미리 정의하지 않아도 되므로 저장하는 데이터의 구조 변화에 유연
- 데이터베이스 시스템 확장하기 비교적 쉬움
- 확장하기가 쉽고 데이터의 구조가 유연하다보니 방대한 양의 데이터를 저장하는 데 유리
비관계형 데이터베이스 시스템의 단점
- 데이터의 완전성 덜 보장
- 트랜잭션이 안 되거나 되더라도 비교적 불안정함
비관계형 데이터베이스 시스템은 주로 비정형화 데이터, 오나전성이 상대적으로 덜 유리한 데이터를 저장하는 데 유리
EX) 로그 데이터
'백엔드' 카테고리의 다른 글
API에 데이터베이스 연결하기 (0) | 2021.08.16 |
---|---|
SQL(Structured Query Language) (0) | 2021.08.10 |
API 개발하기(미니터 : 타임라인) (0) | 2021.08.08 |
API 개발하기(미니터 : 팔로우) (0) | 2021.08.08 |
API 개발하기(미니터 : 트윗) (0) | 2021.08.07 |