⚡️ API 개발 with Flask - 6

codeamor·2020년 7월 7일
0

API Development

목록 보기
6/9

✔️ 데이터베이스

앞에서 만들었던 API 는 새로 재시작할 때마다 모든 데이터가 없어졌다.
데이터를 영구적으로 보존하기 위해서는 데이터베이스 시스템을 사용해서 저장해야 한다.

  • 데이터베이스 시스템에 대한 소개
  • 데이터베이스 핵심 개념
  • SQL(Structured Query Language)
  • 데이터베이스와 API 연결시키기


데이터베이스 시스템

: 데이터를 저장 및 보존하는 시스템이다.

  • 데이터베이스에 저장되어 있는 데이터를 읽어 들일 수 있으며, 새로운 데이터를 저장할 수도 있고, 기존의 데이터를 업데이트 할 수 있다.

일반적으로 데이터베이스 시스템에는 크게 2가지 종류가 있다.

  • 관계형 데이터베이스 시스템(RDBMS, Relational Database Management System)
  • 비관계형 데이터베이스(NoSQL)

## 관계형 데이터베이스 : 관계형 데이터 모델에 기초를 둔 데이터베이스 시스템이다.
  • 관계형 데이터란 데이터들이 서로 상호관련성을 가진 형태로 표현한 데이터를 말한다.

  • 대표적인 관계형 데이터 베이스 시스템에는 MySQL과 PostgreSQL(Postgres) 등이 있다.

  • 관계형 데이터베이스에서 모든 데이터들은 2차원 테이블(table)들로 표현된다.

    • 각각의 테이블은 칼럼(column)과 로우(row)로 구성된다.
      • 칼럼은 테이블의 각 항목을 말한다. 행으로 생각하면 된다.
      • 로우는 각 항목들의 실제 값들을 이야기한다. 열로 생각하면 된다.

    • 각 로우는 고유 키(primary key)가 있다. 주로 이 고유 키를 통해서 해당 로우를 찾거나 인용하게 된다.
      물론 고유 키 이외에도 다른 값으로 로우를 찾을 수 있다.

앞에서 구현한 미니터 API의 데이터를 보면
미니터의 사용자들은 각 사용자당 0개부터 여러 개의 트윗을 생성할 수 있다.
이 두 데이터(사용자와 사용자의 트윗들)를 관계형 데이터베이스에서 구현한다면 다음과 같다.

users
id
name
email
profile

⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️ ⬇️

tweets
id
user_id
tweet

users 테이블은 사용자 정보를 저장하는 테이블이다.

  • 사용자의 아이디, 이름, 이메일, 프로파일 정보를 저장하는 테이블이다.

  • id, name, email, profile이 각 users 테이블의 칼럼(column)이 된다.

  • 각 로우는 실제 해당 값들이 된다.

  • id 칼럼은 users 테이블의 고유 키(primary key)가 된다.

tweets 테이블은 사용자들의 트윗들을 저장하는 테이블이다.

  • 각 트윗의 고유 아이디, 트윗을 생성한 사용자의 아이디, 트윗 내용, 트윗이 생성된 시간을 저장한다.
  • id, user_id, tweet, created_at(트윗이 생성된 시간)이 tweets 테이블의 칼럼이다.
  • 각 로우는 실제 해당 트윗과 트윗의 고유 아이디, 그리고 트윗을 생성한 사용자 아이디들이다. (id 가 tweets 테이블의 고유 키다.)

users 테이블과 tweets 테이블은 사용자의 id를 기준으로 연결되어 있다.

  • 즉, users 테이블의 id와 tweets 테이블의 user_id가 연결되어 있으며,
    두 값이 같은 로우들은 서로 연결되어 있다.

    • 여기서 연결되어 있다는 뜻은,
      tweets 테이블의 user_id 칼럼의 값과 동일한 id 값을 가지고 있는 users 테이블의 사용자가 해당 tweets 들의 사용자라는 의미이다.
  • 이렇게 한 테이블에서 다른 테이블의 특정 칼럼의 값으로 연결시키는 과정을 외부 키(foreign key)를 통해 연결시키는 과정이라고 한다.

  • 앞에서의 users 테이블과 tweets 테이블의 경우 tweets 테이블의 user_id 칼럼이 users 테이블의 id 키에 걸려 있는 외부 키가 된다. 관계형 데이터베이스에서는 일반적으로 외부 키를 사용하여 테이블들을 연결시킨다.


* 테이블 들의 상호 관련성 종류

관계형 데이터베이스 시스템에서 테이블들은 서로 상호관령성을 가지고 연결될 수 있다.
그 연결에는 다음과 같은 3가지 종류가 있다.

  • one to one
  • one to many
  • many to many

one to one 관계
: 테이블 A의 로우와 테이블 B의 로우가 정확히 일대일 매칭되는 관계이다.

one to many 관계
: 테이블 A의 로우가 테이블 B의 여러 로우와 연결되는 관계이다.

