세 번째 면접 정리본은 데이터베이스로 준비해 봤습니다. 이번 글도 수정해야 할 부분이 있다면 댓글로 알려주세요!
Q. RDBMS와 NoSQL의 차이점은 무엇인가요?
RDBMS는 관계형 데이터베이스로 테이블 형태로 데이터를 저장하며, SQL을 사용해 데이터를 관리합니다. NoSQL은 비관계형 데이터베이스로 문서, 키-값, 그래프 등 다양한 데이터 모델을 지원합니다. RDBMS는 ACID 트랜잭션을 보장하지만, NoSQL은 스키마가 유연하고 확장성이 뛰어나 빠르게 데이터를 처리할 수 있습니다.
Q. SQL의 조인에는 어떤 종류가 있고 그 조인들에 대해 각각 설명해주세요.
SQL JOIN에는 INNER JOIN, LEFT OUTER JOIN, RIGHT OUTER JOIN, FULL OUTER JOIN, CROSS JOIN이 있습니다. INNER JOIN은 두 테이블 간에 일치하는 데이터만 반환합니다. LEFT OUTER JOIN은 왼쪽 테이블의 모든 행과 오른쪽 테이블에서 일치하는 값을 가져오고 일치하는 값이 없다면 NULL값을 반환합니다. RIGHT OUTER JOIN은 오른쪽 테이블의 모든 행과 왼쪽 테이블에서 일치하는 값을 가져오고 일치하는 값이 없다면 NULL값을 반환합니다. FULL OUTER JOIN은 양쪽 테이블 모두에서 일치하는 값을 가져오고 일치하지 않는 값은 NULL값을 반환합니다. CROSS JOIN은 모든 가능한 조합을 가져와 결과를 반환합니다.
Q. 데이터베이스에서 인덱스의 역할은 무엇인가요?
인덱스는 데이터베이스 테이블의 검색 성능을 향상하기 위한 구조입니다. 인덱스를 사용하면 데이터 조회 시 테이블의 전체 데이터를 탐색하지 않고, 인덱스를 통해 필요한 데이터에 빠르게 접근할 수 있습니다. 하지만 인덱스는 추가적인 저장 공간을 차지하며, 데이터 삽입, 삭제, 수정 시 성능 저하를 발생시킬 수 있습니다. 따라서 인덱스는 자주 조회하는 컬럼에 한해 적절히 설정하는 것이 좋습니다.
Q. 트랜잭션과 ACID원칙에 대해 설명해 주세요.
트랜잭션은 데이터베이스에서 하나의 논리적 단위를 의미합니다. ACID 원칙은 트랜잭션의 특성을 나타내며 원자성, 일관성, 격리성, 지속성을 포함합니다.
원자성 : All or Nothing의 개념으로 모두 수행되거나 모두 취소되어야 함.
일관성 : 트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지
격리성 : 여러 트랜잭션이 동시에 수행될 때, 각각의 트랜잭션은 서로 영향을 주면 안 된다.
지속성 : 트랜잭션이 성공적으로 완료되면 해당 트랜잭션의 결과는 영구적으로 반영
Q. 데이터베이스의 뷰(View)란 무엇이며, 왜 사용하나요?
뷰는 하나 이상의 테이블로부터 유도된 가상 테이블입니다. 뷰는 실제로 데이터를 저장하지 않고, 테이블에 저장된 데이터를 참조하여 보여줍니다. 뷰를 사용하면 복잡한 쿼리를 단순화하고, 데이터 접근을 제한해 보안성을 강화할 수 있습니다.
Q. 데이터베이스에서 DeadLock(교착상태)란 무엇이며, 어떻게 해결할 수 있나요?
데드락은 두 개 이상의 트랜잭션이 서로가 필요로 하는 자원을 점유하고 있어 무한정 대기하는 상태입니다. 예를 들어, 트랜잭션 A가 자원 1을 점유하고 자원 2를 기다리며, 트랜잭션 B는 자원 2를 점유하고 자원 1을 기다리는 경우 발생합니다. 해결 방법으로는 타임아웃 설정, 트랜잭션 실행 순서 조정, 자원 접근 시 일관된 순서 사용 등이 있습니다.
Q. 데이터베이스 샤딩과 파티셔닝의 차이는 무엇인가요?
샤딩은 수평분할을 통해 데이터를 여러 데이터베이스 서버에 나누어 저장하는 방법입니다. 반면, 파티셔닝은 하나의 데이터베이스 내에서 테이블을 여러 파티션으로 나누어 데이터를 관리합니다. 샤딩은 대규모 데이터를 처리하거나 시스템 확장성을 높일 때 유리하며, 파티셔닝은 테이블 내 특정 조건에 따라 데이터를 분할합니다. 결론적으로 샤딩은 여러 서버를 대상으로 하지만, 파티셔닝은 단일 서버 내에서 작업이 이루어집니다.
Q. 데이터베이스 트랜잭션 격리 수준(Isolation level)을 설명해 주세요.
격리 수준에는 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, SERIALIZABLE이 있습니다. READ UNCOMMITTED는 가장 낮은 격리 수준으로, Dirty Read가 발생할 수 있습니다. SERIALIZABLE은 가장 높은 격리 수준으로 모든 트랜잭션을 순차적으로 처리하여 완벽한 격리를 보장하지만 동시성이 낮아질 수 있습니다. (금융 시스템에는 REPEATABLE READ, SERIALIZABLE 수준이 주로 사용됩니다.)
Q. 데이터베이스 성능을 튜닝하기 위한 기본적인 방법을 설명해 주세요.
성능 튜닝은 적절한 인덱스 설정, 쿼리 최적화, 데이터 파티셔닝 등으로 이루어집니다. 예를 들어, 쿼리에서 불필요한 SELECT * 대신 필요한 컬럼만 지정하거나, 조인 조건을 명확히 설정해야 합니다. 또한 테이블 구조를 정규화 또는 비정규화하여 성능을 최적화할 수 있습니다.
Q. B-Tree와 B+Tree의 차이점은 무엇이며, 데이터베이스 인덱스는 B-Tree일까, B+Tree일까?
B-Tree : 모든 리프노드들이 같은 레벨을 가질 수 있도록 자동으로 밸런스를 맞추는 트리
B+Tree : B-Tree를 개선시킨 자료구조. 모든 Key, Data가 리프노드에 모여있고, 각 리프노드가 연결리스트의 형태를 띠고 있다.
관계형 데이터베이스에서 사용하는 인덱스는 B+Tree 구조로 구현됩니다. 범위검색과 순차접근에서 B-Tree보다 더 효율적이기 때문입니다.