데이터베이스

유석현(SeokHyun Yu)·2023년 10월 7일

기술면접

목록 보기
2/3
post-thumbnail

1. DBMS(Database Management System)란?

DBMS는 데이터베이스 관리 시스템의 약어로, 여러 사용자가 데이터베이스에 접근하여 데이터를 사용할 수 있도록 하는 소프트웨어를 말합니다.


데이터베이스 사용 이유

1. 데이터 중복 제거

DBMS는 데이터를 중복 저장하지 않고 한 번만 저장하여 저장 공간을 절약하며 데이터 일관성을 유지합니다.

2. 데이터 무결성 보장

데이터 입력에 제약 조건을 설정하여 데이터의 무결성을 유지하고 잘못된 데이터의 삽입을 방지합니다.

3. 동시성 관리

여러 사용자가 동시에 데이터베이스에 접근할 수 있도록 관리하며 데이터 충돌을 방지합니다.

4. 데이터 검색 및 조작

강력한 질의(Query) 기능을 제공하여 데이터를 효과적으로 검색하고 조작할 수 있습니다.

5. 데이터 보안

데이터 액세스 권한을 관리하고 데이터를 안전하게 보호합니다.

6. 데이터 백업과 복구

데이터를 안전하게 백업하고 장애 발생 시 복구할 수 있는 기능을 제공합니다.

7. 데이터 일관성 유지

트랜잭션(Transaction)을 관리하여 데이터 일관성을 유지하며 데이터 손실을 최소화합니다.


2. 스키마 (Schema)란?

데이터베이스의 구조와 제약 조건에 관한 전반적인 명세를 포함한 메타데이터 집합을 의미합니다. 스키마는 데이터베이스 내의 데이터 개체, 속성, 관계를 형식 언어로 정의한 구조로, DB 사용자가 데이터를 저장, 조회, 삭제, 변경할 때 DBMS는 이 스키마를 참조하여 명령을 수행합니다.


다양한 스키마 종류

  1. 외부 스키마 (External Schema):

    • 프로그래머나 사용자의 입장에서 데이터베이스를 본 모습으로, 조직의 일부분을 정의합니다.
    • 외부 스키마는 사용자나 응용 프로그램이 실제로 상호 작용하는 부분을 나타냅니다.
  2. 개념 스키마 (Conceptual Schema):

    • 모든 응용 시스템과 사용자가 필요로 하는 데이터를 통합한 조직 전체의 데이터베이스 구조를 논리적으로 정의한 것입니다.
    • 이는 조직 전체의 데이터 관점을 제공하며 모든 응용 시스템이 공유하는 데이터를 정의합니다.
  3. 내부 스키마 (Internal Schema):

    • 전체 데이터베이스의 물리적 저장 형태를 기술합니다.
    • 이는 데이터를 실제로 어떻게 저장하고 관리하는지를 나타냅니다.

3. 뷰(View)란?

뷰는 사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 테이블에서 유도된, 메모리에는 물리적으로 존재하지 않는 가상 테이블입니다.


뷰의 특징 및 용도

  • 가상 테이블: 뷰는 실제로 물리적으로 저장되는 테이블이 아니라, 데이터베이스 내에서 쿼리를 실행할 때 결과를 동적으로 생성합니다. 이로써 뷰는 메모리에서만 존재합니다.

  • 데이터 필터링: 뷰를 사용하여 특정 사용자나 응용 프로그램에게 필요한 데이터만 표시할 수 있습니다. 이를 통해 데이터의 보안과 접근 제어를 관리할 수 있습니다.

  • JOIN 최소화: 뷰를 사용하면 여러 테이블을 조인하지 않고도 필요한 데이터를 가져올 수 있어, 쿼리 작성과 사용상의 편의성을 향상시킵니다.

  • 임시 작업 및 테스트: 뷰는 데이터 보정 작업, 처리 과정 테스트 등의 임시 작업에 유용하게 활용됩니다.


4. 키 (Key)란?

키는 데이터베이스에서 튜플(레코드)을 구분하고, 검색 및 정렬할 때 사용되는 속성을 의미합니다. 이는 데이터베이스의 중요한 개념 중 하나로, 다양한 종류가 있습니다.


키의 종류

1. 슈퍼키 (Super Key):

  • 테이블에 존재하는 필드들의 부분집합으로, 유일성을 만족하는 키입니다.
  • 필드 하나도 슈퍼키가 될 수 있으며, 여러 필드를 묶은 키도 슈퍼키가 될 수 있습니다.
  • 복합키(Composite Key)라고도 불립니다.

2. 후보키 (Candidate Key):

  • 후보키는 기본 키가 될 수 있는 키들 중에서 선택된 키를 의미합니다.
  • 후보키는 유일성과 최소성을 만족해야 합니다.
    • 유일성: 해당 필드에서 중복된 값이 없어야 합니다.
    • 최소성: 최소한의 필드로 레코드를 유일하게 식별할 수 있어야 합니다.

3. 기본키 (Primary Key):

  • 기본 키는 테이블에서 특정 레코드를 고유하게 식별하기 위해 선택된 후보키 중 하나입니다.
  • 중복된 값이나 NULL 값은 가질 수 없습니다.
  • 기본 키는 테이블에서 레코드를 식별하고 연결하는 데 사용됩니다.

4. 대체키 (Alternate Key):

  • 후보 키 중에서 기본 키로 선택되지 않은 나머지 키를 대체키라고 합니다.

