본문 바로가기

Computer Science

[데이터베이스] CS 질문 리스트 정리

반응형
SMALL

 

과거의 공부 기록을 정리한다.

 

🗂️ 데이터베이스 특징에 대해 설명해주세요.

실시간 접근성, 지속적인 변화, 동시 공용, 내용에 의한 참조가 있습니다.

 

✍️ 실시간 접근성: 비정형적인 질의에 의하여 실시간 처리에 대한 응답이 가능해야 합니다.

✍️ 지속적인 변화: 데이터베이스의 상태는 동적으로, 항상 최신 데이터를 유지해야 합니다.

✍️ 동시 공용: 다수의 사용자가 동시에 같은 내용의 데이터를 이용할 수 있어야 합니다.

✍️ 내용에 의한 참조: 데이터를 참조할 때 사용자가 요구하는 데이터의 내용으로 찾을 수 있어야 합니다.

 


🗂️ 데이터베이스의 언어에 대해 설명해주세요.

DDL, DML, DCL이 있습니다.

 

✍️ DDL: 정의어로, 데이터베이스의 구조를 정의, 수정, 삭제할 수 있습니다.

✍️ DML: 조작어로, 데이터베이스 내 자료를 CRUD 할 수 있습니다.

✍️ DCL: 제어어로, 데이터에 대해 무결성 유지, 병행 수행 제어, 보호와 관리를 위한 언어입니다.

 

 

select 쿼리의 수행 순서를 설명해주세요.

1. FROM, ON, JOIN
2. WHERE, GROUP BY, HAVING
3. SELECT
4. DISTINCT
5. ORDER BY
6. LIMIT
순서로 진행됩니다.

 

 

트리거(Trigger)에 대해 설명해주세요.

특정 테이블에 대한 이벤트에 대해 DML문이 수행되었을 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램입니다.

 

 

Inner Join과 Outer Join의 차이에 대해 설명해주세요.

Inner Join은 서로 연관된 내용만 검색하는 조인 방법으로, 교집합의 의미와 비슷합니다.
Outer Join은 한 쪽에는 데이터가 있고, 한 쪽에는 없는 경우 있는 쪽의 내용을 전부 출력하는 조인 방법입니다.

 

 

Group By의 역할에 대해 설명해주세요.

특정 칼럼을 기준으로 연산한 결과를 집계 키로 정의하여 그룹을 짓는 역할을 수행합니다.
데이터의 중복도 제거되는 특징이 있습니다.

 

 

DELETE, TRUNCATE, DROP의 차이에 대해 설명해주세요.

DELETE는 특정 데이터를 지우는 것입니다. 테이블의 용량은 변하지 않으며, 되돌릴 수 있습니다.
TRUNCATE는 전체 데이터를 지우는 것입니다. 테이블의 용량은 줄어들며, 되돌릴 수도 없습니다.
DROP은 테이블 자체를 삭제하는 것입니다. 삭제 후 되돌릴 수 없습니다.

 

 

HAVING과 WHERE의 차이에 대해 설명해주세요.

HAVING은 그룹을 필터링하는 데 사용되고, WHERE는 개별 행을 필터링하는 데 사용됩니다.

 

 

JOIN에서 ON과 WHERE의 차이에 대해 설명해주세요.

ON은 JOIN 전에 필터링되고, WHERE은 JOIN 후에 필터링됩니다.

 


🗂️ 인덱스(Index)에 대해 설명해주세요.

특정 칼럼 값을 가지고 있는 데이터를 빠르게 찾기 위해 사용되는 것입니다.

 

 

장단점은 무엇인가요?

인덱스는 항상 정렬된 상태를 유지하기 때문에 값 조회에는 빠르지만,
새로운 값을 추가하거나 수정, 삭제하는 경우에는 쿼리가 느려집니다.

 

✍️ 조회가 많은 칼럼에는 인덱스 사용을 지향하고, 값의 변경이 많은 칼럼에는 인덱스 사용을 지양하는 것이 좋습니다.

 

 

DBMS에서는 인덱스를 어떻게 관리하고 있나요?

주로 B+Tree 또는 해시 테이블 자료구조로 관리합니다.

B+Tree는 B-Tree의 리프 노드들을 LinkedList로 연결시켜 순차 검색을 용이하게 한 것입니다.
해시 테이블은 칼럼 값으로 생성된 해시를 기반으로 인덱스를 구현합니다. 속도가 빠르지만, 부등호 범위와 같은 연속적인 데이터 검색은 불가능합니다.

 

✍️ B+Tree는 B-Tree의 리프 노드들을 LinkedList로 연결시켜 순차 검색을 용이하게 합니다.

