๐Ÿ“Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Database): ๊ธฐ์ดˆ๋ถ€ํ„ฐ ์‹ค๋ฌด๊นŒ์ง€ ๐Ÿ“š

Jinil Parkยท2025๋…„ 4์›” 19์ผ
0

Computer Science

๋ชฉ๋ก ๋ณด๊ธฐ
3/5

๐Ÿ”– ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ž€?

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(Database)๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(DBMS, Database Management System)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ €์žฅ, ์ˆ˜์ •, ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ“‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ๊ตฌ์„ฑ ์š”์†Œ

๐Ÿ“ ํ…Œ์ด๋ธ”(Table)

  • ๋ฐ์ดํ„ฐ๋ฅผ ํ–‰(Row)๊ณผ ์—ด(Column)๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ์ €์žฅํ•˜๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธ์ ์ธ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค.
  • ํ–‰์€ ๋ ˆ์ฝ”๋“œ(Record), ์—ด์€ ํ•„๋“œ(Field)๋ผ๊ณ ๋„ ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๐Ÿ“ ์Šคํ‚ค๋งˆ(Schema)

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ๋ฅผ ์ •์˜ํ•œ ๊ฒƒ์œผ๋กœ, ํ…Œ์ด๋ธ”์˜ ๊ตฌ์กฐ(์ปฌ๋Ÿผ ์ด๋ฆ„, ๋ฐ์ดํ„ฐ ํƒ€์ž… ๋“ฑ)๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“ ์ฟผ๋ฆฌ(Query)

  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์š”์ฒญ์„ ๋ณด๋‚ด ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.
  • SQL(Structured Query Language)์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ—‚๏ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ข…๋ฅ˜

  • ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(RDBMS)

    • MySQL, PostgreSQL, Oracle ๋“ฑ
    • ํ…Œ์ด๋ธ” ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(NoSQL)

    • MongoDB, Redis, Cassandra ๋“ฑ
    • ๋Œ€๋Ÿ‰์˜ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ €์žฅ ๋ฐ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ–ฅ๏ธ SQL์ด๋ž€?

SQL(Structured Query Language)์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ, ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ‘œ์ค€ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

๐Ÿ”น ์ฃผ์š” ๋ช…๋ น์–ด ์ข…๋ฅ˜

  • DDL (Data Definition Language): ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌ์กฐ ์ •์˜

    • CREATE, ALTER, DROP
  • DML (Data Manipulation Language): ๋ฐ์ดํ„ฐ ์กฐ์ž‘

    • INSERT, UPDATE, DELETE
  • DQL (Data Query Language): ๋ฐ์ดํ„ฐ ์กฐํšŒ

    • SELECT
  • DCL (Data Control Language): ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๊ถŒํ•œ ๊ด€๋ฆฌ

    • GRANT, REVOKE

๐Ÿ’ป SQL ๊ธฐ์ดˆ ๋ช…๋ น์–ด ์‹ค์Šต

๐Ÿ“Œ ๋ฐ์ดํ„ฐ ์กฐํšŒ (SELECT)

๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋ณธ ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.

SELECT column1, column2 FROM table_name;
  • ์ „์ฒด ๋ฐ์ดํ„ฐ ์กฐํšŒ
SELECT * FROM students;
  • ํŠน์ • ์กฐ๊ฑด์„ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ ์กฐํšŒ
SELECT name, age FROM students WHERE age > 20;

๐Ÿ“Œ ๋ฐ์ดํ„ฐ ์‚ฝ์ž… (INSERT)

๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

INSERT INTO students (name, age) VALUES ('John', 23);
  • ๋‹ค์ค‘ ํ–‰ ์‚ฝ์ž…
INSERT INTO students (name, age) VALUES ('Alice', 21), ('Bob', 22);

๐Ÿ“Œ ๋ฐ์ดํ„ฐ ์ˆ˜์ • (UPDATE)

๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

UPDATE students SET age = 24 WHERE name = 'John';
  • ์กฐ๊ฑด ์—†์ด ์ „์ฒด ํ–‰ ์ˆ˜์ •(์ฃผ์˜!)
UPDATE students SET age = age + 1;

๐Ÿ“Œ ๋ฐ์ดํ„ฐ ์‚ญ์ œ (DELETE)

๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

DELETE FROM students WHERE name = 'John';
  • ์ „์ฒด ๋ฐ์ดํ„ฐ ์‚ญ์ œ(์ฃผ์˜!)
DELETE FROM students;

๐Ÿ“ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ •๊ทœํ™”(Normalization)

