DB 면접 질문 정리

kmb·2022년 10월 18일
0

DB

목록 보기
2/10

서브쿼리

쿼리내부에 포함되어있는 select 문을 의미.
서브쿼리를 포함하고 있는 쿼리를 외부쿼리(outer query), 서브쿼리는 내부쿼리(inner query) 라고도 부른다.


정규화

DB설계에서 데이터의 중복을 최소화 하도록 구조화하는 프로세스.
장점 : 중복으로 인한 이상현상을 방지
단점 : 릴레이 간의 연산(join 연산)이 많아진다.

1NF : 테이블간의 모든 엔티티가 고유하거나 원자값을 포함.
2NF : 1NF에 있으면서 테이블의 키가 아닌 모든 속성이 PK에 의존하는 경우
3NF : 2NF에 있고 테이블의 PK가 아닌 모든 속성이 PK에 이행적 함수 종속이 되지 않는 경우 ex) x->y y->z 라면 함수적 종속관계로 인하여 x->z 따라서 z가 x에 이행적으로 함수 종속
BCNF : 결정자이면서 후보키가 아닌것들 제거.
4NF : 다치 종속 제거
5NF :


DBMS

데이터베이스 관리 시스템으로 여러 사용자가 데이터베이스에 접근하여 사용 할 수 있도록 해주는 소프트웨어
장점 : 데이터의 일관성, 무결성 유지가능. 데이터 중복을 피하고 실시간 처리 가능.
단점 : 집중적인 접근으로 과부하(overhead) 발생할 수 있다.


DB를 사용하는 이유?

파일 시스템의 데이터 중복, 비일관성, 검색 문제를 해결하기 위해 사용.


스키마

데이터베이스의 구조를 전반적으로 기술한 것.


하나 이상의 테이블에서 유도된, 메모리에 물리적으로 존재하지않는 가상의 테이블.
인덱스를 가질수 없고, 특정사용자로부터 특정속성을 숨기는 기능으로 뷰를 정의해서 그 뷰를 테이블처럼 사용.
기본키를 포함해서 정의할 경우에 삽입, 삭제, 갱신 가능.


키(key)

데이터베이스에 저장되어있는 행(row)을 유일하게 구별할 수 있는 식별자


후보키

테이블을 구성하는 열(column)중에서 행(row)을 유일하게 식별할 수 있는 열(column) 또는 열(column)들의 집합.
모든 테이블은 하나 이상의 후보키를 갖는다.


기본키

후보키중에서 선택한 Primary Key
특정한 튜플을 유일하게 식별 가능하다.
중복값 및 null 값 불가능


대체키

후보키가 2개이상일때 기본키를 제외한 나머지 후보키

슈퍼키

테이블의 행(row)을 고유하게 식별할 수 있는 열(column) 또는 열(column)들의 집합.
슈퍼키와 후보키의 차이점은 --> 슈퍼키는 고유하게 식별할 수 있는 모든 조합을 가진다. 즉 후보키에 불필요한 열(column)을 덧붙여 장황하게 만든것은 후보키는 아니지만 여전히 슈퍼키다.


외래키

테이블의 열(column) 중에서 다른 테이블의 PK를 참조하는 열(column)
테이블 간의 연결, 중복방지, 무결성 유지 역할을 한다.


트랜잭션(transaction)

데이터베이스의 상태를 변화시키는 논리적인 작업 단위


트랜잭션 특징 ACID

Atomicity(원자성) : 트랜잭션을 구성하는 연산 자체가 모두 정상적으로 실행되거나 모두 취소되어야 한다.
Consistency(일관성) : 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지한다.
Isolation(고립성) : 2개이상의 트랜잭션이 동시에 발생할 때, 서로의 연산에 영향을 주면 안된다.
Durability(영구성) : commit된 트랜잭션의 내용은 영구히 반영된다.


트랜잭션 상태

Active(활동) : 트랜잭션이 실행중인 상태
Fail(장애) : 트랜잭션이 실행에 오류가 발생하여 중단한 상태
Aborted(철회) : 트랜잭션이 비정상적으로 종료되어 Rollback 수행하는 상태
Partically Commit(부분 완료) : 트랜잭션이 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전 상태
Committed(완료) : 트랜잭션이 성공적으로 종료되어 commit 연산을 실행한 이후 상태


트랜잭션 격리수준