5. 외래키 (Foreign Key):

  • 한 테이블의 키 중에서 다른 테이블의 레코드를 식별하기 위한 키를 의미합니다.
  • 외래 키는 다른 테이블의 기본 키와 연결되며, 참조 무결성을 유지합니다.
  • 외래 키는 참조 대상이 존재하지 않는 경우를 방지하기 위해 RESTRICTED, CASCADE, SET NULL 등의 옵션을 제공합니다.

5. 트랜잭션 (Transaction)란?

트랜잭션은 데이터베이스에서의 하나의 논리적인 작업 단위를 나타냅니다. 이 작업 단위는 데이터베이스의 상태를 변화시키는 연속적인 작업 집합을 의미합니다.


트랜잭션의 특징

  1. 원자성 (Atomicity): 트랜잭션 내에서 수행되는 모든 작업은 원자적인 단위로 간주됩니다. 이것은 모든 작업이 성공하거나 실패해야 한다는 의미입니다. 어떤 작업이 실패하면 모든 작업은 롤백되어 이전 상태로 돌아가야 합니다.

  2. 일관성 (Consistency): 트랜잭션이 실행되기 전과 후에 데이터베이스는 일관된 상태여야 합니다. 즉, 트랜잭션은 데이터베이스의 무결성을 유지해야 합니다.

  3. 고립성 (Isolation): 동시에 여러 트랜잭션이 실행되더라도 각 트랜잭션은 서로에게 영향을 주지 않고 각자 독립적으로 실행되는 것처럼 보여야 합니다.

  4. 지속성 (Durability): 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 데이터베이스에 저장되어야 합니다. 시스템 장애가 발생하더라도 데이터는 손실되지 않아야 합니다.


트랜잭션의 예

예를 들어, 은행에서의 송금 작업을 생각해보면, 이는 하나의 트랜잭션입니다. 이 작업은 다음과 같은 과정을 거칩니다:

  1. 계좌 A에서 일정 금액을 인출.
  2. 계좌 B로 동일한 금액을 입금.

이러한 두 단계를 하나의 트랜잭션으로 묶어야 합니다. 그렇지 않으면 어떤 단계에서 문제가 발생할 경우 돈이 사라질 수 있습니다. 따라서 트랜잭션은 데이터베이스의 무결성과 일관성을 유지하며, 데이터 조작 작업을 안전하게 수행하는 데 중요한 역할을 합니다.


6. 트랜잭션의 다섯 가지 상태

  1. 활동 (Active):

    • 트랜잭션이 실행 중인 상태입니다.
    • 트랜잭션이 시작되었지만 아직 완료되지 않은 상태를 의미합니다.
  2. 장애 (Fail):

    • 트랜잭션이 실행 중에 오류가 발생하여 중단된 상태입니다.
    • 오류 또는 예외가 발생하면 트랜잭션이 실패 상태로 전환됩니다.
  3. 철회 (Aborted):

    • 트랜잭션이 비정상적으로 종료되어 Rollback(트랜잭션 연산 이전의 상태로 돌아가는 작업)가 수행되는 상태입니다.
    • 예를 들어, 트랜잭션 중간에 오류가 발생하거나 Rollback 명령을 수행하는 경우 발생합니다.
  4. 부분 완료 (Partially Commit):

    • 트랜잭션이 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태를 나타냅니다.
    • 이 상태에서는 일부 변경 사항이 적용되었지만 아직 완전히 커밋되지 않았습니다.
  5. 완료 (Committed):

    • 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태입니다.
    • 이 상태에서는 모든 변경 사항이 영구적으로 적용되었습니다.

7. 트랜잭션의 격리 수준

  1. Read Uncommitted (미커밋된 읽기):

    • 다른 트랜잭션이 커밋되지 않은 데이터에 접근 가능합니다.
    • Dirty Read(더티 리드)가 발생할 수 있으며, 이는 커밋되지 않은 데이터를 읽을 수 있는 상황입니다.
    • 락을 사용하지 않습니다.
  2. Read Committed (커밋된 읽기):

    • 커밋된 데이터만 접근 가능합니다.
    • 한 트랜잭션 내에서 검색 결과가 비일관적일 수 있으며, 이를 Nonrepeatable Read(반복 가능하지 않은 읽기)라고 합니다.
    • 락을 사용하지 않습니다.
  3. Repeatable Read (반복 가능한 읽기):

    • 커밋된 데이터만 읽을 수 있으며, 한 트랜잭션 내에서 조회한 내용이 항상 동일함을 보장합니다.
    • 일정 범위의 레코드를 두 번 이상 읽을 때, 첫 번째 쿼리에서 없던 유령 레코드가 두 번째 쿼리에서 나타나는 현상을 Phantom Read(유령 읽기)라고 합니다.
    • 락을 사용하여 다른 트랜잭션의 수정을 막을 수 있습니다.
  4. Serializable (직렬화 가능한):

    • 가장 엄격한 격리 수준으로, 한 트랜잭션에서 사용하는 데이터는 다른 트랜잭션이 접근할 수 없습니다.
    • 모든 데이터를 락으로 보호하여 다른 트랜잭션 간의 상호작용을 막습니다.

