CS 지식/[inflearn] CS 전공지식 (완)

개발자면접을 위한 CS전공지식 | CS면접 - 데이터베이스

web_seul 2022. 7. 28. 20:34
반응형

#_데이터베이스 (DB, DataBase) : 일정한 규칙, 규약을 통해 구조화되어 저장되는 데이터 모음, DB내의 데이터드릉ㄴ 특정 DBMS마다 정리된 쿼리언어를 통해 삽입, 삭제, 수정, 조회 등 CRUD 수행가능, 실시간 접근과 동시공유 가능

#_DBMS (DataBase Management System) : 해당 데이터베이스를 제어, 관리하는 통합시스템

#_엔터티 (entity) : 사람, 장소, 물건, 사건, 개념 등 여러개의 속성을 지닌 명사, 서비스의 요구사항에 맞춰 엔터티의 속성이 정해짐

*약한 엔터티와 강한 엔터티 : A가 혼자서는 존재하지 못하고 B의 존재여부에 따라 종속적일 경우 A는 약한 엔터티, B는 강한 엔터티

 

#_릴레이션 (relation) : DB에서 정보를 구분하여 저장하는 기본 단위, 엔티티에 관한 데이터를 릴레이션 하나에 담아서 관리, 엔터티가 DB에서 관리될때 릴레이션으로 변화됨, 테이블(관계형 DB), 컬렉션(NoSQL DB)라고 부름

테이블 (관계형 DB) 컬렉션 (NoSQL DB)
ex. MySQL ex. MongoDB
레코드-테이블-DB 도규먼트-컬렉션-DB

 

#_속성 (attribute) : 릴레이션에서 관리하는 구체적이며 고유한 이름을 갖는 정보, ex. 차 - 차 넘버, 바퀴수, 색상, 차종 등이 엔터티의 속성이 됨

#_도메인 (domain) : 릴레이션에 포함된 각각의 속성들이 가질 수 있는 값으 집합, ex. 성별이라는 속성의 값은 {남, 여}라는 집합

 

#_필드 타입 : 필드는 타입을 가짐, 대표적으로 숫자, 날짜, 문자 타입 (MySQL 기준)

- 숫자타입 : TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT / INT : 4바이트, -12억~21억 

- 날짜타입 : DATE, DATETIME, TIMESTAMP

- 문자타입 : CHAR, VARCHAR, TEXT, BLOB, ENUM, SET

 

#_관계 : DB에는 여러개의테이블이 있고 서로의 관계가 정의됨

- 1:1관계 : 테이블을 두개의테이블로 나눠 테이블의 구조를 더 이해하기 쉽게 만듦 ex. 1인당 1개의 아이디

- 1: N관계 : 한 개체가 다른 많은 개체를 포함하는 관계 ex. 유저의 장바구니

- N:M관계 : 1:N과 1:M의 두 테이블로 나눠 설명 ex. 수강생이 신청하는 여러개의 강의

 

#_키 : 테이블간의 관계를 더 명확히하고 테이블자체의 인덱스를 위해 설정한 장치

- 기본키 : 유일성 + 최소성, 자연키 또는 인조키 중에서 설정

- 외래키 : 다른 테이블의기본키를 그대로 참조하는 값으로 개체와의 관계 식별시 사용, 중복가능

- 후보키 : 유일성 + 최소성(조합x), 기본키가 될 수 있는 후보

- 슈퍼키 : 유일성

- 대체키 : 후보키에서 기본키를 제외한 키

- 자연키 : 중복된 값을 제외하여 중복되지 않는 것을 자연스레 나오는 키, 언젠가는 변하는 속성

- 인조키 : 인위적으로 생성한 키, 변하지 않음 -> 주로 기본키로 사용

 

#_ERD(Entity Relationship Diagram) : DB구축시 가장 기초뼈대역할, 릴레이션 간의 관계 정의, 서비스 구축시 가장 기초로 시작, 시스템의 요구사항기반으로 작성되며 이를 기반으로 DB구축

 

#_트랜잭션 : DB에서 하나의 논리적 기능을 수행하기 위한 작업의 단위, DB에 접근하는 방법인 여러개의 쿼리들을 하나로 묶는 단위, ACID 특징(원자성, 일관성, 독립성, 지속성)

- 원자성 (atomicity) : 트랜잭션과 관련된 일이 모두 수행되었거나 되지않았거나를 보장하는 특징

- 일관성 (consistency) : 허용된 방식으로만 데이터를 변경해야하는 것, DB에 기록된 모든 데이터는 여러 조건 규칙에 따라 유효함을 가짐

