# 데이터베이스란 무엇인가

> **이 장에서 배우는 것**
> 데이터베이스가 엑셀과 무엇이 다른지, 테이블·행·열·키를 읽는 법, SQL 한 줄의
> 모양, 그리고 왜 "읽기 전용 계정"이라는 말이 계속 나오는지.

## 회사의 사실이 쌓이는 곳

주문·회원·재고·결제. 매일 늘어나는 기록이 사는 곳이 데이터베이스(DB)입니다.
화면에서 보는 거의 모든 숫자는 결국 여기서 나옵니다.

## 표로 되어 있습니다

가장 흔한 종류(**관계형 데이터베이스**)는 데이터를 표로 담습니다.

**`orders` 테이블**

| id | customer_id | ordered_at | amount | status |
|---|---|---|---|---|
| 1001 | 42 | 2026-08-01 | 128000 | paid |
| 1002 | 7 | 2026-08-01 | 34000 | refunded |

| 말 | 뜻 |
|---|---|
| **테이블** | 표 하나 — 대개 한 종류의 사실 |
| **행**(row·레코드) | 가로 한 줄 — 사건 하나 |
| **열**(column·필드) | 세로 한 칸 — 항목 하나 |
| **기본 키**(PK) | 행을 하나로 지목하는 값 — 위의 `id` |
| **외래 키**(FK) | 다른 표를 가리키는 값 — 위의 `customer_id` |

**외래 키가 "관계형"의 정체입니다.** 주문 표에 고객 이름을 통째로 적는 대신
번호만 적어두고, 이름은 고객 표에서 가져옵니다. 그래서 고객이 이름을 바꾸면
**한 곳만 고치면 됩니다.**

```mermaid
graph TD
  A["orders<br/>id · customer_id · amount"] -->|"customer_id 로 연결"| B["customers<br/>id · name · email"]
```

## 엑셀과 무엇이 다른가

| | 엑셀 | 데이터베이스 |
|---|---|---|
| 동시에 고치기 | 충돌 · 사본이 번식 | **여러 명이 동시에** |
| 양 | 수십만 행부터 버거움 | 수억 행 |
| 규칙 | 아무 값이나 들어감 | **형식·필수·중복 금지를 강제** |
| 권한 | 파일 단위 | **표·열 단위** |
| 기록 | 누가 고쳤는지 모름 | 남길 수 있음 |

**"엑셀 파일이 최종.xlsx / 최종_진짜.xlsx 로 번식한다"가 DB로 넘어가는
신호입니다.** 사본이 생기는 순간 어느 것이 사실인지 아무도 모르게 됩니다.

## SQL — 데이터베이스에 묻는 말

조회는 이렇게 생겼습니다. 영어 문장에 가까워서 **읽는 것은 배우면 됩니다.**

```sql
SELECT 지역, COUNT(*)
FROM 반품
WHERE 날짜 >= '2026-07-01'
GROUP BY 지역;
```

| 조각 | 뜻 |
|---|---|
| `SELECT` | 무엇을 보여줄지 |
| `FROM` | 어느 표에서 |
| `WHERE` | 어떤 조건으로 거를지 |
| `GROUP BY` | 무엇 단위로 묶을지 |

**에이전트에게 데이터베이스를 붙이면 이 문장을 대신 씁니다**
([데이터베이스 붙이기](/guide/cn-database)). 사람이 SQL을 몰라도 되게
하는 것이 그 기능의 목적입니다.

## 읽기와 쓰기는 성격이 다릅니다

| 갈래 | SQL | 되돌릴 수 있나 |
|---|---|---|
| 조회 | `SELECT` | 안 바꿈 |
| 추가 | `INSERT` | 지우면 됨 |
| 수정 | `UPDATE` | **이전 값은 사라짐** |
| 삭제 | `DELETE` · `DROP` | **못 되돌림** |