8. 트랜잭션 연산: Commit과 Rollback

  1. Commit (커밋):

    • Commit은 트랜잭션이 성공적으로 실행되고, 그 결과를 데이터베이스에 영구적으로 반영하는 연산입니다.
    • 트랜잭션의 모든 변경 사항이 데이터베이스에 적용되어, 이후에는 롤백 없이 변경 내용이 영구적으로 유지됩니다.
    • 예를 들어, 금액 이체 트랜잭션에서 모든 단계가 성공하면 최종적으로 Commit을 통해 이체가 확정됩니다.
  2. Rollback (롤백):

    • Rollback은 트랜잭션이 실패하거나 중단되었을 때, 트랜잭션의 실행을 취소하고 이전 상태로 돌아가는 연산입니다.
    • 트랜잭션이 장애 상태(Fail)에 놓이면 Rollback이 실행되어 트랜잭션의 변경 사항을 원래 상태(트랜잭션 연산 이전의 상태)로 되돌립니다.
    • 이를 통해 데이터의 무결성을 유지하고 데이터베이스를 일관된 상태로 유지할 수 있습니다.

9. 동시성 제어 (Concurrency Control)란?

DBMS는 다수의 사용자를 가정하고 있기 때문에 동시에 여러 개의 트랜잭션이 수행됩니다. 이때, 트랜잭션들이 데이터베이스의 일관성을 파괴하지 않도록 트랜잭션 간의 상호작용을 제어하는 것을 동시성 제어라고 합니다.


동시성 제어 기법 종류

  1. Locking (잠금):

    • 트랜잭션이 데이터를 읽거나 쓸 때 해당 데이터에 대한 잠금을 획득하고, 다른 트랜잭션이 접근하지 못하도록 막습니다.
    • 고전적인 방식으로 가장 간단하면서도 효과적인 방법 중 하나입니다.
  2. Timestamp Ordering (시간 순서화):

    • 트랜잭션에 타임스탬프를 할당하고 이를 기반으로 트랜잭션 실행 순서를 결정합니다.
    • 타임스탬프가 더 빠른 트랜잭션이 우선권을 갖게 됩니다.
  3. Multiversion Concurrency Control (다중 버전 동시성 제어):

    • 각 데이터 항목에 대한 다양한 버전을 유지하고 트랜잭션은 해당 버전을 읽습니다.
    • 다중 버전을 사용하여 동시성을 높이고 충돌을 줄입니다.
  4. Serializable Schedules (직렬 가능한 일정):

    • 직렬 가능한 일정을 유지하여 트랜잭션 간에 상호작용을 제어합니다.
    • 직렬 가능성을 보장하기 위해 그래프 이론을 활용하는 방법도 있습니다.
  5. 낙관적 검증 (Optimistic Concurrency Control):

    • 트랜잭션의 충돌을 미리 예상하지 않고 모든 트랜잭션을 자유롭게 진행한 다음, 최종적으로 충돌이 있는지 검사합니다.
    • 충돌이 발생하면 트랜잭션을 롤백하고 다시 시작합니다.

10. DB Lock (데이터베이스 락)란?

DB Lock은 트랜잭션 처리의 순차성을 보장하고 데이터의 동시 접근을 제어하기 위한 방법으로 사용됩니다. 데이터에 접근하기 전에 Lock을 요청하고, Lock이 허용되면 해당 데이터에 접근할 수 있도록 하는 기법입니다.


DB Lock의 종류

  1. 비관적 락 (Pessimistic Lock):

    • 데이터 갱신 시 충돌이 발생할 것으로 예상해 락을 거는 방식입니다.
    • 비관적 락에는 두 가지 유형이 있습니다:
      • 공유락 (Shared Lock): 다른 트랜잭션에 의해 읽기 허용되지만 쓰기는 허용되지 않습니다.
      • 베타락 (Exclusive Lock): 다른 트랜잭션에 의해 읽기 및 쓰기가 모두 허용되지 않습니다.
    • 데이터 수정 시 즉시 트랜잭션 충돌을 감지할 수 있습니다.
    • 롤백 작업이 복잡하거나 비용이 많이 드는 경우, 여러 기능이 한 트랜잭션에 묶여 있는 경우에 적합합니다.
  2. 낙관적 락 (Optimistic Lock):

    • 데이터 갱신 시 충돌이 발생하지 않을 것으로 가정하고, 버전 관리 기능을 통해 트랜잭션 격리성을 관리하는 방식입니다.
    • 버전 컬럼을 별도로 추가하여 충돌을 방지합니다.
    • 커밋 전까지는 충돌을 감지할 수 없으며, 충돌 발생 시 롤백 처리는 개발자의 역할입니다.
    • 주로 읽기 작업이 많은 경우나 JPA의 버전 관리 기능을 활용하는 상황에 적합합니다.

선택 기준

비관적 락과 낙관적 락의 선택 기준은 "읽기와 수정 비율"에 따라 달라집니다. 수정 작업이 빈번하다면 비관적 락을 사용하는 것이 좋으며, 읽기 작업이 많은 경우에는 낙관적 락을 활용하는 것이 효과적입니다.


11. 데이터의 무결성 (Data Integrity)

무결성은 데이터베이스에서 데이터의 정확성, 일관성 및 유효성을 보장하기 위한 개념입니다. 데이터베이스의 무결성은 다음과 같은 측면을 다룹니다:

  1. 정확성 (Accuracy): 데이터는 정확하고 오류가 없어야 합니다. 이는 데이터가 실제 현실 세계를 정확하게 반영해야 함을 의미합니다.

  2. 일관성 (Consistency): 데이터는 일관된 상태를 유지해야 합니다. 여러 테이블 간의 관계나 조건에 따라 데이터가 일관성 있게 유지되어야 합니다.

  3. 유효성 (Validity): 데이터는 정해진 규칙과 제약 조건을 준수해야 합니다. 예를 들어, 나이가 음수가 될 수 없는 경우에는 이를 준수해야 합니다.


