본문 바로가기
취업 준비

[기술 면접] 데이터베이스 개념 정리

by wadekang 2022. 4. 18.

데이터베이스


⟬ RDBMS vs NoSQL ⟭

  RDBMS NoSQL
데이터 구조 2차원의 행과 열로 이루어진 테이블 형태 Document : JSON 형태
Key-value : key-value 페어
Wide-column : Row가 Column을 결정
Graph : 노드와 엣지
스키마 미리 정의된 스키마에 따라 데이터 저장 정의된 스키마 없어서 유연
성능 향상 Vertical(Scale-up) Horizontal(Scale-out)
장단점 정해진 스키마에 따라 데이터를 저장하기 때문에 데이터의 무결성 보장, 중복 방지

하지만 스키마가 정해져있기 때문에 변경 어려움 시스템이 커질수록 복잡한 쿼리
스키마가 없어 유연하기 때문에 데이터 변경에 용의, Scale-out 가능

중복된 데이터 저장 가능, 스키마가 없기 때문에 데이터의 명확성을 보장하지 않음

 

⟬ 트랜잭션(Transaction) & ACID ⟭

트랜잭션(Transaction)은 데이터베이스 관리 시스템에서 상호작용의 단위, 한 번에 모두 수행되어야 하는 여러 개의 쿼리 집합

 

1. 원자성 (Atomicity)

트랜잭션 내의 모든 쿼리의 결과가 반영되거나 (Commit) 모두 롤백 (Rollback) 되어야 함, 하나의 쿼리라도 오류가 발생한다면 트랜잭션 내의 모든 쿼리가 반영되지 않음

 

2. 일관성 (Consistency)

트랜잭션을 수행하기 전과 후의 데이터베이스는 일관된 상태를 유지, 정해진 스키마에 따라서만 쿼리 실행 가능 (예를 들어 잔고 컬럼이 있다면 쿼리 실행 후 마이너스가 되거나 문자열이 들어가면 안 됨)

 

3. 독립, 고립성 (Isolation)

각각의 트랜잭션은 독립적으로 실행됨, 실행되고 있는 두 트랜잭션에서 한 트랜잭션이 다른 트랜잭션의 연산에 영향을 주면 안 됨

 

4. 영속, 지속성 (Durability)

성공적으로 완료된 트랜잭션의 결과는 데이터베이스에 영원히 반영되어야 함

 

⟬ 데이터 잠금 (Lock) ⟭

락(Lock)은 DB에서 트랜잭션 처리의 순차성을 보장하기 위해 데이터 변경을 일시적으로 중지하는 것을 말함. 데이터에 동시에 접근할 경우 데이터가 오염되는 것을 방지

 

1. 공유 잠금(Shared Lock)

가장 낮은 강도의 잠금, 데이터를 읽을 때 사용되는 락. 공유 잠금끼리는 동시에 접근 가능하지만 공유잠금 데이터에 배타잠금 불가능. 일반적으로 SELECT를 할 때 공유잠금 발생

 

2. 배타 잠금(Exclusive Lock)

가장 높은 강도의 잠금, 데이터를 변경할 때 사용하며 트랜잭션이 완료될 때까지 유지. 배타 잠금이 해제될 때까지 다른 트랜잭션은 해당 데이터에 접근할 수 없음

 

3. 갱신 잠금(Update Lock)

공유 잠금과 배타 잠금의 중간 강도의 잠금, 공유 잠금과는 호환되만 다른 갱신 잠금이나 배타잠금과 호환되지 않음. 일반적으로 Update의 Filter(Where절)가 수행되는 단계에서 갱신잠금이 걸리지만 컨버전 데드락을 방지하기 위해 SELECT문에 갱신 잠금을 거는 경우도 많음

 

4. 집중 잠금(Intent Lock)

데이터베이스나 테이블 내의 일부 데이터 영역에 잠금이 걸려있다는 것을 다른 커넥션에 알리기 위해 사용

 

⟬ 데드락(DeadLock) ⟭

두 개 이상의 트랜잭션이 동시에 진행될 때 락을 소유한 상태로 대기 상태에 빠져 더 이상 진행하지 못하는 상황

T1 : write(A) read(B)

T2 : wirte(B) read(A)

위의 상황과 같이 T1과 T2가 병행 처리될 때, T1은 A에 대한 락을 소유하고 T2는 B에 대한 락을 소유한 상태로 각각 B와 A를 기다리는 대기 상태가 되어 무한정 대기하는 상황이 발생

 

데드락의 해결

  • 예방 - 각 트랜잭션이 실행되기 전 필요한 데이터를 모두 로킹(Locking), 하지만 병행성 보장 못함
  • 회피 - 타임스탬프를 사용해 시간에 따라 먼저 들어왔을 경우 Wait 하거나 Die, 혹은 Wound 하거나 Wait (Wait-Die, Wound-Wait) 하는 방식들을 사용
  • 탐지 - Union-Find 알고리즘 사용하여 사이클 존재 여부 확인, 사이클 탐지 -> 데드락 발생
  • 이외에도 트랜잭션 진행방향 설정, 로킹(Locking) 해제 시간 조절 (LOCK_TIMEOUT) 등

 

