SEB_BE_43 / 23.01.30 회고

rse·2023년 1월 31일
0

코드스테이츠_BE_43

목록 보기
24/65

오늘

  • MySQL

데이터 베이스란?

HTTP를 배우면서 데이터 베이스를 같이 봤을 것이다.
그냥 데이터 베이스에서 무언가를 꺼내오는구나 정도로 이해했는데 진짜 의미는 뭘까?

데이터베이스(DB: database)는 통합하여 관리되는 데이터의 집합체를 의미한다.
이는 중복된 데이터를 없애고, 자료를 구조화하여, 효율적인 처리를 할 수 있도록 관리된다.
따라서, 여러 업무에 여러 사용자가 데이터 베이스를 사용할 수 있다.

SQL?

SQL = Structured Query Language 라는 뜻으로 데이터베이스 언어이다. 관계형 데이터베이스에서 많이 사용한다.

또한 SQL은 구조화된 쿼리 언어이다.

쿼리(Query)

직역하자면 "질의문" 이라는 뜻인데 쉽게 말하자면 우리가 무언가를 검색할 때 검색창에 적는 것도 쿼리의 일종이라고 볼 수 있다.

데이터 베이스에 저장 되어 있는 정보들을 쿼리을 통해 필터처럼 걸러주는 것이다.

그래서 데이터베이스를 왜 쓰는가?

우리가 데이터를 저장 할 때 In-Memory나 File I/O에 저장을 하는데
In-Memory는

  • 끄면 사라짐

File I/O

  • 원하는 데이터만 가져올 수 없음.
    항상 모든 데이터를 가져온 뒤 서버에서 필터링 해줘야함.
  • 파일이 손상되거나 여러 개의 파일들을 동시에 다뤄야 하거나 하는 등 복잡하고 데이터량이 많아질수록 데이터를 부르는 작업이 힘들어짐.

DataBase
필터링 외에도 File I/O 로 구현 하기 힘든 관리를 위한 여러가지 기능을 들고 있는 데이터에 특화된 서버.

MySQL

기본 쿼리문

show : 조회

현재 있는 데이터베이스들, 테이블들을 조회 할 수 있다.

use : 데이터베이스 사용(변경)

select : 조건에 따른 검색 / from : 보고싶은 테이블 이름 / limit : 결과 갯수 제한

*은 조건없이 전부라는 뜻

describe : 테이블 정보 확인.

create : 새로운 데이터베이스, 테이블 생성.

insert into : 값을 넣는다. 추가.


값이 정상적으로 나오는 것을 확인.

Inner Join

이렇게 두개의 테이블이 있을 때 공통된 값을 가져오고 싶다면 inner join을 사용한다.


이렇게 왼쪽이 mixtestb의 공통값 오른쪽이 mixtest의 공통값이다.

Outer Join

결과를 보면 알 수 있듯 outer join은 left outer join 에 on 테이블 = 테이블 사이에서 왼쪽 테이블을 기준으로 할 것인지 오른쪽 테이블을 기준으로 할 것인지를 정한다. 적혀 있는 테이블을 기준으로 데이터를 모두 가져온다. 아까 이너 조인은 공통된 값만 가져왔다면 outer join은 공통되지 않은 값도 가져오는 것을 확인 할 수 있다.

이건 rigth이기 때문에 오른쪽 테이블을 기준으로 해서 mixtest의 값이 모두 나온 것을 확인 할 수 있다.

이것들을 그림으로 보자면

출처 : https://gywlsp.github.io/mysql/5/

이런식의 그림이 되겠다.

⭐트랜잭션(transaction) (중요)

여러개의 작업을 하나의 실행 유닛으로 묶은 것.

트랜잭션은 성공 / 실패 의 결과 밖에 존재하지 않기 때문에

트랜잭션의 여러 작업 중 단 하나의 작업이라도 실패를 한다면 트랜잭션에 속한 모든 작업을 실패라고 판단하고, 전부 성공해야 성공 이라고 판단함.

그렇기에 트랜잭션은 미완료된 작업 없이 모든 작업을 성공해야 함.

ACDI

ACID는 데이터베이스 내에서 일어나는 하나의 트랜잭션(transaction)의 안전성을 보장하기 위해 필요한 성질이다.

  • Atomicity
  • Consistency
  • Isolation
  • Durability

Atomicity(원자성)

원자성은 하나의 트랜잭션에 속해있는 모든 작업이 전부 성공하거나 전부 실패해서 결과를 예측할 수 있어야한다.

예로 들어 계좌이체라고 생각해보자.

내가 A라는 사람에게 송금을 할려고 한다면
단계 : 내 계좌 출금, A계좌 입금.
이 이루어져야 할 것이다.

