본문 바로가기

백엔드 학습 과정/Section 2 [재귀함수, 자료구조, 네트워크]

#6. 데이터베이스 - SQL, NoSQL, DB 설계

[데이터베이스의 필요성]

[데이터를 In-Memory에 저장할 경우]

PC를 끄면 데이터가 사라짐.

 

[데이터를 File I/O 할 경우]

원하는 데이터만 가져올 수 없고, 모든 데이터를 호출한 뒤 서버에서 필터링 해야함.

 

[DataBase의 경우]

필터링 외에도 File I/O 으로 구현이 힘든 데이터 관리를 위한 여러 기능들을 가지고 있는 데이터에 특화된 서버.

 

[데이터베이스]

데이터베이스는 크게 관계형 데이터베이스 / 비관계형 데이터베이스 로 구분된다.

관계형 데이터베이스는 SQL을 기반으로, 비관계형 데이터베이스는 NoSQL을 기반으로 데이터를 다룬다.

 

SQL (Structured Query Language)

관계형 데이터베이스에서 사용하는 데이터베이스 언어.

데이터가 구조화된 테이블을 사용하는 관계형-데이터베이스에 쿼리를 통해 원하는 데이터를 가져오거나 삽입 할 수 있다.

즉, SQL을 사용하기 위해서는 데이터의 구조가 고정되어야 한다.

 

Query

검색할 때, 기존에 존재하는 데이터를 검색어로 필터링하는 것처럼, 쿼리는 저장되어 있는 데이터를 필터하기 위한 검색어.

 

NoSQL

SQL을 사용할 수 있는 데이터가 구조화된 데이터베이스와는 달리, 데이터의 구조가 고정되어 있지 않은 데이터베이스.

관계형 데이터베이스와는 달리, 테이블을 사용하지 않고 데이터를 다른 형태로 저장.

 

SQL (구조화 쿼리 언어) VS NoSQL (비구조화 쿼리 언어)

SQLNoSQL은 만들어진 방식, 저장하는 정보의 종류, 저장하는 방법 등에서 차이가 있다.

 

1. SQL기반 관계형 데이터베이스

데이터를 저장할 테이블의 구조와 데이터 타입을 사전에 정의하고, 테이블에 정의된 내용에 알맞은 형태의 데이터만 삽입.

관계형 데이터베이스에서는 행(row)와 열(column)으로 구성된 테이블에 데이터를 저장한다.

각 열(column)하나의 속성에 대한 정보를 저장.

각 행(row)은 각 열의 데이터 형식에 맞는 데이터를 저장.

 

2. NoSQL기반 비관계형 데이터베이스

NoSQL 기반의 비관계형 데이터베이스는 다음과 같이 구성된다.

 

A. Key - Value 타입

속성을 Key-Value 의 쌍으로 나타내는 데이터를 배열의 형태로 저장한다. 

Key : 속성 이름, Value : 속성에 연결된 데이터 값

 

B. 문서형(Document) 데이터베이스

데이터를 테이블이 아닌 문서처럼 저장하는 데이터베이스. JSON과 유사한 형식의 데이터를 문서화하여 저장.

각각의 문서는 하나의 속성에 대한 데이터를 가지고 있고, 컬렉션이라는 그룹으로 묶어서 관리.

 

C. Wide-Column 데이터베이스

데이터베이스의 열(Column)에 대한 데이터를 집중적으로 관리하는 데이터베이스.

각 열(Column)에는 key-value 형식으로 데이터가 저장되고, 컬럼 패밀리 라는 집합체 단위로 데이터를 처리.

하나의 행(row)에 많은 열(Column)을 포함시킬 수 있어서 유연성이 높다.

 

D. 그래프(Graph) 데이터베이스

자료구조의 그래프와 비슷한 형식으로 데이터 간의 관계를 구성하는 데이터베이스.

노드에 속성별로 데이터를 저장. 노드간의 관계는 으로 표현한다.

 

SQL기반 관계형 데이터베이스와 NoSQL기반 비관계형 데이터베이스의 차이점

1. 데이터 저장(Storage) 방식

[관계형DB]

SQL을 통해 미리 작성된 스키마를 기반으로 정해진 형식에 맞게 테이블에 데이터 저장.

[비관계형DB]

Key-Value, 문서형, Wide-Column, Graph 등의 방식으로 데이터 저장.

 

2. 스키마 (Schema)

[관계형DB] 

