백엔드/코드스테이츠 수강

코드스테이츠 수강_8주차_2일차_관계형 데이터베이스 (SQL)

반 불혹 2022. 10. 5. 20:31

코드스테이츠 수강 8주차 2일차에는 SQL에대해 배웟다. 

SQL은 관계형 데이터베이스를 사용할때 쓰는 놈이다.

일단 데이테베이스를 왜 쓰느냐? 

그냥 서버에서 데이터 가져와서 이캐캐 하면 될거같은데 이게 막상 하면 안된다고 한다.
(소규모의 경우, 서버 내에서 데이터를 적제해서 사용하는 경우가 있다. 이 경우는 됨 ㅎ)

안되는 이유

1. In-Memory

자바스크립트에서 데이터를 다룰 때, 프로그램이 실행될 때만 존재하는 데이터가 있다. 
(프로그램 꺼지면 사라짐)

이런 변수에 데이터를 저장한 경우, 프로그램이 꺼지면 해당 데이터도 사라진다.

예기치 못한 상황으로 프로그램이 멈추거나 종료되면 멀쩡히 잘 쓰고 있다가도 데이터가 날아가버리니 제대로 동작할 수 없고, 프로그램이 종료된 상태에서는 에초에 사용이 불가능해진다. 

2. File I/O 

파일을 읽는 방식으로 작동하는 형태를 말한다. 

앞에서 자바스크립트로 쓰면 종료하면 사라진다 했는데 "엑셀로 만들어놓고 저장하면 그만 아님?" 할 수도 있다.

이게 문제가 또 있다.

먼저 원하는 데이터를 조회하려면 만들어진 파일을 다 봐야한다. 

만약 "서울사는 김철수씨, 내성발톱 있음" 의 특징을 서울시 주민등록 목록에서 찾는다고 생각해보자 

일일히 김철수인지;, 내성발톱인지 확인해야 하는데, 한세월 걸린다. 

그런데, 김철수 말고 정말자, 박속순 할머니들도 와서 이것저것 찾아달라고 하면 거의 못하는거나 다름없다. 

또한, 목록에 커피얼룩이나 중간중간 문서를 조회하는데 공인인증서 등등의 복잡한 요소가 잇으면 또또 거의 불가능 한 것이나 다름없다. 

  • 데이터가 필요할때마다 전체 데이터를 읽어오는 것이기 때문에 파일의 크기가 커질수록 비효율적

  • 파일의 손상, 여러개의 파일 동시 사용, 복잡한 데이터 등의 요소가 있으면 비효율성을 더 올라감

 

위의 이유들 때문에 관계형 데이터베이스가 사용된다. 

관계형 데이터베이스는 하나의 CSV파일이나, 엑셀시트를 한개의 테이블로 저장 할 수있는데, 한번에 여러개의 테이블을 가질 수 있기 때문에 SQL로 불러우고 수월하다.
(일일히 보지 않고 필요한거만 쏙 가져오는거 가능)

 

SQL 

SQL은 데이터베이스를 사용하기 위한 일종의 언어이다. 

SQL은 쿼리를 활용하여 작성하고, 해당 쿼리에 맞게 데이터베이스가 출력을 내놓는 것이다. 

쿼리가 뭐임?

쿼리는 직역하면 "질의문" 이라고 한다. 

단순한 예로 검색할때의 검색어가 쿼리로 볼 수 있는데, 쉽게 생각하면 그냥 데이터베이스에 요청할때 사용하는 키워드라고 생각하면 된다. 

 대략 " ~~ 해줘 " 를 키워드로 

서울시 "안의" 김철수 "찾아 줘" -> ~~안에, ~~찾아줘 

밥 "줘" 도 쿼리다.

이게 바로 쿼리라는 것이다. 

SQL은 마치 이 쿼리를 지정된 양식으로 쓰는것과 같다고 보면 된다.

 

SQL 간략한 명령어 

 