✍️ 해시 테이블은 해시 값을 기반으로 인덱스를 구하기 때문에 O(1)이라는 빠른 속도를 보장합니다. 하지만 부등호 범위와 같은 연속적인 데이터 검색은 불가능합니다.

 


🗂️ 정규화에 대해 설명해주세요.

하나의 릴레이션에 하나의 의미만 존재하도록 릴레이션을 분해하는 과정입니다.
데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성을 목적으로 합니다.

 

✍️ 제 1정규형: 테이블 칼럼이 원자 값을 갖도록 한다.

✍️ 제 2정규형: 기본키가 아닌 속성이 기본키에 완전 함수 종속이도록 한다. (기본키로 모두 식별 가능해야 함)

✍️ 제 3정규형: 이행 함수 종속을 제거합니다. (X->Y, Y->Z 일 때, X->Z 만족)

✍️ BCNF 정규형: 함수 종속성 X->Y가 성립할 때, 모든 결정자 X가 후보키(유일성, 최소성 만족)가 되도록 분해한다.

 

 

이행 함수 종속은 왜 제거해야 할까요?

이상 현상이 발생할 수 있기 때문입니다.

예를 들어, 학생, 과목명, 수강 금액이 이행 함수 종속을 만족하는 가정을 들어보겠습니다.
이 때 과목명 데이터가 변경된다면, 수강 금액 데이터 값도 변경되어야 일관성을 유지할 수 있습니다.
이와 같이 이상 현상이 발생할 수 있기 때문에 제거해야 하는 종속입니다.

 

 

장단점에 대해 설명해주세요.

정규화는 DB 변경 시 발생할 수 있는 이상현상의 문제를 막을 수 있고, 구조 확장에 유연합니다.
하지만 릴레이션 분배로 인해 조인 연산이 증가하고, 이로 인해 질의에 대한 응답 시간이 느려질 수 있습니다.

 

 

역정규화의 필요성에 대해 설명해주세요.

정규화로 인해 조인 연산이 늘어나면서 질의 응답 시간이 느려질 수 있습니다. 즉, 성능이 저하될 수 있습니다.
때문에 읽기 작업이 많은 DB의 성능을 향상시키기 위해 역정규화를 필요로 할 수 있습니다.

 


🗂️ 이상 현상에 대해 설명해주세요.

테이블을 잘못 설계하여, 데이터를 삽입/수정/삭제할 때 생기는 논리적 오류입니다.

 

 

이상 현상의 종류에 대해 설명해주세요.

삽입 이상, 갱신 이상, 삭제 이상이 있습니다.

삽입 이상은 데이터를 삽입할 때, 특정 속성에 해당하는 값이 없어 NULL을 입력해야 하는 상황입니다.
갱신 이상은 데이터를 갱신할 때, 중복된 데이터 중 일부만 갱신되어 모순이 발생하는 상황입니다.
삭제 이상은 데이터를 삭제할 때, 의도하지 않은 정보까지 삭제되는 상황입니다.

 


🗂️ SQL Injection에 대해 설명해주세요.

공격자가 악의적인 의도를 갖는 SQL을 삽입하여, 데이터베이스를 비정상적으로 조작하는 공격 기법입니다.

 

 

방어 기법에 대해 설명해주세요.

사용자의 입력이 쿼리에 동적으로 영향을 주는 경우, 입력 값이 개발자가 의도한 값인지 검증합니다.
또는, 저장 프로시저를 사용할 수 있습니다.

 

✍️ 저장 프로시저: 사용하고자 하는 쿼리에 미리 형식을 지정하는 것

 


🗂️ RDBMS와 NoSQL의 차이에 대해 설명해주세요.

RDBMS는 2차원 테이블 형태로 표현됩니다. 스키마에 맞춰 데이터를 관리하기 때문에 정합성을 보장할 수 있지만, 시스템이 커질수록 쿼리가 복잡해지고 성능이 저하되며 Scale-out이 어렵습니다.
NoSQL은 컬렉션 형태로 표현됩니다. 스키마가 없어 데이터를 자유롭게 관리할 수 있지만, 데이터의 중복이 발생하며 중복 데이터를 수정할 경우 정합성이 깨지거나, 모든 컬렉션에서 동일한 수정 작업을 수행해야 합니다.

 

 

RDBMS와 NoSQL이 각각 적합한 경우에 대해 설명해주세요.

RDBMS는 다중 행 트랜잭션에 적합하고,
NoSQL은 JSON과 같은 비정형 데이터에 적합합니다.

 

✍️ NoSQL는 거의 다중 트랜잭션을 지원하지 않지만, 몽고디비 같은 일부에서는 지원한다. 하지만 성능이 떨어진다고 한다.

 


🗂️ 트랜잭션에 대해 설명해주세요.