고정된 형식의 스키마가 필요. 처리하려는 데이터 속성별로 열(Column)에 대한 정보를 미리 정한다.

[비관계형DB] 

관계형DB보다는 동적으로 스키마의 형태를 관리할 수 있다.

행(row)를 추가할 때 즉시 새로운 열을 추가할 수 있고,

개별 속성에 대해 모든 열(Colum)에 대한 데이터를 반드시 입력하지 않아도 된다.

 

3. 쿼리 (Query)

[관계형DB] 

테이블의 형식, 테이블의 관계에 맞추어 요청해야한다. 그래서 정보를 요청할 때 SQL과 같이 구조화된 쿼리 언어를 사용.

[비관계형DB] 

데이터 그룹 자체를 조회하는 것에 초점. 그래서 구조화되지 않은 쿼리 언어로도 데이터 요청 가능.

 

4. 확장성 (Scalability)

[관계형DB] 

수직적으로 확장이 가능. 높은 메모리, CPU를 사용하는 확장. 하드웨어의 고성능을 추구하므로 비용이 비싸다.

[비관계형DB] 

수평적으로 확장이 가능. 보다 값싼 서버 증설, 클라우드 서비스를 이용하는 확장. 많은 트래픽을 보다 편리하게 처리 가능.

 

ACID 

트랜잭션 : 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위.

(EX) 계좌이체. A의 통장에서 만원을 인출하고, B의 통장에 만원을 입금한다.

이때, 인출과 입금의 두가지 일이 합쳐져 '송금'이라는 하나의 논리적 기능을 이룬다.

 

트랜잭션 연산

롤백 (Rollback)

트랜잭션 작업 도중 오류가 발생하면 트랜잭션 처리를 시작하기 이전의 상태로 되돌린다.

 

커밋 (Commit)

트랜잭션 작업을 성공적으로 마치고 데이터베이스에 영구적으로 반영한다.

 

 

ACID하나의 트랜잭션의 안전성을 보장하기 위해 필요한 성질이다.

 

[A] : Atomicity 원자성.

트랜잭션은 데이터베이스에 모두 반영되거나 전혀 반영되지 않아야 한다.

ex) 송금과정에서 A의 통장에서 만원이 인출됬지만, B 통장에 만원이 입금이 되지 않은 경우가 발생하면 안된다.

 

[C] : Consistency 일관성

트랜잭션이 성공적으로 완료되면, 일관적인 데이터를 유지한다.

 

[I] : Isolation 독립성

둘 이상의 트랜잭션이 동시에 실행되는 경우, 각 트랜잭션은 서로의 연산에 끼어들 수 없다.

 

[D] : Durability 영구성

성공적으로 완료된 트랜잭션의 결과는 영구적으로 반영되어야 한다.

 

SQL 기반의 관계형 DB를 사용하는 케이스.

1. DB의 ACID 성질을 준수해야 하는 경우.

ACID는 DB에서 실행되는 하나의 트랜잭션에 의한 상태의 변화를 수행하는 과정에 필요한 성질이다.

SQL을 사용하면 DB와 상호작용하는 방식을 정확하게 규정할 수 있기에,

DB에서 데이터 처리할 때 발생하는 예외적인 상황을 줄이고 DB의 무결성을 보호할 수 있다.

 

2.소프트웨어에 사용되는 DB가 구조적이고 일관적인 경우

소프트웨어(프로젝트)의 규모가 많은 서버를 필요로 하지 않고, 일관된 데이터를 사용하는 경우.

 

NoSQL기반의 비관계형 DB를 사용하는 케이스

1. 데이터의 구조가 거의 혹은 전혀 없는 대용량의 데이터를 저장하는 경우

대부분의 NoSQL DB는 저장할 수 있는 데이터의 유형에 제한이 없다.

개발에 정형화 되지 않은 많은 양의 데이터가 필요한 경우 NoSQL을 적용하는 것이 더 효율적이다.

 

2. 클라우드 컴퓨터 및 저장공간을 최대한 활용하는 경우

클라우드 기반으로 DB 저장소를 구축하면, 저렴한 비용의 솔루션을 제공받을 수 있다.

DB의 확상성이 중요하다면, 별다른 번거로움 없이 확장할 수 있는 NoSQL DB를 사용한다.

 

3. 빠르게 서비스를 구축하는 과정에서 데이터 구조를 자주 업데이트 하는 경우

