개요

미니터를 클론 코딩해봤다.
엄청 불편한 점이 하나 있었다.

  • app.py 코드를 수정할 때마다 서버를 재시작해야 하고

  • 서버가 재시작되어 API가 새로 시작될 때마다
    이전에 했던 모든 걸 처음부터 다시해야

데이터베이스가 없어서 그렇다.
데이터를 영구적으로 보존하기 위해서는 데이터베이스 시스템을 사용해야 한다.
그래서 데이터베이스에 대해 또 알아볼 것임.
복습은 언제나 즐겁다. 🙆‍♂️


데이터베이스 시스템

이름 그대로 데이터를 저장 및 보존하는 시스템이다.
데이터베이스에 저장되어 있는 데이터를

  1. 읽어 들일 수 있고
  2. 저장할 수 있고
  3. 업데이트할 수도 있다

미니터의 API들은 데이터베이스 시스템을 사용하지 않았다. 그러니 날아가지.

관계형 데이터베이스 시스템(RDBMS)

데이터베이스 포스팅에서도 봤지만 가장 일반적인 형태다.

관계형 데이터베이스에서 모든 데이터들은 2차원 테이블로 표현된다.
테이블에는 column(열)과 row(로우)가 있다.

  • column(열) : 항목을 뜻한다
  • row(행) : 항목의 실제 값들을 뜻한다

각 row는 저마다의 고유키(primary key)가 있다.
이것을 통해서 해당 row를 찾거나 인용(reference)하게 된다.
고유키 이외에도 다른 값으로도 row를 찾을 수 있다.

앞에서 구현해둔 미니터 API의 데이터를 예로 들어본다.

하늘색 글자가 테이블의 이름이다.
그 아래의 흰색 글자는 열(col)의 이름이다. 즉 항목이 된다.
흰색 글자들의 실제 값들은 행(row)이 될 것이다.

그리고 여기서 'id 열'은 'users 테이블'의 고유 키(primary key)가 된다.

외부 키(foreign key)

위의 그림에서 users테이블과 tweets테이블은 사용자의 id를 기준으로 연결되어 있다.
user테이블의 id와 tweets테이블의 user_id가 연결되어 있으며,
id와 user_id가 동일한 행(row)들은 연결되어 있다.

이렇게 한 테이블에서 다른 테이블의 특정 열(column)의 값으로 연결시키는 과정은 외부 키(foreign key)를 통해 실현된다.

위 그림에서는 tweets테이블의 user_id칼럼이 users테이블의 id키에 걸려 있는 외부 키가 된다.

관계형 데이터베이스에서는 일반적으로 외부 키를 사용하여 테이블들을 연결시킨다.


테이블들의 상호 관련성

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

    국가의 수도를 예를 들자면, 각 국가의 수도는 단 하나다.
    따라서 국가와 수도는 one to one관계를 가진다.

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

    미니터에서 사용자와 트윗이 one to many관계다.
    한 명의 사용자가 여러 트윗을 작성할 수 있기 때문이다.

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

    미니터에서 사용자 사이의 팔로우 관계가 many to many라고 할 수 있다.
    사용자A를 다른 여러 사용자들이 follow할 수 있고,
    사용자A는 다른 여러 사용자들을 follow할 수 있다.


정규화

중복을 최소화하여 데이터를 구조화하는 프로세스를 정규화 또는 노멀리제이션이라고 한다.
관계형 데이터베이스에서는 굉장히 중요한 부분이다.

정규화를 하지 않았을 때의 문제점

  1. 동일한 정보들이 불필요하게 중복된다.
    '수도'에 관한 정보가 '국가 테이블' 말고도 다른 테이블에서도 여러번 쓰인다면?
    동일한 정보가 중복되어 존재하게 된다.
    이는 불필요하게 더 많은 디스크를 사용하는 것이다.

    외부 키로 연결하여 단순히 키의 값만 저장해준다면 공간을 효율적으로 사용할 수 있다.

  2. 잘못된 데이터가 저장될 가능성이 높아진다.
    어느 한 정보에 대해 외부 키로 연결하기만 하면 데이터를 직접 조작하지 않고도 완전히 동일한 데이터를 그대로 보전하여 사용할 수 있다.

    그러나 어느 한 정보를 여기저기 일일이 입력한다면 그 과정 속에서 정보의 변형이 일어날 수 있다.(EX.오타)
    외부 키를 사용하면 같은 정보에 대한 부분적 오류를 막을 수 있다.


트랜잭션

일련의 작업들이 마치 하나의 작업처럼 취급되어 부분적 성공과 실패가 아닌 전체 성공 또는 실패를 의미한다.

계좌이체로 예를 들어 설명해봄.

  1. 내 계좌를 확인하고 잔금이 있는지 확인
  2. 잔금이 있다면 이체하려 하는 만큼 계좌의 잔고에서 차감
  3. 이체 금액을 받는 쪽 계좌에 전송
  4. 받는 계좌는 그 금액 만큼을 잔고에 더한다

여기서 부분적으로 실패하거나 막히면 처음으로 돌아간다는 말임.
2까지는 성공했는데 3이 실패하면 내 돈만 나가게 됨.
이걸 막기 위해서 일련의 작업들을 하나의 작업으로 취급하는 것이 트랜잭션임.

모든 과정에 제대로 실행되었을 때만 작업을 성공처리 하는 것임.

ACID

데이터베이스 시스템은 ACID 성질을 통해 트랜잭션 기능을 보장한다.
Atomicity 원자성 / Consistency 일관성 / Isolation 고립성 / Durability 지속성


0개의 댓글