트랜잭션은 작업의 완전성을 보장해주는 기능입니다.
모두 성공하거나, 취소하고, 일부만 처리되었을 경우 전체를 취소합니다.

 

 

트랜잭션의 특징에 대해 설명해주세요.

원자성, 일관성, 독립성, 영속성이 있습니다.

원자성은 작업이 모두 반영되거나 실패해야 합니다.
일관성은 실행 완료 후 항상 일관성을 유지해야 합니다.
독립성은 둘 이상의 트랜잭션이 실행될 경우 서로의 연산에 끼어들 수 없어야 합니다.
영속성은 완료된 결과는 영구적으로 반영되어야 합니다.

 


🗂️ DB 락에 대해 설명해주세요.

DB 락은 트랜잭션 처리의 순차성을 보장하기 위한 것입니다.
크게 공유락과 베타락으로 나뉩니다.

 

 

✍️ 공유락: 데이터를 읽을 때 사용하는 락으로, 같은 공유락끼리는 동시 접근이 가능하다. (베타락 허용 X)

✍️ 베타락: 데이터를 변경할 때 사용하는 락으로, 트랜잭션이 종료되기 전까지 유지되며, 베타락이 끝나기 전까지 접근을 허용하지 않는다.

 


🗂️ Elastic Search의 키워드 검색과 LIKE 검색의 차이에 대해 설명해주세요.

Elastic Search의 키워드 검색은 알고리즘을 통해서 가장 유사한 순서대로 결과를 나타냅니다.
LIKE 검색은 와일드 카드로 시작하지 않는 경우에만 인덱스를 사용하고, 나머지는 전체를 탐색하기 때문에 상대적으로 느립니다.

 

✍️ Elastic Search: 자바 오픈 소스 분산 검색 엔진으로, 방대한 양의 데이터를 신속하게 처리한다.

 


🗂️ 옵티마이저에 대해 설명해주세요.

SQL을 효율적으로 처리하기 위해 최적의 처리 경로를 생성해주는 DBMS 내부 핵심 엔진입니다.
쿼리에 대한 여러가지 실행 계획을 세우고, 최고 효율의 실행 계획을 결정하여 쿼리를 수행합니다.

 


🗂️ DB 튜닝에 대해 설명해주세요.

DB 시스템의 전체적인 성능을 개선하는 작업입니다.

1단계로, 모델링 관점에서 DB 설계 튜닝을 진행합니다.
2단계로, 환경 관점에서 DBMS 튜닝을 진행합니다.
3단계로, 앱 관점에서 SQL 튜닝을 진행합니다.

 


🗂️ 데이터베이스 클러스터링(clustering)과 리플리케이션(replication)의 차이에 대해 설명해주세요.

클러스터링은 여러 개의 DB를 수평적 구조로, 리플리케이션은 수직적 구조로 구축하는 방식입니다.

 

✍️ 클러스터링

- 일관성 있는 데이터를 얻을 수 있습니다.

- 하나의 DB에 장애가 생겨도 전체에 영향을 주지 않습니다. (같은 데이터를 가지고 있기 때문)

- 하나의 DB에 몰리는 부하를 여러 DB로 분산시킬 수 있습니다.

- 저장소 하나를 공유하면 병목 현상이 발생할 수 있고, 서버를 동시에 운영하기 위한 비용이 증가합니다.

 

✍️ 리플리케이션

- 비동기 방식으로 진행되어 지연 시간이 거의 없습니다.

- master DB는 읽기/쓰기를, slave DB는 읽기를 담당합니다.

- 데이터 동기화가 100% 보장되지 않아, 일관성 있는 데이터를 얻지 못할 수도 있습니다. (동기화되지 않은 짧은 순간)

- master DB에 문제가 발생하면 장애 대처가 까다롭습니다.

  1️⃣ master DB를 직접 회복할 경우: 데이터 손실은 절대 없지만, 복구 전까지 쓰기 작업이 불가하다.

  2️⃣ slave DB를 승격시킬 경우: 빠른 대처가 가능하지만, 데이터 손실이 발생할 수 있다.

 


References

https://skasha.tistory.com/36

https://victorydntmd.tistory.com/308

https://velog.io/@paki1019/%EA%B3%B5%EC%9C%A0-%EB%9D%BDShared-Lock%EA%B3%BC-%EB%B2%A0%ED%83%80-%EB%9D%BDExclusive-Lock#%EA%B3%B5%EC%9C%A0-%EB%9D%BDshareds-lock

https://bottleh.netlify.app/backend/RDBMS%20vs%20NoSQL/

https://www.integrate.io/ko/blog/the-sql-vs-nosql-difference-ko/

https://parkmuhyeun.github.io/etc/database/2022-08-22-Normalization/

https://developer111.tistory.com/8

반응형
LIST