- 격리성 (isolation) : 트랜잭션 수행시 서로 끼어들지 못함, 복수의 병렬 트랜잭션은 서로 격리되어 순차적으로 실행되는 듯이 작동

- 지속성 (durability) : 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함, 이를 위해 DB에 시스템 장애가 발생해도 원래 상태로 복구하는 회복 기능이 있어야하므로 체크섬, 저널링, 롤백 등의 기능을 제공함

*체크섬 : 중복 검사의 한 형태로 오류 정정을 통해 송신된 자료의 무결성을 보호하는 단순한 방법

*저널링 : 파일 시스템 또는 DB시스템에 변경 사항을 반영하기전에 로깅하는 것, 트랜잭션 등 변경사항에 대한 로그를 남기는 것 

 

#_커밋 : 여러 쿼리가 성공적으로 처리되었다고 확정하는 명령어, 트랜잭션 단위로 수행되며 변경된 내용이 모두 영구적으로 저장되는 것

#_롤백 : 에러나 이슈 등으로 트랜잭션으로 처리한 하나의 묶음 과정을 이어나기 전으로 돌리는 일(취소), 롤백을 고려해서 트랜잭션 로직에 외부 APi호출 자제

-> 데이터의 무결성 보장, 데이터 변경 전 변경사항 확인, 해당 작업 그룹화 

 

#_트랜잭션 전파 : 커넥션 단위의 트랜잭션 수행시 커넥션 객체를 넘겨야하는데 대신 여러 트랜잭션 관련 메서드의 호출을 하나의 트랜잭션에 묶이도록 하는 것

#_무결성 : 데이터의 정확성, 일관성, 유효성을 유지하는 것, 무결성이 유지되어야 DB에 저장된 데이터 값과 그 값에 해당하는 현실 세계의 실제 값이 일치하는지에 대한 신뢰 발생

개체 무결성 기본키로 선택된 필드는 빈 값 허용x
참조 무결성 서로 참조관계에 있는 두 테이블의 데이터는 항상 일관된 값 유지
고유 무결성 특정 속성에 대해 고유한 값을 가지도록 조건이 주어진 경우 그 속성값은 모두 고유한 값을 가짐
NULL 무결성 특정 속성값에 NULL이 올 수 없다는 조건이 주어진 경우 그 속성값은 NULL값이 될 수 없다는 제약조건

 

#_격리수준에 따른 현상

격리수준   발생현상
serializable 트랜잭션을 순차적으로 진행시키는 것, 동시 접근x, 엄격, 교착상태 발생률↑, 성능↑  
repeatable_read 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수는 없으나 새로운 행 추가가 가능하므로 후에 추가된 행 발견 가능성 팬텀리드
read_committed 가장 많이 사용, 다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없음, 커밋 완료된 데이터만 조회 허용
ex. a가 접근한 행을 b가 수정가능하므로 a에게 다른 내용이 발견될 수 있음
팬텀리드, 반복 가능하지 않은 조회
read_uncommitted 가장 낮은 격리 수준, 커밋 전에 노출되나 가장 빠름, 일반적으로는 권장하지 않으나 어림잡은 집계에 사용 팬텀리드, 반복 가능하지 않은 조회, 더티 리드
팬텀 리드 한 트랜잭션 내에서 동일한 쿼리를 보냈을 때 해당 조회 결과가 다른 경우
반복 가능하지 않은 조회 한 트랜잭션 내에서 같은 행에 두번 이상 조회시 그 값이 다른 경우
더티 리드 반복가능하지 않은 조회와 유사하며 한 트랜잭션이 실행중일 때 다른 트랜잭션에 의해 수정되었지만 아직 커밋되지 않은 데이터를 읽을 수 있을 때 발생

 

#_관계형 데이스베이스 : 행과 열을 가지는 표 형식 데이터를 저장하는 형태의 DB로 SQL언어를 사용하여 조작, 각 제품에 특화된 SQL사용 ex. MySQL, PostgreSQL, 오라클, SQL Server, MSSQL 등

#_NoSQL 데이터베이스 : SQL을 사용하지 않는 DB, 유연한 스키마, 확장성의 특징이 있음 ex. MongoDB, redis

#_MySQL : 대부분의 운영체제와 호환, 현재 가장 많이 사용, C, C++로 만들어졌으며 MySAM인덱스 압축기술, B-트리 기반 인덱스, 스레드 기반의 메모리할당 시스템, 매우 빠른 조인, 최대 64개의 인덱스 제공, 대용량 DB용, 롤백,커밋, 이중 암호 지원 보안 등의 기능 제공, 쿼리캐시를 지원하여 입력된 쿼리문에 대한 전체 결과 집합을 저장하므로 사용자가 작성한 쿼리가 캐시에 있는 쿼리와 동일하면 서버는 단순 구문 분석, 최적화 및 실행을 건너뛰고 캐시의 출력만 표시함