12. 무결성 제약 조건 (Integrity Constraints)

무결성 제약 조건은 데이터베이스에서 무결성을 보장하기 위해 데이터의 저장, 삭제, 수정을 제약하는 규칙입니다. 이러한 제약 조건은 다음과 같이 구체적으로 정의될 수 있습니다:

  1. 개체 무결성 (Entity Integrity):

    • 개체(테이블) 내의 각 레코드(행)는 고유한 기본 키(primary key) 값을 가져야 합니다.
    • 기본 키는 중복되거나 null일 수 없습니다. 이를 통해 레코드의 고유성과 정확성을 보장합니다.
  2. 참조 무결성 (Referential Integrity):

    • 외래 키(foreign key)는 참조하는 테이블의 기본 키(primary key) 값과 일치하거나 null이어야 합니다.
    • 이를 통해 관계형 데이터베이스에서 테이블 간의 관계가 일관성 있게 유지됩니다.

무결성 제약 조건은 데이터베이스 관리 시스템(DBMS)에 의해 강제되며, 데이터의 정확성과 무결성을 보장하는 데 중요한 역할을 합니다. 이러한 제약 조건을 설정하여 데이터의 무결성을 유지하고 데이터의 신뢰성을 확보할 수 있습니다.


13. DELETE, TRUNCATE, DROP의 차이

DELETE

  • 기능: 데이터를 지우지만 테이블 용량은 줄어들지 않고, 원하는 데이터만 골라서 지울 수 있습니다.
  • 특징: 삭제 후에도 데이터베이스에 남아 있으며, 롤백(되돌림)이 가능합니다.

TRUNCATE

  • 기능: 전체 데이터를 한 번에 삭제하는 방식입니다. 테이블 용량이 줄어들고 인덱스 등도 삭제되지만 테이블 자체는 삭제할 수 없습니다.
  • 특징: 삭제 후에도 데이터베이스에 남아 있지만, 롤백이 불가능합니다.

DROP

  • 기능: 테이블 자체를 완전히 삭제하는 방식(공간, 인덱스, 객체 모두 삭제)입니다.
  • 특징: 삭제 후에는 테이블과 관련된 모든 것이 완전히 제거되며, 롤백이 불가능합니다.

14. 트리거 (Trigger)란?

트리거는 데이터베이스에서 특정 테이블에 대한 INSERT, DELETE, UPDATE와 같은 데이터 조작 언어 (DML) 작업이 수행될 때 자동으로 실행되도록 작성된 프로그램 또는 프로시저입니다. 트리거는 사용자가 직접 호출하는 것이 아니라 데이터베이스 시스템에서 자동으로 호출됩니다.

트리거의 주요 특징

  1. 자동 실행:

    • 트리거는 특정 이벤트(예: 테이블에 데이터 삽입)가 발생하면 자동으로 실행됩니다.
    • 사용자의 명시적 호출이 필요하지 않습니다.
  2. 프로시저 실행:

    • 트리거는 주로 프로시저(저장 프로시저 또는 함수) 형태로 작성됩니다.
    • 이 프로시저는 트리거 발생 시 특정 작업을 수행하며, 이를 통해 데이터베이스의 무결성 유지, 데이터 갱신, 로깅 등 다양한 작업을 자동화할 수 있습니다.

트리거는 데이터베이스의 상태나 데이터 변경을 감지하고, 그에 따라 필요한 작업을 수행하여 데이터베이스의 일관성과 무결성을 유지하는 데 유용합니다. 특히 복잡한 비즈니스 논리나 보안 정책을 적용할 때 자주 사용됩니다.


15. DML, DDL, DCL의 차이

DML (데이터 조작어)

  • 목적: 데이터를 검색, 삽입, 갱신, 삭제하는 데 사용됨.
  • 주요 명령어: SELECT, INSERT, UPDATE, DELETE
  • 예시: 사용자가 데이터베이스에서 원하는 정보를 검색하거나 새로운 데이터를 추가하거나 기존 데이터를 수정 또는 삭제하는 데 사용.

DDL (데이터 정의어)

  • 목적: 데이터베이스 구조를 정의, 수정, 삭제하는 데 사용됨.
  • 주요 명령어: CREATE, ALTER, DROP
  • 예시: 테이블, 인덱스, 뷰 등의 데이터베이스 객체를 생성하거나 변경하거나 삭제하는 데 사용.

DCL (데이터 제어어)

  • 목적: 데이터에 대한 무결성 유지, 병행 수행 제어, 보호와 관리를 위해 사용됨.
  • 주요 명령어: COMMIT, ROLLBACK, GRANT, REVOKE
  • 예시: 트랜잭션의 변경 사항을 확정하거나 취소하며, 데이터베이스 사용자에게 권한을 부여하거나 회수하는 데 사용.

16. DB 인덱스란?

인덱스(Index)는 테이블의 모든 데이터를 처음부터 끝까지 검색하지 않고, 특정 열(또는 열의 조합)에 대한 빠른 검색 및 접근을 가능하게 하는 데이터베이스 객체입니다.


인덱스의 기능