⟬ 트랜잭션 격리 수준(Isolation Level) ⟭

1. Read Uncommitted

트랜잭션에서 처리 중인 데이터를 다른 트랜잭션이 읽는 것을 허용 -> 데이터 정합성에 문제

Dirty Read, Non-Repeatable, Phantom Read 발생

 

2. Read Committed

RDB에서 기본적인 격리 수준, 트랜잭션의 변경 내용이 Commit 되어야만 다른 트랜잭션에서 조회 가능

트랜잭션에서 변경 중일 경우에는 UNDO 영역에 저장된 데이터를 읽어옴

 

Non-Repeatable, Phantom Read 발생

 

3. Repeatable Read

트랜잭션이 시작되기 전에 Commit 된 데이터에 대해서만 조회 가능, 트랜잭션이 시작된 시점의 데이터를 일관되게 보여주는 것을 보장

트랜잭션 ID를 부여하여 트랜잭션 ID보다 작은 트랜잭션 ID에서 변경한 것만 읽게 함 (MySQL)

 

Phantom Read 발생

 

4. Serializable

가장 단순하고 엄격한 격리 수준, 트랜잭션에서 데이터를 읽을 때 공유 잠금(Shared Lock)을 걸어 다른 트랜잭션에서 변경하지 못하도록 함

병행성이 떨어지고 성능 저하 발생

 

Dirty Read, Non-Repeatable, Phantom Read에 대한 설명과 격리 수준에 대한 자세한 설명

https://velog.io/@guswns3371/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC%EC%88%98%EC%A4%80#%ED%8A%B9%EC%A7%95

 

[데이터베이스] 트랜잭션 격리수준

https://joont92.github.io/db/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80-isolation-level/https://mozi.tistory

velog.io

 

⟬ 인덱스(Index) ⟭

인덱스는 데이터베이스 테이블의 검색 속도를 향상하기 위한 자료구조

책의 목차에 소제목과 페이지가 적혀있듯이 별도의 메모리 공간에 데이터와 물리적 주소를 함께 저장함으로 인덱스에서 원하는 데이터를 먼저 찾아 해당 주소로 찾아가는 방식

 

⟬ 이상 현상(Anomaly) ⟭

1. 삽입 이상 (Insertion anomaly) 

원하지 않는 데이터가 삽입되거나, 불필요한 데이터를 추가해야 삽입할 수 있는 경우

 

2. 삭제 이상 (Deletion anomaly)

데이터를 삭제할 때 Row 전체가 삭제됨으로 필요한 정보까지 함께 삭제되는 경우

 

3. 갱신 이상 (Update anomaly)

데이터의 일부만 변경되어 데이터의 불일치 발생되는 경우

 

⟬ DB 정규화(Normalization) ⟭

RDB의 설계에서 중복을 최소화하게 데이터를 구조화하는 프로세스, 이상 현상이 발생하는 관계를 재구성하여 이상 현상을 제거 

 

1. 1차 정규화

컬럼이 원자값(Atomic Value)을 갖도록 구성, 각 Row마다 컬럼의 값이 1개만 있어야 함

 

2. 2차 정규화

테이블의 모든 컬럼이 완전 함수적 종속을 만족 -> 기본키가 아닌 컬럼이 기본키에 완전 함수 종속

(기본키가 여러 컬럼일 경우 기본키의 부분집합이 다른 값을 결정하지 못함)

 

3. 3차 정규화

기본키를 제외한 속성들 간의 이행적 함수 종속 제거 -> 기본키 외의 다른 컬럼이 기본키가 아닌 다른 컬럼을 결정하지 못함

 

DB 정규화에 대한 자세한 설명

https://3months.tistory.com/193

 

데이터베이스 정규화 1NF, 2NF, 3NF, BCNF

데이터베이스 정규화 1NF, 2NF, 3NF, BCNF 데이터베이스 정규화란 데이터베이스의 설계를 재구성하는 테크닉입니다. 정규화를 통해 불필요한 데이터(redundancy)를 없앨 수 있고, 삽입/갱신/삭제 시 발

3months.tistory.com

 

⟬ 쿼리가 처리되는 논리적 과정 ⟭

1. 구문 분석(Parsing)

문법적으로 틀리지 않은지 확인

 

2. 표준화(Standardization)

쿼리에서 필요 없는 부분 제거, 표준화된 쿼리 트리 생성

 

3. 최적화(Optimization)

쿼리 실행 계획 생성, 쿼리 분석, 인덱스 선택, 조인 처리 -> 실행 계획 출력

 

4. 컴파일(Compilation)

이진 코드 생성

 

5. 실행(Execute)

쿼리를 실제 처리하고 결과 돌려줌

 

⟬ SELECT Query 실행 순서 ⟭

FROM - WHERE - GROUP BY - HAVING - SELECT - ORDER BY

1. From (Getting Data)

2. Where (Row Filter)

3. Group by (Grouping)

4. Group Filter (Having)

5. Select (Return Expressions)

6. Order by, Limit/Offset (Order and Paging)

 

댓글