#_MySQL의 스토리니 엔진 아키텍처 : 모듈식 아키텍처로 쉽게 스토리지 엔진을 바꿀 수 있으며 데이터 웨어하우징, 트랜잭션 처리, 고가용성처리에 강점, 스토리지 엔진 위의 커넥터 API 및 서비스 계층을 통해 MySQL DB와 상호작용 용이

#_PostgreSQL : MySQL 다음 선호하는 DB기술, 디스크 조각이 차지하는 영역을 회수하는 VACUUM, 최대 테이블크기 32TB, SQL뿐 아니라 JSON을 이용하여 데이터 접근 가능, 지정 시간에 복구하는 기능, 로깅 , 접근제어, 중첩된 트랜잭션, 백업 등 가능

#_MongoDB : JSON을 통해 데이터에 접근, BSON형태의 데이터로 저장, 와이드타이거 엔진이 기본 스토리지 엔진으로 장착된 키-값 데이터 모델에서 확장된 도큐먼트 기반의 데이터베이스, 확장성이 뛰어나며 빅데이터 저장시 성능↑, 고가용성, 샤딩, 레플리카셋 지원, 스키마를 정해놓지않고 데이터 삽입이 가능하여 다양한 도메인의 DB를 기반으로 분석하거나 로깅 등 구현시 강점, 도큐먼트 생성시 다른 컬렉션에서 중복된 값을 지니기 힘든 objectID 생성(기본키로 유닉스 기반의 타임스탬프(4바이트), 랜덤값(5바이트), 카운터(3바이트)로 이루어짐 

1) key와 value 형태의 도규먼트 : _id의 고유한값, DB저장시 key의 길이 저장, JSON형태로 쿼리생성, JSON을 매개변수로 받아 BSON형태로 DB에 삽입, 추출 가능, type변환 x, JSON데이터 통신시 성능면에서 더 좋은 선택이 됨, key-value 값으로 저장되므로 칼럼의 길이 데이터 + 칼럼이름도 추가되어 저장공간을 더 필요로 함

2) 스키마없이 삽입가능 : 스키마없이 데이터 모델을 구현하지 않은채 유동적인 데이터 삽입가능하여 다양한 서비스로부터 데이터를 유동적으로 쌓을 수 있는 장점

*스키마 : DB를 구성하는 속성, 관계 등 데이터 값이 갖는 type을 명시한 것

3) 데이터의 조합함수 지원 : min, max, aggregate, mapReduce 등 강력한 함수로 데이터 추출, 조합하여 압축된 결과값 생성

4) 이중화 지원과 샤딩 : 서버는 멈추면 안되므로 운영서버의 경우 서버 이중화, ReplicaSet을 이용해 이분화를 가능케함, 데이터의 양이 많은 경우 샤딩을 통해 collection 분할 관리 가능

5) JSON 형태의 데이터 : BSON형태로 저장되며 JSON 형태의 값으로 추출 가능, JSON object를 매개변수로 받아 저장 용이

6) 2차원 좌표 인덱싱 : geoSpartial이라는 인덱스를 사용하여 2차원 좌표 인덱싱 가능

7) collection join : $lookup을 통한 collection join 가능

8) B-tree 를 적용한 인덱싱

#_redis : 인메모리 DB이자 키-값 데이터 모델 기반의 DB, 기본 데이터 타입은 문자열이며 최대 512MB까지 저장 가능, 이외 셋(set), 해시(hash) 등 지원, pub/sub 기능을 통한 채팅 시스템, 데란 DB앞단에서 사용하는 캐싱 계층, 단순 키-값이 필요한 세션 정보관리, 정렬된 셋 자료구조를 이용한 실시간 순위표 서비스

 

#_스토리지 엔진 : InnoDB, MyISAM, Wiredtiger 

InnoDB : MySQL 8.0 default엔진, but MyISAM으로 변경 가능 MyISAM
DB크기가 커짐에 따라 더 큰 가용성 제공  
엔진자체내에서 행 캐시와 인덱스 캐시를 결합하여 행, 인덱스 조회 캐싱 파일시스템 블록캐시에 의존하여 행, 인덱스 조회 캐싱
행 수준 잠금 테이블 수준 잠금
  ROW COUNT가 있어 조회 쿼리시 빠름
트랜잭션 처리, 대용량 데이터 처리에 용이 트랜잭션 없이 조회기능이 많을 때

