춤추는 개발자

[DB] 신입 개발자의 면접 준비 본문

Small talk/면접 준비

[DB] 신입 개발자의 면접 준비

Heon_9u 2021. 4. 13. 11:52
728x90
반응형

PK와 FK, ERD란?

PK: 테이블에서 각 행을 유일하게 구분해주는 칼럼 key로 중복과 NULL값이 불가능한 키

FK: 외래키라고 불리며, 테이블에 있는 하나의 컬럼으로 의미를 표현할 수 없는 경우, 다른 테이블의 PK의 값을 반드시 참조하여 표현하는 key

ERD: 요구사항으로부터 구성된 Entity와 Attribute, Relation으로 기술하는 데이터 모델

 Entity: 단독으로 존재하는 객체

 Attribute: 개체가 갖는 속성, 특징

 Relation: 객체와 객체간의 관계를 뜻하며 1:1, 1:N, N:M관계

 


참조 무결성이란?

기본키와 참조키 간의 관계가 항상 유지됨을 보장하는 것. 테이블의 행을 참조하는 참조키가 존재하는 한 삭제될 수 없고, 기본키도 변경할 수 없다. 

 


RDBMS, 관계형 데이터베이스란?

모든 데이터를 2차원 테이블로 표현한 것으로 테이블은 Row와 Column으로 이루어진 저장 단위를 가진 DB를 뜻함.

서로 관계를 형성하고 있는 테이블들의 집합으로 이용하기도 수월하며, 확장이 용이하다는 장점이 있다. 

 


DB에서 Commit과 Rollback이란?

Commit은 쿼리문에서 insert, update, delete를 수행할 때, 수행결과를 확정짓는 것.

Rollback이란 수행된 쿼리문을 복구하고 싶은 때, 데이터를 복원시키는 것.

 


DB정규화란?

데이터의 일관성이나 중복을 최소화하기 위해 하나의 테이블을 둘 이상으로 분리하는 작업입니다. 이는 데이터를 저장하는데 필요한 저장 공간을 최소화하고, 삽입, 갱신 및 삭제에 따른 이상현상을 제거하여 데이터의 무결성을 유지할 수 있습니다.

 


DB Language

DDL: 데이터베이스 구조를 정의, 수정, 삭제 (Create, Alter, Drop)

DML: 데이터베이스 내의 자료 검색, 삽입, 갱신, 삭제 (Select, Insert, Update, Delete)

DCL: 데이터의 무결성을 유지, 병행 수행 제어, 보호와 관리 (Commit, Rollback, grant, revoke)

Schema: DB의 전체적인 구조와 제약조건에 대한 기술 정의

개체 무결성 - 기본키는 Null값x, 중복 허용x

참조 무결성 - 외래키는 Null값x, 부모 테이블의 기본키에 종속

도메인 무결성, 고유 무결성 등이 존재

 


기본키와 유일키의 차이점은?

NULL값의 차이가 있습니다. 기본키는 NULL값을 허용하지 않는 반면에, 유일키는 모든 칼럼 중 유일하게 하나에 대한 NULL값을 허용합니다.

 


트랜잭션이란 무엇인가요?

하나의 기능을 수행하기위한 작업의 단위로, DB의 일관된 상태를 다른 상태로 변환시키는 기능을 수행, 트랜잭션은 전체가 수행되거나 또는 전혀 수행되지 않습니다. 결제를 예로 든다면 물건을 계산하고, 현금을 내고, 거스름돈을 받는 일련의 과정들을 하나의 트랜잭션이라고 볼 수 있습니다.

 


트랜잭션의 성질에 대해 설명해보세요

원자성, 일관성, 독립성, 영속성 4가지가 있습니다.

 

원자성: 트랜잭션의 연산이 DB에 모두 반영되거나 반영되지 않거나 둘 중 하나

일관성: 트랜잭션에 완료되면 항상 일관성있는 DB상태를 유지

독립성: 이미 수행 중인 트랜잭션이 완료되기 전에 다른 트랜잭션에서 수행 결과를 참조할 수 없다.

영속성: 완료된 트랜잭션은 시스템이 고장나도 DB에는 영구적으로 반영

 


트랜잭션을 병행 처리할 때, 발생할 수 있는 문제

데이터 갱신에 이상현상, 트랜잭션이 동시에 실행되면서 데이터의 모순이 발생할 수 있습니다. 또는 2개이상의 트랜잭션이 하나의 레코드를 갱신할 때, 하나의 트랜잭션이 Rollback되면 다른 트랜잭션도 같이 Rollback되는 연쇄 복귀 문제가 있습니다.

 


병행으로 처리할 때, 위와 같은 문제를 방지하기 위한 방법

로킹 제어 기법