Read Uncommited : 다른 트랜잭션에서 commit되지않은 내용에 접근 가능 (dirty read). 락 발생하지않음.
Read Commited : commit 된 내용만 접근가능. 한 트랜잭션 내에서 검색 결과가 비일관적인 현상 발생. 락 발생하지않음.
Repeatable Read : commit이 완료된 데이터만 읽을 수 있고, 트랜잭션 범위내에서 조회한 내용이 항상 동일함을 보장. 락 발생함.
Serializable : 한 트랜잭션에서 사용하는 데이터는 다른 트랜잭션이 접근 불가능. 락 발생


Commit

트랜잭션이 성공하여 트랜잭션 결과를 영구적으로 반영하는 연산


Rollback

트랜잭션의 실행을 취소했음을 알리는 연산. 트랜잭션이 수행한 결과를 원래 상태로 원상복구 시키는 연산.


동시성 제어

동시에 여러개의 트랜잭션이 수행될 때, 트랜잭션들이 DB의 일관성(Consistency)을 파괴하지 않도록 트랜잭션 간의 상호작용을 제어하는것.


Locking

트랜잭션이 데이터에 접근하기전에 Lock을 요청해서 Lock이 허락되면 해당 데이터에 접근할 수 있도록 하는것.

비관적 락(Pessimistick lock)
데이터 수정 즉시 트랜잭션 충돌 감지 가능. rollback을 일일이 하기 힘들거나 여러 기능이 한 트랜잭션에 묶여 있는 경우에 사용. 수정 비율이 높다면 비관적 락을 사용한다.

낙관적 락(Optimistic lock)
데이터 수정시 충돌이 발생하지 않을것으로 가정해서 lock을 걸지 않는 방식. lock이 아닌 JPA가 제공하는 버전 관리 기능을 통해서 트랜잭션 격리성 관리. commit 전까지는 충돌을 알 수 없다. 읽기의 비중이 높다면 낙관적 락을 사용한다.


갱신 분실 문제

A와 B가 동시에 수정한다고 가정할때 A가 먼저 수정완료하고 이후에 B가 수정완료한다면 B의 수정사항만 남게 되는 경우를 갱신 분실 문제라고 한다.

<갱신 분실 문제 해결방법>
1. 마지막 commit만 인정하기. (ex. B의 commit만 인정하기)
2. 최초 commit만 인정하기 (ex. A수정까지만 인정하고 B수정이 완료되면 오류 발생)
3. 충돌하는 갱신내용 병합. (ex. A와 B의 수정사항을 병합)


조인(join)

2개이상의 테이블이나 데이터베이스를 연결해서 데이터를 검색하는 방법. 적어도 1개 이상의 컬럼을 서로 공유해야한다.

Inner Join : 기준 테이블과 join한 테이블의 중복된 값 (교집합)
Left Outer Join : 기준 테이블값 + join 테이블과 기준테이블의 중복값 (중복값이 없으면 join 테이블의 내용은 null로 표기된다)
Right Outer Join : Left Outer Join 반대
Full Outer Join : 기준 테이블값 + join 테이블값 (합집합), 빈값들은 null로 채운다.
Cross Join : 모든 경우의 수를 전부 표현하는것. ex. 각 테이블의 데이터 개수가 n,m 이라면 데이터 개수는 n*m개
Self Join : Cross Join의 상대가 자기 자신인것.


트리거(trigger)

DML이 수행되었을때 자동으로 실행되게 정의한 프로시저

프로시저 : 쿼리문을 하나의 메서드 형식으로 만들고 어떤 동작을 일괄적으로 처리하는 용도


SQL

DML : 데이터 조작 --> select, insert, update, delete
DDL : 데이터(구조, 객체) 정의 --> create, drop, truncate(테이블삭제, 초기화), alter
DCL : 권한제어 --> grant revoke


인덱스(index)

데이터베이스의 검색 속도를 향상시키기 위한 방법.
필드(field)를 key, 필드의 주소값을(pointer)를 value인 자료구조로 이루어짐.
일반적으로 B+ 트리 자료구조를 사용한다.
장점 : 검색 속도 향상
단점 : 데이터의 insert, update, delete의 경우 인덱스까지 변경 및 정렬해야하므로 성능이 저하


B트리

이진트리를 확장해서 많은 자식을 가질수있는 균형트리.
key들이 항상 오름차순으로 정렬되어 구성.
branch와 leaf노드가 key와 data를 저장.


B+트리