인덱스는 다음과 같은 기능을 제공합니다:

  1. 빠른 검색: 인덱스는 항상 정렬된 상태를 유지하므로 검색 작업을 빠르게 수행할 수 있습니다. 특히 대량의 데이터에서 원하는 값을 빠르게 찾을 때 유용합니다.

  2. 정렬된 저장: 인덱스를 사용하면 해당 열의 데이터를 정렬된 상태로 저장합니다. 이로써 원하는 범위의 값을 검색할 때도 효율적입니다.


인덱스의 단점

인덱스를 사용하는 동안에는 다음과 같은 단점도 고려해야 합니다:

  1. 성능 저하: 새로운 값을 추가하거나 삭제, 수정하는 경우에는 인덱스도 변경하고 정렬해야 하므로 성능이 저하될 수 있습니다.

  2. 저장 공간 사용: 인덱스는 데이터베이스 내에 별도의 저장 공간을 차지하므로, 저장 공간을 더 많이 사용하게 됩니다.


결론

인덱스는 데이터의 저장 성능을 일부 희생하면서도 데이터의 검색 속도를 획기적으로 높일 수 있는 기능입니다. 따라서 데이터베이스 설계 시 어떤 열에 인덱스를 생성할지를 신중하게 결정해야 합니다.


17. B+ 트리 (B+ Tree)

B+ 트리는 B 트리를 확장한 자료구조로, 데이터베이스 인덱스 구조에 주로 사용됩니다.

1) B 트리 (B-Tree)

  • 이진 트리를 확장해서 많은 자식을 갖을 수 있는 균형 트리를 의미합니다.
  • Key들이 항상 오름차순으로 정렬되어 구성되며, Branch와 Leaf 노드가 Key와 Data를 저장하는 구조입니다.

2) B+ 트리 (B+ Tree)

  • B-트리를 확장하여 데이터의 빠른 접근을 위한 인덱스 역할만 하는 비단말 노드를 추가한 트리입니다.
  • Branch 노드는 Key만 저장하게 되며, Key들이 항상 오름차순으로 정렬되어 구성됩니다.
  • 하나의 노드에 더 많은 Key를 담을 수 있도록 하여 B-트리에 비해 B+트리의 높이가 더 낮아지게 됩니다. 이는 캐시 히트를 높입니다.
  • Leaf 노드는 Key와 Data를 저장하고, Linked List로 연결되어 있습니다. Full scan시 B-트리는 리프 노드끼리 연결되어 있지 않기 때문에 모든 노드를 확인해야 하지만, B+트리의 경우 리프 노드에 연결된 연결 리스트로 선형 검색이 가능하기 때문에 검색 측면에서 효율적입니다.

18. 해시 인덱스 방식 vs. B+ 트리 인덱스 방식

해시 인덱스 방식:

  • 해시 인덱스는 칼럼 값으로 생성된 해시를 기반으로 인덱스를 구현합니다.
  • 시간 복잡도가 O(1)로 굉장히 빠릅니다. 이는 해시 함수를 통해 직접 해당 값을 찾을 수 있기 때문입니다.
  • 주로 동등 비교(=)에서 효과적으로 동작합니다.

B+ 트리 인덱스 방식:

  • B+ 트리 인덱스는 트리 구조로 인덱스를 구현합니다. 이 트리는 정렬된 형태를 유지합니다.
  • 범위 검색(부등호 연산)에 특히 효과적입니다.
  • 시간 복잡도는 O(log n)으로, 검색과 범위 검색 모두에 빠른 성능을 제공합니다.

주요 차이점:

  • 해시 인덱스는 동등 비교(=)에서 뛰어난 성능을 보이지만, 부등호 연산에서는 성능 저하가 발생할 수 있습니다.
  • B+ 트리 인덱스는 정렬된 구조를 가지므로 범위 검색에서 효과적이며, 대부분의 데이터베이스에서 범용적으로 사용됩니다.
  • 해시 인덱스는 주로 메모리 내에서 빠른 검색을 위해 사용되며, B+ 트리는 디스크 기반 데이터베이스에서 사용됩니다.

19. 정규화(Normalization)란?

정규화는 하나의 릴레이션에 하나의 의미만 존재하도록 릴레이션을 분해하는 과정입니다. 이를 통해 데이터의 일관성을 유지하고 최소한의 데이터 중복을 가지며 최대한의 데이터 유연성을 확보하기 위해 진행됩니다.


이상현상 (Anomalies)

이상현상은 테이블을 설계할 때 잘못 설계하여 데이터를 삽입, 삭제, 수정할 때 생기는 논리적 오류를 의미합니다. 이상현상은 다음과 같은 종류로 나뉩니다:

  • 삽입 이상 (Insertion Anomaly): 불필요한 데이터를 추가해야만 삽입이 가능한 상황.
  • 갱신 이상 (Update Anomaly): 전체의 데이터 중 일부만 변경하여 데이터가 불일치하는 상황.
  • 삭제 이상 (Deletion Anomaly): 삭제로 인해 꼭 필요한 데이터까지 삭제되는 상황.

정규화 단계

  1. 1정규화 (First Normal Form - 1NF): 테이블의 컬럼이 하나의 값을 갖도록 테이블을 분해하는 것으로, 도메인이 원자값만을 포함하도록 합니다.

  2. 2정규화 (Second Normal Form - 2NF): 기본키의 부분집합이 결정자가 되지 않도록 테이블을 분리합니다. 이는 완전 함수적 종속을 제거하는 과정입니다.

  3. 3정규화 (Third Normal Form - 3NF): 이행 종속을 제거합니다. 즉, a -> b, b -> c일 때 a -> c가 성립되는 것을 분리하여 테이블을 정규화합니다.

  4. BCNF 정규화 (Boyce-Codd Normal Form - BCNF): 값을 정하는 결정자가 후보키가 되도록 테이블을 분해합니다. 이상적으로 모든 결정키가 후보키여야 합니다.