그런데 내 계좌에서는 돈이 나갔는데 A계좌에는 돈이 입금되지 않는다면 내 돈은 그냥 사라져버리게 된다. 그렇기에 이런점을 막기 위해서 내 계좌에서 출금이 성공했지만 A계좌에서 입금이 불가능하다면 내 계좌에서 출금하는 작업까지 포함하여 모든 작업이 실패로 돌아간다는 것이 원자성이다.

Consistency(일관성)

두 번째는 데이터베이스의 상태가 일관되어야 한다는 성질이다. 하나의 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야한다.

예를 들어 '모든 고객은 반드시 이름을 가지고 있어야 한다' 라는 제약이 있다면

은행에 새로운 통장을 만들러 갔다고 생각했을 때
통장에 예금주 이름을 반드시 넣어야한다.

만약 예금주 이름 빼고 적어주세요 라고 은행에서 요청하거나
예금주는 빼주세요 라고 고객이 요청한다면

이건 일관성에 위반하는 내용이기 때문에 이루어질 수 없다.

즉 데이터베이스의 유효한 상태는 다를 수 있지만 데이터의 상태에 대한 일관성을 변하지 않아야한다.

Isolation (격리성, 고립성)

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

예를 들어 계좌이체를 한다고 생각해보자.
내가 A에게 1000원, B에게 6000원을 동시에 이체한다고 했을 때
A에게 먼저 송금한 뒤 C에게 보내는 결과와 같아야한다.

즉 내 계좌에서는 7000원이 출금된 것처럼 보이지만 A에게 1000원을 보낸 것과 B에 6000원을 보낸 것은 각각 독립적이라는 뜻이다. A의 트랜잭션과 C의 트랜잭션이 서로에게 영향을 줄 수 없는 것.

Durability (지속성)

Durability는 하나의 트랜잭션이 성공적으로 수행되었다면 그 트랜잭션의 로그가 영구적으로 남아야한다는 의미이다.

아까 예시를 든 것처럼 계좌이체를 들어보면
A에게 1000원을 송금 완료하고 은행 데이터베이스에 에러가 발생해 꺼지더라도 계좌이체는 완료했기 때문에 내역이 기록으로 남아햐 한다는 것이다.

반면 A에게 보내기 전 은행 데이터베이스에 에러가 발생해 꺼진다면 실패로 돌아가고 이전 상태로 돌아가게 된다.

SQL(구조화 쿼리 언어) / NoSQL(비구조화 쿼리 언어)

데이터베이스는 크게 관계형, 비관계형 데이터베이스로 구분한다.
관계형 데이터베이스는 SQL을 기반, 비관계형 데이터베이스는 NoSQL로 데이터를 다룬다.

대표적인 관계형 데이터베이스는 MySQL, Oracle, SQLite, PostgresSQL, MariaDB 등이 있다.

관계형 데이터베이스

  • 행,열로 구성된 테이블에 데이터를 저장한다.
  • 특정한 형식을 지키기 때문에 데이터를 사용할 때 수월.
  • 테이블 간의 관계를 직관적으로 파악 가능. (스키마 뚜렷)

비관계형 데이터베이스

  • 읽어올 때 스키마가 사용. 스키마에 따라 데이터를 읽음.
  • 데이터가 고정되어 있지 않음.

대표적인 비관계형 데이터베이스는 몽고DB, Casandra 등이 있다.

차이점

데이터 저장
NoSQL : key-value, document, wide-column, graph 등의 방식으로 데이터를 저장한다.
SQL : SQL을 이용해서 데이터를 테이블에 저장한다. 미리 작성 해둔 스키마를 기반으로 정해진 형식에 맞게 데이터를 저장해야 함.

스키마
SQL : 고정된 형식의 스키마가 필요. 처리하려는 데이터 속성별로 열(column)에 대한 정보를 미리 정해둬야함. 스키마는 나중에 변경할 수 있지만, 이 경우 데이터베이스 전체를 수정하거나 오프라인(down-time)으로 전환할 필요가 있음.
NoSQL : SQL에 비해 동적으로 스키마의 형태 관리 가능. 행을 추가할 때 즉시 새로운 열을 추가할 수 있고, 개별 속성에 대해서 모든 열에 대한 데이터를 반드시 입력하지 않아도 됨.

쿼리
SQL : 테이블의 형식과 테이블간의 관계에 맞춰 데이터를 요청해야됨. 그래서 정보를 요청할 때, SQL과 같이 구조화된 쿼리 언어를 사용.
NoSQL : 데이터 그룹 자체를 조회하는 것에 초첨. 구조화되지 않은 쿼리 언어로도 데이터 요청 가능.

확장성
SQL : 수직적으로 확장. 높은 메모리, CPU를 사용하는 확장이라고도 부른다. 데이터베이스가 구축된 하드웨어의 성능을 많이 이용하기 때문에 비용이 많이 든다.
NoSQL : 수평적으로 확장한다. 값싼 서버 증설, 또는 클라우드 서비스 이용하는 확장이라고도 부른다.

profile
기록을 합시다

0개의 댓글