데이터베이스란?
여러 사람이 공유하여 사용할 목적으로 체계화해 통합, 관리하는 데이터의 집합
RDBMS와 NoSQL
RDBMS (관계형)
- 관계형 데이터 모델을 기초로 두고, 데이터는 스키마로 정의된 2차원 테이블에 저장됩니다.
- 장점
- 스키마에 맞춰 데이터를 관리하기 때문에 명확한 데이터 구조 보장한다.
- 데이터 중복을 피하기 때문에 공간이 절약 된다.
- 단점
- 시스템이 커질 수록 쿼리가 복잡해지고 성능이 저하되며 Scale-Out이 어렵습니다.
NoSQL (비 관계형)
- 비 관계형 데이터베이스로, 데이터간의 관계를 정의하지 않고, 스키마가 없어 좀 더 자유롭게 데이터를 관리할 수 있습니다.
- 장점
- 데이터 분산이 용이하고 Scale-Out이 가능합니다.
- 단점
- 데이터 중복이 발생할 수 있고, 데이터가 변경 시 연산이 오래 걸립니다.
- 스키마가 존재하지 않아 데이터 구조를 보장하지 않는다. 때문에 데이터 구조 결정이 어려울 수 있다
트랜잭션
데이터베이스의 상태를 변화시키는 하나의 논리적인 작업 단위입니다. 여러 개의 작업을 하나의 논리적인 단위로 묶어서 반영과 복구를 조정할 수 있습니다. 반영을 하는 경우 commit을 통해 처리되고 데이터의 부정합이 일어났을 경우 rollback을 하여 데이터의 부정합을 방지할 수 있습니다.
ACID : 트랜잭션이 만족해야하는 특성
- 원자성 : 하나의 트랜잭션의 작업은 모두 성공해야하거나 모두 실패해야 한다는 특성입니다.
- 일관성 : 트랜잭션이 실행을 기준으로 전, 후에 일관된 DB 상태를 보존해야한다는 특성입니다.
- 고립성 : 트랜잭션 작업 중 다른 트랜잭션과 서로 영향을 주지 않아야 한다는 특성입니다. Isolation Level따라 달라짐
- 지속성 : 트랜잭션 작업이 완료되면 DB에 영속적으로 반영되어야 한다는 특성입니다.
트랜잭션의 격리 수준 (다시 정리)
트랜잭션의 격리 수준은 트랜잭션의 격리성(Isolation) 레벨에 따른 일관성과 동시성을 조절하는 것을 의미합니다.
- Read Uncommitted(Lv.0) 은 커밋되지 않은 내용에 대해 데이터를 읽을 수 있습니다.
- Read Committed(Lv.1) 은 커밋된 내용에 대해서만 데이터를 읽을 수 있습니다. (대부분 Default)
- Repeatable Read(Lv.2) 은 선행 트랜잭션이 읽은 데이터는 트랜잭션이 종료될 때까지 후행 트랜잭션이 갱신하거나 삭제하는 것이 불허합니다.
- Serializable Read(Lv.3) 은 선행 트랜잭션이 읽은 데이터를 후행 트랜잭션이 갱신하거나 삭제하지 못하고, 중간에 새로운 데이터를 삽입하는 것도 막아주기 때문에 완벽하게 읽기 일관성 모드를 제공합니다. 대신 동시성에 대한 성능으 매우 떨어집니다.
Index
DB 테이블 검색 성능의 속도를 높여주는 자료 구조입니다.
데이터베이스에 테이블의 모든 데이터를 검색하면 시간이 오래 걸리기 때문에 데이터와 데이터의 위치를 포함한 자료구조를 생성하여 빠르게 조회하도록 한다.
일반적으로 사용되는 인덱스 알고리즘은 B +- Tree 알고리즘이다.
- 장점
- 테이블을 조회하는 속도에 따르 성능을 향상시킬 수 있다.
- 단점
- 인덱스를 관리하기 위해 추가 작업이 필요하고 DB의 약 10%에 해당하는 저장공간이 필요하다.
- 인덱스를 잘못 사용할 경우 오히려 성능이 저하되는 역효과가 발생할 수 있다.
Trigger
특정 테이블에서 INSERT, DELETE, UPDATE 같은 쿼리가 수행되었을 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램이다.
Key의 종류
- 슈퍼키 : 유일성의 특징을 만족하는 속성 또는 속성들의 집합입니다.
- 후보키 : 유일성과 최소성을 만족하는 속성 또는 속성들입니다.
- 기본키 : 후보키 중에서 선정된 키. (Not Null, Unique, 최소성)
- 대체키 : 후보키 중에 기본키가 아닌 키
- 외래키 : 다른 테이블의 기본키를 참조하는 컬럼
정규화
관계형 데이터베이스의 설계에서 이상 문제를 해결하기 위해 속성들끼리의 종속 관계를 분석하여 여러 개의 릴레이션으로 구조화(분해)하는 과정입니다. 테이블을 분해하지 않는 경우 이상 현상이 발생할 수 있지만 과도하게 정규화를 하게되면 속도는 상대적으로 느려지게 됩니다.
(이상 현상 : 정규화를 거치지 않아 DB 내의 데이터들이 불필요하게 중복되어 릴레이션 조작 시 발생하는 문제 현상)
>제1정규형
"한 칸엔 하나의 데이터만"
애트리뷰트의 도메인이 오직 원자값만으로 되어있고, 모든 애트리뷰트에 반복되는 그룹이 나타나지 않습니다.
>제2정규형
"partial dependency(하나의 composite primary key에 종속)를 제거한 테이블"
"현재 테이블의 주제와 관련있는 컬럼만"
모든 비주요 애트리뷰트들이 주요 애트리뷰트(기본키)에 대해서 완전 함수적 종속을 만족하는 정규형
완전 함수적 종속이란 X -> Y 라고 가정했을 때, X 의 어떠한 애트리뷰트라도 제거하면 더 이상 함수적 종속성이 성립하지 않는 경우를 말한다. 즉, 키가 아닌 열들이 각각 후보키에 대해 결정되는 릴레이션 형태를 말한다.
>제3정규형
"일반 컬럼에도 종속된 컬럼이 없는 테이블 "
어떠한 비주요 애트리뷰트도 기본키에 대해서 이행적으로 종속되지 않으면 제 3 정규형을 만족한다고 볼 수 있다. 이행 함수적 종속이란 X - >Y, Y -> Z의 경우에 의해서 추론될 수 있는 X -> Z의 종속관계를 말한다. 즉, 비주요 애트리뷰트가 비주요 애트리뷰트에 의해 종속되는 경우가 없는 릴레이션 형태를 말한다.
>BCNF 정규형
여러 후보 키가 존재하는 릴레이션에 해당하는 정규화 내용이다. 복잡한 식별자 관계에 의해 발생하는 문제를 해결하기 위해 제 3 정규형을 보완하는데 의미가 있다. 비주요 애트리뷰트가 후보키의 일부를 결정하는 분해하는 과정을 말한다.
각 정규형은 그의 선행 정규형보다 더 엄격한 조건을 갖는다.
- 모든 제 2 정규형 릴레이션은 제 1 정규형을 갖는다.
- 모든 제 3 정규형 릴레이션은 제 2 정규형을 갖는다.
- 모든 BCNF 정규형 릴레이션은 제 3 정규형을 갖는다.
수많은 정규형이 있지만 관계 데이터베이스 설계의 목표는 각 릴레이션이 3NF(or BCNF)를 갖게 하는 것이다.
무결성이란
데이터의 정확성과 일관성을 유지하고 보증하는 것
트랜잭션이란
논리적인 작업 셋을 모두 완벽하게 처리하거나 또는 처리하지 못할 경우에는 원 상태로 복구해서 작업의 일부만 적용되는 현상이 발생하지 않게 만들어주는 기능이다.
원자성 / 일관성 / 고립성 / 지속성
Connection Pool
웹 컨테이너(WAS)가 실행되면서 DB와 미리 연결해놓은 객체들을 Pool에 저장해두었다가 클라이언트 요청이 오면 connection을 빌려주고, 처리가 끝나면 다시 connection을 반납받아 pool에 저장하는 방식
자바에서 DB를 직접 연결해서 처리하는 경우 Driver를 로드하고 커넥션 객체를 받아와야한다. 매번 요청마다 이런 행위가 반복된다면 매우 비효율적일 것이다. 이러한 문제를 해결하기 위해 나온 것이 커넥션 풀이다.
Statement vs PreparedStatement
Statement를 사용하면 쿼리를 수행할 때마다 계속적으로 컴파일을 하면서 수행한다.
PreparedStatement는 처음 한 번만 컴파일하여 캐시에 담아 재사용을 한다.
동일한 쿼리를 반복적으로 수행한다면 PreparedStatement가 성능이 더 좋다.
Redis
Key-Value 저장소로 문자열 및 다양한 자료구조를 지원하는 NoSQL입니다.
Redis는 인메모리 데이터베이스이기 때문에 디스크 스캐닝이 필요없어 빠르게 데이터를 가져올 수 있습니다. 데이터의 스냅샷, AOF 로그를 통해 데이터 복구가 영속성 또한 어느정도 보장해줄 수 있습니다.
MyISAM / InnoDB
MySQL DB 엔진에는 MyISAM, InnoDB가 있습니다.
MyISAM은 비-트랜잭션 세이프 테이블을 관리합니다. 데이터 모델 디자인이 단순하여 전체적인 속도는 InnoDB 엔진보다 빠릅니다.
InnoDB는 MyISAM에서 지원하지 않는 트랜잭션을 지원합니다. 또한 commit, rollback, 장애 복구 등 기능을 지원합니다. 기본적으로 MySQL을 설치하면 Default로 이 엔진을 사용합니다. MyISAM보다 속도는 떨어지지만 안정성이 높습니다.
'CS > 면접 준비' 카테고리의 다른 글
백엔드 면접 질문 (0) | 2023.02.05 |
---|---|
웹과 네트워크 면접 질문 (0) | 2022.12.23 |
운영체제 면접 질문 (0) | 2022.12.22 |
Spring & Spring Boot 면접 질문 (0) | 2022.12.22 |
객체지향 프로그래밍 & Java 면접 질문 (0) | 2022.12.22 |