[Section2] 데이터베이스 - SQL
🧑🏻💻 TIL(Today I Learned)
✔️ SQL, 관계형 데이터베이스
💡 관계형 데이터베이스
➡️ 구조화된 데이터는 하나의 테이블로 표현할 수 있고 사전에 정의된 테이블을 relation이라고 부르기 때문에 테이블을 사용하는 데이터베이스를 관계형 데이터베이스라고 부름
- 데이터(data) : 각 항목에 저장되는 값
- 테이블(table; relation) : 사전에 정의된 열의 데이터 타입대로 작성된 데이터가 행으로 축적됨
- 열(column; field) : 테이블의 한 열을 가리킴
- 레코드(record; tuple) : 테이블의 한 행에 저장된 데이터
- 키(key) : 테이블의 각 레코드를 구분할 수 있는 값, 각 레코드마다 고유한 값을 가짐
(기본키 - primary key, 외래키 - foreign key)
📍 데이터베이스의 필요성
1. In-Memory
: Java에서 데이터를 다룰 때에는 프로그램이 실행될 때에만 존재하는 데이터가 있음, Java에서 변수를 만들어 저장한 경우 프로그램
이 종료될 때 해당 프로그램이 사용하던 데이터도 사라짐
→ 즉 변수 등에 저장된 데이터가 프로그램의 실행에 의존한다는 것
→ 데이터를 보호할 수 없고, 프로그램이 종료된 상태라면 데이터를 원하는 시간에 받아올 수 없고, 데이터의 수명은 프로그램 수명에
의존
2. File I/O
: 파일을 읽는 방식하는 작동하는 형태, 엑셀 시트나 CSV 같은 파일의 형태는 In-Memory에 비해 데이터를 저장하는 방식으로 적절
하나 한계가 있음
→ 데이터가 필요할 때마다 전체 파일을 매번 읽어야 함, 크기가 커질 수록 버겁고 비효율적 (매우 큰 단점)
→ 파일이 손상되거나 여러 개의 파일들을 동시에 다뤄야 하는 등 복잡하고 데이터량이 많아질수록 데이터를 불러들이는 작업 힘듦
👉🏻 하지만 관계형 데이터베이스에서는 하나의 CSV 파일이나 엑셀 시트를 한 개의 테이블로 저장 가능, 한 번에 여러 개의 테이블을 가질 수 있기 때문에 SQL을 활용해 데이터를 불러오기 수월함
🔎 SQL(Structured Query Language, 구조화 쿼리 언어)
➡️ 데이터베이스용 프로그래밍 언어, 주로 관계형 데이터베이스에서 사용, 구조화된 쿼리 언어
➡️ MySQL, Oracle, SQLite, PostgreSQL 등 다양한 데이터베이스에서 사용가능
➡️ 데이터가 구조화된 테이블을 사용하는 데이터베이스에서 활용할 수 있음
➡️ SQL을 사용하기 위해서는 데이터 구조가 고정되어 있어야 함
✔️ SQL vs NoSQL
➡️ 관계형 데이터베이스는 SQL, 비관계형 데이터베이스는 NoSQL
- 대표적인 관계형 데이터베이스 : MySQL, Oracle, PostgreSQL, MariaDB 등
- 대표적인 비관계형 데이터베이스 : MongoDB, Casandra 등
➡️ NoSQL 은 데이터가 고정되어 있지 않은 데이터베이스를 가리킴
🔎 쿼리(Query)란?
➡️ 저장되어 있는 데이터를 필터하기 위한 질의문
➡️ SQL을 이용해 데이터베이스에 쿼리를 보내고 원하는 데이터를 가져오거나 삽입할 수 있음
🔎 ACID
➡️ 데이터베이스 내에서 일어나는 하나의 트랜잭션(transaction)의 안전성을 보장하기 위해 필요한 것
📍 트랜잭션(Transaction)? →ACID 특성 가짐
: 여러 개의 작업을 하나로 묶은 실행 유닛
데이터베이스의 상태를 변환시키는 논리적 기능을 수행하기 위해 행해지는 하나 이상의 쿼리를 모아 놓은 하나의 작업 단위
각 트랜잭션은 하나의 특정 작업으로 시작해 묶여 있는 모든 작업들을 다 완료해야 정상적으로 종료함
만약 작업이 하나라도 실패하면 트랜잭션에 속한 모든 작업을 실패한 것으로 판단
모든 작업이 성공적이면 트랜잭션도 성공
ex) A가 B에게 돈을 입금하고 입금이 완료되는 그러한 전 과정들(A에게서는 돈이 출금, B에게는 돈이 입금)
👉🏻 Atomicity(원자성)
➡️ 하나의 트랜잭션에 속해있는 모든 작업이 전부 성공하거나 전부 실패해서 결과를 예측할 수 있어야 함
➡️ A가 B에게 돈을 입금할 때 A 계좌에서는 돈이 출금되고 B 계좌에는 입금이 되지 않았다고 한다면 출금되는 작업을 포함한 모든 작업이 실패로 돌아가야한다는 것
➡️ SQL에서 특정 쿼리를 실행했는데 부분적으로 실패하는 부분이 있다면 전부 실해하도록 구현되어 있음 → 기존 데이터를 보호하기 위해
👉🏻 Consistency(일관성)
➡️ 데이터베이스의 상태가 일관되어야 한다는 성질, 하나의 트랜잭션 이전과 이후 데이터베이스의 상태는 이전과 같이 유효해야 함
즉, 트랜잭션이 일어난 이후의 데이터베이스는 데이터베이스의 제약이나 규칙을 만족해야 한다는 뜻
'모든 고객은 반드시 이름을 가지고 있어야 한다' 라는 데이터베이스의 제약이 있다고 가정
→ 이름 없는 새로운 고객을 추가하는 쿼리
→ 기존 고객의 이름을 삭제하는 쿼리
✔️ 위 트랜잭션은 일관성을 위반함
👉🏻 Isolation(격리성, 고립성)
➡️ 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 함
➡️ 동시에 여러 개의 트랜잭션이 실행될 때 각 트랜잭션은 고립(격리)되어 있어서 연속으로 실행한 것과 동일한 결과를 나타냄
➡️ 격리성을 지키는 각 트랜잭션은 철저히 독립적이기 때문에 다른 트랜잭션의 작업 내용을 알 수 없음
➡️ 트랜잭션이 동시에 실행될 때와 연속으로 실행될 때의 데이터베이스 상태가 동일해야 함
👉🏻 Duability(지속성)
➡️ 하나의 트랜잭션이 성공적으로 수행되었다면 해당 트랜잭션에 대한 로그가 남아야 함
: 런타임 오류나 시스템 오류가 발생하더라도 해당 기록은 영구적이야 한다는 것
SQL 적응의 시간은 필요하지만 알고리즘보다는 훨씬 수월하다. 훨씬 재밌음👍
'SEB_BE_45 > 공부 정리' 카테고리의 다른 글
[Section2] Spring Framework 1 (0) | 2023.05.31 |
---|---|
[Section2] 데이터베이스 - 설계 (0) | 2023.05.26 |
[Section2] 네트워크 - HTTP / 20230523 (0) | 2023.05.24 |
[Section2] 네트워크 - 웹 애플리케이션 작동 원리 / 20230522 (0) | 2023.05.22 |
[Section2] 06. 자료구조와 알고리즘 3 / 20230517 (0) | 2023.05.18 |