새소식

반응형
CS/DB

DB 면접 대비 질문 리스트업

  • -
728x90
반응형
  • DB는 관련 직무가 아니라면 CS 중에서도 우선순위가 낮은 것 같다.
  • 진행한 프로젝트에서 DB 사용 경험이 있다면, 그 위주로 준비하기.

 

톺아보기

데이터 베이스는 왜 사용할까요?

⭐️ 사용해보신 DB 종류가 어떤 게 있나요?

⭐️ 왜 해당 DB를 선택하셨나요?

다른 DB를 사용한다면? (RDB라면 NoSQL로, NoSQL 이라면 RDB로 바꾼다면?)

가장 큰 데이터를 다룬 프로젝트는 무엇인가요? 데이터 양이 많아질 때 어떻게 하면 효율적으로 관리가 가능할까요?

(AI) 데이터 베이스를 모델과 어떻게 연결했고, 데이터를 이용한 재학습은 어떻게 했나요?

 

DB 구조 & 설계
🔺 key와 관련된 기본적인 용어
🔺 실제 프로젝트에서 마주할 수 있는 상황을 예시로 주면서 N:M 관계로 데이터베이스를 설계해 보라는 질문

 

⭐️ Primary key가 무엇인지 설명해 주세요.

더보기

후보키 중 선택한 main key로써, 각 row를 unique하게 구분하는 column(또는 column의 집합)을 말합니다.

그래서 기본키는 테이블 당 1개로 Null 값을 가질 수 없고, 중복된 값을 가질 수 없습니다.

기본키가 되기 위한 필요 조건은?

더보기

유일성, 최소성을 만족해야 하고, 기본키가 되는 컬럼은 NULL 값을 가질 수 없습니다.

  • 유일성은 테이블 내 하나의 row를 유일하게 식별할 수 있어야 함을 의미하고,
  • 최소성은 유일성을 만족하는 집합에서 하나의 컬럼만 없어져도 유일성을 잃어버림을 의미합니다.

후보키, 기본키, 대체키, 외래키, 슈퍼키란?

더보기
  • 슈퍼키는 각 row를 유일하게 식별할 수 있는 하나 또는 그 이상의 속성들의 집합입니다.
  • 후보키는 슈퍼키 중 최소성을 만족하는 속성의 집합입니다.
  • 기본키는 후보키 중 선택된 하나의 키입니다.
  • 대체키는 기본키를 제외한 나머지 후보키 입니다.
  • 외래키는 참조하는 테이블의 기본키로, 각 테이블의 관계를 맺을 때 사용합니다.

⭐️ 관계형 데이터베이스의 N:M 관계에 대해서 설명해 주세요.

더보기

관계형 데이터베이스에서 양쪽 entity 모두가 서로에게 1:N 관계를 갖는 구조를 말합니다.

보통 N:M 관계는 새로운 테이블을 통해 관계를 맺습니다. 예를 들어 학생 테이블과 수강 과목 테이블이 있다고 한다면, 학생과 수강 과목 테이블의 primary key를 foreign key로 갖는 “수강신청”이라는 새로운 테이블을 만들어 N:M 관계를 나타낼 수 있습니다.

1:N 관계에 대해서 설명해 주세요.

더보기

관계형 데이터베이스에서 하나의 entity(table)가 관계를 맺은 entity의 여러 객체를 가질 수 있는 구조를 말합니다.

보통 primary key - foreign key 구조로 나타낼 수 있습니다.

left outer join, inner join 차이를 설명해 주세요

더보기

Join이란 두 개 이상의 테이블을 서로 연결하여 하나의 결과를 만들어 보여주는 것을 말합니다.

inner join(또는 join)은 두 테이블에 공통된 데이터가 존재하는 행에 대해서만 join 되는 방식이고,

left outer join(또는 left join)은 왼쪽 table의 모든 행에 대해서 join을 진행하는 방식입니다.

데이터 정규화란?

더보기

관계형 DB에서 중복을 최소화하기 위해 데이터를 구조화하는 작업을 의미합니다.