정규화의 장단점

장점:

  • 데이터베이스 변경 시 발생하는 이상현상을 해결할 수 있습니다.
  • 구조 확장 시 정규화된 데이터베이스는 구조를 변경하지 않거나 일부만 변경해도 됩니다.

단점:

  • 릴레이션 분해로 인해 JOIN 연산이 많아져 질의에 대한 응답시간이 느려질 수 있습니다. 다만 중복 속성을 제거하고 테이블의 데이터 용량이 최소화되는 효과가 있어 속도가 빨라질 수도, 느려질 수도 있습니다.

20. 역정규화(반정규화)란?

역정규화 또는 반정규화는 데이터베이스 설계에서 정규화의 단점을 극복하기 위한 과정입니다. 정규화는 데이터 중복을 최소화하고 데이터 일관성을 보장하기 위한 중요한 개념이지만, JOIN 연산이 늘어나는 결과를 초래하여 읽기 작업이 많은 데이터베이스의 성능을 저하시킬 수 있습니다.


주요 이유와 목적

역정규화를 수행하는 주요 이유와 목적은 다음과 같습니다:

  1. 읽기 성능 향상: JOIN 연산의 사용을 줄여 읽기 작업의 성능을 향상시키는 것이 주요 목적입니다.

  2. 간결한 쿼리: 역정규화를 통해 데이터를 중복 저장하면 더 간결하고 효율적인 쿼리를 작성할 수 있습니다.

  3. 복잡성 감소: 정규화로 인해 복잡해진 데이터 모델을 단순화하고 유지보수를 용이하게 만듭니다.

예시

예를 들어, 고객 정보와 주문 정보가 별도의 테이블에 저장되는 경우, 주문 정보를 조회할 때 JOIN 연산이 필요합니다. 역정규화를 적용하면 고객 정보를 주문 테이블에 중복 저장하여 JOIN을 줄일 수 있습니다.

하지만 역정규화는 주의해서 사용해야 합니다. 데이터 중복으로 인해 데이터 무결성의 위험이 높아지며, 쓰기 작업에 대한 관리가 복잡해질 수 있습니다. 따라서 역정규화는 읽기 성능을 향상시키기 위한 특별한 상황에서 사용하는 것이 권장됩니다.


21. Connection Pool(커넥션 풀)이란?

Connection Pool은 클라이언트의 요청에 따라 각 애플리케이션 스레드에서 데이터베이스(DB)에 접근하기 위해 필요한 Connection(연결)을 미리 생성하고 이를 풀에 보관해두는 개념을 의미합니다.


왜 Connection Pool이 필요한가?

  • 성능 향상: 요청이 발생할 때마다 Connection을 생성하는 방식은 연결량이 많을 때 서버에 과부하를 초래할 수 있습니다. Connection Pool을 사용하면 미리 생성된 Connection을 재사용함으로써 연결 및 해제에 따른 오버헤드를 줄여 성능을 향상시킵니다.

  • 리소스 관리: Connection Pool을 사용하면 미리 정해진 개수의 Connection만 허용하기 때문에 리소스 소모를 제어할 수 있습니다. 이를 통해 애플리케이션이 메모리 누수나 과도한 커넥션 생성으로 인한 문제를 방지할 수 있습니다.

  • 안정성 향상: Connection Pool을 사용하면 커넥션을 관리하고 검사할 수 있어, 불필요한 에러와 장애를 예방하며 애플리케이션의 안정성을 높입니다.


Connection Pool 동작 방식

  1. 초기화: 애플리케이션 시작 시 미리 정해진 개수의 Connection을 생성하고 풀에 저장합니다.

  2. 요청 처리: 클라이언트 요청이 들어올 때마다 Connection Pool에서 Connection을 빌려주고, 요청 처리가 완료되면 다시 풀에 반환합니다.

  3. 연결 유지: Connection Pool은 Connection을 유지하며 일정 시간 동안 사용되지 않을 경우 자동으로 반환 또는 연결을 유지합니다.

  4. 풀 제어: Connection Pool은 최대 연결 수, 최소 연결 수 등을 설정하여 풀의 크기를 관리합니다.

Connection Pool을 사용하면 생성 및 소멸에 대한 시간 소요가 없어 효율적이며, 동시에 사용 가능한 커넥션 수가 제어되어 애플리케이션이 쉽게 과부하에 빠지지 않습니다.

이를 통해 데이터베이스와 애플리케이션 간의 효율적인 연결 관리를 가능하게 합니다. 추가 질문이나 더 자세한 설명이 필요하면 언제든지 물어보세요.


22. RDB vs. NoSQL: 주요 차이점

RDB (관계형 데이터베이스)

  • 데이터 저장 방식:

    • 테이블 형태로 데이터를 저장하며, 데이터 구조는 정해진 스키마에 따라 관리됩니다.
    • 중복을 피하고 일관된 데이터 구조를 유지합니다.
  • 쿼리 언어:

    • SQL(Structured Query Language)을 사용하여 데이터를 조작하고 검색합니다.
    • 데이터 관계를 강조하며 복잡한 쿼리를 지원합니다.
  • 확장성:

    • 주로 수직적 확장을 통해 서버의 성능을 향상시키는 방식으로 확장됩니다.
  • 사용 사례:

    • 관계를 맺고 있는 데이터의 변경이 잦거나, 명확한 데이터 스키마가 필요한 경우에 사용됩니다.

