< 학습 목표 >
- SQL이 어떻게 이루어져 있는지 이해한다
- SQL 기본 query문을 사용할 줄 안다
- Schema의 설계 방법과 나은 방향성을 고안한다
- 서버와 클라이언트 사이에서 주고 받는 데이터를 database에 저장하여 영속성 있게 저장할 수 있다.
❑ SQL
➤ SQL이란?
Structured Query Language (구조화된 Query 언어)
▶️ Query란?
직역하면 질의문이란 뜻이다.
가장 친숙한 예시로 검색창에 적는 검색어가 있다.
저장되어 있는 정보를 필터하기 위한 질문이라고 볼 수 있다.
SQL은 데이터베이스용 프로그래밍 언어이다.
데이터베이스에 query를 보내 원하는 데이터만을 뽑아올 수 있다.
➤ database가 왜 필요할까?
▶️ In-memory 데이터베이스
인메모리는 런타임에만 존재하는 데이터이다.
데이터를 보조기억장치가 아닌 RAM에서 읽고 쓴다.
CPU와 바로 데이터를 주고받기 때문에 보조기억장치에 저장하는 것보다 훨씬 빠르다.
하지만 전원이 꺼지면 데이터는 사라진다.
굉장히 빠르지만 많은 양을 담지는 못한다.
실무에선 주로 고속 데이터베이스 조작을 필요로 하는 애플리케이션에 인메모리 데이터베이스를 사용한다.
▶️ File I/O
원하는 데이터만 가져올 수 없고 항상 모든 데이터를 가져온 뒤 서버에서 필터링 필요
파일이 커질수록 비효율적
▶️ database
필터링 외에도 File I/O로 구현이 힘든 관리를 위한 여러 기능들을 가지고 있는 데이터에 특화된 서버
➤ 관계형 데이터베이스의 장점
하나의 CSV파일이나 엑셀 시트를 한개의 테이블로 저장할 수 있음
한번에 여러 개의 테이블을 가질 수 있어 데이터를 불러오기 수월함
➤ SQL
데이터베이스 언어
관계형 데이터베이스에서 사용
SQL구문을 사용할 수 있는 데이터베이스: MySQL, Oracle, SQLite, PostgreSQL
SQL을 사용하기 위해서는 데이터 구조가 고정되어 있어야 함
데이터의 구조가 고정되어 있지 않은 데이터베이스를 NoSQL이라고 함
NoSQL은 관계형 데이터베이스와 달리 테이블을 사용하지 않고 다른 형태로 데이터를 저장함
NoSQL의 대표적인 예로 MongoDB (문서 지향 데이터베이스)
데이터베이스에 쿼리를 날리면 작성한 조건에 맞는 데이터들을 필터해서 보여줌
➤ 기본 쿼리문
- SELECT : 데이터를 불러온다
- FROM : 데이터를 불러올 곳(테이블)을 지정한다
- WHERE : SELECT와 함께 사용되며 특정하게 지정된 값을 불러오는 기능을 한다.(원하는 값만 가져올 때)
- AND, OR, NOT : 주로 WHERE 처럼 조건이 들어가는 쿼리문에 같이 사용한다
- DISTINCT : SELECT와 함께 사용되며 중복되지 않는 유일한 값만 불러오는 기능을 한다
- ORDER BY : 데이터를 정렬할 때 사용한다(기본값은 오름차순, 내림차순으로 작성하려면 DESC 속성값 부여하면 된다)
- INSERT INTO (Statement) : 테이블 안에 새로운 데이터를 삽입할 때 사용된다
- UPDATE : 테이블 안의 데이터를 수정할 때 사용된다
- DELETE : 테이블 안의 데이터를 삭제할 때 사용된다
- IS (NOT) NULL
- COUNT : 데이터의 수를 세는 함수이다
- AVG : 데이터의 평균 값을 구하는 함수이다
- MIN / MAX : 데이터의 최솟값, 최댓값을 구하는 함수이다
- LIKE : WHERE과 함께 쓰이는 조건 연산자이다 if와 같은 역할을 한다
- Wildcard : 문자열에서 하나 이상의 문자를 대체하는데 사용된다
- ALIASES : 별칭(별명)을 붙인다
- JOINS : INNER JOIN, LEFT JOIN, RIGHT JOIN 이 있다
- GROUP BY : 그룹을 지정한다
데이터베이스 관련 용어
- CREATE DATABASE (database name);
- CREATE TABLE (table name);
- DROP DATABASE (database name);
- DROP TABLE (table name);
- BACKUP DATABASE (database name) TO DISK = 'filepath';
- ALTER TABLE : 테이블에 column을 추가, 삭제, 변경할 때 사용
- Not Null : column 생성시 null을 허용하지 않도록 설정하는 제약 조건
- UNIQUE : column의 모든 값이 다르도록 지정하는 제약 조건
- PRIMARY KEY : 테이블의 각 레코드를 기본키로 지정하는 제약 조건
- FOREIGN KEY : 외부 테이블의 레코드와 연결하는 제약 조건
- DEFAULT : column의 기본값을 지정하는 제약 조건
- AUTO_INCREMENT : 레코드가 생성될 때마다 자동으로 고유 번호가 생성되도록 함
❑ ACID
트랜젝션(Transaction)
데이터베이스의 상태를 변환시키는 논리적 기능을 수행하기 위해 행해지는 하나 이상의 쿼리를 모아 놓은 하나의 작업 단위
➤ ACID?
데이터베이스 트랜젝션이 발생할 때, 그 안정성을 보장할 수 있는 성질
Atomicity : 원자성, 하나의 트랜젝션 내에서는 모든 연산이 성공하거나 모두 실패해야 한다. (하나의 연산이라도 실패하면 롤백시킨다)
Consistency : 일관성, 하나의 트랜젝션 전후에 데이터베이스의 일관된 상태가 유지되어야 한다.
Isolation : 격리성, 각각의 트랜젝션은 독립적이기 때문에 서로의 연산을 확인받거나 영향을 줄 수 없다.
Durability : 지속성, 하나의 성공된 트랜젝션에 대한 로그가 기록되고 영구적으로 남는다.
데이터베이스를 구축할 때 언제나 ACID를 지켜야 하는 것은 아니다.
ACID를 지키면서 설계하는 건 금융 계열에서 일할 때 필요하다.
❑ SQL(구조화 쿼리 언어) vs NoSQL(비구조화 쿼리 언어)
데이터베이스는 크게 관계형 데이터베이스와 비관계형 데이터베이스로 구분된다.
관계형 데이터베이스는 SQL을 기반으로 하고 비관계형은 NoSQL로 데이터를 다룬다.
➤ 관계형 데이터베이스
- 테이블의 구조와 데이터 타입 등을 사전에 정의
- 테이블에 정의된 내용에 알맞은 형태의 데이터만 삽입할 수 있음
- 행(row) 와 열(column)으로 구성된 테이블에 데이터를 저장
- 각 열은 하나의 속성에 대한 정보를 저장
- 각 행은 열의 데이터 형식에 맞는 데이터가 저장
- 데이터를 정확히 입력했다면 사용할 때 매우 수월함
- 원하는 정보를 SQL을 활용해 쿼리할 수 있음 -> 스키마*가 뚜렷하게 보인다
- 데이터를 입력할 때 스키마에 맞게 입력해야함
- 테이블 간의 관계를 직관적으로 파악할 수 있음
- 대표적인 관계형 데이터베이스 : MySQL, Oracle, SQLite, PostgreeSQL, MariaDB
*스키마
데이터베이스 스키마(database schema)는 데이터 베이스에서 자료의 구조, 자료의 표현 방법, 자료 간의 관계를 형식 언어로 정의한 구조이다
➤ 비관계형 데이터베이스
- 데이터가 고정되어 있지 않은 데이터베이스를 가리킴
- NoSQL이 스키마가 반드시 없는 것은 아님
- 데이터를 읽어올 때 스키마에 따라 데이터를 읽어옴 -> ’schema on read’ 라고함
- 읽어올 때에만 데이터 스키마가 사용됨
- 데이터를 쓸 때 정해진 방식이 없는 것은 아님
- 데이터를 입력하는 방식에 따라 데이터를 읽어올 때 영향을 미침
- 대표적인 NoSQL: 몽고DB, Casandra
➤ NoSQL의 구성
- Key-Value 타입
- 문서형(Document) 데이터베이스
- Wide-Column 데이터베이스
- Graph 데이터베이스
➤ SQL기반의 데이터베이스와 NoSQL데이터베이스의 차이점
▶️ 데이터 저장(Storage)
NoSQL: key-value, document, wide-column, graph 등의 방식으로 데이터를 저장함
SQL: 테이블에 저장함, 미리 작성된 스키마를 기반으로 정해진 형식에 맞게 데이터를 저장해야함
▶️ 스키마(Schema)
SQL: 고정된 형식의 스키마가 필요함, 데이터 속성별로 열에 대한 정보를 미리 정해두어야함, 스키마는 나중에 변경이 가능하지만 이 경우 데이터베이스 전체를 수정하거나 오프라인(down-time)으로 전환할 필요가 있음
NoSQL: 관계형보다 동적으로 스키마 관리할 수 있음, 행을 추가할 때 즉시 새로운 열을 추가할 수 있고 개별 속성에 대해서 모든 열에 대한 데이터 값을 입력하지 않아도 됨
▶️ 쿼리(Querying)
SQL: 테이블의 형식과 관계에 맞춰 데이터를 요청해야함, 구조화된 쿼리 언어를 사용함
NoSQL: 데이터 그룹 자체를 조회하는 것에 초점을 두고 있음, 구조화 되지 않은 쿼리 언어로도 데이터 요청이 가능, UnQL(Unstructured Query Language)라고도 말함
▶️ 확장성(Scalability)
SQL: 수직적으로 데이터를 확장(높은 메모리, CPU를 사용하는 확장)
구축된 하드웨어의 성능을 많이 이용 -> 비용 많이 소모
여러 서버에 걸쳐서 데이터베이스의 관계를 정의할 수 있지만, 매우 복잡하고 시간이 소모됨
NoSQL: 수평적으로 데이터 확장(보다 값싼 서버 증설, 클라우드 서비스 이용하는 확장)
서버를 추가적으로 구축 -> 많은 트래픽을 보다 편리하게 처리
➤ SQL과 NoSQL 중 어떤 것을 사용해야 하나요?
정답은 없다.
각각의 상황에 맞게 선택하여 쓰지만 관계형, 비관계형을 모두 사용하여 서비스에 맞게 설계할 수도 있다.
▶️ SQL 기반의 관계형 데이터베이스를 사용하는 케이스
1. 데이터베이스의 ACID성질을 준수해야 하는 경우
금융 서비스를 위한 소프트웨어 개발에서는 반드시 ACID를 준수해야 하므로 SQL을 사용
2. 소프트웨어에 사용되는 데이터가 구조적이고 일관적인 경우
소프트웨어의 규모가 많은 서버를 필요로 하지 않고 일관된 데이터를 사용하는 경우
▶️ NoSQL 기반의 관계형 데이터베이스를 사용하는 케이스
1. 데이터 구조가 거의 또는 전혀 없는 대용량의 데이터를 저장하는 경우
2. 클라우드 컴퓨팅 및 저장공간을 최대한으로 활용하는 경우
3. 빠르게 서비스를 구축하는 과정에서 데이터 구조를 자주 업데이트 하는 경우
읽어주셔서 감사합니다. 좋은하루 되세요
오개념에 대한 지적은 언제나 환영입니다.🔥
'TIL(Today I Learned)' 카테고리의 다른 글
6/14 (화) Spring Framework 기본 (0) | 2022.06.14 |
---|---|
6/10 (금) 관계형 데이터베이스2️⃣ - Schema & Query Design (2) | 2022.06.13 |
6/8 (수) HTTP (0) | 2022.06.12 |
6/7 (화) 네트워크-1️⃣ 브라우저의 작동 원리 (0) | 2022.06.08 |
5/31 (화) 코딩 테스트 준비 - 1️⃣ 알고리즘, 의사코드, 시간복잡도(Big-O) (0) | 2022.06.01 |