NoSQL DB의 경우, 스키마를 미리 준비할 필요가 없기에, 빠르게 개발하는 과정에 매우 유리하다.

소프트웨어 버전별로 많은 다운타임(DB서버를 오프라인으로 전환하여 데이터 처리를 진행하는 시간)없이

데이터 구조를 자주 변경하면, 매번 스키마를 수정해야하는 관계형 DB 보단 비관계형 DB ( NoSQL DB)가 적합하다.

 

 

DB 설계

1. 관계형 데이터베이스

구조화된 데이터는 하나의 테이블로 표현이 가능. 사전에 정의된 테이블을 Relation 이라고 하고,

테이블을 사용하는 관계형 데이터베이스 (Relational DataBase) 라고 한다.

 

[데이터베이스 키워드]

A. 데이터 (Data)

각 항목에 저장되는 값.

 

B. 테이블 (Table ,Relation)

전에 정의된 열(Column)의 데이터 타입대로 작성된 데이터가 행(row)로 축적.

 

C. 컬럼, 세로, 열 (Column, Field)

Table의 세로 열.

 

D. 레코드,가로, 행 (Record, Tuple, row)

Table의 가로 행.

 

E. 키 (Key) : Primary KeyForeign Key가 있다.

테이블의 각 Record(row)를 구분할 수 있는 값. 각 레코드마다 고유한 값을 가진다. 

Primary Key Foreign Key
Primary Key는 특정 Column 내에
데이터가 유일하도록 보장해주는데 사용.
Foreign Key는 두 테이블 사이에 테이터를 연결시켜주는 
관계형 데이터베이스 테이블의 Column.
관계형 DB 테이블 내에 기록을 유일하게 식별. 다른 테이블의 Primary Key를 참조.
테이블 내에 하나의 Primary Key만 허락. 테이블 내에 한개 이상의 Foreign Key가 허락.
Unique와 Not Null 제약의 결합 관계형DB 내에 중복값과 테이블을 포함할 수 있다.
Null 값을 허락하지 않는다 Null 값이 가능
상위 테이블에서 해당 값을 삭제할 수 없다. 상위 테이블에서 해당 값을 삭제 할 수 있다.
암묵적으로 임시 테이블에 정의 될 수 있다. 임시 테이블에서 정의 될 수 없다.

 

F. 스키마 (Schema)

데이터베이스를 구성하는 레코드의 크기, 키(Key)의 정의, 레코드와 레코드의 관계, 검색방법 등을 정의한 것.

데이터가 구성되는 방식과 서로 다른 엔티티 간의 관계에 대한 설명을 말한다.

 

**엔티티 : 실체, 객체라는 의미로 업무에 필요하고 유용한 정보를 저장하고 관리하기 위한 집합.

ex) 학번, 이름, 학점, 등록일자, 생일, 정공 등의 속성.

 

2. 테이블 (Relation) 간의 관계 종류.

A. 1:1 관계

B. 1:N 관계

C. N:N 관계

D. Self-Referencing 관계

 

A. 1:1 관계

하나의 레코드(row)가 다른 테이블의 레코드 1개와 연결된 경우.

User 테이블의 phone_id 컬럼은 Foreign Key로써 Phonebook 테이블의 phone_id 컬럼과 연결되어 있다.

 

B. 1:N 관계

하나의 레코드(row)가 서로 다른 여러 개의 레코드와 연결된 경우.

한 명의 user가 여러 전화번호를 가질 수 있고, 여러 명의 유저가 하나의 전화번호를 가질 수 없다.

이런 1:N 관계는 관계형 DB에서 가장 많이 사용된다.

 

C. N:N 관계 ( + JOIN TABLE)

여러 개의 레코드(row)가 다른 테이블의 여러 개의 레코드와 관계가 있는 경우.

N:N 관계를 위해 스키마(Schema)를 디자인 할 때에는 JOIN TABLE을 만들어서 관리한다.

두개의 테이블을 연결하기 위해서 JOIN TABLE을 생성해 관리한다.

Customer_package 테이블(JOIN TABLE)은 customer_id와 package_id를 묶어주는 역할

이렇게 조인 테이블을 생성하더라도, 조인 테이블을 위한 기본 키는 반드시 필요하다.

 

D. 자기참조 관계 (Self Referencing Relationship)

테이블 내에서도 관계가 필요하다. ex) 추천인을 파악하기 위해 사용 가능.