`UPDATE` 와 `DELETE` 는 **조건을 안 붙이면 표 전체에 적용됩니다.** 한 줄
차이로 전 고객의 등급이 바뀌는 사고가 여기서 납니다.

```sql
UPDATE 고객 SET 등급 = 'VIP' WHERE id = 42;   -- 한 명
UPDATE 고객 SET 등급 = 'VIP';                 -- 전원. 조건이 빠졌습니다
```

## 그래서 계정으로 막습니다

이 매뉴얼이 반복해서 "읽기 전용 계정"을 말하는 이유입니다. DB 계정마다 **할 수
있는 일이 정해집니다.**

```
✓ SELECT 권한만 가진 계정을 새로 만들어 붙이기
✓ 운영 DB 대신 복제본·분석용 DB를 붙이기
✗ 앱이 쓰는 계정을 그대로 붙이기
```

**지시로 정하는 것과 권한으로 막는 것은 다릅니다.** 지시는
[흔들릴 수](/guide/ai-hallucination) 있고 [외부 입력에 밀릴
수](/guide/mcp-prompt-injection)도 있지만, 계정 권한은 데이터베이스가
강제합니다 — [도구는 권한이다](/guide/mcp-security)의 DB판입니다.

## 종류 — 이름만 알아두면 됩니다

| 종류 | 예 | 성격 |
|---|---|---|
| 관계형 | PostgreSQL · MySQL | 표와 관계. 가장 흔함 |
| 파일형 | SQLite | 파일 하나가 곧 DB |
| 문서형 | MongoDB | JSON 비슷한 덩어리를 저장 |
| 벡터 | pgvector 등 | **뜻이 가까운 것 찾기** — [그라운딩](/guide/ai-grounding)에 쓰임 |

**맨 아래 줄이 AI와 직접 이어집니다.** 문장을 숫자 목록(임베딩)으로 바꿔
저장해두고 "뜻이 가까운 문서"를 찾는 데 씁니다.

## 백업 — 여기만은 확인하세요

```
□ 백업이 돌고 있나
□ 복구를 **해본 적**이 있나
□ 얼마나 옛것까지 되돌릴 수 있나
```

**두 번째 줄이 진짜입니다.** 백업이 도는 것과 복구가 되는 것은 다른
문제이고, 그 차이는 사고가 난 날에만 드러납니다.

## 자주 하는 오해

### "우리 데이터는 엑셀에 있는데 AI를 못 쓰나요"

**씁니다.** 다만 [Phase 2 — 데이터 · 시스템 진단](/guide/ax-phase2-assessment)에서
"어디에 무엇이 있는가"를 먼저 정리하게 되는데, 엑셀이 흩어져 있으면 그
단계에서 시간이 걸립니다.

### "에이전트에게 DB를 붙이면 데이터가 밖으로 나가나요"

**조회한 결과가 답을 만드는 데 쓰입니다.** 그래서 붙이는 범위(계정 권한)를
좁히고, 나가면 안 되는 값은 [마스킹](/guide/cn-masking)으로 가립니다.

---

## 확인

**1. 외래 키가 하는 일은?**

<details>
<summary>답</summary>

**다른 표의 행을 가리킵니다.** 같은 정보를 여러 곳에 적지 않고 한 곳만 고치면
되게 만듭니다.
</details>

**2. `UPDATE` 에서 가장 위험한 실수는?**

<details>
<summary>답</summary>

**조건(`WHERE`)을 빠뜨리는 것**입니다. 표 전체에 적용되고 이전 값은
돌아오지 않습니다.
</details>

**3. 도구 설정보다 읽기 전용 계정이 확실한 이유는?**

<details>
<summary>답</summary>

**지키는 주체가 다르기 때문**입니다. 지시나 설정은 바뀔 수 있지만 계정 권한은
데이터베이스가 강제합니다.
</details>

---

이 파트의 마지막입니다 →
[계정 · 비밀번호 · API 키 · 권한](/guide/it-accounts)
