요구사항 한 문단을 받아,
ERD 한 장으로 완성하기
섹션 4의 마지막 강의이자 종합 실습입니다. "학원 등록 시스템"이라는 작은 도메인을 받아 — 요구사항 정리, 엔티티 추출, 관계 정의, ERD 그리기 — 4단계를 처음부터 끝까지 직접 해봅니다. 마지막엔 완성한 ERD를 AI에게 검증시키는 실무 협업 방식까지 시연합니다.
이번 섹션의 여정
완료 ✓
완료 ✓
완료 ✓
지금 여기
AI 협업 SQL 작성법
Step 1 — 요구사항 정리: 모든 모델링의 출발점
지금까지 부모-자식, 관계 종류, FK, ERD 읽기, 정규화, 도메인 비교까지 다 봤습니다. 이번엔 직접 만들어볼 시간이에요. 오늘 갈 길을 지도 한 장으로 먼저 보고 갑니다.
회사에서 이런 메시지를 받았다고 상상해보세요.
"학원 등록 시스템을 만들어야 해요.
학생들이 강의를 신청할 수 있고, 한 학생이 여러 강의를 신청할 수 있어요.
강의마다 강사가 한 명씩 있고, 강사는 여러 강의를 맡을 수 있어요.
학생 등록 시 결제가 이뤄지고, 결제 정보는 안전하게 별도 관리해야 해요."이게 실무에서 받는 요구사항의 전형적인 형태입니다 — 한두 문단의 자연어. 표도 없고 ERD도 없어요. 여기서 모델링이 시작됩니다. 첫 작업은 이 문단을 핵심 문장 단위로 쪼개는 것입니다.
- “학생들이 강의를 신청한다”
- “한 학생이 여러 강의를 신청할 수 있다”
- “강의마다 강사가 한 명씩 있다”
- “강사는 여러 강의를 맡을 수 있다”
- “학생 등록 시 결제가 이뤄진다”
- “결제 정보는 안전하게 별도 관리한다”
각 문장이 “누가, 무엇을, 어떻게 한다” 구조예요. 명사에서 엔티티가, “여러 / 한 명씩” 같은 수량 표현에서 관계가 나옵니다. 다음 두 단계에서 하나씩 캐냅니다.
Step 2 — 엔티티 추출: 명사를 찾으세요
엔티티(Entity) 는 데이터로 표현할 “것 / 사물” — 요구사항 속의 명사입니다. 방금 쪼갠 문장들을 다시 읽으면서 명사에 형광펜을 그어보세요.
| 요구사항 속 명사 | 테이블 이름 |
|---|---|
| 학생 | students |
| 강의 | courses |
| 강사 | teachers |
| 결제 | payments |
엔티티 4개. 그런데 — 여기서 멈추면 빠진 게 하나 있습니다.
엔티티 4개 — 신청 기록이 갈 곳이 없다
학생·강사·강의·결제는 챙겼는데, “학생이 강의를 신청한다”의 신청 자체를 저장할 곳이 없습니다. 누가 언제 어떤 강의를 신청했는지 — 기록할 테이블이 없어요.
신청 → enrollments, 5개 완성
신청이라는 행위 자체가 데이터입니다. 그리고 이게 바로 4-3에서 배운 N:M 중간 테이블 — 학생과 강의의 다대다 관계를 풀어주는 자리예요.
명사뿐 아니라 행위(신청·주문·예약·결제)도 거의 항상 엔티티가 됩니다.
우리 shop DB의 orders·order_items가 정확히 이 패턴이었죠 — “주문한다”는
행위가 테이블 두 개가 됐습니다.
최종 엔티티 5개 — students, teachers, courses, enrollments, payments.
Step 3 — 관계 정의: 한 X가 여러 Y? 반대도?
엔티티 사이의 관계는 4-3에서 배운 식별 질문 하나로 결정합니다 — “한 X가 여러 Y를 가질 수 있나? 반대 방향은?”
| 관계 | 양방향 질문의 답 | 결과 |
|---|---|---|
| 강사 ↔ 강의 | 한 강사가 여러 강의 YES / 한 강의에 강사는 1명 | 1:N — teachers → courses |
| 학생 ↔ 강의 | 양쪽 다 여러 개 YES | N:M — enrollments가 풀어줌 |
| 학생 ↔ 신청 | 한 학생이 여러 신청 YES | 1:N — students → enrollments |
| 강의 ↔ 신청 | 한 강의에 여러 신청 YES | 1:N — courses → enrollments |
| 신청 ↔ 결제 | 설계 선택이 필요 (아래) | 1:1 ⭐ |
마지막 줄에서 잠깐 멈춥니다. “학생 등록 시 결제가 이뤄진다” — 이 문장은 두 가지로 해석할 수 있어요. 설계 선택이 필요한 순간입니다.
students 1:N payments — 묶음 결제
학생이 강의 여러 개를 한 번에 묶어 결제하는 모델. 결제 1건에 신청 여러 건이 매달립니다. 틀린 설계가 아니에요 — 비즈니스가 장바구니식 결제라면 이쪽이 정답입니다.
enrollments 1:1 payments — 신청별 결제
신청 1건마다 결제 1건. 강의 단위로 결제·환불을 처리하기 쉽고, “결제 정보는 별도 관리” 요구와도 맞습니다. 4-3에서 배운 1:1 분리 패턴이 한 번 더 등장하네요.
두 선택 모두 성립합니다. 중요한 건 “왜 이 선택을 했는지” 말할 수 있는 것 — 실무에서는 이 순간에 기획자에게 “결제는 강의별인가요, 묶음인가요?” 하고 되묻는 게 모델러의 일입니다.
Step 4 — ERD 그리기: PK·FK·UNIQUE까지
이제 화이트보드에 뼈대부터 슥슥 그립니다. 까마귀발 없이 선만 그어도 충분해요.
뼈대가 잡혔으면 각 엔티티의 PK와 FK를 명시해서 정식 ERD로 완성합니다.
여기서 기술적으로 제일 중요한 한 줄 — payments.enrollment_id에 거는 UNIQUE 제약입니다. FK만 있으면 한 신청에 결제가 여러 건 붙을 수 있는 1:N이 돼버려요. UNIQUE가 있어야 “한 결제 = 한 신청” 을 DB가 강제합니다.
CREATE TABLE payments (
payment_id INT AUTO_INCREMENT PRIMARY KEY,
enrollment_id INT NOT NULL UNIQUE, -- 이 UNIQUE 가 1:1 을 보장
paid_at DATETIME NOT NULL,
amount INT NOT NULL,
FOREIGN KEY (enrollment_id) REFERENCES enrollments (enrollment_id)
);1:1 관계는 선으로 그리는 게 아니라 FK + UNIQUE 조합으로 구현합니다.
4-4의 FK가 “부모 없는 자식 금지”를 강제했다면, UNIQUE는 “자식은 한 명만”을 강제하는 장치예요.
Step 5 — AI와 협업: 검증시키고 보완하기 ⭐
이제 이 강의의 하이라이트 — AI와 협업하는 모델링입니다. 방금 만든 ERD를 AI에게 검증시켜볼 거예요. 그 전에, 협업의 방향부터 분명히 하고 갑니다.
”AI야, 학원 등록 시스템 ERD 만들어줘”
그럴듯한 결과는 나옵니다. 하지만 어디가 맞고 틀렸는지 판단할 눈이 없으면 받아쓰기일 뿐이에요. 1:1이냐 1:N이냐 같은 설계 선택이 왜 그렇게 됐는지도 모른 채 넘어가게 됩니다.
내가 1차 설계 → AI가 검토 → 내가 보완
4단계로 직접 만든 ERD를 던지고 검증을 요청합니다. 빠진 컬럼, 상태값, 삭제 정책 같은 구멍을 AI가 찾아주고 — 최종 결정은 항상 내가 내립니다.
2-4에서 만든 AI 과외 선생님 세션에 아래 프롬프트를 그대로 던져보세요.
다음 학원 등록 시스템 ERD 를 검토해줘:
[엔티티]
- students (학생): student_id PK, name
- teachers (강사): teacher_id PK, name
- courses (강의): course_id PK, title, teacher_id FK, fee
- enrollments (신청): enrollment_id PK, student_id FK, course_id FK, enrolled_at
- payments (결제): payment_id PK, enrollment_id FK UNIQUE, paid_at, amount
[관계]
- teachers 1:N courses
- students 1:N enrollments
- courses 1:N enrollments (→ students ↔ courses 의 N:M)
- enrollments 1:1 payments
[검증 요청]
1. 빠진 엔티티 / 관계는?
2. 정규화 직관 위반된 곳은?
3. 보완해야 할 컬럼은?
4. 실무에서 추가로 고려할 점은?AI가 ERD를 처음부터 만들어주는 게 아닙니다. 내가 1차로 만들고, AI가 피드백하고, 내가 보완한다.
이 사이클이 진짜 실무의 AI 협업 모델링입니다.
자주 막히는 지점
너무 많이 뽑아도, 너무 적게 뽑아도 불안한 단계입니다. 기준은 “여러 건 저장할 데이터인가”예요 — “학원 이름” 같은 단일 값은 엔티티가 아닙니다.
양쪽 다 “여러 개”인 관계를 FK 하나로 이으려 하면, 한쪽 테이블에 FK 컬럼을 여러 개 만들거나 한 칸에 여러 값을 욱여넣게 됩니다 — 4-6에서 본 안티패턴이에요.
enrollments)이 유일한 길 — 4-3을 복습하세요.요청이 모호하면 AI는 자기 설계를 새로 제안하는 쪽으로 흐릅니다. 검토 범위를 좁혀주는 게 협업의 기술이에요.
섹션 4 완주 — 메시지를 손에 잡았습니다
오늘 한 일을 한 줄씩 정리하면 이렇습니다.
| Step | 무엇을 | 핵심 도구 |
|---|---|---|
| 1. 요구사항 정리 | 자연어 한 문단 → 문장 단위 분해 | 형광펜 / 메모 |
| 2. 엔티티 추출 | 명사 찾기 + “행위도 엔티티” 점검 | 화이트보드 |
| 3. 관계 정의 | ”한 X가 여러 Y? 반대도?” 식별 질문 | 양방향 답 표 |
| 4. ERD 그리기 | PK·FK 명시 + UNIQUE 등 제약 | mermaid / draw.io |
| 5. AI와 협업 | 1차 설계 → 검증 → 보완 | AI 과외 선생님 |
그리고 — 섹션 4, 모델링이 끝났습니다. 8개 강의 동안 걸어온 길입니다.
| 강의 | 핵심 한 줄 |
|---|---|
| 4-1 관계의 구조 | 엑셀 한 장 사고에서 관계 사고로 |
| 4-2 부모 / 자식 테이블 ⭐ | 모든 관계는 결국 부모-자식 |
| 4-3 1:1 / 1:N / N:M | 식별 질문으로 관계 판별 |
| 4-4 외래키 (FK) | 관계를 DB가 강제하는 장치 |
| 4-5 ERD 읽는 법 | 설계도를 읽는 5단계 루틴 |
| 4-6 정규화 직관 | 중복 제거의 두 가지 직관 |
| 4-7 실무 ERD 분석 | 도메인이 달라도 뼈대는 같다 |
| 4-8 모델링 종합 실습 ⭐ | 요구사항 → ERD, 직접 완주 |
— 앞부분 “DB 모델링”을 방금 손에 잡으셨습니다. 여기까지 따라오신 분들, 진심으로 박수.
섹션 5 AI 협업 SQL 작성법에서는 — 여러분이 만든 이 모델링을 AI에게 어떻게 정확히 전달하고, 어떤 프롬프트가 좋은지 단계별로 다룹니다. 모델링이 무기라면, 섹션 5는 그 무기를 쓰는 법이에요.
먼저 연습 문제로 오늘의 4단계를 새 도메인에 한 번 더 적용해보세요 — 손에 잡힌 흐름은 한 번 더 굴려야 진짜 내 것이 됩니다.