[Section2] 데이터베이스 - SQL

2023. 5. 24. 17:49

🧑🏻‍💻 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 적응의 시간은 필요하지만 알고리즘보다는 훨씬 수월하다. 훨씬 재밌음👍

BELATED ARTICLES

more