제1 정규화는 테이블의 컬럼이 하나의 값을 갖도록 테이블을 분해하는 것이고,

제2 정규화는 제1 정규화를 만족하는 테이블에 대해 모든 컬럼이 기본키가 아니거나 기본키의 부분 집합에 의해 유일하게 식별되지 않도록 (완전 함수 종속을 만족하도록) 테이블을 분해하는 것입니다.

제3 정규화는 제2 정규화를 만족하는 테이블에 대해 이행적 종속을 없애도록 테이블을 분해하는 것입니다.

(이행적 종속이란 A, B, C 3개의 속성이 있을 때, A가 B에 종속되고, B가 C에 종속되는 경우 A가 C에 종속되는 관계가 성립되는 것을 의미합니다.)

BCNF 정규화란 제3 정규화를 진행한 테이블에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것입니다.

Stored PROCEDURE 란?

더보기

사전 컴파일된 SQL 쿼리의 모음으로, 사전에 준비해 둔 명령을 자동으로 실행할 수 있어 작업의 효율성을 높일 수 있습니다.

첫 실행 시에 컴파일 과정을 거쳐 버퍼 풀 내에 있는 플랜 캐시에 해당 계획이 저장되므로 두 번째 실행부터는 플랜 캐시 내에 있는 계획을 토대로 쿼리를 해서 최적의 실행을 수행할 수 있습니다.

데이터베이스 뷰란?

더보기

허용된 데이터를 제한적으로 보여주기 위해 하나 이상의 테이블에서 유도된 가상 테이블입니다.

테이블이 아닌 뷰를 사용하는 이유는 대체로 사용자의 편의와 데이터베이스 보안 때문입니다. 원본 테이블에 접근하지 않아도 사용자가 임의의 뷰를 구성해 별도의 이름을 붙이거나 접근 가능한 사람을 지정할 수 있습니다.

 

 

SQL vs NoSQL ⭐️

 

⭐ RDB과 NoSQL를 비교 설명해 주세요.

더보기

관계형 데이터베이스(RDB)는 사전에 엄격하게 정의된 DB schema를 요구하는 table 기반 데이터 구조를 갖고, transaction을 보장합니다.

NoSQL(비관계형 데이터베이스)은 스키마없이 유연한 데이터 구조를 가져 비정형 데이터를 저장할 수 있고 scale out에 용이하지만 transaction이 보장되지 않습니다.

NoSQL에는 어떤 종류가 있나요?

더보기

NoSQL은 데이터를 저장하는 방식에 따라 다른데, 저는 Key-Value DB, Document DB, Wide Column DB, Graph DB 를 알고 있습니다.

  • Key-Value DB는 말 그대로 key와 value 쌍으로 데이터가 저장되는 유형으로 key는 값에 접근하기 위한 unique 한 값을 갖고, value에는 문자열 뿐 아니라 이미지나 비디오 등 어떤 형태의 데이터든 담을 수 있습니다.
  • Document DB는 Key-Value DB와 유사하나 Value가 JSON 이나 XML 형식의 문서라는 점이 다릅니다.
  • Wide Column DB는 행마다 다른 값과 다른 수의 스키마를 가질 수 있는 DB입니다.
  • Graph DB는 그래프 구조로 데이터를 표현하고 저장하며 질의도 그래프 순회로 이루어지는 DB입니다.

언제 NoSQL을 사용하면 좋을까요?

더보기
  • 대용량 데이터를 저장해야할 때
  • 도메인에 필요한 자료형태가 NoSQL에 적합한 경우
  • 예를 들어 데이터를 모두 그래프로 사용하는 도메인인 경우, 그래프 데이터 베이스를 사용하면 그래프에 최적화된 API를 사용할 수 있습니다.

RDB는 언제 사용하면 좋을까요?

더보기

RDB는 데이터 구조가 명확하여 변경될 여지가 없는 경우, 또 데이터 중복이 없으므로 데이터 update가 잦은 시스템에서 사용하면 좋습니다.

본인이라면 RDB와 NoSQL 기술을 결정해야 할 때 어떤 기준을 가지고 결정하시겠어요?

더보기

