개발놀이터

여태까지 공부한 데이터베이스 면접질문 / 답변 본문

CS 지식/면접준비

여태까지 공부한 데이터베이스 면접질문 / 답변

마늘냄새폴폴 2023. 4. 6. 05:25

https://coding-review.tistory.com/344

 

여태까지 공부한 Spring 면접질문 / 답변

https://coding-review.tistory.com/343 여태까지 공부한 Java 면접질문 / 답변 4부터 시작하는 것은 넘어가주시길 바랍니다... 따로 정리하면서 공부한거라 Java 면접질문이 아닌 123번을 제외하고 4번부터 수

coding-review.tistory.com

위의 포스팅과 이어집니다. 

 

46. 데이터베이스 인덱스에 대해서 설명해주세요. 
데이터베이스 인덱스는 조회 성능을 향상시켜주는 데이터베이스 튜닝 방식 중 하나입니다. 하지만 실질적인 성능 향상을 위해서라면 인덱스가 사용된 컬럼인지 카디널리티나 셀렉티비티같은 구성 요소들이 고려된 인덱스인지 확인해야합니다. 

47. 인덱스의 장점과 단점에 대해서 설명해주세요. 
인덱스의 장점은 역시 검색 성능의 향상입니다. 단점은 인덱스를 구성하기 위한 비용 즉, UPDATE, INSERT, DELETE와 같은 연산을 하게 되면 추가적인 연산이 필요합니다. 또한, 인덱스를 유지하기 위한 저장공간인 전체 데이터베이스의 10퍼센트정도가 필요합니다. 

48. 트랜잭션이 뭔가요? 
트랜잭션은 데이터베이스의 상태를 변경하기위한 논리적인 단위입니다. 트랜잭션에는 여러개의 연산이 포함될 수 있습니다. 

49. 트랜잭션의 ACID에 대해서 설명해주세요. 
트랜잭션의 ACID는 객체지향의 SOLID처럼 원자성, 일관성, 고립성, 내구성의 앞글자를 따서 만든 단어입니다. 각각에 대해서 설명해보자면 원자성은 트랜잭션의 모든 연산은 완벽해야하고 하나의 연산이라도 실패하는 경우 모든 연산이 실패해야 한다는 특징입니다. 일관성은 트랜잭션이 진행중에 데이터베이스가 변경되더라도 변경된 데이터베이스가 아닌 진행하고 있던 데이터베이스로 마저 진행해야 한다는 특징입니다. 고립성은 서로다른 두 트랜잭션이 서로에게 영향을 받지않고 독립적으로 동작해야 한다는 특징입니다. 내구성은 시스템이 오류로 정지하더라도 커밋이 되었다면 커밋을 보장해야 한다는 특징입니다. 

50. 트랜잭션의 격리수준에 대해서 설명해주세요. 
트랜잭션의 격리수준은 서로 다른 두 트랜잭션이 얼마나 많은 정보를 볼 수 있는지를 선택하는 옵션입니다. 격리수준에는 READ UNCOMMITED, READ COMMITED, REPEATABLE READ, SERIEALIZABLE 이렇게 네가지가 있습니다. READ UNCOMMITED는 커밋되지 않은 읽기로서 말 그대로 커밋이 되지 않아도 읽을 수 있습니다. 만약 한 트랜잭션이 연산을 수행하다 롤백을 했어도 다른 트랜잭션이 롤백을 하기 이전의 데이터로 연산이 가능하다는 뜻입니다. 이를 더티 리드 부정합 문제라고 하고 이는 굉장히 치명적이기 때문에 아예 이 옵션을 지원하지조차도 않는 데이터베이스가 많으며 지원을 하더라도 권고하지 않는 데이터베이스 격리수준이며 정말 필요한 경우 속도 향상을 위해서 사용하는 경우가 종종 있습니다. READ COMMITED는 오라클, PostgreSQL이 기본적으로 사용하는 격리수준으로 앞서 설명했던 더티리드 부정합 문제가 발생하지 않습니다. 커밋이 되어야만 데이터를 읽을 수 있기 때문에 더티 리드 부정합 문제는 발생하지 않지만 같은 쿼리에서 같은 결괏값이 나와야 한다는 Non-Repeatable Read 부정합 문제가 발생합니다. 이 때 오라클이나 PostgreSQL의 경우 Non-Repeatable Read 부정합 문제를 해결하기 위해서 MVCC라는 방법론을 통해 해결했고 오라클의 경우 Undo 테이블을 도입함으로써, PostgreSQL의 경우 Xmin, Xmax를 도입하고 Vaccum이라는 것을 통해 이 부정합 문제를 해결했습니다. REPEATABLE READ 격리수준은 MySQL에서 기본적으로 선택하고 있는 격리수준으로 앞에서 설명한 Non-Repeatable Read 부정합 문제가 발생하지 않습니다. 하지만 쿼리를 재실행 했을 때 레코드가 보였다 안보였다 하는 Phantom Read 부정합 문제가 발생합니다. MySQL의 경우 Shared Lock, Exclusive Lock을 가지고 Record Lock, Gap Lock을 만든 후 이를 결합한 Next-Key Lock으로 이 Phantom Read 부정합 문제를 해결했습니다. SERIEALIZABLE 격리수준은 앞서 설명한 모든 부정합 문제가 발생하지 않지만 읽기작업에도 락을 획득해야하는 문제가 있기 때문에 성능상 다른 격리수준에 비해서 좋지 못합니다. 

