In-Memory
예기치 못한 상황으로부터 데이터를 보호하고, 프로그램이 종료된 상태에서도 데이터를 원하는 시간에 받아올 수 있다.
File I/O
단점: 데이터가 필요할 때마다 전체 파일을 읽어야 합니다. 파일의 크기가 커질수록 작업이 힘들고, 비효율적이어서 File I/O 방식의 큰 단점입니다.
단점: 파일이 손상되거나 여러 개의 파일을 동시에 다뤄야 하는 등 복잡하고 데이터량이 많아질수록 데이터를 불러들이는 작업이 힘들어진다.
반면 관계형 데이터베이스에서는 여러 개의 테이블을 가질 수 있기 때문에 SQL을 활용해 데이터를 불러오기 수월합니다.
(데이터 베이스는 단순하게 특정 형태의 파일, 대용량의 데이터를 저장하기 위한 목적이 아닙니다.)
데이터베이스 언어로, 주로 관계형 데이터베이스에서 사용합니다.
ex) MySQL, Oracle, SQLite, PostgreSQL 등 다양한 데이터 베이스에서 SQL 구문을 사용할 수 있습니다.
SQL이란 데이터 베이스 용 프로그래밍 언어입니다. 데이터베이스에 쿼리를 보내 원하는 데이터를 가져오거나 삽입할 수 있습니다. 데이터가 구조화된 테이블을 사용하는 데이터 베이스에서 사용할 수 있습니다.
SQL을 사용할 수 있는 데이터베이스와 달리, 데이터의 구조가 고정되어 있지 않은 데이터베이스를 NoSQL이라고 합니다. 테이블을 사용하지 않고 데이터를 다른 형태로 저장합니다.
ex) MongoDB
SQL을 사용하기 위해서는 데이터 구조가 고정되어 있어야 합니다.
입력하는 검색어가 일종의 쿼리입니다. 기존에 존재하는 데이터를 검색어로 필터링합니다. 따라서 쿼리는 저장되어 있는 데이터를 필터하기 위한 질의문으로 볼 수 있다.
CREATE DATABASE 데이터베이스_이름;
데이터베이스를 이용해 테이블을 만들거나 수정, 삭제 등의 작업을 하려면 먼저 사용하겠다는 명령을 전달해야 합니다.
USE 데이터베이스_이름;
USE를 이용해 데이터베이스를 선택했다면, 테이블을 만들 수 있습니다.
id를 Primary Key를 이용해 자동 증가하도록 설정하고, name 필드이름에 필드 타입은 문자열(최대 255개), email 필드이름에 필드 타입을 문자열(최대 255개)로 만들어야 합니다.
CREATE TABLE user(
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(255),
email varchar(255)
);
생성 후 DESCRIBE 명령어를 이용해 테이블 정보를 확인합니다.
테이블과 관련한 작업을 할 경우 반드시 입력해야 합니다. FROM 뒤에는 결과를 도출해낼 데이터베이스 테이블을 명시합니다.
SELECT 특성 FROM 테이블_이름;
모든 특성을 적용하고 싶을 경우 * 을 사용합니다.
SELECT * FROM 테이블_이름;
필터 역할을 하는 쿼리문입니다. WHERE는 선택적으로 사용할 수 있습니다.
SELECT 특성 FROM 테이블_이름 WHERE 특성 = "특정 값";
SELECT 특성 FROM 테이블_이름 WHERE 특성 <> "특정 값";
SELECT 특성 FROM 테이블_이름 WHERE 특성 > "특정 값";
SELECT 특성 FROM 테이블_이름 WHERE 특성 IN "특정 값";
돌려받는 데이터 결과를 어떤 기준으로 정렬하여 출력할지 결정합니다.
SELECT * FROM 테이블_이름 ORDER BY 특성;
SELECT * FROM 테이블_이름 ORDER BY 특성 DESC;
결과로 출력할 데이터의 개수를 정할 수 있습니다. 선택적 사용이며, 쿼리문 마지막에 추가합니다.
SELECT * FROM 테이블_이름 LIMIT 200;
유니크한 값을 받고 싶을 때 SELECT DISTINCT를 사용할 수 있습니다.
SELECT DISTINCT 특성 FROM 테이블_이름;
둘 이상의 테이블을 서로 공통된 부분을 기준으로 연결한다.
SELECT * FROM 테이블_1 JOIN 테이블_2 ON 테이블_1.특성 = 테이블_2.특성;
이때 특성이 같아야 한다.
데이터 베이스 트랜잭션이 발생할 때, 안정성을 보장할 수 있는 성질(이유)
A: Atomicity (원자성)
하나의 트랜잭션 내에서는 모든 연산이 성공하거나 실패해야 한다.
C: Consistency (일관성)
하나의 트랜잭션 전후에 데이터베이스의 일관된 상태가 유지되어야 한다.
I: Isolation (격리성, 고립성)
각각의 트랜잭션은 독립적이며, 서로의 연산을 확인하거나 영향을 줄 수 없다.
D: Durability (지속성)
성공한 트랜잭션에 대한 로그가 기록되고 영구적으로 남는다.
만들어진 방식, 저장하는 정보의 종류, 저장하는 방법 등에 차이가 있습니다.
관계형 데이터베이스에서는 테이블의 구조와 데이터 타입 등을 사전에 정의하고, 테이블에 정의된 내용에 알맞은 형태의 데이터만 삽입할 수 있습니다.
관계형 데이터베이스는 행(row) 열(col)로 구성된 데이블에 데이터를 저장합니다. 각 열은 하나의 속성에 대한 정보를 저장하고, 행에는 각 열의 데이터 형식에 맞는 데이터가 저장됩니다.
SQL은 특정한 형식을 지키기 때문에 데이터를 정확히 입력했다면 데이터를 사용할 때 매우 수월합니다. (테이블 간의 관계를 직관적으로 파악할 수 있습니다.)
ex) MySQL, Oracle, PostgresSQL, MariaDB
반대로 NoSQL은 데이터가 고정되어 있지 않은 데이터베이스를 가리킵니다. NoSQL에 반드시 스키마가 없는 것은 아닙니다. 관계형 데이터베이스에서는 데이터를 입력할 때 스키마에 맞게 입력해야 하는 반면, NoSQL에서는 데이터를 읽어올 때 스키마에 따라 데이터를 읽어옵니다. 데이터를 쓸 때 정해진 방식이 없다는 의미는 아닙니다. 데이터를 입력하는 방식에 따라, 데이터를 읽어올 때 영향을 미칩니다.
ex) MongoDB
완벽한 해답은 없습니다. 유저의 요구에 따라, 서비스에 맞게 설계해야 한다. NoSQL은 확장성이나 속도 면에서 뛰어나지만, 고차원으로 구조화된 SQL기반의 데이터베이스가 더 좋은 성능을 보여주는 서비스도 있다. 다양한 사례를 보고 적절한 데이터베이스를 선택하는 것이 좋다.
따라서 전자 상거래를 비롯한 모든 금융 서비스를 위한 소프트웨어 개발에서는 반드시 데이터베이스의 ACID 성질을 준수해야 합니다. (일반적으로 SQL을 이용한 관계형 데이터베이스를 사용합니다.)
데이터의 구조가 거의 또는 전혀 없는 대용량의 데이터를 저장하는 경우
정형화되지 않은 많은 양의 데이터가 필요한 경우, NoSQL을 적용하는 것이 더 효율적일 수 있습니다.
클라우드 컴퓨팅 및 저장 공간을 최대한 활용하는 경우
번거로움 없이 확장할 수 있는 NoSQL
빠르게 서비스를 구축하는 과정에서 데이터 구조를 자주 업데이트하는 경우
NoSQL 데이터베이스의 경우 스키마를 미리 준비할 필요가 없기 때문에 빠르게 개발하는 과정에 매우 유리합니다. 데이터 구조를 자주 업데이트해야하는 경우, 스키마를 매번 수정해야 하는 관계형 데이터베이스 보다 NoSQL 기반의 비관계형 데이터베이스를 사용하는 게 더 적합합니다.