이번에는
에 대해서 학습을 하게 된다.
데이터베이스는 원래 im-memory방신으로 저장하고 클라이언트의 HTTP요청에 따라 서버에서 알맞은 데이터를 응답했다.
이 방식의 단점은 프로그램의 실행에 따라서 이전에 저장한 값이 휘발된다는 단점이 있다.
즉 데이터를 저장하는 방법은
in-memory -> 파일로 저장 -> 데이터베이스로 저장
이런식으로 변화해 왔다고 요약할수가 있다.
우리가 굳이 데이터 베이스를 사용해야 하는 이유는 뭘까??
임시로 파일로도 데이터를 저장할수 있다 = in-memory
하지만 이 방식은 앞서 말한 것처럼 프로그램의 실행 유무에 따라서 값이 사라지게 된다.
또한 예기치 못한 상황에 대해서 대처를 할수가 없다.
다음에 진화한 저장방법은 파일로 데이터를 저장하는 방법이다. === File I/O
하지만 단점이 명확한데.
이러한 단점들을 모두 해결한 것이 데이터베이스 이다.
하나의 엑셀, CSV파일에 모든 값이 들어가 있으며 SQL문을 통해서 원하는 값을 가져 올수가 있다.
SQL은 데이터 베이스에서 사용하나 일종의 언어로
MySQL, Oracle등 다양한 데이터베이스에서 SQL구문을 사용할 수 있다.
SQL은 데이터베이스에 쿼리를 보내 원하는 데이터를 가져오거나 삽입할 수가 있다.
SQL을 사용할수 없는, 데이터의 구조가 고정되어 있지 않은 데이터베이스를 NoSQL
이라고 한다.
데이터 베이스 생성하기
CREATE DATABASE 데이터베이스_이름;
: 데이터 베이스를 생성한다.
USE 데이터베이스_이름;
: 데이터 베이스를 이용할떄는 반드시 use사용을 선행해야 한다.
id int PRIMARY KEY AUTO_INCREMENT,
name varchar(255),
email varchar(255)
);
PRIMARY KEY AUTO_INCREMENT
: 주요 키를 지정하며 자동으로 증가하는 값이라고 지정해 준다.DESCRIBE user;
: 테이블에 있는 값을 확인하는 방법이다.
우리는 이렇게 DB를 만들고 테이블을 만들어 테이블에 원하는 데이터를 저장할수 있다.
SELECT : 테이블에서 데이터를 선택하는 SQL문이다.
SELECT * FROM user
: user라는 테이블에 있는 모든값을 가져오라는 의미이다.
SELECT * FROM user WHERE name = 'hojin'
: user라는 테이블에서 이름이 hojin이라는 데이터들을 가져오라는 뜻이다.
SELECT * FROM user WHERE name <> "hojin"
: user라는 테이블에서 이름이 hojin인 데이터를 제외한 데이터를 모두 가져오라는 뜻이다.
ORDER BY : 데이터를 정렬하는 SQL문이다.
SELECT * FROM user ORDER BY name DESC
: 데이터를 내림차순으로 가져오라는 뜻이다.
LIMIT : 데이터의 양을 조절해서 가져온다
- 항상 SQL문의 가장 마지막에 붙여서 사용하면 된다.
DISTINCT : 유니크한 값을 받고 싶을 떄에 사용하면 된다.
SELECT DISTINCT name FROM user
: user라는 테이블에서 name값들을 가져오라는 뜻
SELECT DISTINCT name, age FROM user
: user라는 테이블에서 name, age값들을 가져오라는 뜻
INNER JOIN : 테이블에 서로 연관관계를 줄떄 사용한다.
SELECT * FROM user JOIN customer ON user_name = customer_name
: user와 customer에 있는 user_name, customer_name에 서로 연관관계를 준다.
트랜잭션
여러 개의 작업을 하나로 묶은 실행 유닛
각 트랜잭션은 하나의 특정 작업으로 시작을 해 묶여 있는 모든 작업들을 다 완료해야 정상적으로 종료합니다.
ACID는 트랜잭션의 안전성을 보장하기 위해 필요한 성질이다.
A : Atomicity(원자성)
&&와 같은 역할을 한다.
계좌 입금과 같다
A가 B에서 돈을 보낼떄 A에서 전송이 되고 B에서 받아야 정상적이지만
하나라도 이루어 지지 않으면 작업이 실패로 돌아간것과 같다.
이것을 원자성 이라고 한다.
만약 원자성이 실패하게 된다면 작업 자체를 취소하여 기존 데이터를 보호한다.
C : Consistency(일관성)
데이터베이스의 상태가 일관되어야 한다는 성질이다.
예를들면 데이터를 추가할떄 반드시 이름이 있어야 한다
라는 조건이 있다면
이름이 없는 고객을 추가하는 쿼리는 작동하지 않을 것이다.
I : Isolation(격리성, 고립성)
모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다는 뜻이다.
D : Durability(지속성)
트랜잭션이 성공적으로 수행되면 로그가 남아야 한다.
후에 오류가 발생하였을떄 기록을 보고 오류를 처리할수 있기 떄문이다.
SQL(구조화 언어) vs NoSQL(비 구조화 언어)의 차이를 말한다.
관계형 데이터베이스와 비관계형 데이터베이스 라고도 부르기도 한다.
관계형 데이터베이스 같은 경우에는 테이블에 정확한 값을 입력하고 규제를 지켜야만 활용을 할수가 있다.
SQL쿼리 문을 활용하여 값을 가져올수 있고 이것을 스키마가 뚜렷하게 보인다는 말과 같다.
비관계형 데이터베이스는 데이터가 고정되어 있지 않은 데이터베이스를 말한다.
스키마가 없다는 것이 아니고 관계형은 스키마에 맞게 입력해야 하는 반면
비관계형은 스키마에 따라 데이터를 읽어 온다.
NoSQL
비관계형 데이터베이스는 보통 다음과 같이 구성된다.
어떤 데이터베이스가 더 우수한가..?
완벽한 솔루션은 없다. 두종류를 모두 사용할수도 있고 한가지만 사용 할수도 있다.
NoSQL같은 경우에는 확장성이나 속도면에서 더 뛰어나다.
그러나 설계가 잘된 SQL기반이 더 좋은 성능을 보여줄떄도 있다.
SQL 기반의 관계형 데이터베이스를 사용하는 케이스
NoSQL 기반의 비관계형 데이터베이스를 사용하는 케이스
스키마
: 계획이나 도식을 가르킨다, 설계도와 같다고 생각하자