51. 데이터베이스 정규화에 대해서 설명해주세요. 
데이터베이스 정규화는 데이터 무결성, 중복방지를 위해 데이터베이스를 설계하는 방법 중 하나입니다. 정규화에는 제 1정규화, 제 2정규화, 제 3정규화, BCNF 정규화가 있습니다. 제 1정규화는 하나의 컬럼에 하나의 값만 들어가도록 테이블을 쪼개는 것입니다. 제 2정규화는 제 1정규화가 끝난 테이블에 한해서 완전 함수 종속을 만족시키도록 테이블을 쪼개는 것입니다. 완전 함수 종속이란 기본키의 부분집합이 결정자가 되어서는 안된다는 것입니다. 제 3정규화는 제 2정규화가 끝난 테이블에 한해서 이행적 종속을 만족시키지 않도록 테이블을 쪼개는 것입니다. 이행적 종속이란 A->B, B->C, A->C를 하나의 테이블에서 만족하는 경우를 뜻합니다. BCNF 정규화는 제 3정규화가 끝난 테이블에 한해서 결정자는 모두 후보키여야한다를 만족시키도록 테이블을 쪼개는 것입니다. 

52. NoSQL에 대해서 설명해주세요. 
NoSQL은 비관계형 데이터베이스라고도 불리고 기존 RDBMS에서 저장하지 못했던 비정형 데이터를 저장할 수 있고 뛰어난 수평적인 확장성과 뛰어난 유연성으로 스마트폰에 적합한 2009년에 개발된 데이터베이스입니다. NoSQL은 Key-Value Store, Document Store, Wide Column Store, Graph Store가 있습니다. 

53. RDBMS와 NoSQL의 차이에 대해서 설명해주세요. 
우선 이 둘을 성능, 보안, 확장성, 유연성을 기준으로 구분할 수 있습니다. 우선 성능은 기본적으로 1대1 연산의 경우 NoSQL이 RDBMS보다 10~20%정도 속도가 더 빠릅니다. 가장 빠른 속도를 보여줬던 것은 Redis였으며 그 다음은 MongoDB입니다. RDBMS에서 그나마 속도가 빠른 것은 MySQL과 Oracle이었습니다. 그 다음 보안적으로 봤을 때는 RDBMS가 NoSQL보다 뛰어납니다. 기본적으로 RDBMS는 데이터를 자체적으로 encrypt할 수 있으며 NoSQL은 비정형 데이터를 encrypt하기 힘들다는 한계 때문에 자체적으로 encrypt를 지원하지 않습니다. 또한, NoSQL은 인증과 인가에 대한 정상적인 구현체를 지원하지 않기도 합니다. 하지만 NoSQL은 느슨한 데이터 스키마와 느슨한 ACID를 채택하여 높은 확장성을 보여줍니다. 또한, 데이터베이스 Sharding의 관점에서도 NoSQL은 뛰어난 확장성을 보여줍니다. 또한, 유연성에서도 기존 RDBMS는 문자형, 숫자형, 날짜형, 논리형등만을 저장할 수 있었지만 NoSQL은 이미지, 영상, 음성등 비정형 데이터를 저장할 수 있다는 데이터 저장의 관점에서 뛰어난 유연성을 가지고 있습니다. 

54. CAP정리에 대해서 설명해주세요. 
CAP정리는 Brewer가 2000년에 발표한 Consistency, Availability, Partition Tolerance 이 셋을 모두 만족하는 분산시스템은 없다는 정리입니다. 하지만 20년도 더 된 정리이기 때문에 보완해야 하는 점이 많고 그에 따라 등장한 이론이 PACELC정리입니다. 

55. 어느것을 보완해야 하나요? 
우선 C와 A는 분산시스템의 특징이지만 P는 네트워크의 특징입니다. 따라서 겉보기에는 P를 선택하지 않고 CA를 선택할 수도 있게끔 보이지만 P를 선택하지 않았다는 것은 우리 시스템은 절대로 무슨일이 있어도 장애가 나지 않는다고 말하는 격이기 때문에 이는 이세상에 존재할 수 없는 시스템입니다. 또한, C와 A가 동일선상에 위치하지 않습니다. CP로 알려진 HBase의 경우 장애상황에서만 A를 포기하고 정상상황에서는 A를 만족합니다. 따라서 CAP정리는 장애상황일때만 C와 A가 동일선상에 있습니다. 따라서 CAP의 내포된 뜻은 장애상황일 때 C와 A를 선택할 수 있다 라는 것입니다. 

56. 그럼 RDBMS가 CA라고 알려져있는데 그럼 이게 틀리다는 의미인가요? 
처음 2000년에 Brewer가 RDBMS는 CA라고 발표했습니다. 하지만 RDBMS는 분산시스템이 아니기 때문에 분산시스템에 대한 특징을 나타낸 CAP정리로는 설명하는 것은 옳지 않습니다. 하지만 Brewer가 RBDMS를 CA라고 말한 이유는 MySQL을 예로 들었을 때 마스터 노드와 슬레이브 노드가 서로 Consistency와 Availability를 만족하게 작동하고 장애상황에서는 마스터노드가 죽어버려도 그 다음 슬레이브노드가 마스터노드를 대체하기 때문에 P를 선택하지 않은 것처럼 보이기 때문입니다. 

57. ElasticSearch에 대해서 설명해주세요. 
ElasticSearch는 자바로 만들어진 오픈소스 검색엔진입니다. 하지만 기본적으로 ELK라고 하는 데이터 집계 툴인 Logstash와 데이터 시각화 툴인 Kabana를 합쳐 동작합니다.