트랜잭션이 특정 DB의 데이터를 사용할 때, DB의 일정 부분만 Lock을 시키고, 트랜잭션이 완료되면 unLock하는 방법입니다. 그러나 로킹 단위에 따라 관리나 병행성의 차이가 있기 때문에 상황에 따라 적절한 로킹을 적용해야 합니다. 잘못 적용하면 트랜잭션이 자원을 점유하기위해 무한정 대기하는 데드락 현상이 발생할 수 있습니다.

 


데드락에 대한 설명과 해결 방법

 이미 자원을 점유하고 있는 트랜잭션끼리 서로의 자원을 점유하기위해 완료될 때까지 무한정 기다리는 현상을 말합니다. 데드락은 4가지 조건을 충족해야 발생하는데, 상호배제, 점유와 대기, 비선점, 환형 대기가 있습니다. 이중 하나라도 충족되지 않으면 데드락은 발생하지 않습니다.

 이를 해결하기위해 각 프로세스에게 자원을 할당하는 회피기법이나 데드락을 일으킨 트랜잭션을 Rollback하는 회복 기법이 있습니다.

 


DB의 index가 필요한 이유

 index는 테이블의 검색 속도를 향상시키기 위한 자료구조입니다. 즉, DB에서 모든 데이터를 검색하는 것은 시간이 오래걸리기 때문에 테이블에서 특정 행을 빠르게 찾기위해 index가 필요합니다. 

mangkyu.tistory.com/96

 Index의 장점으로는 테이블을 조회하는 속도와 그에 따른 성능 향상이 있습니다. 하지만 단점으로는 index를 관리하기 위한 저장공간과 추가 작업이 필요합니다. 또한, INSERT, UPDATE, DELETE가 빈번한 속성에 index를 적용하면 매번 정렬이 이루어지면서 성능 저하가 발생할 수 있습니다.

 


Index를 사용하며 좋은 경우

 규모가 작지 않은 테이블

 INSERT, UPDATE, DELETE가 자주 발생하지 않는 컬럼

 JOIN이나 WHERE에 자주 사용되는 컬럼

 데이터의 중복도가 낮은 컬럼


DB에서 index가 검색하는 과정 (구조)

 일반적으로 B+Tree가 사용됩니다. 실제 데이터가 저장되는 리프노드, 경로의 출발점이 되는 루트노드, 리프노드까지 경로역할을 하는 브랜치 노드로 구성되어 있습니다. 실제 특정 index를 검색할 때, 검색하고자 하는 target과 노드를 비교합니다. 만약, target보다 노드가 클 경우, 왼쪽 브랜치로 반대의 경우, 오른쪽 브랜치로 이동하며 검색합니다. 

 


행의 개수가 많은 테이블을 설계한다면, 어떻게 설계할 것인가?

 테이블을 분할하여 설계합니다. 데이터가 많은 경우, 요청을 처리할 때, 한 테이블로만 집중되어 성능 저하가 발생할 수 있습니다. 특히, 많은 트랜잭션이 한 테이블로 집중되면서 로킹(로킹 제어 기법)으로 인해 병목 현상이 발생할 가능성이 커집니다. 이를 해결하기 위해 수평 분할이나 수직 분할을 통해 행이 많은 테이블을 분할하여 설계합니다.

 이 때, 분할 기준은 필수 컬럼, 수정이 빈번하게 발생하는 컬럼들에 따라 분할합니다.

 


컬럼이 많은 테이블은 어떻게 설계할 것인가?

 컬럼이 많은 경우, 디스크에서 데이터를 읽는 I/O량이 많아져 성능 저하가 발생할 수 있습니다. 이러한 경우, 수정이 빈번한 컬럼들을 분석하여 테이블을 분할해야 합니다. 

 


대량의 데이터 저장 및 처리로 인한 성능 개선

 대량의 데이터가 예상될 경우, 파티셔닝을 적용하거나 PK에 따라 테이블을 분할합니다. 예를 들어 날짜를 index로 갖는 테이블을 년도와 월을 이용하여 12개의 파티션 테이블로 만들어 준다면, 각 테이블들로 트랜잭션이 분리될 수 있습니다.

 


DB의 멀티 인덱싱, 2개의 이상의 index

burning-dba.tistory.com/79

 DB에 멀티 인덱싱을 적용하면 단일 인덱싱에 비해 검색의 정확도를 높일 수 있습니다. 하지만, 그만큼 INSERT, UPDATE, DELETE와 같은 DML에 비효율적입니다.

 멀티 인덱싱을 생성할 때는 순서가 중요합니다. 왜냐하면 해당 index들을 타냐 안타냐의 문제가 생기기 때문입니다. 만약, WHERE절에 자주 사용되지 않는 컬럼이 멀티 인덱싱의 첫번째 index라면 그렇지 않은 경우보다 검색 시간이 오래걸릴 것입니다.

 이러한 상황을 방지하기위해 멀티 인덱싱을 생성한다면, index로 가장 적합한 순서대로 적용해야 합니다.

 

 

728x90
반응형