NoSQL

  • 데이터 저장 방식:

    • 스키마가 없거나 느슨한 스키마를 사용하여 데이터를 저장합니다.
    • 데이터 간의 관계 없이 자유로운 형태로 데이터를 저장할 수 있습니다.
  • 유연성:

    • 데이터 조정과 새로운 필드 생성이 자유롭게 가능하며, 중복 데이터 업데이트가 필요할 수 있습니다.
  • 확장성:

    • 주로 수평적 확장을 통해 대용량 데이터 처리 및 트래픽 분산이 가능합니다.
  • 사용 사례:

    • 읽기는 자주 발생하지만 데이터 변경이 적은 경우, 비정형 데이터를 다루는 경우, 대용량 데이터를 수평적으로 확장해야 하는 경우에 주로 사용됩니다.

23. DB 클러스터링 (Database Clustering)란?

DB 클러스터링은 데이터베이스 시스템을 구축할 때 사용되는 방식 중 하나로, 여러 대의 DB 서버가 공유 스토리지를 사용하고, 동일한 DB 서버를 여러 대 놓아 사용하는 방식입니다. 이러한 클러스터링은 데이터베이스 시스템의 가용성과 성능 향상을 위해 사용됩니다.


DB 클러스터링의 두 가지 주요 방식

  1. Active-Active 방식:

    • 여러 대의 DB 서버가 트래픽을 분산해서 처리합니다.
    • 모든 서버가 활성 상태로 동작하므로, 병목 현상이 발생할 수 있습니다.
    • 이 방식은 가용성을 높이고 성능을 향상시키기 위해 사용됩니다.
  2. Active-Standby 방식:

    • 한쪽 서버는 Active 상태로 동작하고, 다른 한쪽은 Standby 상태로 대기합니다.
    • Active 상태의 서버가 고장이 나거나 다른 이유로 작동하지 않을 때, Standby 서버가 대기 중인 데이터베이스 서버로 FailOver(자동 전환)되어 작동합니다.
    • FailOver 과정에서 데이터 손실이 발생할 수 있습니다.
    • 이 방식은 가용성을 높이고 데이터 손실을 최소화하기 위해 사용됩니다.

24. DB 레플리케이션 (DB Replication)란?

DB 레플리케이션은 데이터베이스 서버와 데이터베이스 스토리지를 다중화하는 방식으로, DB 클러스터링과는 다른 개념입니다. 주요 특징과 동작 방식은 다음과 같습니다:

  1. 트래픽 분산:

    • DB 레플리케이션은 읽기(조회) 작업과 쓰기(INSERT, DELETE, UPDATE) 작업을 분리하여 처리합니다.
    • 읽기 작업은 주로 Slave(복제된 서버)에서 처리하고, 쓰기 작업은 Master(원본 서버)에서 처리합니다.
    • 이로써 트래픽이 분산되어 시스템의 성능을 향상시킵니다.
  2. 비동기 복제:

    • 데이터를 Slave로 복제할 때 비동기 방식으로 동작합니다.
    • 이는 Master에서 변경 사항이 발생하면 즉시 Slave로 복사되지 않고, 일정 시간 지연이 발생할 수 있음을 의미합니다.
    • 이러한 비동기성으로 인해 일시적으로 일관성이 누락될 수 있습니다.
  3. 장애 대처:

    • Master 노드가 다운되는 경우, 대처가 까다로울 수 있습니다.
    • 장애 발생 시, 다른 Slave 노드 중 하나를 Master로 승격시켜야 하며, 이 과정에서 데이터 일관성을 유지하는 것이 중요합니다.

25. 수직 파티셔닝 (Vertical Partitioning)

수직 파티셔닝은 큰 테이블이나 인덱스를 관리하기 쉬운 단위로 분리하는 데이터베이스 파티셔닝 기법입니다. 이것은 테이블을 더 작은 논리적 또는 물리적인 단위로 분할하는 것을 의미합니다. 예를 들어, "사람"이라는 테이블이 너무 커지면 "북유럽인", "아시아인", "서유럽인"과 같이 지역 또는 속성에 따라 테이블을 분리하는 것입니다.


장점:

  • Insert 작업을 분리된 파티션으로 분산하여 경합을 줄입니다.
  • 읽기/쓰기 성능을 향상시킵니다.
  • 파티션 별로 백업 및 복구가 가능하므로 데이터 관리가 용이합니다.
  • 데이터 검색 시 필요한 부분만 탐색하여 성능을 증가시킵니다.

단점:

  • 인덱스와 테이블을 별도로 파티셔닝할 수 없으므로 테이블과 인덱스를 같이 파티셔닝해야 합니다.
  • 테이블 간 조인 비용이 증가할 수 있습니다.

26. 수평 파티셔닝 (샤딩 - Sharding)

수평 파티셔닝 또는 샤딩은 동일한 테이블 스키마를 가진 데이터를 다수의 데이터베이스에 분산하여 저장하는 방식입니다. 이것은 데이터를 잘 분산시키기 위해 Shard Key를 고려해야 합니다. Shard Key를 선택하는 방법에는 Hash Sharding, Dynamic Sharding, Entity Group 방식 등이 있습니다.