B트리를 확장해서 데이터의 빠른 접근을 위한 index 역할만 하는 비단말 노드를 추가한 트리.
branch노드는 key만 저장.
key가 항상 오름차순으로 정렬되어 구성. (1개의 노드에 더 많은 key를 담을 수 있으므로 트리의 높이가 B트리에 비해 낮아진다. 따라서 cache hit를 높일수 있는 장점이 있다.)
leaf노드는 key와 data를 저장하고 Linked List로 연결되어있다. 따라서 선형탐색이 가능하며 검색에 좋다.


커넥션 풀(connection pool)

DB와 미리 연결해놓은 connection들을 pool에 저장해두고 클라이언트의 요청이 오면 connection을 빌려주었다가 사용이 끝나면 반납하는 방식.
스프링에서는 HikariCP 많이 사용


서버와 스토리지 차이점

서버는 클라리언트 서비스(SW자원, 네트워크)를 처리하는 용도.
스토리지는 데이터 저장용

<서버와 스토리지를 연결하는 방식>
DAS방식 : 서버와 스토리지를 직접 연결
NAS방식 : 직접 연결이 아닌 네트워크를 통한 연결
SAN방식 : 네트워크 망 안에 묶여서 연결되어 중앙서버에 접근하는 방식


클러스터링

DB 스토리지를 공유하고 동일 DB서버를 다중화 하는 방식. 동기방식으로 동기화한다.

Active-Active 방식
여러대의 DB서버가 트래픽을 분산해서 받는다. 여러대의 서버가 DB 스토리지를 공유하기 때문에 병목 현상이 생길수 있다.

Active-Standby 방식
한쪽은 Standby 상태로 두어서 Active 상태의 서버가 죽으면 FailOver되어 전환하는 방식. FailOver가 이루어지는 동안 손실이 발생한다.


레플리케이션

DB서버와 DB 스토리지를 다중화하는 방식.
조회(select)작업은 Salve에서 한다. insert, delete, update 작업은 Master에서 하면서 트래픽을 분산.
Master에서 Slave로 데이터를 복제할때 비동기 방식이므로 일관성있는 데이터를 얻지 못할 수 도 있다.


수직 파티셔닝

테이블이나 인덱스를 관리하기 쉬운 단위로 분리하는것.
장점 : insert시 분리된 파티션으로 분산시켜 경합을 줄인다. 읽기/쓰기 향상
단점 : 인덱스와 테이블을 각각 별도로 파티셔닝할 수 없고 같이 파티셔닝해야 한다.

파티셔닝 : 테이블을 파티션(partition)이라는 작은 단위로 나누어 관리하는것


샤딩(수평 파티셔닝)

같은 테이블 스키마를 가진 데이터를 여러개의 데이터 베이스에 분산하여 저장하는것.
복잡도가 매우 높아지므로 다른 방식을 우선 고려해야한다.

스키마 : 데이터베이스의 구조와 제약조건을 정의하는것.


SQL Injection

조작된 SQL 쿼리문이 데이터베이스에 그대로 전달되어 비정상적 명령을 실행시키는 공격 기법.


행(row)의 개수가 많은 테이블 설계 방법

파티셔닝이나 샤딩으로 테이블을 분리한다.
레플리카를 사용해 write, read 트래픽을 분산시킨다.
중복도가 낮은 인덱스를 설정 (인덱스도 공간을 차지하므로 테이블당 최대 4개가 적당)


Statement vs PreparedStatement

<공통점>
SQL 실행단계가 같다.
1. Parsing(쿼리문장 분석) --> 2. Compile(컴파일) --> 3. 실행(execute)

<차이점>
Statement : 매번 쿼리를 수행할 때마다 실행 3단계를 거친다. 즉 매번 컴파일을 해야한다.
PreparedStatement : 처음 한번만 실행 3단계를 거치고 이후에는 캐시에 담아 재사용을 한다. 즉 동일 쿼리를 반복할 때 성능이 좋다.

Statement : SQL문을 실행할 수 있는 객체


RabbitMQ & Kafka

필요한 데이터를 담은 메세지 Queue를 한쪽에서 생성하면 다른쪽에서 소비하는 구조를 하는 역할

RabbitMQ : 소비자가 메세지를 가져가면 Queue에는 남지않고 사라진다. 따라서 소비자와 메세지 결합력이 높아 트래픽이 증가하면 수평적 확장이 어렵다.

Kafka : 토픽을 소비자가 가져간 후에도 이벤트 스트림에서 계속 토픽을 유지하기 때문에 오류 수정이나 앱 리빌드 과정에서 이벤트를 다시 재생시킬 수 있다.

 

출처

profile
꾸준하게

0개의 댓글