저장할 데이터에 따라 다를 것 같습니다. 만약 데이터의 구조가 명확하고 관계를 맺는 데이터가 자주 변경된다면, 또는 금융 서비스처럼 트랜잭션이 보장되어야 할 때는 RDB를 선택할 것입니다.

반면 정확한 데이터 구조가 없거나 변경될 수 있는 경우거나, 변경보다는 읽는 작업이 많을 때, 또는 다뤄야 하는 데이터의 양이 매우 많을 때는 NoSQL을 사용할 것입니다.

Elastic Search 에 대해 설명해주세요

더보기

엘라스틱 서치는 No-SQL 중 하나로 역 색인을 통해 데이터를 RDBMS보다 훨씬 빠르게 찾을 수 있어 검색엔진으로 사용되는 DB입니다. 역 색인은 문서 내의 문자와 같은 내용물의 맵핑 정보를 색인하는 것으로, 책 뒷표지에 색인된 키워드를 이용해 역으로 본문을 찾는 방식입니다.

Redis 란?

더보기

인메모리 DB로 데이터를 키, 값으로 메모리에 저장하고 관리하는 DB 입니다. 하지만 데이터를 유한하게 저장하기 때문에 캐시 등과 같이 데이터 저장기한이 있고, 빠른 성능이 필요한 기능에 사용됩니다.

 

 

 

트랜잭션 transaction ⭐️
🔺 Index다음으로 가장 자주 나오는 질문
🔺 transaction에 대한 설명과 ACID가 무엇을 뜻하는지를 정확하게 이해

 

은행 계좌 데이터 베이스이 관계형 데이터 베이스이고, 이름/잔액 두 가지 column을 가진다고 하자. A가 B에게 만원을 송금할 때, 실제로 데이터 베이스에서는 어떤 과정으로 이루어질까요?

 

⭐ Transaction을 간단히 설명해 주세요.

더보기

transaction는 데이터베이스 내에서 수행되는 작업의 최소 단위로, 데이터베이스의 무결성을 유지하며 DB의 상태를 변화시키는 기능을 수행합니다.

transaction은 하나 이상의 query를 포함해야 하고, ACID라고 칭해지는 원자성, 일관성, 고립성, 지속성의 4가지 규칙을 만족해야합니다.

트랜잭션을 보장하기위해 DBMS에는 무엇이 필요할까요? 예를 들면 트랜잭션에서 rollback 하는 경우 이전 데이터로 복구를 해야하는데, 이를 DBMS에서는 어떻게 지원해줄 수 있을까요?

더보기
  • 페이지 버퍼 (UNDO 복구를 위해)
  • Locking 과 같은 함수 기능

트랜잭션의 Islation level에는 어떤게 있나요?

더보기

트랜 잭션 격리수준은 멀티-트랜잭션 환경에서 발생할 수 있는 이상현상에 대해 고립 수준을 정해서 동시성을 제어하는 방법이며 4가지가 있습니다.

  1. read-uncommitted: 다른 트랜잭션이 커밋하지 않은 데이터에 대해서도 조회할 수 있는 고립수준으로. dirty-read 문제가 발생합니다.
  2. read-committed: 다른 트랜잭션이 커밋한 데이터에 대해서만 조회할 수 있는 고립수준으로 dirty-read 문제는 발생하지 않지만 unrepeatable-read 문제가 발생합니다.
  3. repeatable-read: 현재 트랜잭션이 시작하기 이전에 커밋된 데이터에 대해서만 조회할 수 있는 고립수준으로 unrepeatable-read 문제는 발생하지 않지만 phantom-read 문제가 발생합니다.
  4. serializable: 가장 높은 고립수준으로 3가지 이상현상이 모두 발생하지 않지만 동시성이 가장 떨어지는 고립수준입니다.

트랜잭션과 Locking은 각각 무엇을 위한 기능인가요?

더보기

잠금은 동시성을 제어하기 위한 기능이고 트랜잭션은 데이터의 정합성을 보장하기 위한 기능

ACID 4가지 특징은?

