Interview
개발자 기술면접 대비 - DB
Dev Warrior Jungi
2025. 4. 12. 04:01
질문 리스트
RDBMS가 무엇인가요? NoSQL과는 어떻게 다르나요?
RDBMS(Relational Database Management System)
테이블(표) 형태로 데이터를 저장하고, 관계(Relation)를 기반으로 데이터를 관리하는 데이터베이스 시스템
데이터는 행(Row)과 열(Column) 구조로 표현되며,
SQL(Structured Query Language)로 데이터 정의, 조회, 수정, 삭제를 수행합니다.
대표적인 RDBMS에는 MySQL, PostgreSQL, Oracle, MSSQL 등이 있습니다.
NoSQL
"Not Only SQL"의 줄임말로,
관계형 구조가 아닌 다양한 방식(문서, 키-값, 그래프, 컬럼 기반 등)으로 데이터를 저장하는 데이터베이스
NoSQL은 대량의 데이터 처리와 수평적 확장성(Scale-out)이 필요한 상황에서 주로 사용되며, MongoDB, Redis, Cassandra 같은 데이터베이스가 이상 현상의 종류에 대해 설명해주세요. 대표적입니다.
테이블(표) 형태로 데이터를 저장하고, 관계(Relation)를 기반으로 데이터를 관리하는 데이터베이스 시스템
데이터는 행(Row)과 열(Column) 구조로 표현되며,
SQL(Structured Query Language)로 데이터 정의, 조회, 수정, 삭제를 수행합니다.
대표적인 RDBMS에는 MySQL, PostgreSQL, Oracle, MSSQL 등이 있습니다.
NoSQL
"Not Only SQL"의 줄임말로,
관계형 구조가 아닌 다양한 방식(문서, 키-값, 그래프, 컬럼 기반 등)으로 데이터를 저장하는 데이터베이스
NoSQL은 대량의 데이터 처리와 수평적 확장성(Scale-out)이 필요한 상황에서 주로 사용되며, MongoDB, Redis, Cassandra 같은 데이터베이스가 이상 현상의 종류에 대해 설명해주세요. 대표적입니다.
트랜잭션(Transaction)이란 무엇인가요?
트랜잭션(Transaction)
데이터베이스에서 수행되는 하나의 논리적 작업 단위를 의미합니다.
즉, 여러 개의 데이터베이스 연산(INSERT, UPDATE, DELETE 등)을 묶어 모두 성공하거나 모두 실패해야 하는 하나의 작업입니다.
트랜잭션이 중요한 이유는, 데이터베이스의 일관성과 신뢰성을 유지하기 위해서입니다.
예를 들어, 은행 송금처럼 A 계좌에서 돈을 빼고 B 계좌에 돈을 넣는 작업은 둘 다 성공해야지, 하나만 성공하면 안 됩니다.
데이터베이스에서 수행되는 하나의 논리적 작업 단위를 의미합니다.
즉, 여러 개의 데이터베이스 연산(INSERT, UPDATE, DELETE 등)을 묶어 모두 성공하거나 모두 실패해야 하는 하나의 작업입니다.
트랜잭션이 중요한 이유는, 데이터베이스의 일관성과 신뢰성을 유지하기 위해서입니다.
예를 들어, 은행 송금처럼 A 계좌에서 돈을 빼고 B 계좌에 돈을 넣는 작업은 둘 다 성공해야지, 하나만 성공하면 안 됩니다.
ACID란 무엇인가요?
트랜잭션은 다음과 같은 ACID 특성을 만족해야 합니다:
A (Atomicity, 원자성)
트랜잭션은 모두 성공하거나 모두 실패해야 합니다. 중간 실패는 허용되지 않습니다.
C (Consistency, 일관성)
트랜잭션 실행 전후에 데이터베이스는 항상 일관된 상태를 유지해야 합니다.
I (Isolation, 고립성)
동시에 여러 트랜잭션이 실행되더라도 각각이 독립적으로 수행되어야 합니다. 다른 트랜잭션에 영향을 주지 않아야 합니다.
D (Durability, 지속성)
트랜잭션이 성공적으로 완료되면, 시스템 장애가 발생해도 그 결과는 영구적으로 보장되어야 합니다.
A (Atomicity, 원자성)
트랜잭션은 모두 성공하거나 모두 실패해야 합니다. 중간 실패는 허용되지 않습니다.
C (Consistency, 일관성)
트랜잭션 실행 전후에 데이터베이스는 항상 일관된 상태를 유지해야 합니다.
I (Isolation, 고립성)
동시에 여러 트랜잭션이 실행되더라도 각각이 독립적으로 수행되어야 합니다. 다른 트랜잭션에 영향을 주지 않아야 합니다.
D (Durability, 지속성)
트랜잭션이 성공적으로 완료되면, 시스템 장애가 발생해도 그 결과는 영구적으로 보장되어야 합니다.
Isolation Level(격리 수준)이 무엇인가요?
Isolation Level(격리 수준)
여러 트랜잭션이 동시에 실행될 때, 서로의 작업 결과를 어느 정도까지 격리할지 정하는 규칙입니다.
트랜잭션끼리 너무 엄격하게 격리하면 시스템 성능이 떨어질 수 있고,
반대로 격리를 약하게 하면 데이터 일관성이 깨질 수 있습니다.
SQL 표준에서는 다음과 같은 네 가지 Isolation Level을 정의
1. Read Uncommitted (커밋되지 않은 읽기)
다른 트랜잭션이 아직 커밋하지 않은 데이터도 읽을 수 있습니다.
(Dirty Read가 발생할 수 있음)
2. Read Committed (커밋된 읽기)
다른 트랜잭션이 커밋한 데이터만 읽을 수 있습니다.
(Dirty Read는 방지하지만, Non-repeatable Read는 발생 가능)
3. Repeatable Read (반복 가능한 읽기)
트랜잭션이 시작한 이후로 읽은 데이터는 항상 동일하게 보장됩니다.
(Non-repeatable Read 방지, 그러나 Phantom Read는 발생할 수 있음)
4. Serializable (직렬화)
트랜잭션을 순차적으로 실행하는 것처럼 보장합니다.
(가장 높은 격리 수준, 모든 문제 방지하지만 성능이 가장 낮음)"
여러 트랜잭션이 동시에 실행될 때, 서로의 작업 결과를 어느 정도까지 격리할지 정하는 규칙입니다.
트랜잭션끼리 너무 엄격하게 격리하면 시스템 성능이 떨어질 수 있고,
반대로 격리를 약하게 하면 데이터 일관성이 깨질 수 있습니다.
SQL 표준에서는 다음과 같은 네 가지 Isolation Level을 정의
1. Read Uncommitted (커밋되지 않은 읽기)
다른 트랜잭션이 아직 커밋하지 않은 데이터도 읽을 수 있습니다.
(Dirty Read가 발생할 수 있음)
2. Read Committed (커밋된 읽기)
다른 트랜잭션이 커밋한 데이터만 읽을 수 있습니다.
(Dirty Read는 방지하지만, Non-repeatable Read는 발생 가능)
3. Repeatable Read (반복 가능한 읽기)
트랜잭션이 시작한 이후로 읽은 데이터는 항상 동일하게 보장됩니다.
(Non-repeatable Read 방지, 그러나 Phantom Read는 발생할 수 있음)
4. Serializable (직렬화)
트랜잭션을 순차적으로 실행하는 것처럼 보장합니다.
(가장 높은 격리 수준, 모든 문제 방지하지만 성능이 가장 낮음)"
Dirty Read, Non-repeatable Read, Phantom Read가 뭔가요?
트랜잭션이 동시에 실행될 때 발생할 수 있는 읽기 문제는 다음 세 가지로 나눌 수 있습니다:
Dirty Read
다른 트랜잭션이 아직 커밋하지 않은 변경사항을 읽는 것을 말합니다.
만약 읽은 트랜잭션이 끝나기 전에 원래 트랜잭션이 롤백되면, 잘못된 데이터를 읽은 셈이 됩니다.
예시: 트랜잭션 A가 금액을 100 → 200으로 수정했지만 아직 커밋하지 않은 상태에서, 트랜잭션 B가 200을 읽음. 이후 A가 롤백하면 B는 잘못된 데이터(200)를 읽은 셈이 됨.
Non-repeatable Read
한 트랜잭션 안에서 같은 데이터를 두 번 읽었는데, 그 사이에 다른 트랜잭션이 값을 수정해버려 읽은 결과가 달라지는 것을 말합니다.
예시: 트랜잭션 A가 특정 상품 가격을 읽었는데, 트랜잭션 B가 그 가격을 변경하고 커밋함. 다시 읽었을 때 가격이 달라져 있음.
Phantom Read
한 트랜잭션 안에서 같은 조건으로 조회했을 때, 다른 트랜잭션이 새로운 행(Row)을 삽입하거나 삭제해서 조회 결과가 달라지는 것을 말합니다.
예시: 트랜잭션 A가 "가격이 100 이하인 상품 목록"을 조회했는데, 트랜잭션 B가 새로운 상품을 가격 90으로 삽입하고 커밋. A가 다시 같은 조건으로 조회했더니 새 상품이 생겨 있음.
Dirty Read
다른 트랜잭션이 아직 커밋하지 않은 변경사항을 읽는 것을 말합니다.
만약 읽은 트랜잭션이 끝나기 전에 원래 트랜잭션이 롤백되면, 잘못된 데이터를 읽은 셈이 됩니다.
예시: 트랜잭션 A가 금액을 100 → 200으로 수정했지만 아직 커밋하지 않은 상태에서, 트랜잭션 B가 200을 읽음. 이후 A가 롤백하면 B는 잘못된 데이터(200)를 읽은 셈이 됨.
Non-repeatable Read
한 트랜잭션 안에서 같은 데이터를 두 번 읽었는데, 그 사이에 다른 트랜잭션이 값을 수정해버려 읽은 결과가 달라지는 것을 말합니다.
예시: 트랜잭션 A가 특정 상품 가격을 읽었는데, 트랜잭션 B가 그 가격을 변경하고 커밋함. 다시 읽었을 때 가격이 달라져 있음.
Phantom Read
한 트랜잭션 안에서 같은 조건으로 조회했을 때, 다른 트랜잭션이 새로운 행(Row)을 삽입하거나 삭제해서 조회 결과가 달라지는 것을 말합니다.
예시: 트랜잭션 A가 "가격이 100 이하인 상품 목록"을 조회했는데, 트랜잭션 B가 새로운 상품을 가격 90으로 삽입하고 커밋. A가 다시 같은 조건으로 조회했더니 새 상품이 생겨 있음.
인덱스(Index)는 무엇인가요?
인덱스(Index)
데이터베이스 테이블에서 원하는 데이터를 빠르게 찾기 위해 사용하는 자료구조입니다.
인덱스를 사용하지 않으면, 특정 데이터를 찾기 위해 테이블 전체를 처음부터 끝까지 탐색해야 합니다.
이를 풀 테이블 스캔(Full Table Scan) 이라고 하는데, 데이터 양이 많을수록 속도가 매우 느려집니다.
인덱스는 주로 B-Tree나 Hash 같은 자료구조를 이용해 만들어지며,
검색, 조회, 정렬 작업에서 성능을 크게 향상시킵니다.
하지만 인덱스는 데이터를 삽입하거나 수정할 때 추가 관리 비용이 발생합니다.
그래서 인덱스는 자주 조회되는 컬럼에만 신중하게 설정해야 합니다.
데이터베이스 테이블에서 원하는 데이터를 빠르게 찾기 위해 사용하는 자료구조입니다.
인덱스를 사용하지 않으면, 특정 데이터를 찾기 위해 테이블 전체를 처음부터 끝까지 탐색해야 합니다.
이를 풀 테이블 스캔(Full Table Scan) 이라고 하는데, 데이터 양이 많을수록 속도가 매우 느려집니다.
인덱스는 주로 B-Tree나 Hash 같은 자료구조를 이용해 만들어지며,
검색, 조회, 정렬 작업에서 성능을 크게 향상시킵니다.
하지만 인덱스는 데이터를 삽입하거나 수정할 때 추가 관리 비용이 발생합니다.
그래서 인덱스는 자주 조회되는 컬럼에만 신중하게 설정해야 합니다.
클러스터드 인덱스와 넌클러스터드 인덱스 차이는?
클러스터드 인덱스(Clustered Index)
테이블의 실제 데이터 자체가 인덱스 구조에 맞춰 정렬되어 저장되는 인덱스입니다.
하나의 테이블에 클러스터드 인덱스는 단 하나만 존재할 수 있습니다.
(왜냐하면 실제 데이터가 정렬된 구조 자체이기 때문입니다.)
넌클러스터드 인덱스(Non-clustered Index)
인덱스와 실제 데이터가 분리되어 저장됩니다.
인덱스는 검색용 키와 실제 데이터 위치(주소)를 별도로 가지고 있고,
인덱스를 찾은 다음 다시 실제 테이블로 가서 데이터를 읽어야 합니다.
테이블의 실제 데이터 자체가 인덱스 구조에 맞춰 정렬되어 저장되는 인덱스입니다.
하나의 테이블에 클러스터드 인덱스는 단 하나만 존재할 수 있습니다.
(왜냐하면 실제 데이터가 정렬된 구조 자체이기 때문입니다.)
넌클러스터드 인덱스(Non-clustered Index)
인덱스와 실제 데이터가 분리되어 저장됩니다.
인덱스는 검색용 키와 실제 데이터 위치(주소)를 별도로 가지고 있고,
인덱스를 찾은 다음 다시 실제 테이블로 가서 데이터를 읽어야 합니다.
데이터베이스 언어(DDL, DML, DCL)에 대해 설명해주세요.
데이터베이스 언어는 DB를 조작하고 관리하기 위해 사용하는 명령어들을 의미하며, 크게 DDL, DML, DCL로 나눌 수 있습니다.
DDL (Data Definition Language)
데이터베이스 구조를 정의하거나 변경하는 언어입니다.
예시: CREATE, ALTER, DROP, TRUNCATE
DML (Data Manipulation Language)
데이터베이스 안에 저장된 데이터를 조회, 삽입, 수정, 삭제하는 언어입니다.
예시: SELECT, INSERT, UPDATE, DELETE
DCL (Data Control Language)
데이터베이스에 대한 접근 권한을 제어하는 언어입니다.
예시: GRANT, REVOKE
DDL (Data Definition Language)
데이터베이스 구조를 정의하거나 변경하는 언어입니다.
예시: CREATE, ALTER, DROP, TRUNCATE
DML (Data Manipulation Language)
데이터베이스 안에 저장된 데이터를 조회, 삽입, 수정, 삭제하는 언어입니다.
예시: SELECT, INSERT, UPDATE, DELETE
DCL (Data Control Language)
데이터베이스에 대한 접근 권한을 제어하는 언어입니다.
예시: GRANT, REVOKE
SELECT 쿼리의 수행 순서를 알려주세요.
SQL 쿼리는 우리가 작성하는 순서(SELECT → FROM → WHERE...)와 실제 데이터베이스가 실행하는 순서가 다릅니다.
데이터베이스는 쿼리를 다음과 같은 순서로 처리합니다:
데이터베이스는 쿼리를 다음과 같은 순서로 처리합니다:
순서 | 단계 | 설명 |
1 | FROM | 데이터를 가져올 테이블 선택 |
2 | ON | 조인 조건 처리 |
3 | JOIN | 테이블 결합 |
4 | WHERE | 조건으로 행(Row) 필터링 |
5 | GROUP BY | 데이터를 그룹핑 |
6 | HAVING | 그룹핑된 데이터 필터링 |
7 | SELECT | 가져올 컬럼 선택 |
8 | DISTINCT | 결과 중복 제거 |
9 | ORDER BY | 결과 정렬 |
10 | LIMIT | 결과 개수 제한 |
트리거(Trigger)에 대해 설명해주세요.
트리거(Trigger)
특정 테이블에 대해 INSERT, UPDATE, DELETE 같은 이벤트가 발생할 때 자동으로 실행되는 저장 프로시저입니다.
사용자가 직접 트리거를 호출하는 것이 아니라, 특정 이벤트가 발생하면 DBMS가 자동으로 트리거를 실행.
* 트리거의 목적
1. 데이터 무결성 유지
(ex. 주문이 들어올 때마다 자동으로 재고를 감소시키기)
2. 로그 기록 자동화
(ex. 데이터 변경 이력을 자동으로 저장)
3. 복잡한 제약 조건 구현
(ex. 두 테이블 간 동기화 처리)
* 트리거의 구분
BEFORE Trigger: 본 작업 전에 실행 (검증/거부할 때 사용)
AFTER Trigger: 본 작업이 끝난 후 실행 (이력 저장/추가 작업할 때 사용)
특정 테이블에 대해 INSERT, UPDATE, DELETE 같은 이벤트가 발생할 때 자동으로 실행되는 저장 프로시저입니다.
사용자가 직접 트리거를 호출하는 것이 아니라, 특정 이벤트가 발생하면 DBMS가 자동으로 트리거를 실행.
* 트리거의 목적
1. 데이터 무결성 유지
(ex. 주문이 들어올 때마다 자동으로 재고를 감소시키기)
2. 로그 기록 자동화
(ex. 데이터 변경 이력을 자동으로 저장)
3. 복잡한 제약 조건 구현
(ex. 두 테이블 간 동기화 처리)
* 트리거의 구분
BEFORE Trigger: 본 작업 전에 실행 (검증/거부할 때 사용)
AFTER Trigger: 본 작업이 끝난 후 실행 (이력 저장/추가 작업할 때 사용)
B-트리 vs B+트리에 대해 설명해주세요.
B-트리(B-Tree) 와 B+트리(B+Tree) 는 모두 데이터베이스 인덱스에 사용되는 균형 트리 자료구조입니다.
하지만 구조와 탐색 방식에 몇 가지 중요한 차이가 있습니다.
B-트리는 모든 노드(내부 노드와 리프 노드) 에 데이터(key와 value) 를 저장합니다.
B+트리는 오직 리프(leaf) 노드에만 실제 데이터(value)를 저장하고,
내부 노드에는 검색을 위한 key만 존재합니다.
이 때문에 B+트리는 리프 노드끼리 Linked List 형태로 연결되어 있어,
범위 검색(Range Query)에 훨씬 더 유리합니다.
하지만 구조와 탐색 방식에 몇 가지 중요한 차이가 있습니다.
B-트리는 모든 노드(내부 노드와 리프 노드) 에 데이터(key와 value) 를 저장합니다.
B+트리는 오직 리프(leaf) 노드에만 실제 데이터(value)를 저장하고,
내부 노드에는 검색을 위한 key만 존재합니다.
이 때문에 B+트리는 리프 노드끼리 Linked List 형태로 연결되어 있어,
범위 검색(Range Query)에 훨씬 더 유리합니다.
인덱스 설정은 어떻게 해야할까요?
인덱스를 설정할 때는 조회 성능 향상과 쓰기 성능 저하를 모두 고려해야 합니다.
따라서 인덱스는 다음 기준에 따라 신중하게 설정해야 합니다:
WHERE 절에 자주 사용되는 컬럼
특정 조건으로 자주 조회되는 컬럼에 인덱스를 설정합니다.
(ex. WHERE user_id = 10)
JOIN에 사용되는 컬럼
테이블 간 조인 시 ON 조건에 등장하는 컬럼에도 인덱스를 설정합니다.
(ex. ON user.user_id = order.user_id)
ORDER BY, GROUP BY에 사용되는 컬럼
결과를 정렬하거나 그룹핑할 때 사용되는 컬럼도 인덱스를 설정하면 정렬 비용을 줄일 수 있습니다.
중복도가 낮은 컬럼(선택도가 높은 컬럼)
데이터 값이 다양하고 고르게 분포된 컬럼에 인덱스를 설정하는 것이 효과적입니다.
(ex. 주민등록번호 처럼 값이 거의 모두 다른 컬럼은 좋음) (ex. 성별처럼 값이 남/녀로 두 개뿐이면 인덱스 효과가 별로 없음)
복합 인덱스 고려
여러 조건을 동시에 자주 검색할 경우 (WHERE A = ? AND B = ?) 복합 인덱스를 설정할 수 있습니다.
이때는 선행 컬럼(왼쪽 컬럼)이 중요합니다.
다만, 모든 컬럼에 인덱스를 설정하는 것은 금물입니다.
인덱스가 많아질수록 삽입/수정/삭제 시 오버헤드가 커지고, 인덱스 유지 관리 비용이 발생하기 때문입니다.
따라서 인덱스는 다음 기준에 따라 신중하게 설정해야 합니다:
WHERE 절에 자주 사용되는 컬럼
특정 조건으로 자주 조회되는 컬럼에 인덱스를 설정합니다.
(ex. WHERE user_id = 10)
JOIN에 사용되는 컬럼
테이블 간 조인 시 ON 조건에 등장하는 컬럼에도 인덱스를 설정합니다.
(ex. ON user.user_id = order.user_id)
ORDER BY, GROUP BY에 사용되는 컬럼
결과를 정렬하거나 그룹핑할 때 사용되는 컬럼도 인덱스를 설정하면 정렬 비용을 줄일 수 있습니다.
중복도가 낮은 컬럼(선택도가 높은 컬럼)
데이터 값이 다양하고 고르게 분포된 컬럼에 인덱스를 설정하는 것이 효과적입니다.
(ex. 주민등록번호 처럼 값이 거의 모두 다른 컬럼은 좋음) (ex. 성별처럼 값이 남/녀로 두 개뿐이면 인덱스 효과가 별로 없음)
복합 인덱스 고려
여러 조건을 동시에 자주 검색할 경우 (WHERE A = ? AND B = ?) 복합 인덱스를 설정할 수 있습니다.
이때는 선행 컬럼(왼쪽 컬럼)이 중요합니다.
다만, 모든 컬럼에 인덱스를 설정하는 것은 금물입니다.
인덱스가 많아질수록 삽입/수정/삭제 시 오버헤드가 커지고, 인덱스 유지 관리 비용이 발생하기 때문입니다.
정규화에 대해 설명해주세요.
정규화(Normalization)
데이터베이스 설계 시 데이터 중복을 최소화하고, 데이터 무결성을 유지하기 위해 테이블을 체계적으로 분해하는 과정입니다.
정규화를 통해 데이터가 불필요하게 중복되는 것을 방지하고, 데이터 삽입/수정/삭제 시 발생할 수 있는 이상(Anomaly) 현상을 최소화할 수 있습니다.
정규화의 단계
1NF (제1정규형)
모든 컬럼이 원자값(Atomic Value) 만 가지도록 테이블을 설계합니다.
즉, 하나의 셀에는 하나의 값만 들어가야 합니다. (중복된 컬럼 X)
2NF (제2정규형)
부분 함수 종속성(Primary Key의 일부에만 종속) 을 제거합니다.
기본 키 전체에 대해 완전하게 종속되어야 합니다.
3NF (제3정규형)
이행적 종속(Transitive Dependency) 을 제거합니다.
기본 키에 종속되지 않은 컬럼이 다른 일반 컬럼에 종속되어 있으면 분리합니다.
데이터베이스 설계 시 데이터 중복을 최소화하고, 데이터 무결성을 유지하기 위해 테이블을 체계적으로 분해하는 과정입니다.
정규화를 통해 데이터가 불필요하게 중복되는 것을 방지하고, 데이터 삽입/수정/삭제 시 발생할 수 있는 이상(Anomaly) 현상을 최소화할 수 있습니다.
정규화의 단계
1NF (제1정규형)
모든 컬럼이 원자값(Atomic Value) 만 가지도록 테이블을 설계합니다.
즉, 하나의 셀에는 하나의 값만 들어가야 합니다. (중복된 컬럼 X)
2NF (제2정규형)
부분 함수 종속성(Primary Key의 일부에만 종속) 을 제거합니다.
기본 키 전체에 대해 완전하게 종속되어야 합니다.
3NF (제3정규형)
이행적 종속(Transitive Dependency) 을 제거합니다.
기본 키에 종속되지 않은 컬럼이 다른 일반 컬럼에 종속되어 있으면 분리합니다.
정규화에는 어떤 장점이 있고, 어떤 단점이 있는지 아는대로 설명해주세요.
장점
1. 데이터 중복 감소
같은 데이터를 여러 테이블에 중복 저장하지 않게 되어 저장 공간이 절약됩니다.
2. 데이터 무결성 향상
중복이 없기 때문에 데이터가 일관되게 유지됩니다. 하나만 수정하면 됩니다.
3. 이상 현상(Anomaly) 방지
삽입 이상, 갱신 이상, 삭제 이상 같은 문제를 예방할 수 있습니다.
1. 데이터 중복 감소
같은 데이터를 여러 테이블에 중복 저장하지 않게 되어 저장 공간이 절약됩니다.
2. 데이터 무결성 향상
중복이 없기 때문에 데이터가 일관되게 유지됩니다. 하나만 수정하면 됩니다.
3. 이상 현상(Anomaly) 방지
삽입 이상, 갱신 이상, 삭제 이상 같은 문제를 예방할 수 있습니다.
단점
1. 조회 성능 저하
데이터가 여러 테이블로 분리되기 때문에, 조회할 때 조인이 많이 발생하여 성능이 떨어질 수 있습니다.
2. 복잡한 쿼리 작성
단순한 데이터 조회에도 여러 테이블을 조인해야 해서 쿼리 작성이 복잡해질 수 있습니다.
3. 과도한 정규화는 오히려 관리 비용 증가
필요 이상으로 테이블을 잘게 쪼개면 관리가 어려워질 수 있습니다.
역정규화하는 이유에 대해 아는대로 설명해주세요.
역정규화(Denormalization)
정규화된 데이터베이스 구조를 다시 일부러 중복시키거나 테이블을 합쳐서 조회 성능을 개선하는 작업
정규화를 하면 데이터 무결성은 좋아지지만, 테이블이 너무 많아지고, JOIN 연산이 많아져서
조회 성능이 떨어질 수 있습니다.
이런 경우 읽기 성능(조회 속도) 을 높이기 위해 일부러 테이블을 합치거나 중복 데이터를 허용하는 것이 역정규화입니다.
역정규화를 하는 주된 이유
1. 조회 성능 향상
조인(JOIN) 없이 빠르게 필요한 데이터를 조회할 수 있습니다.
2. 복잡한 쿼리 단순화
여러 테이블을 조인할 필요 없이 단일 테이블에서 필요한 정보를 가져올 수 있습니다.
3. 시스템 부하 감소
조인 연산이 줄어들면서 CPU, I/O 부하가 감소할 수 있습니다.
정규화된 데이터베이스 구조를 다시 일부러 중복시키거나 테이블을 합쳐서 조회 성능을 개선하는 작업
정규화를 하면 데이터 무결성은 좋아지지만, 테이블이 너무 많아지고, JOIN 연산이 많아져서
조회 성능이 떨어질 수 있습니다.
이런 경우 읽기 성능(조회 속도) 을 높이기 위해 일부러 테이블을 합치거나 중복 데이터를 허용하는 것이 역정규화입니다.
역정규화를 하는 주된 이유
1. 조회 성능 향상
조인(JOIN) 없이 빠르게 필요한 데이터를 조회할 수 있습니다.
2. 복잡한 쿼리 단순화
여러 테이블을 조인할 필요 없이 단일 테이블에서 필요한 정보를 가져올 수 있습니다.
3. 시스템 부하 감소
조인 연산이 줄어들면서 CPU, I/O 부하가 감소할 수 있습니다.
이상 현상의 종류에 대해 설명해주세요.
이상 현상(Anomaly)
데이터베이스 테이블 설계가 잘못되어 발생하는 비정상적인 데이터 문제를 말합니다.
주로 중복 데이터나 비정규화된 테이블에서 발생합니다.
1. 삽입 이상 (Insertion Anomaly)
데이터를 삽입하려고 할 때, 다른 불필요한 정보까지 함께 입력해야 하는 문제입니다.
예시: 학생과 수업 정보를 한 테이블에 저장하는 경우, 수업을 아직 듣지 않는 신입생을 등록하려면 수업 정보도 억지로 채워야 하는 문제.
2. 수정 이상 (Update Anomaly)
데이터를 수정할 때, 중복된 여러 행을 일관되게 수정하지 않으면 데이터 불일치가 발생하는 문제입니다.
예시: 강사의 이메일 주소가 여러 행에 중복되어 있을 때, 이메일 변경 시 모든 행을 수정하지 않으면 불일치 발생.
3. 삭제 이상 (Deletion Anomaly)
특정 데이터를 삭제하려고 할 때, 의도하지 않은 다른 중요한 정보까지 함께 삭제되는 문제입니다.
예시: 수업 정보를 삭제하려다, 수업과 연관된 학생 정보까지 모두 사라지는 문제.
데이터베이스 테이블 설계가 잘못되어 발생하는 비정상적인 데이터 문제를 말합니다.
주로 중복 데이터나 비정규화된 테이블에서 발생합니다.
1. 삽입 이상 (Insertion Anomaly)
데이터를 삽입하려고 할 때, 다른 불필요한 정보까지 함께 입력해야 하는 문제입니다.
예시: 학생과 수업 정보를 한 테이블에 저장하는 경우, 수업을 아직 듣지 않는 신입생을 등록하려면 수업 정보도 억지로 채워야 하는 문제.
2. 수정 이상 (Update Anomaly)
데이터를 수정할 때, 중복된 여러 행을 일관되게 수정하지 않으면 데이터 불일치가 발생하는 문제입니다.
예시: 강사의 이메일 주소가 여러 행에 중복되어 있을 때, 이메일 변경 시 모든 행을 수정하지 않으면 불일치 발생.
3. 삭제 이상 (Deletion Anomaly)
특정 데이터를 삭제하려고 할 때, 의도하지 않은 다른 중요한 정보까지 함께 삭제되는 문제입니다.
예시: 수업 정보를 삭제하려다, 수업과 연관된 학생 정보까지 모두 사라지는 문제.
RDBMS와 NoSQL은 각각 어떤 상황에 적합한가요?
RDBMS
1. 정형화된 데이터를 다룰 때
데이터 구조(스키마)가 명확하고 자주 변경되지 않는 경우
예: 금융 시스템, ERP, 쇼핑몰 결제 내역 관리
2. 데이터 무결성과 일관성(ACID)이 중요한 경우
트랜잭션 단위로 정확하게 처리가 보장되어야 하는 경우
예: 은행 이체, 주문 처리 시스템
3. 복잡한 관계형 데이터를 다룰 때
여러 테이블 간의 조인(Join)이 필요한 경우
예: 학생-수강과목-교수 연결 같은 복잡한 관계
NoSQL
1. 대규모 데이터를 빠르게 처리해야 할 때
초당 수백만 건 이상 기록되는 로그, IoT 데이터, 실시간 채팅 시스템
2. 비정형 데이터 또는 자주 변경되는 데이터 구조를 다룰 때
예: 유저 프로필 정보처럼 항목이 상황에 따라 계속 추가/삭제될 때
3. 수평 확장이 필요한 경우
서버를 여러 대 추가하여 성능을 높여야 할 때
예: 소셜 미디어 서비스(댓글, 좋아요, 친구목록 등)
4. 일관성보다 가용성과 속도가 중요한 경우
약간의 데이터 불일치보다 빠른 서비스 응답이 중요한 경우
예: SNS 피드, 상품 추천 시스템
1. 정형화된 데이터를 다룰 때
데이터 구조(스키마)가 명확하고 자주 변경되지 않는 경우
예: 금융 시스템, ERP, 쇼핑몰 결제 내역 관리
2. 데이터 무결성과 일관성(ACID)이 중요한 경우
트랜잭션 단위로 정확하게 처리가 보장되어야 하는 경우
예: 은행 이체, 주문 처리 시스템
3. 복잡한 관계형 데이터를 다룰 때
여러 테이블 간의 조인(Join)이 필요한 경우
예: 학생-수강과목-교수 연결 같은 복잡한 관계
NoSQL
1. 대규모 데이터를 빠르게 처리해야 할 때
초당 수백만 건 이상 기록되는 로그, IoT 데이터, 실시간 채팅 시스템
2. 비정형 데이터 또는 자주 변경되는 데이터 구조를 다룰 때
예: 유저 프로필 정보처럼 항목이 상황에 따라 계속 추가/삭제될 때
3. 수평 확장이 필요한 경우
서버를 여러 대 추가하여 성능을 높여야 할 때
예: 소셜 미디어 서비스(댓글, 좋아요, 친구목록 등)
4. 일관성보다 가용성과 속도가 중요한 경우
약간의 데이터 불일치보다 빠른 서비스 응답이 중요한 경우
예: SNS 피드, 상품 추천 시스템
트랜잭션 상태에 대해 설명해주세요.
1. Active (활동 상태)
트랜잭션이 시작되어 SQL 연산들을 수행하고 있는 상태입니다.
2. Partially Committed (부분 커밋 상태)
트랜잭션이 마지막 명령을 실행하고, 커밋을 준비하는 상태입니다.
3. Committed (커밋 완료 상태)
트랜잭션이 성공적으로 끝나고, 모든 변경사항이 데이터베이스에 영구 반영된 상태입니다.
4. Failed (실패 상태)
트랜잭션 수행 도중 오류가 발생하여, 정상적으로 완료되지 못한 상태입니다.
5. Aborted (중단 상태)
실패한 트랜잭션이 롤백(rollback)되어, 데이터베이스가 트랜잭션 시작 이전 상태로 복구된 상태입니다.
트랜잭션이 시작되어 SQL 연산들을 수행하고 있는 상태입니다.
2. Partially Committed (부분 커밋 상태)
트랜잭션이 마지막 명령을 실행하고, 커밋을 준비하는 상태입니다.
3. Committed (커밋 완료 상태)
트랜잭션이 성공적으로 끝나고, 모든 변경사항이 데이터베이스에 영구 반영된 상태입니다.
4. Failed (실패 상태)
트랜잭션 수행 도중 오류가 발생하여, 정상적으로 완료되지 못한 상태입니다.
5. Aborted (중단 상태)
실패한 트랜잭션이 롤백(rollback)되어, 데이터베이스가 트랜잭션 시작 이전 상태로 복구된 상태입니다.
HAVING과 WHERE의 차이를 설명해주세요.
WHERE 과 HAVING 은 모두 조건을 걸어 데이터를 필터링하는 데 사용되지만,
적용 시점과 대상이 다릅니다.
WHERE 절은 GROUP BY 전에 실행되어,
개별 행(Row) 에 대해 조건을 걸어 데이터를 필터링합니다.
HAVING 절은 GROUP BY 이후에 실행되어,
그룹(Group) 에 대해 조건을 걸어 필터링합니다.
적용 시점과 대상이 다릅니다.
WHERE 절은 GROUP BY 전에 실행되어,
개별 행(Row) 에 대해 조건을 걸어 데이터를 필터링합니다.
HAVING 절은 GROUP BY 이후에 실행되어,
그룹(Group) 에 대해 조건을 걸어 필터링합니다.
뷰(View)는 무엇인가요? 그리고 뷰의 장단점은 무엇인가요?
뷰(View)
하나 이상의 테이블을 조합하거나 특정 컬럼만 선택하여 저장한 가상의 테이블입니다.
실제 데이터를 별도로 저장하는 것이 아니라,
SELECT 쿼리 결과를 테이블처럼 사용할 수 있게 만들어주는 객체입니다.
즉, 뷰는 "SELECT 쿼리를 저장한 이름 붙은 쿼리" 라고 볼 수 있습니다.
뷰의 장점
1. 복잡한 쿼리 단순화
복잡한 조인이나 서브쿼리를 뷰로 만들어두면, 간단한 쿼리로 재사용할 수 있습니다.
2. 보안성 향상
원본 테이블 전체를 보여주지 않고, 일부 컬럼만 선택해서 노출할 수 있습니다. (ex. 개인정보 제외)
3. 논리적 독립성 제공
실제 테이블 구조가 변경되더라도, 뷰를 통해 사용하는 애플리케이션은 영향을 덜 받습니다.
하나 이상의 테이블을 조합하거나 특정 컬럼만 선택하여 저장한 가상의 테이블입니다.
실제 데이터를 별도로 저장하는 것이 아니라,
SELECT 쿼리 결과를 테이블처럼 사용할 수 있게 만들어주는 객체입니다.
즉, 뷰는 "SELECT 쿼리를 저장한 이름 붙은 쿼리" 라고 볼 수 있습니다.
뷰의 장점
1. 복잡한 쿼리 단순화
복잡한 조인이나 서브쿼리를 뷰로 만들어두면, 간단한 쿼리로 재사용할 수 있습니다.
2. 보안성 향상
원본 테이블 전체를 보여주지 않고, 일부 컬럼만 선택해서 노출할 수 있습니다. (ex. 개인정보 제외)
3. 논리적 독립성 제공
실제 테이블 구조가 변경되더라도, 뷰를 통해 사용하는 애플리케이션은 영향을 덜 받습니다.
뷰의 단점
1. 성능 저하 가능성
뷰는 기본적으로 매번 SELECT 쿼리를 실행하기 때문에, 복잡한 뷰를 많이 사용하면 성능이 저하될 수 있습니다.
2. DML 제약
일부 뷰에서는 INSERT, UPDATE, DELETE 같은 조작이 제한될 수 있습니다.
(특히 여러 테이블을 조인한 뷰나 집계 함수가 포함된 뷰)
3. 관리 복잡성
뷰가 너무 많아지거나 중첩 뷰(View on View)가 많아지면 관리가 복잡해질 수 있습니다.
Primary Key와 Foreign Key의 차이점은 무엇인가요?
Primary Key (기본 키)
테이블에서 각 행을 고유하게 식별하기 위한 컬럼입니다.
NULL 값을 허용하지 않으며, 중복도 허용되지 않습니다.
한 테이블에 하나만 존재할 수 있습니다.
예시: 주민등록번호, 사번 등
테이블에서 각 행을 고유하게 식별하기 위한 컬럼입니다.
NULL 값을 허용하지 않으며, 중복도 허용되지 않습니다.
한 테이블에 하나만 존재할 수 있습니다.
예시: 주민등록번호, 사번 등
Foreign Key (외래 키)
다른 테이블의 Primary Key를 참조하는 컬럼입니다.
두 테이블 간 관계를 설정하는 데 사용됩니다.
여러 개 존재할 수 있고, NULL은 허용될 수도 있습니다.
외래 키는 참조 무결성을 유지하도록 도와줍니다.
INNER JOIN과 OUTER JOIN의 차이점은 무엇인가요?
INNER JOIN
두 테이블 간 조인 조건을 만족하는 데이터만 결과에 포함합니다.
조건에 맞지 않는 데이터는 결과에서 제외됩니다.
예시: 고객 테이블과 주문 테이블을 조인할 때, 주문한 고객만 조회하는 경우
두 테이블 간 조인 조건을 만족하는 데이터만 결과에 포함합니다.
조건에 맞지 않는 데이터는 결과에서 제외됩니다.
예시: 고객 테이블과 주문 테이블을 조인할 때, 주문한 고객만 조회하는 경우
SELECT *
FROM 고객
INNER JOIN 주문
ON 고객.id = 주문.고객_id;
OUTER JOIN
조인 조건을 만족하지 않아도 한쪽 테이블의 데이터를 결과에 포함시킬 수 있습니다.
종류는 다음과 같습니다:
LEFT OUTER JOIN: 왼쪽 테이블의 모든 행을 결과에 포함 (조건 불일치 시 NULL 채움)
RIGHT OUTER JOIN: 오른쪽 테이블의 모든 행을 포함
FULL OUTER JOIN: 양쪽 테이블 모두의 모든 행을 포함
(MySQL은 FULL OUTER JOIN을 기본 지원하지 않음)
예시: 고객 테이블에 주문이 없어도 모든 고객 정보를 조회하고 싶을 때
SELECT *
FROM 고객
LEFT OUTER JOIN 주문
ON 고객.id = 주문.고객_id;
옵티마이저(Optimizer)에 대해 설명해주세요.
옵티마이저(Optimizer)
데이터베이스가 SQL 쿼리를 가장 효율적으로 실행하기 위해 실행 계획(Execution Plan)을 자동으로 선택해주는 엔진입니다.
같은 SQL 쿼리라도 실행 방법(조인 순서, 인덱스 사용 여부 등)에 따라 성능 차이가 크게 발생할 수 있기 때문에, 데이터베이스는 옵티마이저를 통해 가능한 실행 계획들 중 가장 비용(Cost)이 낮은 계획을 선택합니다.
데이터베이스가 SQL 쿼리를 가장 효율적으로 실행하기 위해 실행 계획(Execution Plan)을 자동으로 선택해주는 엔진입니다.
같은 SQL 쿼리라도 실행 방법(조인 순서, 인덱스 사용 여부 등)에 따라 성능 차이가 크게 발생할 수 있기 때문에, 데이터베이스는 옵티마이저를 통해 가능한 실행 계획들 중 가장 비용(Cost)이 낮은 계획을 선택합니다.
옵티마이저 종류는 크게 두 가지로 나눌 수 있습니다:
RBO (Rule-Based Optimizer)
정해진 규칙(rule)에 따라 실행 계획을 선택합니다.
(ex. 인덱스가 있으면 무조건 인덱스를 먼저 사용)
CBO (Cost-Based Optimizer)
테이블의 통계 정보(행 수, 인덱스 분포도 등)를 바탕으로
실행 계획들의 예상 비용(cost)을 계산하여 가장 효율적인 계획을 선택합니다.
(현재 대부분의 DBMS는 CBO 기반을 사용합니다.)
데이터베이스에서 프로시저란 무엇인가요?
프로시저(Procedure)
여러 SQL문을 하나로 묶어 저장해두고, 이름을 통해 반복해서 호출할 수 있는 데이터베이스 프로그램
즉, 자주 사용하는 쿼리 작업을 미리 저장해두고, 필요할 때마다 호출하여 실행하는 기능입니다.
프로시저는 입력값(파라미터)을 받을 수 있고, 복잡한 로직을 포함할 수 있어
반복 작업, 대량 데이터 처리, 트랜잭션 관리 등에 매우 유용합니다.
여러 SQL문을 하나로 묶어 저장해두고, 이름을 통해 반복해서 호출할 수 있는 데이터베이스 프로그램
즉, 자주 사용하는 쿼리 작업을 미리 저장해두고, 필요할 때마다 호출하여 실행하는 기능입니다.
프로시저는 입력값(파라미터)을 받을 수 있고, 복잡한 로직을 포함할 수 있어
반복 작업, 대량 데이터 처리, 트랜잭션 관리 등에 매우 유용합니다.
데이터베이스에서 DELETE, TRUNCATE, DROP 차이점이 무엇인가요?
DELETE
테이블의 일부 또는 전체 데이터를 삭제합니다.
WHERE 조건을 사용할 수 있어 선택적으로 삭제할 수 있습니다.
트랜잭션 지원 → 롤백(Rollback)이 가능합니다.
테이블의 일부 또는 전체 데이터를 삭제합니다.
WHERE 조건을 사용할 수 있어 선택적으로 삭제할 수 있습니다.
트랜잭션 지원 → 롤백(Rollback)이 가능합니다.
DELETE FROM 회원 WHERE 나이 > 30;
TRUNCATE
테이블 전체 데이터를 빠르게 삭제합니다.
WHERE 조건 없이, 모든 데이터를 일괄 삭제합니다.
일반적으로 롤백이 불가능합니다. (DBMS마다 일부 지원하는 경우 있음)
삭제 과정에서 개별 행을 기록하지 않기 때문에 DELETE보다 훨씬 빠릅니다.
TRUNCATE TABLE 회원;
DROP
테이블 자체를 삭제합니다. (테이블 구조 + 데이터 모두 제거)
복구가 불가능합니다. (DDL 명령어)
DROP TABLE 회원;
무결성의 종류가 무엇이 있나요?
무결성(Integrity)
데이터베이스에 저장된 데이터가 정확하고 일관되게 유지되도록 보장하는 제약 조건을 말합니다.
데이터베이스 설계 시 무결성을 지켜야 잘못된 데이터 삽입, 수정, 삭제를 방지할 수 있습니다.
데이터베이스에 저장된 데이터가 정확하고 일관되게 유지되도록 보장하는 제약 조건을 말합니다.
데이터베이스 설계 시 무결성을 지켜야 잘못된 데이터 삽입, 수정, 삭제를 방지할 수 있습니다.
1. 엔터티 무결성 (Entity Integrity)
테이블의 각 행(Row)은 고유해야 한다는 규칙입니다.
Primary Key는 NULL이 될 수 없고, 중복도 허용되지 않습니다.
예시: 회원 테이블의 회원 ID (Primary Key)
테이블의 각 행(Row)은 고유해야 한다는 규칙입니다.
Primary Key는 NULL이 될 수 없고, 중복도 허용되지 않습니다.
예시: 회원 테이블의 회원 ID (Primary Key)
2. 참조 무결성 (Referential Integrity)
Foreign Key를 통해 두 테이블 간 관계를 맺을 때,
외래 키는 반드시 기존 기본 키(Primary Key)를 참조해야 한다는 규칙입니다.
예시: 주문 테이블의 고객 ID는 반드시 고객 테이블에 존재해야 함.
3. 도메인 무결성 (Domain Integrity)
컬럼에 저장되는 데이터는 허용된 데이터 타입과 범위를 따라야 한다는 규칙입니다.
예시: 나이 컬럼은 0 이상만 가능, 성별 컬럼은 '남' 또는 '여'만 가능.
Foreign Key를 통해 두 테이블 간 관계를 맺을 때,
외래 키는 반드시 기존 기본 키(Primary Key)를 참조해야 한다는 규칙입니다.
예시: 주문 테이블의 고객 ID는 반드시 고객 테이블에 존재해야 함.
3. 도메인 무결성 (Domain Integrity)
컬럼에 저장되는 데이터는 허용된 데이터 타입과 범위를 따라야 한다는 규칙입니다.
예시: 나이 컬럼은 0 이상만 가능, 성별 컬럼은 '남' 또는 '여'만 가능.
4. 고유 무결성 (Unique Integrity)
특정 컬럼 값은 테이블 안에서 중복되면 안 된다는 규칙입니다.
Primary Key가 아닌 컬럼에도 Unique 제약 조건을 걸 수 있습니다.
예시: 이메일 주소가 유일해야 하는 경우
5. 사용자 정의 무결성 (User-Defined Integrity)
사용자가 정의하는 비즈니스 로직에 따라 추가하는 규칙입니다.
예시: 한 회사에 부서장은 1명만 존재해야 한다는 규칙 등
특정 컬럼 값은 테이블 안에서 중복되면 안 된다는 규칙입니다.
Primary Key가 아닌 컬럼에도 Unique 제약 조건을 걸 수 있습니다.
예시: 이메일 주소가 유일해야 하는 경우
5. 사용자 정의 무결성 (User-Defined Integrity)
사용자가 정의하는 비즈니스 로직에 따라 추가하는 규칙입니다.
예시: 한 회사에 부서장은 1명만 존재해야 한다는 규칙 등