앞에서 만들었던 API 는 새로 재시작할 때마다 모든 데이터가 없어졌다.
데이터를 영구적으로 보존하기 위해서는 데이터베이스 시스템을 사용해서 저장해야 한다.
: 데이터를 저장 및 보존하는 시스템이다.
일반적으로 데이터베이스 시스템에는 크게 2가지 종류가 있다.
관계형 데이터란 데이터들이 서로 상호관련성을 가진 형태로 표현한 데이터를 말한다.
대표적인 관계형 데이터 베이스 시스템에는 MySQL과 PostgreSQL(Postgres) 등이 있다.
관계형 데이터베이스에서 모든 데이터들은 2차원 테이블(table)들로 표현된다.
앞에서 구현한 미니터 API의 데이터를 보면
미니터의 사용자들은 각 사용자당 0개부터 여러 개의 트윗을 생성할 수 있다.
이 두 데이터(사용자와 사용자의 트윗들)를 관계형 데이터베이스에서 구현한다면 다음과 같다.
users |
---|
id |
name |
profile |
⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️
tweets |
---|
id |
user_id |
tweet |
users 테이블은 사용자 정보를 저장하는 테이블이다.
사용자의 아이디, 이름, 이메일, 프로파일 정보를 저장하는 테이블이다.
id, name, email, profile이 각 users 테이블의 칼럼(column)이 된다.
각 로우는 실제 해당 값들이 된다.
id 칼럼은 users 테이블의 고유 키(primary key)가 된다.
tweets 테이블은 사용자들의 트윗들을 저장하는 테이블이다.
users 테이블과 tweets 테이블은 사용자의 id를 기준으로 연결되어 있다.
즉, users 테이블의 id와 tweets 테이블의 user_id가 연결되어 있으며,
두 값이 같은 로우들은 서로 연결되어 있다.
이렇게 한 테이블에서 다른 테이블의 특정 칼럼의 값으로 연결시키는 과정을 외부 키(foreign key)를 통해 연결시키는 과정이라고 한다.
앞에서의 users 테이블과 tweets 테이블의 경우 tweets 테이블의 user_id 칼럼이 users 테이블의 id 키에 걸려 있는 외부 키가 된다. 관계형 데이터베이스에서는 일반적으로 외부 키를 사용하여 테이블들을 연결시킨다.
관계형 데이터베이스 시스템에서 테이블들은 서로 상호관령성을 가지고 연결될 수 있다.
그 연결에는 다음과 같은 3가지 종류가 있다.
one to one 관계
: 테이블 A의 로우와 테이블 B의 로우가 정확히 일대일 매칭되는 관계이다.
one to many 관계
: 테이블 A의 로우가 테이블 B의 여러 로우와 연결되는 관계이다.
many to many 관계
: 테이블 A의 여러 로우가 테이블 B의 여러 로우와 연결되는 관계이다.
: 중복을 최소화하게끔 데이터를 구조화하는 프로세스이다.
: 일련의 작업들이 마치 하나의 작업처럼 취급되어서 모두 다 성공하거나 아니면 모두 다 실패하는 것.
관계형 데이터베이스 시스템은 트랜잭션 기능을 보장하기 위해 ACID라는 성질을 가지고 있다.
ACID는 Atomicity, Consistency, Isolation, Durability를 줄인 단어로서
원자성, 일관성, 고립성, 지속성을 의미한다.
: 비관계형 타입의 데이터를 저장할 때 주로 사용되는 데이터베이스 시스템이다.
관계형 데이터베이스 시스템과 비관계형 데이터베이스 시스템 각각의 장점과 단점을 파악하고, 각 시스템의 필요에 적합한 데이터베이스를 사용하는 것이 좋다.
관계형 데이터베이스 시스템의 장점
관계형 데이터베이스 시스템의 단점
테이블을 미리 정의해야 하므로 테이블 구조 변화 등에 덜 유연하다.
확장이 쉽지 않다. 테이블 구조가 미리 정의되어야 하고 ACID를 보장해야 하다 보니 단순히 서버를 늘리는 것만으로 확장하기가 쉽지 않고 서버의 성능 자체도 높여야 한다.
서버를 늘려서 분산 저장하는 것도 쉽지 않다. 주로 스케일 아웃보다는 스케일 업으로 확장해야 한다.
비관계형 데이터베이스 시스템의 장점
비관계형 데이터베이스 시스템의 단점
관계형 데이터베이스 시스템은 주로 정형화된 데이터들, 그리고 데이터의 완전성이 중요한 데이터들을 저장하는 데 유리하다.
비관계형 데이터베이스 시스템은 주로 비정형화 데이터, 그리고 완전성이 상대적으로 덜 유리한 데이터를 저장하는 데 유리하다.
앞으로의 미니터 API 시스템은 관계형 데이터베이스를 사용하여 구현할 것이다.