MySQL 중심으로 SQL 기초를 익힌 뒤, 애플리케이션에서 JDBC로 DB에 접속하는 흐름까지 진행합니다. (추가: MongoDB NoSQL 개요)
flowchart LR
A[DB 개요] --> B[DDL]
B --> C[DML]
C --> D["DCL / TCL"]
D --> E["SELECT db03"]
E --> F["함수 JOIN db04"]
F --> F5["JOIN DDL 정규화 db05"]
F5 --> F6["인덱스 TCL DCL db06"]
F6 --> G[JDBC]
G --> H[MongoDB 개요]
| 단계 | 폴더·자료 | 핵심 |
|---|---|---|
| DB 개요 | 공통 | RDBMS, 스키마, 테이블, PK/FK, ERD, 1:N·1:1 |
| DDL · DML | db01 | CREATE / INSERT, 1:N JOIN |
| DDL 심화 | db02 | ALTER, PK/FK, CSV Import |
| SELECT · 집계 | db03 | SELECT, 서브쿼리, GROUP BY |
| 내장 함수 · JOIN | db04 | IF/CASE, 내장 함수, INNER/LEFT/SELF JOIN |
| JOIN 복습 · DDL · 정규화 | db05 | FK·UNIQUE/CHECK/DEFAULT, ALTER, 복합 PK, 1NF~3NF |
| 인덱스 · TCL · DCL | db06 | PK·보조 인덱스·EXPLAIN, 정규화 복습, COMMIT/ROLLBACK, GRANT/REVOKE |
| JDBC | (Java) | Driver → Connection → SQL 실행 → ResultSet |
| NoSQL | (예정) | 문서 DB, 컬렉션 개념 |
| 개념 | 설명 |
|---|---|
| DBMS | 데이터를 저장·조회·관리하는 시스템 (MySQL, MariaDB 등) |
| 스키마(Database) | 테이블·뷰 등 객체가 묶인 논리 단위 (shopdb, day2db) |
| 테이블(Table) | 행(Row) · 열(Column)으로 구성된 관계형 데이터 단위 |
| PK / FK | 기본키(고유 식별) · 외래키(다른 테이블 참조) |
| ERD | 테이블 간 관계를 그림으로 표현 (1:N, 1:1) |
erDiagram
memberTBL ||--o{ orderTBL : has
userTBL ||--|| buyTBL : has
memberTBL {
varchar memberID PK
varchar memberName
}
orderTBL {
int orderID PK
varchar memberID FK
varchar product
}
userTBL {
varchar userName PK
}
buyTBL {
varchar userName FK
int price
}
3계층 관점 (애플리케이션 ↔ DB)
flowchart TB
APP["애플리케이션 Java/Spring"] -->|SQL or JDBC| API[DBMS API]
API --> ENG[MySQL Engine]
ENG --> DISK[("디스크 저장")]
flowchart TB
SQL((SQL))
SQL --> DDL
SQL --> DML
SQL --> DCL
SQL --> TCL
DDL --> ddl1["CREATE DATABASE"]
DDL --> ddl2["CREATE / ALTER TABLE"]
DDL --> ddl3["DROP / TRUNCATE"]
DML --> dml1[INSERT]
DML --> dml2[UPDATE]
DML --> dml3[DELETE]
DML --> dml4["SELECT / JOIN"]
DCL --> dcl1[GRANT]
DCL --> dcl2[REVOKE]
TCL --> tcl1[COMMIT]
TCL --> tcl2[ROLLBACK]
TCL --> tcl3[SAVEPOINT]
| 분류 | 역할 | 대표 명령 | 수업 매핑 |
|---|---|---|---|
| DDL | 구조 정의·변경 | CREATE, ALTER, DROP, TRUNCATE |
db01 CREATE TABLE, db02 ALTER PK/FK, db05 제약·복합 PK·RENAME/DROP, db06 CREATE INDEX |
| DML | 데이터 조작·조회 | INSERT, UPDATE, DELETE, SELECT |
db01 INSERT, db03 조회·집계, db04 함수·JOIN, db05 FK 무결성, db06 대량 INSERT·EXPLAIN |
| DCL | 권한 제어 | GRANT, REVOKE |
db06 CREATE USER · sqldb.* 권한 부여·회수 |
| TCL | 트랜잭션 제어 | COMMIT, ROLLBACK |
db06 START TRANSACTION · buytbl 실습 |
sequenceDiagram
participant Dev as 학습자
participant DB as MySQL
Dev->>DB: CREATE DATABASE USE
Dev->>DB: CREATE TABLE PK FK
Dev->>DB: INSERT
Dev->>DB: SELECT JOIN
stateDiagram-v2
[*] --> Active
Active --> Committed: COMMIT
Active --> RolledBack: ROLLBACK
Committed --> [*]
RolledBack --> [*]
autocommit=1(기본)이면 DML 한 문장마다 자동COMMIT. 여러 문장을 묶을 때는START TRANSACTION→ 성공 시COMMIT, 실패 시ROLLBACK.
| 구분 | SQL (Workbench/CLI) | JDBC (Java) |
|---|---|---|
| 실행 주체 | 사람이 직접 쿼리 입력 | 애플리케이션 코드 |
| 결과 | 그리드·텍스트 출력 | ResultSet 객체 |
| 연결 | Workbench 세션 | Connection 풀 |
Java 애플리케이션이 MySQL과 통신하는 표준 단계입니다. SQL에서 익힌 DML·SELECT가 문자열 또는 PreparedStatement로 전달됩니다.
flowchart TD
A["1 Driver 로드"] --> B["2 getConnection"]
B --> C["3 Connection"]
C --> D{4 SQL 종류}
D -->|조회| E["executeQuery"]
D -->|변경| F["executeUpdate"]
E --> G["5 ResultSet 순회"]
F --> H["영향 받은 행 수"]
G --> I["6 close 리소스 해제"]
H --> I
sequenceDiagram
participant App as Java App
participant DM as DriverManager
participant DB as MySQL
App->>DM: getConnection
DM->>DB: TCP 연결
DB-->>DM: Connection
DM-->>App: Connection
App->>DB: prepareStatement
DB-->>App: ResultSet
App->>App: rs.next
App->>DB: close
| 단계 | API / 개념 | 설명 |
|---|---|---|
| 1 | Class.forName 또는 SPI |
com.mysql.cj.jdbc.Driver (Connector/J) |
| 2 | DriverManager.getConnection |
URL · 사용자 · 비밀번호 |
| 3 | Connection |
세션 단위 DB 연결 |
| 4 | PreparedStatement |
? 바인딩으로 SQL Injection 방지 |
| 5 | ResultSet |
조회 결과 커서 (next(), getString(...)) |
| 6 | close() |
리소스 반환 (try-with-resources 권장) |
JDBC URL 예시
jdbc:mysql://localhost:3306/shopdb?serverTimezone=Asia/Seoul&characterEncoding=UTF-8
CRUD ↔ SQL 매핑
| JDBC | SQL | 용도 |
|---|---|---|
executeQuery() |
SELECT |
조회 → ResultSet |
executeUpdate() |
INSERT / UPDATE / DELETE |
변경 → 영향 행 수 |
flowchart LR
D1["db01 DDL DML 1:N"] --> D2["db02 ALTER 1:1 Import"]
D2 --> D3["db03 SELECT 집계"]
D3 --> D4["db04 함수 JOIN"]
D4 --> D5["db05 JOIN DDL 정규화"]
D5 --> D6["db06 인덱스 TCL DCL"]
D6 --> D7[JDBC 프로젝트]
| 폴더 | 파일 | 내용 |
|---|---|---|
| db01/ | day1.sql |
shopdb, memberTBL·orderTBL, 1:N FK, JOIN |
| db02/ | day2.sql |
ALTER PK/FK, 1:1, CSV/JSON Import |
| db03/ | day3.sql |
WHERE, 서브쿼리, GROUP BY, HAVING |
| db04/ | day4.sql |
내장 함수, INNER/LEFT JOIN, SELF JOIN |
| db05/ | day5.sql, day5_수업전배포.sql |
JOIN 복습(sqldb), FK·UNIQUE/CHECK/DEFAULT·ALTER·복합 PK(tableDB), (배포본) RENAME/TRUNCATE/DROP, 1NF~3NF |
| db06/ | day6.sql, day6-사전배포.sql |
PK·보조 인덱스·EXPLAIN(index_test_simple), (메인) 정규화 복습·buytbl 트랜잭션·DCL(testuser) |
상세 가이드: db01/README.md · db02/README.md · db03/README.md · db04/README.md · db05/README.md · db06/README.md
- MySQL + MySQL Workbench (스키마 설계, 쿼리 실행)
- CLI:
mysql -h 호스트 -P 포트 -u 사용자 -p - ERD: erdcloud.com — ERD ↔ SQL 변환
- JDBC: MySQL Connector/J, Maven/Gradle 의존성 추가
관계형(MySQL) 이후 문서 지향 NoSQL을 비교합니다.
flowchart LR
subgraph mysql["MySQL RDBMS"]
T1[테이블]
T2["행과 열"]
T3[JOIN]
end
subgraph mongo["MongoDB"]
C1[컬렉션]
C2["JSON 문서"]
C3["임베딩 참조"]
end
T1 -.->|대응| C1
| MySQL | MongoDB |
|---|---|
| Database | Database |
| Table | Collection |
| Row | Document (BSON/JSON) |
| Column | Field |
| JOIN | $lookup 또는 임베딩 |