더보기
  • Atomicity(원자성) : transaction에 포함된 작업은 전부 수행되거나 아니면 전부 수행되지 말아야 합니다. (all or nothing)
  • Consistency(일관성): transaction이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다. 송금 전후 모두 잔액의 data type은 integer이여야 한다는 것이 일관성의 한 예가 될 수 있습니다.
  • Isolation(고립성): 여러 Transaction은 동시에 수행됩니다. 이때 각 transaction은 다른 transaction의 연산 작업이 끼어들지 못하도록 보장하여 독립적으로 작업을 수행해야 합니다.
  • Durability(지속성): 성공적으로 수행된 transaction은 데이터베이스에 영원히 반영되어야 함을 의미합니다.

COMMIT과 ROLLBACK에 대해 설명해보세요.

더보기

데이터베이스는 COMMIT과 ROLLBACK 명령어를 통해 데이터 무결성을 보장합니다.

COMMIT이란 transaction 작업을 완료했다고 확정하는 명령어로 transaction 작업 내용을 실제 DB에 저장하고, DB가 변경됩니다.

ROLLBACK은 작업 중 문제가 발생했을 때, transaction 처리 과정에서 발생한 변경 사항을 취소하고, 이전 COMMIT의 상태로 되돌립니다.

 트랜잭션에서 발생할 수 있는 데드락이 뭔지 설명해주세요.

더보기

두 transaction이 각각 lock을 설정하고, unlock을 하지 않은 상태에서 서로의 lock이 걸린 데이터에 접근하려고 할 때, 서로 대기를 계속해 영원히 처리되지 않는 상황이 발생합니다. 이런 상황이 트랜잭션에서 발생할 수 있는 데드락입니다.

deadlock을 해결하려면 어떻게 해야 하나요?

더보기

각 transaction이 실행되기 전에 사용될 모든 데이터를 미리 locking을 해주는 예방 기법이 있고, 자원 할당시 timestamp를 사용하여 deadlock이 발생하지 않도록 회피하는 기법이 있습니다. 또한 deadlock이 발생하면 이를 감지하고 회복시키는 탐지/회복기법이 있습니다.

  • timestamp를 사용하는 방식이란, 트랜잭션이 시작된 시간을 timestamp로 기록하고, 일찍 시작한 트랜잭션과, 늦게 시작한 트랜잭션 각 각이 데드락을 일으켰을 때 정책을 정해놔서 정책대로 처리하는 방식
  • 정책1(Wait-die): 일찍 시작한 트랜잭션은 대기 가능/늦게 시작한 트랜잭션은 rollback 시킴정책2(Wound-wait): 늦게 시작한 트랜잭션은 대기 가능/일찍 시작한 트랜잭션은 rollback 시킴

 

 

⭐ 인덱스 Index
🔺 가장 중요하고 자주 나오는 내용
🔺 Index가 왜 필요하고 어느 상황에서 필요한지 묻는 질문

 

DB 조회 성능을 높일 수 있는 방법은 뭐가 있을까요?

더보기

SELECT query의 성능을 높이는 가장 대표적인 방법중에 하나는 Index를 사용하는 것입니다. index를 사용하게 되면 SELECT WHERE절처럼 특정 조건을 만족하는 데이터를 검색할 때 table의 모든 데이터를 살펴볼 필요 없이 index에서 빠르게 해당 데이터에 접근할 수 있게 됩니다.

⭐ 인덱스를 어느 column에 사용하는 것이 좋을까요?

더보기

인덱스는 where 절에서 자주 조회되고, 수정 빈도가 낮고, 중복의 수는 적은 컬럼을 선택하는 것이 좋습니다.

인덱스가 좋으면 모든 컬럼 마다 인덱스를 걸어놓으면 되지 않을까요?

더보기

인덱스를 사용하면 추가 저장 공간이 필요하고, 데이터를 추가/수정/삭제 할 때마다 관련 인덱스를 수정하는 연산이 추가적으로 필요하기 때문에 무분별하게 인덱스를 만들면 오히려 성능 저하를 초래할 수 있습니다.