SELECT : 데이터셋에 포함될 특성을 특정함 (EX: 2들어가는 파일 찾아라)

예시

SELECT 'hello world'
SELECT 2
SELECT 15 + 3

 

FROM : 테이블과 관련한 작업 시 꼭 입력해야 하는 명령어, FROM뒤에는 결과를 도출할 데이터베이스 테이블을 명시
(요약하면 데이터베이스의 특정 테이블에서~ 라는 것)

예시

SELECT 특성_1
FROM 테이블_이름

 

WHERE : 필터 역할을 하는 쿼리, WHERE은 서선택적으로 사용 가능 

특정 값과 동일한 데이터 찾는 예시

SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_1 = "특정 값"

특정 값을 제외한 데이터 찾는 예시

SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_2 <> "특정 값"

 

특정값보다 크거나 작거나 한 데이터 찾는 예시 

SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_1 > "특정 값"

SELECT 특성_1, 특성_2
FROM 테이블_이름
WHERE 특성_1 <= "특정 값"

 

ORDER BY : 돌려받는 데이터 결과를 어떤 기준으로 정렬하려 출력할지 결정

오름차순 정렬

SELECT *
FROM 테이블_이름
ORDER BY 특성_1

내림차순 정렬

SELECT *
FROM 테이블_이름
ORDER BY 특성_1 DESC

 

LIMIT : 출력할 데이터 갯수 제한 , 쿼리문에서 가장 마지막 부분에 사용

200개만 출력하는 예시 

SELECT *
FROM 테이블_이름
LIMIT 200

 

 DISTINCT : 유니크한 값을 받고 싶을때 (지혼자 다른 값, 다른것과 차이가 큰거)

특성 1 을 기준으로 유니크한 값 선택

SELECT DISTINCT 특성_1
FROM 테이블_이름

여러개의 특성을 기준으로도 가능 

SELECT
  DISTINCT
    특성_1
    ,특성_2
    ,특성_3
FROM 테이블_이름

 

ACID 

ACID는 데이터베이스 내에서 발생하는 트렌잭션의 안정성을 보장하기 위한 성질이다. 

트랜잭션이 뭐냐?

트랜잭션은 여러개의 작업을 하나로 묶은 실행 유닛이다. 

작업 도중에 여러개 작업중 하나라도 실패하면 트랜잭션 자체가 실패로 되고, 모두 성공해야 성공으로 처리된다.

뭔소리냐고? 

예를 들어 이메일을 보낸다고 하자, 이 예시에서 이메일은 내 콤퓨터 -> 서버 -> 메일 받는사람의 경로를 거친다고 하자.

내가 이메일을 작성해서 보내기 누르면 -> 서버로 전송 될 것이다, 그런데, 회선이 안좋아서 서버로 가다가 실패하면 -> 발송 실패 처리

또는, 서버까지는 잘 갔는데, 서버에서 받는사람한테 가다 실패하면 -> 발송 실패 처리

결국 내 콤퓨타 -> 써버 -> 받는사람 까지 갈때 별일 없이 잘 가야 성공이라는 것이다. 
(이메일 보낼때 수행하는 작업 모두가 잘 진행되어야 성공이라는 것)

데이터베이스 트랜잭션은 ACID라는 특성을 가진다.

 

앞서 ACID는 총 4개의 성질을 가지는데, 모두 트랜잭션의 안정성 보장과 관련이 있다. 

 

1. Atomicity(원자성)

원자성은 앞서 트랜잭션을 설명할때처럼, 여러 작업중 하나라도 실패하면 실패로 처리하는 것을 말한다.

예를 들어 A 계좌에서 돈을 빼서 B계좌에 넣는다고 했을때 2가지 작업을 생각 할 수 있다.

  1. A 계좌에서 돈을 출금

  2. B 계좌에 입금

만약 이 두가지 일중 A계좌의 출금이 실패하면 -> 출금실패

A계좌에서 출금은 됫으나, B계좌로 입금이 안되면 -> 입금실패

