💡 데이터베이스의 특징에 대해 설명해주세요.
- 데이터베이스는 비정형적인 질의(조회)에 대하여 실시간 처리에 의한 응답이 가능해야 하며(실시간 접근성)
- 새로운 데이터의 삽입, 삭제, 갱신으로 항상 최신의 데이터를 유지해야 합니다(지속적인 변화).
- 또한 데이터베이스는 서로 다른 목적을 가진 여러 응용자들을 위한 것이므로 다수의 사용자가 동시에 같은 내용의 데이터를 이용할 수 있어야 하고(동시 공용)
- 데이터베이스에 있는 데이터를 참조할 때 데이터 레코드의 주소나 위치에 의해서가 아니라 사용자가 요구하는 데이터의 내용으로 참조할 수 있어야 합니다(내용에 의한 참조).
💡 데이터베이스 언어(DDL, DML, DCL)에 대해 설명해주세요.
- 정의어(DDL; Data Definition Language)란 데이터베이스의 구조를 정의, 수정, 삭제하는 언어로 ALTER, CREATE, DROP 등이 이에 속합니다.
- 조작어(DML; Data Manipulation Language)란 데이터베이스 내의 자료 검색, 삽입, 갱신, 삭제를 위한 언어로 SELECT, INSERT, UPDATE, DELETE가 이에 속합니다.
- 제어어(DCL; Data Control Language)란 데이터에 대한 무결성 유지, 병행 수행 제어, 보호와 관리를 위한 언어로 COMMIT, ROLLBACK, GRANT, REVOKE가 이에 속합니다.
💡 SELECT 쿼리의 수행 순서에 대해 설명해주세요.
- 우선 FROM 절에서 각 테이블을 확인하고
- 만약 JOIN 절이 있다면 ON 절을 통해 JOIN 조건을 먼저 확인한 다음 JOIN을 수행하여 데이터가 SET로 모아지게 됩니다.
- 이후 형성된 데이터셋의 개별 행에 WHERE 절의 조건이 적용되고
- 만약 GROUP BY 절이 있다면 WHERE 조건 적용 후 나머지 행이 GROUP BY 절에 지정된 열의 공통값을 기준으로 그룹화되고
- 이후 HAVING 절의 제약조건이 그룹화된 행에 적용됩니다.
- 마지막으로 SELECT 절에 표현된 식이 적용되며
- ORDER BY 절이 있다면 형성된 데이터를 특정 기준에 따라 오름차순 또는 내림차순으로 정렬하여 출력하게 됩니다.
💡 트리거(Trigger)에 대해 설명해주세요.
- 트리거는 특정 테이블에 대한 이벤트에 반응해 INSERT, DELETE, UPDATE와 같은 DML 문이 수행되었을 때, 데이터베이스에서 자동으로 동작하도록 작성된 프로그램을 말합니다.
- 따라서 트리거를 사용하면 트랜잭션에 의해 자동으로 다른 명령을 일으킴으로써 업무처리를 자동화할 수 있습니다.
- 예를 들어, 고객이 물건을 구매해 구매 테이블에 정보가 insert되면, 등록된 트리거가 발동해 물품 테이블에서 자동으로 update 쿼리문을 실행하게 하고, 또 등록된 트리거가 발동해 배송테이블에 insert 쿼리문을 실행시키게 끔 할 수 있는 것입니다.
- 다만 너무 과도하게 사용한다면 복잡한 상호 의존성을 야기할 수 있습니다(트리거의 연쇄).
💡 Index에 대해 설명해주시고, 장점과 단점에 대해 아는대로 말해주세요.
- 인덱스란 추가적인 쓰기 작업과 저장공간을 활용하여 데이터베이스 테이블의 검색 속도를 향상시키기 위한 자료구조입니다.
- DB를 책으로 비유하자면 인덱스는 그 책의 색인과 같다고 말할 수 있습니다.
- 인덱스는 항상 정렬된 상태를 유지하기 때문에 원하는 값을 빠르게 검색하는데 유용하지만
- 인덱스를 관리하기 위해 DB의 약 10%에 해당하는 저장공간이 추가로 필요하며, 인덱스가 적용된 컬럼에 INSERT, UPDATE, DELETE 연산을 수행할 경우 인덱스에 대한 추가적인 연산을 수행해주어야 하기 때문에 그에 따른 오버헤드가 발생하게 됩니다.
- 즉, 인덱스는 데이터베이스의 쓰기 성능을 어느정도 희생하는 대신, 데이터의 검색 속도를 높이는 기능이라고 할 수 있습니다.
- 💡 그렇다면 DBMS는 Index를 어떻게 관리하고 있나요? (Index의 자료구조)
- 인덱스의 자료구조에는 B+Tree와 해시 테이블이 있습니다.
- B+Tree
- B+Tree는 자식 노드가 2개 이상인 B-Tree를 개선시킨 자료구조로써, 리프 노드(데이터 노드)만 인덱스와 함께 데이터를 가지고 있고, 나머지 노드들은 데이터를 위한 인덱스 만을 갖고 있으며, 리프 노드들은 LinkedList로 연결되어 있는 자료구조입니다.
- 해시 테이블
- 해시 테이블은 (Key, Value)로 데이터를 저장하는 자료구조 중 하나로, 빠른 검색 속도를 자랑하는 자료구조입니다.
- 해시 테이블이 빠른 검색 속도를 제공할 수 있는 이유는 내부적으로 배열(버킷)을 사용하여 데이터를 저장하기 때문입니다.
- 각 Key값은 해시함수에 의해 고유한 index를 가지게 되므로, 배열에서 index를 아는 상태에서 접근하는 것과 동일하게 평균 O(1)의 시간 복잡도로 데이터를 조회할 수 있습니다.
- 검색 속도는 해시 테이블이 더 빠르지만 해시 함수는 등호(=) 연산에만 특화되어있기 때문에 부등호 연산(<, >)이 자주 사용되는 데이터베이스 검색의 특성상 해시 테이블보다는 B+Tree를 일반적으로 많이 사용합니다.
- 💡 그렇다면 DBMS는 Index를 어떻게 관리하고 있나요? (Index의 자료구조)
💡 정규화에 대해 설명해주세요.
- 정규화란 하나의 릴레이션에 하나의 의미만 존재하도록 릴레이션을 분해하는 과정이며, 데이터의 일관성, 최소한의 데이터 중복, 최대한의 데이터 유연성을 위해 적용하는 방법입니다.
- 제 1정규형은 테이블의 컬럼이 원자값을 갖도록 분해하는 것이며
- 제 2정규형은 제 1정규형을 만족하면서, 기본키가 아닌 속성이 기본키에 완전 함수 종속이 되도록 분해하는 것이고
- 제 3정규형은 제 2정규형을 만족하면서, 이행적 함수 종속을 제거하는 것이고
- BCNF 정규형은 제 3정규형을 만족하면서, 모든 결정자가 후보키가 되도록 분해해는 것입니다.
💡 역정규화를 하는 이유에 대해 설명해주세요.
- 정규화를 거치면 릴레이션 간의 연산(JOIN)이 많아지는데, 이로인해 읽기 성능이 저하될 우려가 있습니다.
- 따라서 정규화 이후에 읽기 성능에 문제가 있는 DB의 일부 쓰기 성능의 저하를 감수하고 데이터를 묶거나 복제 사본을 추가함으로써 데이터베이스의 읽기 성능을 개선하기위해 주로 사용합니다.
💡 이상 현상의 종류에 대해 설명해주세요.
- 이상 현상은 데이터의 중복으로 인해 데이터의 삽입, 삭제, 수정 연산에서 발생하는 비합리적인 현상을 말합니다.
- 이상 현상의 종류에는 크게 3가지가 있는데
- 삽입 이상이란 자료를 삽입할 때 특정 속성에 해당하는 값이 없어 NULL을 입력해야하는 현상을 말하고
- 갱신 이상이란 중복된 데이터 중 일부만 수정되어 데이터 모순이 일어나는 현상을 말하며
- 삭제 이상이란 어떤 정보를 삭제했을 때, 의도하지 않는 다른 정보까지 삭제되어버리는 현상을 말합니다.
- 이를 예방하기 위해 수행하는 것이 정규화입니다.
💡 SQL Injection이란 무엇인지 설명해주세요.
- SQL Injection은 공격자가 악의적인 의도를 갖는 SQL 구문을 삽입하여 데이터베이스를 비정상적으로 조작하는 코드 인젝션 공격 기법입니다.
- 이를 방어하기 위해서는 입력값을 검증하여 사용자의 입력이 쿼리에 동적으로 영향을 주는 경우 입력된 값이 개발자가 의도한 값인지 검증하거나 저장 프로시저를 사용하여 사용하고자 하는 쿼리의 형식을 미리 지정해놓아야 합니다.
💡 RDBMS와 NoSQL의 차이에 대해 설명해주세요.
- RDBMS
- RDBMS는 모든 데이터를 2차원 테이블 형태로 표현합니다.
- 스키마에 맞춰 데이터를 관리하기 때문에 데이터의 정합성을 보장할 수 있다는 장점이 있지만
- 시스템이 커질 수록 쿼리가 복잡해지고 성능이 저하되며 Scale-out이 어렵다는 단점도 있습니다.
- NoSQL
- NoSQL(Not Only SQL)은 RDBMS와는 달리 데이터간의 관계를 정의하지 않고, 스키마가 없으며, 컬렉션이라는 형태로 데이터를 관리합니다.
- 스키마가 없기 때문에 비교적 자유롭게 데이터를 관리할 수 있으며, 데이터 분산이 용이하여 성능 향상을 위한 Scale-out, Scale-up이 가능합니다.
- 다만 스키마가 존재하지 않기 때문에 명확한 데이터 구조를 보장하지 않아 데이터 구조 결정이 어려울 수 있습니다. 또한 데이터의 변경이 발생하면 여러 컬렉션에 중복되어 있는 데이터를 모두 수정해주어야 하는 불편함도 있습니다.
- 💡 그렇다면 RDBMS와 NoSQL은 어느 경우에 적합한가요?
- RDBMS는 관계를 맺고 있는 데이터가 자주 변경되는 경우, 데이터 구조가 확장될 가능성이 낮은 경우, 명확한 스키마가 중요한 시스템인 경우에 사용하기 적합합니다.
- NoSQL은 정확한 데이터의 구조를 알 수 없거나 변경/확장될 가능성이 높은 경우, 데이터의 변경이 자주 발생하지 않는 경우에 사용하기 적합합니다.
💡 트랜잭션이란 무엇인지 설명해주세요.
- 트랜잭션은 쪼갤 수 없는 업무 처리의 최소 단위를 말합니다.
- 트랜잭션은 작업의 완전성을 보장하며 작업들을 모두 처리하지 못한 경우 이전 상태로 복구하여, 작업의 일부만 적용되는 현상이 발생하지 않도록 기능을 수행합니다.
- 💡 트랜잭션의 특성에 대해 설명해주세요.
- 원자성(Atomicity)이란 작업이 모두 반영되던지 아니면 전혀 반영되지 않아야 하는 특성을 말하고
- 일관성(Consistency)이란 트랜잭션 이전과 이후, 데이터베이스의 상태는 이전과 같이 유효해야함을 의미합니다.
- 격리성(Isolation)이란 모든 트랜잭션은 다른 트랜잭션으로부터 독립되어야 함을 뜻하고
- 영속성(Durability)이란 트랜잭션 실행 후의 결과는 영구적으로 데이터베이스에 반영되어야 함을 의미합니다.
- 💡 트랜잭션의 특성에 대해 설명해주세요.
💡 DB Lock에 대해 설명해주세요.
- DB Lock은 트랜잭션 처리의 순차성을 보장하기 위한 방법으로, 그 종류로는 공유락과 베타락이 있습니다.
- 공유락(Shared Lock)은 Read Lock이라고도 하며, 트랜잭션이 읽기를 할 때 사용하는 락입니다. 데이터를 읽기만 하기 때문에 같은 공유락끼리는 동시에 접근이 가능합니다.
- 베타락(Exclusive Lock)은 Write Lock이라고도 하며, 데이터를 변경할 때 사용하는 락입니다. 베타락은 트랜잭션이 완료될 때까지 유지되며, 베타락이 끝나기 전까지 어떠한 접근도 허용하지 않습니다.
💡 옵티마이저(Optimizer)에 대해 아는대로 말해주세요.
- 옵티마이저는 SQL을 가장 빠르고 효율적으로 수행할 최적의 처리 경로를 생성해주는 DBMS 내부의 핵심 엔진입니다.
- 컴퓨터의 두뇌가 CPU인 것처럼 DBMS의 두뇌는 옵티마이저라고 할 수 있습니다. 개발자가 SQL을 작성하고 실행하면 즉시 실행되는 것이 아니라 옵티마이저라는 곳에서 “이 쿼리문을 어떻게 실행시키겠다!”라는 여러가지 실행 계획을 세우고, 최고의 효율을 갖는 실행계획을 판별한 후 그 실행계획에 따라 쿼리를 수행하게 되는 것입니다.
💡 DB 튜닝(Tuning)이란 무엇인지 그리고 튜닝의 3단계에 대해 설명해주세요.
- DB 튜닝이란 DB의 구조나, DB 자체, 운영체제 등을 조정하여 DB 시스템의 전체적인 성능을 개선하는 작업을 말합니다.
- 튜닝은 DB 설계 튜닝 → DBMS 튜닝 → SQL 튜닝의 단계로 진행할 수 있습니다.
- DB 설계 튜닝은 DB 설계 단계에서 성능을 고려하여 설계하는 것을 말하며
- DBMS 튜닝은 성능을 고려하여 메모리나 블록 크기를 지정하는 것을 말하고
- SQL 튜닝은 성능을 고려하여 SQL 문을 작성하는 것을 말합니다.
💡 Inner Join과 Outer Join의 차이에 대해 설명해주세요.
- inner join은 서로 연관된 내용만 검색하는 조인 방법으로, A와 B에 대해 수행했을 때 A와 B의 교집합을 말합니다.
- outer join은 한 쪽에는 데이터가 있고 한 쪽에는 데이터가 없는 경우, 데이터가 있는 쪽의 내용을 전부 출력하는 방법으로, A와 B에 대해 수행했을 때 A와 B의 합집합을 말합니다.
💡 GROUP BY의 역할에 대해 설명해주세요.
- GROUP BY는 특정 컬럼을 기준으로, 연산한 결과를 집계 키로 정의하여 그룹 짓는 역할을 수행합니다.
- 집합 연산자는 COUNT, SUM, AVG, MAX, MIN 등이 있고, DISTINCT와 같이 중복 데이터를 제거하는 특징이 있습니다.
💡 DELETE, TRUNCATE, DROP의 차이를 설명해주세요.
- DELETE는 데이터는 지우지만 테이블 용량은 줄어들지 않고 원하는 데이터만 골라서 지울 수 있습니다. 삭제 후 되돌릴 수 있습니다.
- TRUNCATE는 전체 데이터를 한번에 삭제하는 방식입니다. 테이블 용량이 줄어들고 인덱스 등도 삭제되지만 테이블은 삭제할 수 없고, 삭제 후 되돌릴 수 없습니다.
- DROP은 테이블 자체를 완전히 삭제하는 방식(공간, 인덱스, 객체 모두 삭제)이며, 삭제 후 되돌릴 수 없습니다.
💡 데이터베이스 클러스터링과 리플리케이션의 차이에 대해 설명해주세요.
- 클러스터링
- 클러스터링이란 DB를 여러 개의 서버에 수평적인 구조로 나누어 구축하는 방식입니다.
- 클러스터링을 사용할 경우 한쪽에 장애가 발생하더라도 동일한 데이터를 가진 DB로 빠른 시간내에 서비스를 재개할 수 있으며, 기존에 하나의 DB 서버에 몰리던 부하를 여러 곳으로 분산시켜 적절한 로드 밸런싱을 이룰 수 있습니다.
- 다만 서버를 동시에 운영하기 위한 비용이 많이 들게 됩니다.
- 리플리케이션
- 리플리케이션은 여러 개의 DB를 권한에 따라 수직적인 구조로 구축하는 방식입니다.
- DB 요청의 60 ~ 80% 정도가 읽기 작업이기 때문에 Replication만으로도 충분히 성능을 높일 수 있으며, 비동기 방식으로 운영되기 때문에 지연 시간이 거의 없습니다.
- 다만 노드들 간의 데이터 동기화가 보장되지 않아 일관성있는 데이터를 얻지 못할 수 있고, Master DB가 다운되면 복구 및 대처가 까다롭다는 단점이 있습니다.
💡 HAVING과 WHERE의 차이를 설명해주세요.
- HAVING은 그룹을 필터링 하는데 사용되고, WHERE는 개별 행을 필터링하는데 사용됩니다.
- HAVING절은 집계 함수(COUNT, SUM, AVG, MAX, MIN 등)와 함께 사용할 수 있으나, WHERE절은 사용할 수 없습니다(집계함수를 사용할 수 있는 GROUP BY 절보다 WHERE절이 먼저 수행되기 때문).
- 즉, WHERE는 그룹화 또는 집계가 발생하기 전 필터링하는데 사용되고, HAVING은 그룹화 또는 집계가 발생한 후 필터링하는데 사용됩니다.
💡 JOIN에서 ON과 WHERE의 차이를 설명해주세요.
- ON이 WHERE보다 먼저 실행되어 JOIN을 하기 전에 필터링을 하고(ON 조건으로 필터링이 된 레코드 간에 JOIN이 이뤄진다)
- WHERE는 JOIN을 한 후에 필터링을 합니다(JOIN을 한 결과에서 WHERE 조건절로 필터링이 이뤄진다).
💡 Primary Key와 Unique Key의 차이에 대해 설명해주세요.
- 기본키는 해당 테이블에서 식별자 역할을 수행하기 위한 컬럼으로, 중복과 널 값을 허용하지 않으며, 테이블에 하나만 존재합니다.
- 유니크키는 값의 유일성을 보장하는 컬럼으로, 중복을 허용하지 않으며, 테이블에 여러 개 존재할 수 있습니다. 또한 기본키와 달리 널 값을 허용합니다.
💡 데이터베이스 트랜잭션 격리수준에 대해 설명해주세요.
- 트랜잭션 격리수준(isolation level)이란 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어 있는지를 나타내는 것입니다.
- 즉, 간단하게 말해 특정 트랜잭션이 다른 트랜잭션에서 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것이라고 말할 수 있습니다.
- 격리수준은 크게 4가지로 나뉩니다.
- READ UNCOMMITTED는 어떤 트랜잭션의 변경 내용이 COMMIT이나 ROLLBACK 여부와 상관없이 다른 트랜잭션에서 보여지는 격리수준을 말합니다. 때문에 해당 격리수준에서는 데이터 정합성에 문제가 발생할 수 있습니다.
- READ COMMITTED는 어떤 트랜잭션의 변경 내용이 COMMIT 되어야만 다른 트랜잭션에서 조회할 수 있는 격리수준을 말합니다. 오라클 DBMS에서 기본으로 사용하고 있고, 온라인 서비스에서도 가장 많이 선택되는 격리수준입니다. 다만 하나의 트랜잭션 내에서 똑같은 SELECT 문을 수행했을 때 같은 결과가 아닌 다른 결과를 반환하는 NON-REPETABLE READ 부정합 문제가 발생할 수 있습니다.
- REPETABLE READ는 트랜잭션이 시작되기 전에 커밋된 내용에 대해서만 조회할 수 있는 격리수준을 말합니다. MySQL에서 기본으로 사용하고 있고, 이 격리수준에서는 NON-REPETABLE READ 부정합이 발생하지 않습니다.
- SERIALIZABLE은 가장 단순하고 엄격한 격리수준으로, 읽기 작업에서도 공유 잠금을 설정하여 동시에 다른 트랜잭션에서 해당 레코드를 변경하지 못하게 합니다. 이러한 특성 때문에 동시처리 능력이 다른 격리수준보다 떨어지고, 성능저하가 발생할 수 있습니다.
📌 References
- https://dev-coco.tistory.com/158
- https://runcoding.tistory.com/32
- https://ko.wikipedia.org/wiki/%EC%97%AD%EC%A0%95%EA%B7%9C%ED%99%94
- https://hanamon.kr/%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98%EC%9D%98-acid-%EC%84%B1%EC%A7%88/
- https://joont92.github.io/db/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80-isolation-level/
'🎤 Tech Interview' 카테고리의 다른 글
[Tech Interview] Part 6. Operation System (0) | 2023.06.02 |
---|---|
[Tech Interview] Part 5. Network (0) | 2023.05.29 |
[Tech Interview] Part 4. Algorithm (0) | 2023.05.24 |
[Tech Interview] Part 3. Data Structure (0) | 2023.05.22 |
[Tech Interview] Part 1. Java (0) | 2023.05.19 |