코드스테이츠 32일차 [관계형 데이터베이스 ]

Lumi·2021년 10월 19일
0
post-thumbnail

이번에는

  • SQL문법
  • 스키마 디자인
  • Nods.js에서느 사용하는 방법

에 대해서 학습을 하게 된다.

  • 관계형 데이터베이스인 MySQL로 스키마를 설계하고 SQL을 사용하여 데이터를 영속성있게 저장하는 방법을 학습한다.

데이터베이스는 원래 im-memory방신으로 저장하고 클라이언트의 HTTP요청에 따라 서버에서 알맞은 데이터를 응답했다.

  • im-memory방식은 프로그램이 실행중일 떄, 변수에 값을 할당하여 저장하는 것을 말한다.

이 방식의 단점은 프로그램의 실행에 따라서 이전에 저장한 값이 휘발된다는 단점이 있다.

  • in-memory방식이 아니면 Node.js의 fs 모듈을 활용하여 데이터를 파일에 저장할 수도 있다.

즉 데이터를 저장하는 방법은
in-memory -> 파일로 저장 -> 데이터베이스로 저장

이런식으로 변화해 왔다고 요약할수가 있다.

SQL소개

우리가 굳이 데이터 베이스를 사용해야 하는 이유는 뭘까??

임시로 파일로도 데이터를 저장할수 있다 = in-memory
하지만 이 방식은 앞서 말한 것처럼 프로그램의 실행 유무에 따라서 값이 사라지게 된다.

또한 예기치 못한 상황에 대해서 대처를 할수가 없다.

다음에 진화한 저장방법은 파일로 데이터를 저장하는 방법이다. === File I/O

  • 엑셀, CSV형태로 값을 저장하기 떄문에 in-memory보다는 확실히 효율적이다.

하지만 단점이 명확한데.

  • 데이터가 필요할 떄마다 전체 파일을 읽어야 한다.
  • 파일이 손상되거나 여러 개의 파일을 다뤄야 할떄 복잡하고 데이터량이 많아진다.

이러한 단점들을 모두 해결한 것이 데이터베이스 이다.
하나의 엑셀, CSV파일에 모든 값이 들어가 있으며 SQL문을 통해서 원하는 값을 가져 올수가 있다.

SQL은 데이터 베이스에서 사용하나 일종의 언어로
MySQL, Oracle등 다양한 데이터베이스에서 SQL구문을 사용할 수 있다.

SQL은 데이터베이스에 쿼리를 보내 원하는 데이터를 가져오거나 삽입할 수가 있다.

SQL을 사용할수 없는, 데이터의 구조가 고정되어 있지 않은 데이터베이스를 NoSQL이라고 한다.

  • 테이블을 사용하지 않고 다른 형태로 저장한다.
  • MongoDB가 대표적인 문서 지향 데이터 베이스 이다.

SQL의 기본 쿼리문

데이터 베이스 생성하기

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라는 테이블에 있는 모든값을 가져오라는 의미이다.

  • where이라는 SQL문과 함께 사용하면

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 : 데이터를 내림차순으로 가져오라는 뜻이다.

  • 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

트랜잭션
여러 개의 작업을 하나로 묶은 실행 유닛
각 트랜잭션은 하나의 특정 작업으로 시작을 해 묶여 있는 모든 작업들을 다 완료해야 정상적으로 종료합니다.

  • 즉 하나라도 실패하면 모든 작업을 실패라고 판단한다.
  • &&와 같다고 생각하면 된다.

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

A : Atomicity(원자성)

&&와 같은 역할을 한다.

  • 모든 작업이 전부 성공하거나 전부 실패해서 결과를 예측할수 있어야 한다.

계좌 입금과 같다

A가 B에서 돈을 보낼떄 A에서 전송이 되고 B에서 받아야 정상적이지만
하나라도 이루어 지지 않으면 작업이 실패로 돌아간것과 같다.

이것을 원자성 이라고 한다.

만약 원자성이 실패하게 된다면 작업 자체를 취소하여 기존 데이터를 보호한다.

C : Consistency(일관성)

데이터베이스의 상태가 일관되어야 한다는 성질이다.

  • 하나의 트랜잭션이 완료후 데이터베이스의 상태가 이전과 같아야 한다는 뜻이다.

예를들면 데이터를 추가할떄 반드시 이름이 있어야 한다 라는 조건이 있다면