์ •๊ทœํ™”๋Š” ์ค‘๋ณต ๋ฐ์ดํ„ฐ๋ฅผ ์ตœ์†Œํ™”ํ•˜๊ณ  ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ(Integrity)์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ •๊ทœํ˜•(Normal Forms)

  • ์ œ1์ •๊ทœํ˜•(1NF): ๋ชจ๋“  ๋ฐ์ดํ„ฐ๊ฐ€ ์›์ž์ (Atomic)์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ œ2์ •๊ทœํ˜•(2NF): ๋ถ€๋ถ„ ํ•จ์ˆ˜์  ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ œ3์ •๊ทœํ˜•(3NF): ์ดํ–‰์  ์ข…์†์„ฑ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”‘ ํŠธ๋žœ์žญ์…˜(Transaction)

ํŠธ๋žœ์žญ์…˜์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์˜ ์ž‘์—… ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ํŠธ๋žœ์žญ์…˜์˜ ํ•ต์‹ฌ ํŠน์„ฑ์œผ๋กœ๋Š” ACID๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Atomicity (์›์ž์„ฑ): ๋ชจ๋“  ์ž‘์—…์€ ์™„์ „ํžˆ ์ˆ˜ํ–‰๋˜๊ฑฐ๋‚˜ ์•„์˜ˆ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Consistency (์ผ๊ด€์„ฑ): ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ์ผ๊ด€๋œ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Isolation (๊ณ ๋ฆฝ์„ฑ): ๊ฐ ํŠธ๋žœ์žญ์…˜์€ ๋…๋ฆฝ์ ์œผ๋กœ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.
  • Durability (์ง€์†์„ฑ): ํŠธ๋žœ์žญ์…˜์ด ์™„๋ฃŒ๋œ ์ดํ›„ ๋ฐ์ดํ„ฐ๋Š” ์˜๊ตฌ์ ์œผ๋กœ ๋ณด์กด๋ฉ๋‹ˆ๋‹ค.

๐Ÿ“Š ์ธ๋ฑ์Šค(Index)

์ธ๋ฑ์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. SQL์—์„œ ์กฐํšŒ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๋ฐ ๋งค์šฐ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

CREATE INDEX idx_students_age ON students(age);

๐Ÿšจ SQL Injection๊ณผ ๋ณด์•ˆ

SQL ์ธ์ ์…˜์€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ด์šฉํ•˜์—ฌ SQL ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ž‘ํ•˜๋Š” ๊ณต๊ฒฉ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฐฉ์ง€ ๋ฐฉ๋ฒ•

  • ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ํ•ญ์ƒ ๊ฒ€์ฆํ•˜๊ณ  ํ•„ํ„ฐ๋ง
  • Prepared Statements ๋ฐ Parameterized Queries ์‚ฌ์šฉ
-- Parameterized Query ์˜ˆ์‹œ
SELECT * FROM users WHERE username = ? AND password = ?;

๐Ÿ—„๏ธ ORM(Object Relational Mapping)

ORM์€ ๊ฐ์ฒด์ง€ํ–ฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

๐Ÿ“Œ ์ฃผ์š” ์˜ˆ์‹œ

  • Python: SQLAlchemy, Django ORM
  • Java: Hibernate, JPA
  • Node.js: Sequelize, TypeORM

โœ๏ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™œ์šฉ ๋ฐ ํ•™์Šต๋ฒ• ๋งˆ๋ฌด๋ฆฌ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ๋ชจ๋“  ์†Œํ”„ํŠธ์›จ์–ด์˜ ํ•ต์‹ฌ์ด๋ฉฐ, ํšจ๊ณผ์ ์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ์žฅ์—์„œ ๋‹ค๋ฃฌ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊นŠ์ด ์ดํ•ดํ•˜๊ณ  ์‹ค์Šต์„ ํ†ตํ•ด ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ํ™œ์šฉํ•ด๋ณด์‹œ๊ธฐ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋‹ค์Œ ์žฅ์—์„œ๋Š” ์ปดํ“จํ„ฐ ์•„ํ‚คํ…์ฒ˜์™€ ์šด์˜์ฒด์ œ์— ๋Œ€ํ•ด ๊นŠ์ด ์žˆ๊ฒŒ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๊ด€๋ฆฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์‹ค์ œ๋กœ ์ปดํ“จํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค!


๐Ÿ“– ์ด ๊ธ€์€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์ฒ˜์Œ ์ ‘ํ•˜๋Š” ๋ถ„๋“ค์ด ๊ธฐ์ดˆ๋ฅผ ํŠผํŠผํžˆ ํ•˜๊ณ  ์‹ค๋ฌด์—์„œ ํ™œ์šฉ ๊ฐ€๋Šฅํ•œ ์ง€์‹์„ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ๊ตฌ์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์žฅ์—์„œ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค!

0๊ฐœ์˜ ๋Œ“๊ธ€