샤딩의 장점:

  • 대용량 데이터를 처리할 수 있으며 데이터베이스 확장이 쉽습니다.
  • 데이터를 분산하여 성능 향상을 이끌어낼 수 있습니다.
  • 부하 분산 및 고가용성을 달성할 수 있습니다.

샤딩의 단점:

  • 복잡성이 높아지며 관리 및 구현이 어려울 수 있습니다.
  • Shard Key를 잘 선택해야 하며 데이터 불일치 문제를 해결해야 합니다.

27. SQL Injection (SQL 인젝션)이란?

SQL Injection은 악의적인 사용자가 보안상의 취약점을 이용하여 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스(DB)가 비정상적인 동작을 하도록 조작하는 공격 행위를 의미합니다.


공격 기법

SQL Injection 공격은 다양한 기법을 사용할 수 있으며, 주요한 공격 기법으로는 다음과 같은 것들이 있습니다:

  1. Error based SQL Injection: 악의적 사용자는 SQL 문에서 오류를 유발하고, 그 오류 메시지를 통해 민감한 정보를 추출합니다.

  2. Union based SQL Injection: UNION 연산자를 이용하여 다른 테이블의 데이터를 추출하는 방법입니다.

  3. Boolean based SQL Injection: 참과 거짓의 조건을 이용하여 데이터베이스 정보를 추출하는 공격입니다.

  4. Time based SQL Injection: 딜레이 함수를 이용하여 데이터베이스가 어떤 정보를 가지고 있는지 확인하는 공격입니다.


대응 방안

SQL Injection 공격을 예방하고 대응하기 위한 방안으로는 다음과 같은 것들이 있습니다:

  1. 입력 값에 대한 검증: 사용자로부터 입력 받은 데이터를 검증하여 SQL Injection 공격에 사용되는 악의적인 코드를 필터링합니다.

  2. Prepared Statement 구문 사용: 데이터베이스 쿼리를 실행할 때 Prepared Statement를 사용하여 입력 값을 파라미터화하여 SQL Injection을 방지합니다.

  3. Error Message 노출 금지: 에러 메시지에는 민감한 정보가 노출되지 않도록 조치합니다.

  4. 웹 방화벽 사용: 웹 애플리케이션에 웹 방화벽을 도입하여 SQL Injection 공격을 탐지하고 차단합니다.


28. ORM (Object-Relational Mapping)란?

ORM은 "객체와 관계형 데이터베이스 매핑"의 약어로, OOP (Object-Oriented Programming)에서 사용하는 객체 개념과 RDB (Relational Database)에서 사용하는 데이터 테이블을 서로 매핑하는 기술을 의미합니다.


ORM의 주요 개념:

  • 객체 지향 프로그래밍 (OOP): 소프트웨어 개발 패러다임 중 하나로, 데이터와 기능을 객체로 묶어 관리하는 방식을 기반으로 합니다.

  • 관계형 데이터베이스 (RDB): 데이터를 테이블 형태로 관리하는 데이터베이스 시스템을 의미하며, SQL을 사용하여 데이터를 조작합니다.


ORM의 역할:

ORM은 객체 지향 프로그래밍에서 사용되는 객체와 관계형 데이터베이스 사이의 변환 작업을 자동화합니다. 이를 통해 다음과 같은 장점을 제공합니다:

  1. 객체와 데이터베이스 간의 매핑: 객체를 데이터베이스 테이블로 매핑하고, 객체 간의 관계를 데이터베이스의 관계로 표현합니다.

  2. SQL 추상화: ORM은 SQL 쿼리를 직접 작성하지 않고도 객체를 통해 데이터베이스 조작을 수행할 수 있도록 돕습니다.

  3. 데이터 일관성 유지: ORM은 데이터베이스와의 상호 작용을 추상화하므로 데이터 일관성을 유지하기 쉽습니다.

  4. 코드 재사용 및 유지보수 용이성: ORM을 사용하면 데이터베이스 접근 코드를 일반화하고 재사용할 수 있으며, 시스템을 변경할 때 유지보수가 용이해집니다.


29. 옵티마이저 (Optimizer)란?

옵티마이저는 데이터베이스 관리 시스템(DBMS) 내부의 핵심 엔진으로, SQL 쿼리를 가장 빠르고 효율적으로 수행할 최적의 처리 경로를 생성해주는 역할을 합니다. 비유적으로 말하면, 컴퓨터의 CPU가 컴퓨팅 작업을 최적화하는 역할을 하는 것처럼, DBMS의 옵티마이저는 SQL 쿼리를 최적화하여 데이터베이스에서 가장 효율적으로 처리할 수 있는 방법을 결정합니다.


옵티마이저의 역할

  1. 실행 계획 생성: 개발자가 작성한 SQL 쿼리를 받아서 실행 계획을 생성합니다. 이 계획은 어떤 순서로 테이블을 스캔하고 어떤 인덱스를 사용할지 등의 정보를 포함합니다.

  2. 최적의 실행 경로 결정: 옵티마이저는 여러 가지 가능한 실행 경로 중에서 가장 효율적인 것을 선택합니다. 이를 통해 데이터베이스의 리소스를 효율적으로 활용하고 쿼리의 처리 시간을 최소화합니다.

  3. 힌트 사용: 옵티마이저가 항상 최적의 실행 경로를 보장하지는 않기 때문에, 개발자가 직접 최적의 실행 경로를 지정할 수 있는데, 이를 "힌트"라고 부릅니다. 힌트를 사용하여 옵티마이저의 결정을 덮어쓸 수 있습니다.

profile
Backend Engineer

0개의 댓글