이름이 없는 고객을 추가하는 쿼리는 작동하지 않을 것이다.

  • 쉽게 말해 데이터에 걸린 규칙을 지켜야 한다는 뜻이다.

I : Isolation(격리성, 고립성)

모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 한다는 뜻이다.

  • 트랜잭션이 다른 트랜잭션에 영향을 주어서는 안된다.

D : Durability(지속성)

트랜잭션이 성공적으로 수행되면 로그가 남아야 한다.

  • 기록은 영구적이어야 한다.

후에 오류가 발생하였을떄 기록을 보고 오류를 처리할수 있기 떄문이다.

SQL vs. NoSQL

SQL(구조화 언어) vs NoSQL(비 구조화 언어)의 차이를 말한다.

관계형 데이터베이스와 비관계형 데이터베이스 라고도 부르기도 한다.

관계형 데이터베이스 같은 경우에는 테이블에 정확한 값을 입력하고 규제를 지켜야만 활용을 할수가 있다.

  • 대신 데이터를 사용할 떄에는 매우 수월하다.

SQL쿼리 문을 활용하여 값을 가져올수 있고 이것을 스키마가 뚜렷하게 보인다는 말과 같다.

  • 테이블 간의 관계를 직관적으로 파악할 수 있다.

비관계형 데이터베이스는 데이터가 고정되어 있지 않은 데이터베이스를 말한다.

스키마가 없다는 것이 아니고 관계형은 스키마에 맞게 입력해야 하는 반면
비관계형은 스키마에 따라 데이터를 읽어 온다.

NoSQL

비관계형 데이터베이스는 보통 다음과 같이 구성된다.

  1. key-value타입
  • 쌍으로 나타나는 데이터를 배열의 형태로 저장을 한다.
  • key : 속성 이름, value:속성에 연결되 데이터 값을 의미한다.
  1. 문서형 데이터베이스
  • 테이블이 아닌 문서처럼 저장하는 것을 말한다.
  • JSON과 유사한 형식의 데이터를 문서화하여 저장하며
  • 컬렉션이라고 하는 그룹으로 묶어서 관리한다.
  1. Wide-Column 데이터베이스
  • 열(column)에 대한 데이터를 집중적으로 관리하는 데이터베이스 이다.
  • 마찬가지로 key-value형식으로 값이 저장되고 컬럼 패밀리 라고 하는 집합체 단위로 데이터를 처리한다.

어떤 데이터베이스가 더 우수한가..?

완벽한 솔루션은 없다. 두종류를 모두 사용할수도 있고 한가지만 사용 할수도 있다.

NoSQL같은 경우에는 확장성이나 속도면에서 더 뛰어나다.
그러나 설계가 잘된 SQL기반이 더 좋은 성능을 보여줄떄도 있다.

SQL 기반의 관계형 데이터베이스를 사용하는 케이스

  1. 데이터베이스의 ACID성질을 준수해야 하는 경우
  • 예외적인 상황을 줄이고, 데이터베이스의 무결성을 보호할수가 있다.
  • 전자 상거래를 비롯한 모든 금융 서비스 개발은 모두 SQL을 사용한다.
  1. 소프트웨어에 사용되는 데이터가 구조적이고 일관적인 경우
  • 규모가 큰 서버를 필요로 하지 않고 일관된 데이터를 사용하는 경우 사용하게 된다.
  • 다양한 데이터유형과 높은 트래픽을 지원하는 NoSQL을 사용할 이유가 없기 떄문이다.

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

  1. 데이터 구조가 거의 없는 대용량의 데이터를 저장하는 경우
  • NoSQL은 정형화 되어있지 않기 떄문에 자유롭게 활용 가능하다.
  1. 클라우드 컴퓨팅 및 저장공간을 최대한 활용하는 경우
  • 클라우드를 구축하면 저렴한 비용의 솔루션을 제공받을 수 있고 확장성이 중요하다면 번거로움이 없는 NoSQL이 유리하다.
  1. 빠르게 서비스를 구축하는 과정에서 데이터 구조를 자주 업데이트 하는 경우
  • 스키마를 준비할 필요가 없기 떄문에 빠르게 개발하는 과정에서 매우 유리하다.
  • 시장에 빠르게 프로토타입을 출시해야 하는 경우에 해당되기도 한다.

스키마 : 계획이나 도식을 가르킨다, 설계도와 같다고 생각하자

profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글