따라서 인덱스를 사용함으로써 추가되는 연산량에 대비해 조건 검색의 성능 향상이 크다고 판단되는 컬럼에만 인덱스를 걸어놓는 것이 좋습니다.

회사 고객 DB에서 성별 Column에 Index를 걸어주는게 좋을까요?

더보기

성별처럼 남녀 두 종류로만 나눠지는 경우에는 카디널리티가 매우 낮고, 선택도는 높게 됩니다. 이경우 index가 주는 이점이 적고 오히려 저장공간 차지와 데이터 수정시 성능 저하 등을 고려했을 때 index를 생성하지 않는 것이 좋습니다.

테이블에 설정될 수 있는 인덱스의 형태들은 어떤게 있나요?

더보기

클러스터드 인덱스와 넌클러스터드 인덱스가 있습니다.

  • 클러스터드 인덱스는 인덱스의 순서대로 실제 레코드가 위치하는 형태로 테이블 당 1개를 만들 수 있습니다.
  • 넌클러스터드 인덱스는 물리적으로 데이터를 정렬하지 않고 별도의 공간에 인덱스를 생성해 물리 데이터의 위치 pointer를 같이 저장해 하나의 테이블에서 여러 개의 넌클러스터드 인덱스를 생성할 수 있습니다.

⭐ 데이터를 검색을 할 때 hash table의 시간복잡도는 O(1)이고 b+tree는 O(logn)으로 더 느린데 왜 index는 hash table이 아니라 b+tree로 구현되나요?

더보기

데이터베이스에서는 범위 조건으로 조회하는 경우도 많기 때문입니다.

해시 테이블의 경우 하나의 데이터를 탐색하는 시간은 O(1)로 b+tree 보다 빠르지만, 값이 정렬되어 있지 않기 때문에 범위를 탐색해야하는 query에 대해서는 매우 비효율적이 됩니다.

B+tree의 경우 내부적으로 자료들이 정렬되어 있어 범위 조건 쿼리 시 빠르게 검색을 할 수 있습니다. 또한 탐색 뿐 아니라 저장, 수정, 삭제에도 항상 O(logN)의 시간 복잡도를 갖습니다.

 

 

데이터 베이스 확장

 

데이터 베이스를 확장하는 방법은?

더보기

데이터를 확장하는 방법으로는 수직적으로 확장하는 리플리케이션, 수평적으로 확장하는 클러스터링, 그리고 수평적으로 분할하는 샤딩이 있습니다.

리플리케이션과 클러스터링이란 무엇인가요?

더보기

리플리케이션은 여러 개의 DB를 수직적인 구조로 구축하는 방식입니다. 하나의 master DB에서는 쓰기 작업만 하고, 여러 개의 slave DB에서는 읽기 작업만 함으로 기존의 트래픽을 분산합니다.

클러스터링은 여러 개의 DB를 수평적인 구조로 구축하는 방식입니다. 서버를 확장해서 Fail over 시스템을 구축하기 위해 주로 사용하는데, 하나의 DB가 동작하지 않더라도 다른 DB를 통해 계속해서 서비스를 제공할 수 있도록 하는 방식입니다.

클러스터링의 단점은?

더보기

일반적으로 리플리케이션에 비해 성능이 떨어지고 동기화 방식이기 때문에 만약 에러가 전파되면 처리하기 까다롭다는 단점이 있습니다.

리플리케이션의 단점은?

더보기

리플리케이션은 비동기 방식이기 때문에 일관성 있는 데이터 신뢰가 불가능하고, 만약 Master 노드가 다운되면 복구나 대처가 까다롭다는 단점이 있습니다.

DB 샤딩이란?

더보기

DB 샤딩이란 같은 테이블 스키마를 가진 데이터를 다수의 DB에 분산해 저장하는 방법으로, DB 트래픽을 분산하기 위해 수행합니다. 샤딩 DB 간 Join 연산이 불가하기 때문에 trade-off가 발생하고, 만약 한 쪽 샤드로 몰리면 샤딩이 무의미해지므로 분산 저장을 위한 샤딩 키를 적절하게 잘 찾는 것이 성능에 큰 영향을 미치게 됩니다.

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.