
1. DBMS(Database Management System)란?
DBMS는 데이터베이스 관리 시스템의 약어로, 여러 사용자가 데이터베이스에 접근하여 데이터를 사용할 수 있도록 하는 소프트웨어를 말합니다.
DBMS는 데이터를 중복 저장하지 않고 한 번만 저장하여 저장 공간을 절약하며 데이터 일관성을 유지합니다.
데이터 입력에 제약 조건을 설정하여 데이터의 무결성을 유지하고 잘못된 데이터의 삽입을 방지합니다.
여러 사용자가 동시에 데이터베이스에 접근할 수 있도록 관리하며 데이터 충돌을 방지합니다.
강력한 질의(Query) 기능을 제공하여 데이터를 효과적으로 검색하고 조작할 수 있습니다.
데이터 액세스 권한을 관리하고 데이터를 안전하게 보호합니다.
데이터를 안전하게 백업하고 장애 발생 시 복구할 수 있는 기능을 제공합니다.
트랜잭션(Transaction)을 관리하여 데이터 일관성을 유지하며 데이터 손실을 최소화합니다.
2. 스키마 (Schema)란?
데이터베이스의 구조와 제약 조건에 관한 전반적인 명세를 포함한 메타데이터 집합을 의미합니다. 스키마는 데이터베이스 내의 데이터 개체, 속성, 관계를 형식 언어로 정의한 구조로, DB 사용자가 데이터를 저장, 조회, 삭제, 변경할 때 DBMS는 이 스키마를 참조하여 명령을 수행합니다.
외부 스키마 (External Schema):
개념 스키마 (Conceptual Schema):
내부 스키마 (Internal Schema):
3. 뷰(View)란?
뷰는 사용자에게 접근이 허용된 자료만을 제한적으로 보여주기 위해 하나 이상의 테이블에서 유도된, 메모리에는 물리적으로 존재하지 않는 가상 테이블입니다.
가상 테이블: 뷰는 실제로 물리적으로 저장되는 테이블이 아니라, 데이터베이스 내에서 쿼리를 실행할 때 결과를 동적으로 생성합니다. 이로써 뷰는 메모리에서만 존재합니다.
데이터 필터링: 뷰를 사용하여 특정 사용자나 응용 프로그램에게 필요한 데이터만 표시할 수 있습니다. 이를 통해 데이터의 보안과 접근 제어를 관리할 수 있습니다.
JOIN 최소화: 뷰를 사용하면 여러 테이블을 조인하지 않고도 필요한 데이터를 가져올 수 있어, 쿼리 작성과 사용상의 편의성을 향상시킵니다.
임시 작업 및 테스트: 뷰는 데이터 보정 작업, 처리 과정 테스트 등의 임시 작업에 유용하게 활용됩니다.
4. 키 (Key)란?
키는 데이터베이스에서 튜플(레코드)을 구분하고, 검색 및 정렬할 때 사용되는 속성을 의미합니다. 이는 데이터베이스의 중요한 개념 중 하나로, 다양한 종류가 있습니다.
5. 트랜잭션 (Transaction)란?
트랜잭션은 데이터베이스에서의 하나의 논리적인 작업 단위를 나타냅니다. 이 작업 단위는 데이터베이스의 상태를 변화시키는 연속적인 작업 집합을 의미합니다.
원자성 (Atomicity): 트랜잭션 내에서 수행되는 모든 작업은 원자적인 단위로 간주됩니다. 이것은 모든 작업이 성공하거나 실패해야 한다는 의미입니다. 어떤 작업이 실패하면 모든 작업은 롤백되어 이전 상태로 돌아가야 합니다.
일관성 (Consistency): 트랜잭션이 실행되기 전과 후에 데이터베이스는 일관된 상태여야 합니다. 즉, 트랜잭션은 데이터베이스의 무결성을 유지해야 합니다.
고립성 (Isolation): 동시에 여러 트랜잭션이 실행되더라도 각 트랜잭션은 서로에게 영향을 주지 않고 각자 독립적으로 실행되는 것처럼 보여야 합니다.
지속성 (Durability): 트랜잭션이 성공적으로 완료되면 그 결과는 영구적으로 데이터베이스에 저장되어야 합니다. 시스템 장애가 발생하더라도 데이터는 손실되지 않아야 합니다.
예를 들어, 은행에서의 송금 작업을 생각해보면, 이는 하나의 트랜잭션입니다. 이 작업은 다음과 같은 과정을 거칩니다:
이러한 두 단계를 하나의 트랜잭션으로 묶어야 합니다. 그렇지 않으면 어떤 단계에서 문제가 발생할 경우 돈이 사라질 수 있습니다. 따라서 트랜잭션은 데이터베이스의 무결성과 일관성을 유지하며, 데이터 조작 작업을 안전하게 수행하는 데 중요한 역할을 합니다.
6. 트랜잭션의 다섯 가지 상태
활동 (Active):
장애 (Fail):
철회 (Aborted):
부분 완료 (Partially Commit):
완료 (Committed):
7. 트랜잭션의 격리 수준
Read Uncommitted (미커밋된 읽기):
Read Committed (커밋된 읽기):
Repeatable Read (반복 가능한 읽기):
Serializable (직렬화 가능한):
8. 트랜잭션 연산: Commit과 Rollback
Commit (커밋):
Rollback (롤백):
9. 동시성 제어 (Concurrency Control)란?
DBMS는 다수의 사용자를 가정하고 있기 때문에 동시에 여러 개의 트랜잭션이 수행됩니다. 이때, 트랜잭션들이 데이터베이스의 일관성을 파괴하지 않도록 트랜잭션 간의 상호작용을 제어하는 것을 동시성 제어라고 합니다.
Locking (잠금):
Timestamp Ordering (시간 순서화):
Multiversion Concurrency Control (다중 버전 동시성 제어):
Serializable Schedules (직렬 가능한 일정):
낙관적 검증 (Optimistic Concurrency Control):
10. DB Lock (데이터베이스 락)란?
DB Lock은 트랜잭션 처리의 순차성을 보장하고 데이터의 동시 접근을 제어하기 위한 방법으로 사용됩니다. 데이터에 접근하기 전에 Lock을 요청하고, Lock이 허용되면 해당 데이터에 접근할 수 있도록 하는 기법입니다.
비관적 락 (Pessimistic Lock):
낙관적 락 (Optimistic Lock):
비관적 락과 낙관적 락의 선택 기준은 "읽기와 수정 비율"에 따라 달라집니다. 수정 작업이 빈번하다면 비관적 락을 사용하는 것이 좋으며, 읽기 작업이 많은 경우에는 낙관적 락을 활용하는 것이 효과적입니다.
11. 데이터의 무결성 (Data Integrity)
무결성은 데이터베이스에서 데이터의 정확성, 일관성 및 유효성을 보장하기 위한 개념입니다. 데이터베이스의 무결성은 다음과 같은 측면을 다룹니다:
정확성 (Accuracy): 데이터는 정확하고 오류가 없어야 합니다. 이는 데이터가 실제 현실 세계를 정확하게 반영해야 함을 의미합니다.
일관성 (Consistency): 데이터는 일관된 상태를 유지해야 합니다. 여러 테이블 간의 관계나 조건에 따라 데이터가 일관성 있게 유지되어야 합니다.
유효성 (Validity): 데이터는 정해진 규칙과 제약 조건을 준수해야 합니다. 예를 들어, 나이가 음수가 될 수 없는 경우에는 이를 준수해야 합니다.
12. 무결성 제약 조건 (Integrity Constraints)
무결성 제약 조건은 데이터베이스에서 무결성을 보장하기 위해 데이터의 저장, 삭제, 수정을 제약하는 규칙입니다. 이러한 제약 조건은 다음과 같이 구체적으로 정의될 수 있습니다:
개체 무결성 (Entity Integrity):
참조 무결성 (Referential Integrity):
무결성 제약 조건은 데이터베이스 관리 시스템(DBMS)에 의해 강제되며, 데이터의 정확성과 무결성을 보장하는 데 중요한 역할을 합니다. 이러한 제약 조건을 설정하여 데이터의 무결성을 유지하고 데이터의 신뢰성을 확보할 수 있습니다.
13. DELETE, TRUNCATE, DROP의 차이
14. 트리거 (Trigger)란?
트리거는 데이터베이스에서 특정 테이블에 대한 INSERT, DELETE, UPDATE와 같은 데이터 조작 언어 (DML) 작업이 수행될 때 자동으로 실행되도록 작성된 프로그램 또는 프로시저입니다. 트리거는 사용자가 직접 호출하는 것이 아니라 데이터베이스 시스템에서 자동으로 호출됩니다.
자동 실행:
프로시저 실행:
트리거는 데이터베이스의 상태나 데이터 변경을 감지하고, 그에 따라 필요한 작업을 수행하여 데이터베이스의 일관성과 무결성을 유지하는 데 유용합니다. 특히 복잡한 비즈니스 논리나 보안 정책을 적용할 때 자주 사용됩니다.
15. DML, DDL, DCL의 차이
16. DB 인덱스란?
인덱스(Index)는 테이블의 모든 데이터를 처음부터 끝까지 검색하지 않고, 특정 열(또는 열의 조합)에 대한 빠른 검색 및 접근을 가능하게 하는 데이터베이스 객체입니다.
인덱스는 다음과 같은 기능을 제공합니다:
빠른 검색: 인덱스는 항상 정렬된 상태를 유지하므로 검색 작업을 빠르게 수행할 수 있습니다. 특히 대량의 데이터에서 원하는 값을 빠르게 찾을 때 유용합니다.
정렬된 저장: 인덱스를 사용하면 해당 열의 데이터를 정렬된 상태로 저장합니다. 이로써 원하는 범위의 값을 검색할 때도 효율적입니다.
인덱스를 사용하는 동안에는 다음과 같은 단점도 고려해야 합니다:
성능 저하: 새로운 값을 추가하거나 삭제, 수정하는 경우에는 인덱스도 변경하고 정렬해야 하므로 성능이 저하될 수 있습니다.
저장 공간 사용: 인덱스는 데이터베이스 내에 별도의 저장 공간을 차지하므로, 저장 공간을 더 많이 사용하게 됩니다.
인덱스는 데이터의 저장 성능을 일부 희생하면서도 데이터의 검색 속도를 획기적으로 높일 수 있는 기능입니다. 따라서 데이터베이스 설계 시 어떤 열에 인덱스를 생성할지를 신중하게 결정해야 합니다.
17. B+ 트리 (B+ Tree)
B+ 트리는 B 트리를 확장한 자료구조로, 데이터베이스 인덱스 구조에 주로 사용됩니다.
18. 해시 인덱스 방식 vs. B+ 트리 인덱스 방식
19. 정규화(Normalization)란?
정규화는 하나의 릴레이션에 하나의 의미만 존재하도록 릴레이션을 분해하는 과정입니다. 이를 통해 데이터의 일관성을 유지하고 최소한의 데이터 중복을 가지며 최대한의 데이터 유연성을 확보하기 위해 진행됩니다.
이상현상은 테이블을 설계할 때 잘못 설계하여 데이터를 삽입, 삭제, 수정할 때 생기는 논리적 오류를 의미합니다. 이상현상은 다음과 같은 종류로 나뉩니다:
1정규화 (First Normal Form - 1NF): 테이블의 컬럼이 하나의 값을 갖도록 테이블을 분해하는 것으로, 도메인이 원자값만을 포함하도록 합니다.
2정규화 (Second Normal Form - 2NF): 기본키의 부분집합이 결정자가 되지 않도록 테이블을 분리합니다. 이는 완전 함수적 종속을 제거하는 과정입니다.
3정규화 (Third Normal Form - 3NF): 이행 종속을 제거합니다. 즉, a -> b, b -> c일 때 a -> c가 성립되는 것을 분리하여 테이블을 정규화합니다.
BCNF 정규화 (Boyce-Codd Normal Form - BCNF): 값을 정하는 결정자가 후보키가 되도록 테이블을 분해합니다. 이상적으로 모든 결정키가 후보키여야 합니다.
20. 역정규화(반정규화)란?
역정규화 또는 반정규화는 데이터베이스 설계에서 정규화의 단점을 극복하기 위한 과정입니다. 정규화는 데이터 중복을 최소화하고 데이터 일관성을 보장하기 위한 중요한 개념이지만, JOIN 연산이 늘어나는 결과를 초래하여 읽기 작업이 많은 데이터베이스의 성능을 저하시킬 수 있습니다.
역정규화를 수행하는 주요 이유와 목적은 다음과 같습니다:
읽기 성능 향상: JOIN 연산의 사용을 줄여 읽기 작업의 성능을 향상시키는 것이 주요 목적입니다.
간결한 쿼리: 역정규화를 통해 데이터를 중복 저장하면 더 간결하고 효율적인 쿼리를 작성할 수 있습니다.
복잡성 감소: 정규화로 인해 복잡해진 데이터 모델을 단순화하고 유지보수를 용이하게 만듭니다.
예를 들어, 고객 정보와 주문 정보가 별도의 테이블에 저장되는 경우, 주문 정보를 조회할 때 JOIN 연산이 필요합니다. 역정규화를 적용하면 고객 정보를 주문 테이블에 중복 저장하여 JOIN을 줄일 수 있습니다.
하지만 역정규화는 주의해서 사용해야 합니다. 데이터 중복으로 인해 데이터 무결성의 위험이 높아지며, 쓰기 작업에 대한 관리가 복잡해질 수 있습니다. 따라서 역정규화는 읽기 성능을 향상시키기 위한 특별한 상황에서 사용하는 것이 권장됩니다.
21. Connection Pool(커넥션 풀)이란?
Connection Pool은 클라이언트의 요청에 따라 각 애플리케이션 스레드에서 데이터베이스(DB)에 접근하기 위해 필요한 Connection(연결)을 미리 생성하고 이를 풀에 보관해두는 개념을 의미합니다.
성능 향상: 요청이 발생할 때마다 Connection을 생성하는 방식은 연결량이 많을 때 서버에 과부하를 초래할 수 있습니다. Connection Pool을 사용하면 미리 생성된 Connection을 재사용함으로써 연결 및 해제에 따른 오버헤드를 줄여 성능을 향상시킵니다.
리소스 관리: Connection Pool을 사용하면 미리 정해진 개수의 Connection만 허용하기 때문에 리소스 소모를 제어할 수 있습니다. 이를 통해 애플리케이션이 메모리 누수나 과도한 커넥션 생성으로 인한 문제를 방지할 수 있습니다.
안정성 향상: Connection Pool을 사용하면 커넥션을 관리하고 검사할 수 있어, 불필요한 에러와 장애를 예방하며 애플리케이션의 안정성을 높입니다.
초기화: 애플리케이션 시작 시 미리 정해진 개수의 Connection을 생성하고 풀에 저장합니다.
요청 처리: 클라이언트 요청이 들어올 때마다 Connection Pool에서 Connection을 빌려주고, 요청 처리가 완료되면 다시 풀에 반환합니다.
연결 유지: Connection Pool은 Connection을 유지하며 일정 시간 동안 사용되지 않을 경우 자동으로 반환 또는 연결을 유지합니다.
풀 제어: Connection Pool은 최대 연결 수, 최소 연결 수 등을 설정하여 풀의 크기를 관리합니다.
Connection Pool을 사용하면 생성 및 소멸에 대한 시간 소요가 없어 효율적이며, 동시에 사용 가능한 커넥션 수가 제어되어 애플리케이션이 쉽게 과부하에 빠지지 않습니다.
이를 통해 데이터베이스와 애플리케이션 간의 효율적인 연결 관리를 가능하게 합니다. 추가 질문이나 더 자세한 설명이 필요하면 언제든지 물어보세요.
22. RDB vs. NoSQL: 주요 차이점
데이터 저장 방식:
쿼리 언어:
확장성:
사용 사례:
데이터 저장 방식:
유연성:
확장성:
사용 사례:
23. DB 클러스터링 (Database Clustering)란?
DB 클러스터링은 데이터베이스 시스템을 구축할 때 사용되는 방식 중 하나로, 여러 대의 DB 서버가 공유 스토리지를 사용하고, 동일한 DB 서버를 여러 대 놓아 사용하는 방식입니다. 이러한 클러스터링은 데이터베이스 시스템의 가용성과 성능 향상을 위해 사용됩니다.
Active-Active 방식:
Active-Standby 방식:
24. DB 레플리케이션 (DB Replication)란?
DB 레플리케이션은 데이터베이스 서버와 데이터베이스 스토리지를 다중화하는 방식으로, DB 클러스터링과는 다른 개념입니다. 주요 특징과 동작 방식은 다음과 같습니다:
트래픽 분산:
비동기 복제:
장애 대처:
25. 수직 파티셔닝 (Vertical Partitioning)
수직 파티셔닝은 큰 테이블이나 인덱스를 관리하기 쉬운 단위로 분리하는 데이터베이스 파티셔닝 기법입니다. 이것은 테이블을 더 작은 논리적 또는 물리적인 단위로 분할하는 것을 의미합니다. 예를 들어, "사람"이라는 테이블이 너무 커지면 "북유럽인", "아시아인", "서유럽인"과 같이 지역 또는 속성에 따라 테이블을 분리하는 것입니다.
장점:
단점:
26. 수평 파티셔닝 (샤딩 - Sharding)
수평 파티셔닝 또는 샤딩은 동일한 테이블 스키마를 가진 데이터를 다수의 데이터베이스에 분산하여 저장하는 방식입니다. 이것은 데이터를 잘 분산시키기 위해 Shard Key를 고려해야 합니다. Shard Key를 선택하는 방법에는 Hash Sharding, Dynamic Sharding, Entity Group 방식 등이 있습니다.
샤딩의 장점:
샤딩의 단점:
27. SQL Injection (SQL 인젝션)이란?
SQL Injection은 악의적인 사용자가 보안상의 취약점을 이용하여 임의의 SQL 문을 주입하고 실행되게 하여 데이터베이스(DB)가 비정상적인 동작을 하도록 조작하는 공격 행위를 의미합니다.
SQL Injection 공격은 다양한 기법을 사용할 수 있으며, 주요한 공격 기법으로는 다음과 같은 것들이 있습니다:
Error based SQL Injection: 악의적 사용자는 SQL 문에서 오류를 유발하고, 그 오류 메시지를 통해 민감한 정보를 추출합니다.
Union based SQL Injection: UNION 연산자를 이용하여 다른 테이블의 데이터를 추출하는 방법입니다.
Boolean based SQL Injection: 참과 거짓의 조건을 이용하여 데이터베이스 정보를 추출하는 공격입니다.
Time based SQL Injection: 딜레이 함수를 이용하여 데이터베이스가 어떤 정보를 가지고 있는지 확인하는 공격입니다.
SQL Injection 공격을 예방하고 대응하기 위한 방안으로는 다음과 같은 것들이 있습니다:
입력 값에 대한 검증: 사용자로부터 입력 받은 데이터를 검증하여 SQL Injection 공격에 사용되는 악의적인 코드를 필터링합니다.
Prepared Statement 구문 사용: 데이터베이스 쿼리를 실행할 때 Prepared Statement를 사용하여 입력 값을 파라미터화하여 SQL Injection을 방지합니다.
Error Message 노출 금지: 에러 메시지에는 민감한 정보가 노출되지 않도록 조치합니다.
웹 방화벽 사용: 웹 애플리케이션에 웹 방화벽을 도입하여 SQL Injection 공격을 탐지하고 차단합니다.
28. ORM (Object-Relational Mapping)란?
ORM은 "객체와 관계형 데이터베이스 매핑"의 약어로, OOP (Object-Oriented Programming)에서 사용하는 객체 개념과 RDB (Relational Database)에서 사용하는 데이터 테이블을 서로 매핑하는 기술을 의미합니다.
객체 지향 프로그래밍 (OOP): 소프트웨어 개발 패러다임 중 하나로, 데이터와 기능을 객체로 묶어 관리하는 방식을 기반으로 합니다.
관계형 데이터베이스 (RDB): 데이터를 테이블 형태로 관리하는 데이터베이스 시스템을 의미하며, SQL을 사용하여 데이터를 조작합니다.
ORM은 객체 지향 프로그래밍에서 사용되는 객체와 관계형 데이터베이스 사이의 변환 작업을 자동화합니다. 이를 통해 다음과 같은 장점을 제공합니다:
객체와 데이터베이스 간의 매핑: 객체를 데이터베이스 테이블로 매핑하고, 객체 간의 관계를 데이터베이스의 관계로 표현합니다.
SQL 추상화: ORM은 SQL 쿼리를 직접 작성하지 않고도 객체를 통해 데이터베이스 조작을 수행할 수 있도록 돕습니다.
데이터 일관성 유지: ORM은 데이터베이스와의 상호 작용을 추상화하므로 데이터 일관성을 유지하기 쉽습니다.
코드 재사용 및 유지보수 용이성: ORM을 사용하면 데이터베이스 접근 코드를 일반화하고 재사용할 수 있으며, 시스템을 변경할 때 유지보수가 용이해집니다.
29. 옵티마이저 (Optimizer)란?
옵티마이저는 데이터베이스 관리 시스템(DBMS) 내부의 핵심 엔진으로, SQL 쿼리를 가장 빠르고 효율적으로 수행할 최적의 처리 경로를 생성해주는 역할을 합니다. 비유적으로 말하면, 컴퓨터의 CPU가 컴퓨팅 작업을 최적화하는 역할을 하는 것처럼, DBMS의 옵티마이저는 SQL 쿼리를 최적화하여 데이터베이스에서 가장 효율적으로 처리할 수 있는 방법을 결정합니다.
실행 계획 생성: 개발자가 작성한 SQL 쿼리를 받아서 실행 계획을 생성합니다. 이 계획은 어떤 순서로 테이블을 스캔하고 어떤 인덱스를 사용할지 등의 정보를 포함합니다.
최적의 실행 경로 결정: 옵티마이저는 여러 가지 가능한 실행 경로 중에서 가장 효율적인 것을 선택합니다. 이를 통해 데이터베이스의 리소스를 효율적으로 활용하고 쿼리의 처리 시간을 최소화합니다.
힌트 사용: 옵티마이저가 항상 최적의 실행 경로를 보장하지는 않기 때문에, 개발자가 직접 최적의 실행 경로를 지정할 수 있는데, 이를 "힌트"라고 부릅니다. 힌트를 사용하여 옵티마이저의 결정을 덮어쓸 수 있습니다.