-> 둘 중 하나라도 안됫을때 이체실패 통보

이체실패 통보를 하게되면 돈은 당연히 A 계좌에서 떠난 상태가 아니여야 한다.
-> 부분적으로 실패하더라도 실패처리하며, 처음상태로 돌아간 상태가 되어야 한다.

 

2. Consistency(일관성)

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

정확히는 트랜잭션 이전과 이후, 데이터베이스에는 차이가 없어야 한다는 것이다.

트랜잭션이 일어난 이후의 데이터 베이스는 데이터베이스의 제약이나 규칙을 만족해야 한다는 것이다.

뭔말이냐고? 

흔히 말하는 유도리 발휘 안한다는 것이다.

쉽게 동사무소에 비유하겠다.

만약 한 가구당 쌀푸대 하나씩 준다고 동사무소에서 방송하면 사람들이 받으러 올것이다.

그런데, 꼭 이런사람 한명씩 있다. 

핑크 패딩에, 장갑낀 민원인? 지금부터 쥰내 도망쳐야 한다. 100% 확률로 진상이다.

"우리 식구가 몇인데~ 순이네는 잘사니까 우리가 그거 하나 더 받아도 된다니께!!"

"나하고 아들하고 같은집에 살아도 등본상으로는 다르다니까... 두포대 줘!!"

이때 유도리라고 한푸대 두푸대 더 주기 시작하면 너도나도 더달라고 개판난다. 

고로, 얄짤없이 한푸대씩만 주어야 뒤에 사람이 부족할 일도없고, 칼같이 거절하면 더이상 얼굴 붉힐 일도 없다.

위에서 쌀푸대를 원래 하나만 주는데, 몇개 더 얹어주는것은 규칙 불만족 -> 일관성 위반 

칼같이 하나만 줘서 끝내는 것을 일관성 유지라고 볼 수 있다.

 

3. Isolation(격리성, 고립성,독립성)

격리성은 모든 트랜잭션은 다른 트랜잭션으로부터 독립적이여야 한다는 것이다. 

만약에 은행에 돈을 맡기러 500원 짜리 10개를 들고 갓는데, 옆자리 창구에 마침 새뱃돈을 넣으러 온 꼬꼬마가 있다고 하자. 

나랑 꼬꼬마 둘 다 돈을 넣으려는데, 에이그머니! 은행원이 실수로 내 500원 하나를 놓쳐서 공교롭게도 바닥에 떨어지고, 신나게 튀어오른 500원이 꼬꼬마 세뱃돈에 섞여버렷고, 나는 500윈이 덜 입금되고, 꼬꼬마는 500원이 더 입금 되었다고 하자.

내가 돈을 맡긴 일이 옆의 꼬꼬마의 입금 금액에 변화를 주게 된 것이다. 

이는 격리성(독립성)이 보장되지 않은 것이다.

결론적으로는 내가 5천원 맡기면 옆에 뭔 일이 일어나든 5천원 입금되어야 한다는 것이다. 

 

4. Durability(지속성)

지속성은 하나의 트랜잭션이 성공적으로 수행되었다면, 해당 트랜잭션에 대한 로그가 남아야 한다는 것이다. 

또한, 런타임 오류, 시스템오류가 발생하더라도 해당 기록은 영구적으로 남아야 한다는 것이다. 

내가 은행에서 계좌이체를 성공적으로 끝마치고 나갈때 갑자기 은행 서버가 다운되어도, 내가 한 계좌이체 내역은 남아야 한다는 것이다. 

만약 그렇지 않으면, 내가 다른곳에 돈은 보낸 사실은 있는데, 기록은 없으니 나중에 이를 악용해서 "전에 돈 보냇다고? 증거있어?" -> 같은 돈 2번 보내기 신공이 가능해진다. 

마찬가지로 실패해도 기록이 남아야 하고, 계좌는 실패 이전의 상태로 돌아가야 한다. 

 

SQL & NoSQL