[데이터베이스]
1. Database
- Query : 저장되어 있는 데이터를 필터하는 질의문
- SQL은 데이터베이스용 프로그래밍 언어
- 데이터베이스에 query를 보내 원하는 데이터를 뽑아올 수 있음
2. Database 필요성
- In-memory는 서버/클라이언트 종료 시 소멸
- File I/O은 원하는 데이터만 가져올 수 없고, 항상 모든 데이터를 가져온 뒤 서버에서 필터링
- Database는 필터링 혹은 File I/O로 구현이 힘든 관리를 위한 여러 기능을 활용 가능
- 즉, 데이터를 저장하고, 필터링할 수 있는 데이터에 특화된 서버
3. Database 활용
- 클라이언트가 서버에게 조건에 따른 데이터를 보여달라 요청
- 서버는 요청 처리를 위해 데이터베이스에 쿼리를 보냄
- 데이터베이스는 필터링 후, 필터링 된 데이터를 전달
- 서버는 이미 필터링 된 데이터를 전달받기 때문에, 별도의 데이터 가공 작업이 불필요
[SQL]
1. SQL(Structured Query Language)
- 구조화된 쿼리 언어
- 데이터베이스 언어로, 주로 관계형 데이터베이스에서 사용
- 데이터베이스에 쿼리를 보내 원하는 데이터를 조회/삽입
- 데이터 구조가 고정되어 있는 데이터베이스에서 사용 가능
2. 쿼리
- "질의문" (ex. 검색 시 입력하는 검색어)
- 저장되어 있는 데이터를 필터하기 위한 질의문이라 볼 수 있음
3. 데이터베이스 관련 명령어
- 데이터베이스 생성
CREATE DATABASE 데이터베이스_이름;
- 데이터베이스 사용
- 데이터베이스를 이용해 작업을 수행하기 전, 데이터베이스 사용 명령 필요
USE 데이터베이스_이름;
- 테이블 생성
CREATE TABLE 테이블_이름 (
열1 int PRIMARY KEY AUTO_INCREMENT,
열2 필드_타입 속성
);
- 테이블 정보 확인
DESCRIBE 테이블_이름;
- SELECT
SELECT 'hello world'
- FROM
- 테이블과 관련된 작업 시, 반드시 입력
- FROM 뒤에 결과를 도출해 낼 데이터베이스 테이블을 명시
SELECT 특성1
FROM 테이블_이름
- WHERE
SELECT 특성1, 특성2
FROM 테이블_이름
WHERE 특성1 = "특정 값"
- ORDER BY
- 돌려받는 데이터 결과를 특정 기준으로 정렬하여 출력할지 결정(선택적 사용 가능)
SELECT *
FROM 테이블_이름
ORDER BY 특성1 // DESC 명시 안할 시, 오름차순 정렬
- LIMIT
- 결과를 출력할 데이터 개수 지정(선택적 사용 가능)
- 쿼리문 가장 마지막에 추가
SELECT *
FROM 테이블_이름
LIMIT 200 // 결과 200개만 출력
- DISTINCT
SELECT DISTINCT 특성1 // 특성1을 기준으로 유니크한 값 선택
FROM 테이블_이름 // 특성이 여러 개일 경우, 해당 특성들의 유니크한 조합 값들을 선택
- INNER JOIN (= JOIN)
- 둘 이상의 테이블을 서로 공통된 부분을 기준으로 연결
SELECT *
FROM 테이블1
JOIN 테이블2 ON 테이블1.특성A = 테이블2.특성B
- OUTER JOIN
- LEFT OUTER JOIN과 RIGHT OUTHER JOIN으로 구분
- INCLUSIVE를 실행
SELECT *
FROM 테이블_1
LEFT(RIGHT) OUTER JOIN 테이블_2 ON 테이블_1.특성_A = 테이블_2.특성_B
4. ACID
- 데이터베이스 내에서 일어나는 트랜잭션의 안정성을 보장하기 위해 필요한 성질
트랜잭션
- 여러 개의 작업을 하나로 묶은 실행 유닛
- 각 트랜잭션은 하나의 특정 작업을 시작으로, 묶여 있는 모든 작업을 모두 완료 시 정상적으로 종료
- 하나의 트랜잭션에 속해있는 여러 작업 중 하나라도 실패할 경우, 트랜잭션에 속한 모든 작업을 실패한 것으로 판단
- Atomicity(원자성)
- 하나의 트랜잭션에 속해있는 모든 작업이 전부 성공하거나 전부 실패하여 결과를 예측할 수 있어야 하는 성질(= 트랜잭션이 성공 혹은 실패하여야 하는 성질)
- 즉, 트랜잭션 내 작업이 전부 성공하지 않을 경우, 모든 작업이 실패하게 만들어 기존 데이터 보호
- Consistency(일관성)
- 데이터베이스의 상태가 일관되어야 하는 성질
- 하나의 트랜잭션 이전/이후, 데이터베이스의 상태는 이전과 같이 유효하여야 함
- 즉, 트랜잭션이 일어난 후의 데이터베이스는 데이터베이스 제약과 규칙을 만족해야 함
- Isolation(격리성, 고립성)
- 모든 틀내잭션은 다른 트랜잭션으로부터 독립되어야 하는 성질
- 동시에 여러 개의 트랜잭션이 수행될 때, 각 트랜잭션은 고립되어 있어 연속으로 실행된 것과 동일한 결과를 나타냄
- 즉, 각 트랜잭션은 다른 트랜잭션에 서로 영향을 줄 수 없고, 서로 영향을 줄 경우 트랜잭션이 실패된 것으로 간주
- Durability(지속성)
- 하나의 성공된 트랜잭션에 대한 로그가 기록되고 그 기록이 영구적으로 남는 성질
- 서버 에러, 런타임 에러 등이 일어나더라도 해당 트랜잭션에 대한 기록은 데이터베이스에 남아있어야 함
5. SQL(구조화 쿼리 언어) vs NoSQL(비구조화 쿼리 언어)
- 데이터베이스는 관계형 데이터베이스와 비관계형 데이터베이스로 구분
- 관계형 데이터베이스는 SQL 기반
- 비관계형 데이터베이스는 NoSQL 기반
- SQL과 NoSQL은 만들어진 방식/저장하는 정보의 종류/저장 방식에 차이가 있음
관계형 데이터베이스
- 테이블 구조/데이터 타입을 사전에 정의(알맞은 형태의 데이터만 삽입 가능)
- 행과 열로 구성된 테이블에 데이터를 저장
- 열 : 하나의 속성에 대한 정보를 저장
- 행 : 각 열의 데이터 형식에 맞는 데이터를 저장
- 특정 형식을 가지고 있기 때문에, 데이터 사용이 수월(스키마가 뚜렷)
- 테이블간의 관계를 직관적으로 파악 가능
비관계형 데이터베이스
- 주로 데이터가 고정되어 있지 않은 데이터베이스를 지칭
- 데이터를 읽어올 때 스키마에 따라 데이터를 읽어오는 방식 사용(schema on read)
6. NoSQL 기반의 비관계형 데이터베이스 구성
- Key-Value 타입
- 속성을 Key-Value 쌍으로 나타내는 데이터를 배열 형태로 저장
- Key : 속성 이름 / Value : 속성에 연결된 데이터 값
- ex. Redis, Dynamo
- 문서형 데이터베이스
- 데이터를 테이블이 아닌 문서처럼 저장하는 데이터베이스
- JSON과 유사한 형식의 데이터를 문서화하여 저장
- 각 문서는 하나의 속성에 대한 데이터를 가지며, 컬렉션이라는 그룹으로 묶여 관리
- ex. MongoDB
- Wide-Column 데이터베이스
- 데이터베이스의 열에 대한 데이터를 집중적으로 관리하는 데이터베이스
- 각 열에는 Key-Value 형식으로 데이터 저장
- '열 패밀리'라고 하는 열의 집합체 단위로 데이터를 처리 가능
- 하나의 행에 많은 열을 포함할 수 있어 유연성 ↑
- 주로 규모가 큰 데이터 분석에 사용
- ex. Cassandra, HBase
- 그래프 데이터베이스
- 자료구조의 그래프와 비슷한 형식으로 데이터간의 관계를 구성하는 데이터베이스
- 노드에 속성별로 데이터를 저장
- 각 노드 간 관계를 선으로 표현
- ex. Neo4J, Infinite Graph
7. SQL 기반 DB와 NoSQL 기반 DB의 차이점
- 데이터 저장
- 관계형 DB : SQL을 이용해 데이터를 테이블에 저장(스키마 기반으로 지정된 형식에 맞게)
- 비관계형 DB : key-value/document/wide-column/graph 등의 방식으로 데이터 저장
- 스키마
- 관계형 DB : 고정된 형식의 스키마 필요(= 열에 대한 정보 미리 지정)
- 비관계형 DB : 동적으로 스키마 형태 관리 가능
- 쿼리
- 관계형 DB : 테이블 형식과 테이블 간 관계에 맞춰 데이터를 요청할 수 있는 구조화된 쿼리 언어 사용
- 비관계형 DB : 데이터 그룹 자체를 조회하는 것에 초첨을 두기 때문에, 구조화되지 않은 쿼리 언어로도 데이터 요청 가능
- 확장성
- 관계형 DB : 수직적 확장(높은 메모리/CPU 사용)으로, 비용과 시간 ↑
- 비관계형 DB : 수평적 확장(클라우드 서비스 이용/값싼 서버 증설)으로, 상대적으로 비용 ↓
8. SQL 기반의 관계형 데이터베이스 사용 케이스
- 데이터베이스의 ACID 성질을 준수해야 하는 경우
- 소프트웨어에 사용되는 데이터가 구조적이고 일관적인 경우
9. NoSQL 기반의 관계형 데이터베이스 사용 케이스
- 데이터의 구조가 거의 또는 전혀 없는 대용량의 데이터르 저장하는 경우
- 클라우드 컴퓨팅 및 저장공간을 최대한 활용하는 경우
- 빠르게 서비스를 구축하는 과정에서 데이터 구조를 자주 업데이트하는 경우