many to many 관계
: 테이블 A의 여러 로우가 테이블 B의 여러 로우와 연결되는 관계이다.

  • 미니터 API가 이에 해당한다. 한 사용자를 여러 사용자가 팔로우 할 수 있고, 해당 사용자 또한 여러 사용자가 팔로우 할 수 있기 때문이다.

* 정규화

: 중복을 최소화하게끔 데이터를 구조화하는 프로세스이다.

  • 단순하게 테이블에 필요한 정보를 저장하는 방식이 아닌, 굳이 여러 테이블에 나누어서 저장하는 이유는 다음과 같다.
  1. 하나의 테이블에 모든 정보를 다 넣으면 동일한 정보들이 불필요하게 중복되어 저장된다.
    : 불필요하게 더 많은 디스크를 사용하게 되고, 반면에 외부 키로 연결하여 사용하면 단순 키 값만 저장하면 되므로 디스크 공간을 훨씬 효율적으로 사용할 수 있게 된다.

  2. 관계형식으로 데이터베이스 구조를 잡지 않고 필요한 데이터를 테이블에 저장하게 되면 잘못된 데이터가 저장될 가능성이 높아진다.
    : 외부 키를 사용함으로써 서로 같은 데이터이지만 부분적으로 오류가 생겨서 틀린 데이터가 생기는 문제가 없어지게 된다.

* 트랜잭션

: 일련의 작업들이 마치 하나의 작업처럼 취급되어서 모두 다 성공하거나 아니면 모두 다 실패하는 것.

관계형 데이터베이스 시스템은 트랜잭션 기능을 보장하기 위해 ACID라는 성질을 가지고 있다.

ACID는 Atomicity, Consistency, Isolation, Durability를 줄인 단어로서
원자성, 일관성, 고립성, 지속성을 의미한다.



비관계형 데이터 베이스

: 비관계형 타입의 데이터를 저장할 때 주로 사용되는 데이터베이스 시스템이다.

  • 관계형 데이터베이스와 다르게 비관계형이므로 데이터들을 저장하기 전에 정의할 필요가 없다.
  • 테이블들의 스키마(schema)와 테이블들의 관계를 미리 구현해야 하는필요가 없이 데이터가 들어오는 그대로 저장하면 된다.
  • 대표적인 NoSQL 데이터베이스 시스템에는 MongoDB, Redis, Cassandra 등이 있다.


✔️ 관계형 데이터베이스 시스템 vs 비관계형 데이터베이스 시스템

관계형 데이터베이스 시스템과 비관계형 데이터베이스 시스템 각각의 장점과 단점을 파악하고, 각 시스템의 필요에 적합한 데이터베이스를 사용하는 것이 좋다.

관계형 데이터베이스 시스템의 장점

  • 관계형 데이터베이스는 데이터를 더 효율적이고 체계적으로 저장하고 관리할 수 있다.
  • 미리 저장하는 데이터들의 구조(테이블 스키마)를 정의함으로써 데이터의 완전성이 보장된다.
  • 트랜잭션(transaction) 기능을 제공한다.

관계형 데이터베이스 시스템의 단점

  • 테이블을 미리 정의해야 하므로 테이블 구조 변화 등에 덜 유연하다.

  • 확장이 쉽지 않다. 테이블 구조가 미리 정의되어야 하고 ACID를 보장해야 하다 보니 단순히 서버를 늘리는 것만으로 확장하기가 쉽지 않고 서버의 성능 자체도 높여야 한다.

  • 서버를 늘려서 분산 저장하는 것도 쉽지 않다. 주로 스케일 아웃보다는 스케일 업으로 확장해야 한다.

    • 스케일 아웃(scale out): 서버 수를 늘려서 확장하는 것
    • 스케일 업(scale up): 서버의 성능을 높이는 것

비관계형 데이터베이스 시스템의 장점

  • 데이터 구조를 미리 정의하지 않아도 되므로 저장하는 데이터의 구조 변화에 유연하다.
  • 데이터베이스 시스템 확장하기가 비교적 쉽다. 스케일 아웃, 즉 서버 수를 늘리는 방식으로 시스템 확장이 가능하다.
  • 확장하기가 쉽고 데이터의 구조도 유연하다 보니 방대한 양의 데이터를 저장하는 데 유리하다.

비관계형 데이터베이스 시스템의 단점

  • 데이터의 완전성이 덜 보장된다.
  • 트랜잭션이 안 되거나 되더라도 비교적 불안정하다.

관계형 데이터베이스 시스템은 주로 정형화된 데이터들, 그리고 데이터의 완전성이 중요한 데이터들을 저장하는 데 유리하다.

  • 전자상거래 정보, 은행 계좌 정보, 거래 정보 등을 관리하는 데 사용된다.

비관계형 데이터베이스 시스템은 주로 비정형화 데이터, 그리고 완전성이 상대적으로 덜 유리한 데이터를 저장하는 데 유리하다.

  • 로그 데이터

앞으로의 미니터 API 시스템은 관계형 데이터베이스를 사용하여 구현할 것이다.

0개의 댓글