- Wiredtiger 엔진 : MongoDB의 default 엔진, LSM Tree 를 이용하여 읽기<저장 성능, 블룸필터를 사용하여 읽기 성능 보완, 60초 간격 체크포인트 생성, 저널링(로그 저널링 가능, 체크포인트 간의 데이터 수정사항 유지, MongoDB가 체크포인트 사이에 종료되면 저널을 사용하여 마지막 체크포인트 이후 수정된 데이터 재생산 가능), 압축(wiredTiger를 통해 모든 컬렉션 및 인덱스에 대한 압축 지원), 메모리(약 50%의 메모리 차지)

 

#_인덱스 : 데이터를 빠르게 찾을 수 있는 장치, 책의 본문에서 내가 항목보기를 통해 빠르게 찾기가 가능하듯 이와 같은 인덱스의 역할, 균형잡힌 B-Tree기반 구축으로 탐색시 평균 O(logN)시간이 소요되며 트리 생성시 대수확정성이랑 특징으로 빠른시간내에 많은 양의 데이터 탐색 가능

#_B-트리 : 루트노드, 리프노드, 브랜치노드로 이루어지며 이진 트리를 확장해 하나의 노드가 가질 수 있는 자식 노드의 최대 숫자가 2보다 큰 트리 구조를 가진 균형잡힌 트리

 

#_인덱스 최적화 기법

1. 인덱스는 비용 : 인덱스 리스트, 컬렉션 순으로 두번 탐색하므로 읽기 비용 발생, 컬렉션 수정시 인덱스 수정도 이루어져야하므로 B-트리의 높이를 균형있기 조절하는 비용, 데이터를 효율적으로 조회할 수 있도록 분산시키는 비용 소요

2. 테스팅 : 서비스에서 사용하는 객체의 깊이, 테이블의 양 등에 따라 인덱스 최적화 기법이 달라지므로 테스팅 필요

3. 복합 인덱스 순서 : 같음(==) -> 정렬 -> 다중값(<, >) -> 카디널리티(유니크, email > age)

 

#_clustered index : 유일성과 최소성을 가진 기본키 중 하나로 설정, 테이블당 하나, 일반적으로 테이블의 기본키가 클러스터형 인덱스가 됨, DB 페이지 정렬되어 저장되며 인덱스 페이지의 리프노드에 '데이터페이지'가 들어있음, 정렬되었으므로 탐색에 장점, 데이터 추가시마다 모든 테이블 정렬로 삽입, 삭제, 수정이 느림

primary key  : 클러스터형, alter table add primary key

#_non-clustered index : 보조인덱스, 여러개 가능, compount key 보조인덱스로 복합키를 만듦, 인덱스 페이지 리프노드에 실제 데이터가 아닌 데이터페이지에 관한 포인터 저장, 정렬되지않아 탐색이 느림, 삽입, 수정, 삭제가 빠름, 인덱스와 데이터의 순서가 일치x

create index : alter table add index

 

#_조인 : 두개 이상의 테이블을 묶어서 하나의 결과물을 만들어 내는 것, 교집합이 없을 경우 null

 

#_중첩루프 조인 : 중첩 for문의 원리, 랜덤 접근에 대한 비용증가로 대용량 테이블 사용 권장x, 작은 블록으로 나눠서 하나씩 조인하는 블록 중첩 루프 조인

#_정렬 병합 조인 : 각각의 테이블을 조인할 필드 기준으로 정렬, 정렬 후 조인작업 수행, 인덱스가 없고 대용량의 테이블들을 조인하고 <,> 등의 범위 비교 연산자가 있을 때 사용

#_해시 조인 : 해시 테이블 기반 조인 방법, 하나의 테이블이 메모리에 온전히 들어갈 경우 중첩 루프 조인보다 효율적, 동등 조인에서만 사용 가능

빌드 단계                                               -> 프로브 단계
메모리 내 해시 테이블을 빌드하는 단계 레코드를 읽기 시작하여 일치하는 레코드를 결과값으로 반환
(해시함수 > 해시값 > 매칭 레코드)
각 테이블은 한번씩만 읽게되어 중첩루프보다 성능이 좋음

 

#_데드락 : DB의 교착 상태로 둘 이상의 트랜잭션이 서로가 잠금을 포기하기를 기다리는 상황

#_교착상태 감지 : 교착상태 감지 및 timeout(일정시간 이후 트랜잭션이 실행되지 않았을 경우 롤백), 그래프 기반 사이클 탐색

#_교착상태 방지 : 격리수준 변경(격리수준을 행수준 잠금으로 조정), 서비스로직이 교차되지않게 수정, wait-die 또는 wound wait(타임스탬프 기반 트랜잭션 대기, 선점, 종료)

 

 

반응형