데이터베이스
데이터베이스란 여러 사람이 공유하여 사용할 목적으로 통합되어 관리되는 데이터의 집합을 의미한다. 이러한 데이터베이스를 관리하는 시스템을 DBMS라고 한다.
데이터베이스 특징
- 독립성 (Independence) : 데이터베이스는 데이터를 사용하는 응용 프로그램과 독립적으로 데이터를 저장 및 관리한다.
- 무결성(Integrity) : 데이터베이스는 다양한 제약조건 및 기능을 통해 데이터의 무결성을 유지해준다.
- 보안성(Security) : 데이터베이스는 계정 및 권한 관리를 통해 데이터들의 보안을 유지해준다.
- 일관성(Consistency) : 데이터베이스는 다양한 제약조건을 통해 데이터를 일관되게 유지해준다.
- 중복 최소화(Minimum Duplicate) : 데이터베이스는 데이터를 통합해서 관리함으로써 데이터의 중복을 최소화한다.
무결성 : 데이터의 정확성과 일관성을 유지하고 보증하는 것
데이터베이스 키 종류
- 기본키 : 하나의 테이블에서 특정 ROW를 구별할 수 있는 속성을 의미한다.
- 외래키 : 참조되는 테이블의 기본키와 대응되어 테이블 간에 참조 관계를 표시하는 키입니다.
조인
조인이란 2개 이상의 테이블에서 조건에 맞는 데이터를 추출하기 위해서 사용하는 쿼리문을 의미한다.
- Inner Join : 2개 이상의 테이블에서 교집합만을 추출
- Left Join : 2개 이상의 테이블에서 FROM문에 해당하는 부분을 추출
- Right Join : 2개 이상의 테이블에서 FROM 문의 테이블과 JOIN 하는 테이블에 해당하는 부분을 추출
- Outer Join(Full Join) : 2개 이상의 테이블에서 모든 테이블에 해당하는 부분을 추출
인덱스
인덱스란 추가적인 쓰기 작업과 저장 공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상하기 위한 자료구조이다.
인덱스를 구현하기 위한 자료구조
- B + Tree
- DB 인덱스를 위해 자식 노드가 2개 이상인 Binary Tree를 개선시킨 자료구조로서 아래와 같은 특성을 가진다.
- Leaf노드만 인덱스와 함께 데이터를 가지고 있고, 나머지 노드들은 데이터를 위한 인덱스만을 갖는다
- Leaf 노드는 LinkedList로 연결되어 있다.
- Hash Table
- 해시 테이블은 Key-Value의 형태로 데이터를 저장하는 자료구조로 빠른 데이터 검색이 필요할 때 유용하다.
- 해시 테이블은 Key값을 이용해 고유한 인덱스를 생성하여 그 인덱스에 저장된 값을 꺼내오는 구조이다.
인덱스를 선정할 때 고려할 점
- 인덱스를 설정할 때 해당 테이블에서 어떠한 쿼리가 자주 사용되는지 분석해야 한다.
- 인덱스 설정 시 칼럼에 중복되는 값이 많이 없는 칼럼을 인덱스로 걸어야 한다.
트랜잭션
- 트랜잭션은 DBMS가 데이터베이스를 다룰 때 사용하는 작업의 단위이다.
- 데이터베이스에서 데이터를 다룰 때 장애가 일어나는 경우에 데이터를 복구하는 작업의 단위가 된다.
- 데이터베이스에서 여러 작업이 동시에 같은 데이터를 다룰 때 서로 분리하는 단위가 된다.
트랜잭션 특징 (ACID)
- 원자성(Atomicity)
- 트랜잭션에 포함된 작업은 전부 수행되거나 전부 수행되지 않아야 한다. 트랜잭션이 중간에 끊기면 이후에 해당 트랜잭션의 어디서부터 이어 수행해야 되어야 하는지 모르기 때문에 작업이 잘못되면 회복 알고리즘을 이용하여 변경한 내용을 취소한다.
- 일관성(Consistency)
- 트랜잭션을 수행하기 전이나 후나 데이터베이스는 항상 일관된 상태를 유지해야 한다.
- 고립성(Isolation)
- 수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 변경 중인 데이터 값을 훼손하지 않아야 한다. 그리고 고립성을 유지하기 위해서는 여러 트랜잭션이 동시에 접근하는 데이터에 대한 제어가 필요하다.
- 지속성(Durability)
- 수행을 성공적으로 완료한 트랜잭션은 변경한 데이터를 영구히 저장해야 한다. 트랜잭션의 성공 결과 값은 장애 발생 후에도 변함없이 보관되어야 한다는 것으로 트랜잭션이 정상적으로 완료(Commit)된 경우에는 버퍼의 내용을 하드디스크에 확실히 기록하여야 하며, 부분 완료(Partial Commit)된 경우에는 작업을 취소(Aborted)하여야 한다.
트랜잭션 격리 수준
- READ uncommitted (Lv.0)
- 커밋되지 않은 데이터에 접근이 가능한 수준으로, N개의 트랜잭션이 하나의 공유 데이터에 접근해도 전혀 보호되지 않는다 데이터베이스의 일관성을 유지하는 것이 불가능함
- Dirty Read 발생 : 데이터 정합성 문제가 많이 발생한다.
- READ committed (Lv.1)
- SELECT 쿼리가 수행되는 동안 해당 데이터에 Shared Lock이 걸리는 레벨이다.
- 트랜잭션이 수행하는 동안 다른 트랜잭션이 접근할 수 없어 대기하게 되고, 커밋이 이루어진 트랜잭션만 조회가 가능하다.
- Non-Repeatable Read 발생
- 오라클 데이터베이스와 SQL 서버에서 기본으로 사용하는 격리 수준이다.
- REPEATABLE READ (Lv.2)
- 트랜잭션이 완료될 때까지 Select 문이 사용되는 모든 데이터에 Shared Lock이 걸린다.
- 트랜잭션이 범위 내에서 조회한 데이터 내용이 항상 동일함을 보장한다,
- 다른 클라이언트는 트랜잭션 영역에 해당되는 데이터에 대한 수정이 불가능하다.
- MYSQL에서 기본으로 사용한다.
- Non-Repeatable Read 부정합이 발생하지 않고, 자신의 트랜잭션 번호보다 낮은 트랜잭션 번호에서 변경된 것만 보게 된다.
- SERIALIZBLE (Lv.3)
- 트랜잭션이 완료될 때까지 조회 쿼리가 사용되는 모든 데이터에 Shared Lock이 걸리는 레벨 가장 엄격한 격리 수준으로 완벽한 읽기 일관성 모드를 제공하고, 다른 사용자는 트랜잭션 영역에 해당되는 데이터에 대한 수정이나 입력이 불가능하다.
트랜잭션 동시성 제어
동시성 제어
- 다중 사용자 환경을 지원하는 데이터 베이스 시스템에서 여러 트랜잭션들이 성공적으로 동시에 실행될 수 있도록 지원하는 기능
- 다중 사용자 환경을 지원하는 DB 시스템의 경우 필수적으로 지원해야 하는 병행 제어라고 한다.
- 트랜잭션의 직렬화 수행 보장
동시성 제어 종류
- 락킹(Locking)
- 트랜잭션이 데이터에 잠금을 설정하면 다은 트랜잭션은 해당 데이터에 잠금이 해제될 때까지 접근/수정/삭제가 불가능하다.
- 타임스탬프(Timestamp)
- 시스템에서 생성하는 고유 번호인 타임스탬프를 트랜잭션에 부여함으로써 트랜잭션 간의 접근 순서를 미리 정한다.
- 적합성(Vaildation) 검증
- 먼저 트랜잭션을 수행하고 트랜잭션을 종료할 때 적합성을 검증하여 데이터베이스에 최종 반영한다.
이상현상
- 삭제 이상 : 튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상이다.
- 삽입 이상 : 튜플 삽입 시 특정 속성에 해당하는 값에 Null 값을 입력해야 하는 현상이다.
- 수정 이상 : 튜플 수정 시 중복된 데이터의 일부만 수정되어 일어나는 데이터 불일치 현상이다.
정규화
정규화란 데이터베이스에서 이상 현상을 없애고 데이터의 중복을 최소화하기 위해 하나의 테이블을 둘 이상의 테이블로 분리하는 작업을 의미합니다.
정규화 종류
- 제1 정규형: 모든 속성 값이 원자 값을 갖도록 분해한다.
- 제2 정규형: 제1 정규형을 만족하고, 기본키가 아닌 속성이 기본키에 완전 함수 종속이 도록 분해한다.
(여기서 완전 함수 종속이란 기본키의 부분집합이 다른 값을 결정하지 않는 것을 의미한다.) - 제3 정규형: 제2 정규형을 만족하고, 기본키가 아닌 속성이 기본키에 직접 종속(비 이행적 종속)하도록 분해한다.
(여기서 이행적 종속이란 A->B->C가 성립하는 것으로, 이를 A, B와 B, C로 분해하는 것이 제3 정규형이다.) - BCNF 정규형: BCNF 정규형은 릴레이션 R에서 함수 종속성 X-> Y가 성립할 때 모든 결정자 X가 후보 키인 정규형이다.
DB락
DB락은 여러 개의 트랜잭션 둘이 하나의 데이터로 동시에 접근하려고 할 때 이를 제어해주는 도구이다.
- 공유락 (Shared Lock) : 트랜잭션이 읽기를 할 때 사용하는 락, 데이터를 읽을 수 있지만 쓸 수 없음
- 베타 락 (Beta Lock) : 트랜잭션이 읽고 쓰기를 할 때 사용하는 락, 데이터를 읽고 쓸 수 있음
RDBMS
2차원의 행과 열로 데이터의 관계를 관리하는 데이터베이스이다.
RDBMS는 관계형 데이터베이스를 생성하고 수정하고 관리할 수 있는 소프트웨어라고 정의할 수 있다.
- 장점: 스키마에 맞추어 데이터를 관리하기 때문에 데이터의 정합성을 보장할 수 있다.
- 단점: 시스템이 커질수록 쿼리가 복잡해지고 성능이 저하되며, 수평적 확장이 어렵다.
NoSQL
NoSQL 데이터베이스란 전통적인 관계형 모델에서 벗어나서 다양한 데이터 모델을 사용하여 데이터의 관리와 접근을 지원하는 데이터베이스이다.
NoSQL은 데이터의 스펙이 자주 변경되는 경우나, 읽기 작업이 자주 일어나는 경우, 수많은 양의 데이터를 다루기 위해 수평 확장이 필요한 경우 사용하면 좋다.
- 장점 : 스키마가 없거나 느슨하게 제공되기 때문에 요구사항 변경에 유연하게 대처할 수 있다.
- 단점 : 데이터베이스마다 사용하는 데이터의 모델이 다르기 때문에 이를 도입하기 위해서는 해당 데이터베이스를 깊게 공부를 해야 해서 RDBMS보단 많은 학습 비용이 든다.
힌트
힌트란 SQL을 튜닝하기 위한 지시 구문입니다. 옵티마이저가 최적의 계획으로 SQL문을 처리하지 못하는 경우에 개발자가 직접 최적의 실행 계획을 제공하는 것입니다
클러스터링
- 여러 개의 데이터베이스를 수평적인 구조로 구성하여 Failover 하는 시스템을 구축하는 방식이다.
- 동일한 DB서버를 두 대를 묶고 active- active 상태로 운영하거나 active-stanby방식으로 운영한다.
- active- active상태는 두대의 서버가 부하를 분담하기 때문에 cpu, 메모리 자원의 부하도 줄게 되지만 서버 두대가 공유하기 때문에 병목현상이 생길 수 있다.
- 이러한 단점을 active-stanby 가 보완할 수 있다. 하나의 서버가 장애가 발생기 failover을 통해 두 서버가 상호 전환된다. 이 방식은 장애 없이 운영할 수 있지만 노드들 간의 동기화가 필요하기 때문에 시간이 소요되고 리플리케이션에 비해 성능이 떨어진다.
리플리케이션
- 여러 개의 DB를 master-slave 형태로 구축하고, master에 DML(write-only)을 하고 slave에 복제(Read-only)하는 방식이다.
- 비동기 방식으로 데이터를 동기화하기 때문에 지연시간이 거의 없다.
- 노드 간의 데이터 동기화가 보장되지 않아 일관성 있는 데이터를 얻지 못할 수 있다.
- 데이터 양의 많을 경우 데이터를 찾는데 오랜 시간이 걸린다.
- 마스터 노드 장애 시 복수&대처가 힘들다.
데이터베이스 튜닝
DB 튜닝은 데이터 베이스의 구조나 데이터베이스 자체, 운영체제 등을 조정하여 데이터베이스 시스템의 성능을 향상하는 작업을 의미한다.
REFERENCE
https://velog.io/@gkskaks1004/클러스터링-vs-리플리케이션-vs-샤딩
https://mangkyu.tistory.com/93
https://imbf.github.io/interview/2021/03/01/NAVER-Practical-Interview-Preparation-3.html
'Dev' 카테고리의 다른 글
[기술면접] SpringFramework (0) | 2022.01.23 |
---|---|
[기술면접]운영체제(Operating System) (0) | 2022.01.21 |
[기술면접]네트워크(Network) (0) | 2022.01.11 |
[Database]트랜잭션 격리 수준(TransactionIsolationLevel) (0) | 2022.01.09 |
[프로그래밍] 애자일 소프트웨어 개발 (0) | 2021.11.13 |