Database 7์ผ์ฐจ

2025. 6. 16. 16:40ยทDatabase

๐Ÿ”จ ๋‹จ๊ณ„๋ณ„ ์‹ค์Šต ์š”์•ฝ

1. DB ์ƒ์„ฑ (ERD ๊ธฐ๋ฐ˜)

sql
๋ณต์‚ฌํŽธ์ง‘
CREATE DATABASE web;
USE web;

CREATE TABLE courses (
  course_id INT PRIMARY KEY,
  course_name VARCHAR(100)
);

CREATE TABLE sections (
  section_id INT PRIMARY KEY,
  section_name VARCHAR(100),
  course_id INT,
  FOREIGN KEY (course_id) REFERENCES courses(course_id)
);

CREATE TABLE lectures (
  lecture_id INT PRIMARY KEY AUTO_INCREMENT,
  lecture_name VARCHAR(100),
  section_id INT,
  FOREIGN KEY (section_id) REFERENCES sections(section_id)
);


2. front.html ๋งŒ๋“ค๊ธฐ

html
๋ณต์‚ฌํŽธ์ง‘
<!-- /var/www/web/front.html -->
<h1>์ด๋‹ˆ์…œ front server</h1>

์ ‘์† ํ™•์ธ:

๐Ÿ‘‰ http://XXX.XXX.XXX.XX/front.html


3. back.jsp ๋งŒ๋“ค๊ธฐ (์„œ๋ฒ„ IP ํ™•์ธ)

jsp
๋ณต์‚ฌํŽธ์ง‘
<%@ page language="java" %>
<p>Server IP: <%= request.getLocalAddr() %></p>

๐Ÿ‘‰ http://XXX.XXX.XXX.XX/api/back.jsp

→ ์—ฌ๋Ÿฌ ๋ฒˆ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด XX, XX๋ฒˆ ํ†ฐ์บฃ IP๊ฐ€ ๋ฒˆ๊ฐˆ์•„ ๋‚˜์™€์•ผ ํ•จ (nginx ๋ผ์šด๋“œ๋กœ๋นˆ ํ™•์ธ)


4. insert.html ๋งŒ๋“ค๊ธฐ

/insert.html์—์„œ course, section, lecture ๊ฐ๊ฐ ์ €์žฅ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๊ตฌ์„ฑ

→ <form>์˜ action="/api/insert.jsp"๋กœ POST ์š”์ฒญ


5. insert.jsp (Tomcat XX/XX ๊ณตํ†ต)

DB ์—ฐ๊ฒฐ: ๋งˆ์Šคํ„ฐ(XX๋ฒˆ) ์‚ฌ์šฉ

jsp
๋ณต์‚ฌํŽธ์ง‘
String dbURL = "jdbc:mariadb://XXX.XXX.XXX.XX:3306/web";

์•ก์…˜๊ฐ’(course, section, lecture)์— ๋”ฐ๋ผ insert ์ฟผ๋ฆฌ ์‹คํ–‰


6. select.jsp (Tomcat XX๋ฒˆ ์ค‘์‹ฌ)

DB ์—ฐ๊ฒฐ: ์Šฌ๋ ˆ์ด๋ธŒ(XX๋ฒˆ) ์‚ฌ์šฉ

jsp
๋ณต์‚ฌํŽธ์ง‘
String dbURL = "jdbc:mariadb://XXX.XXX.XXX.XX:3306/web";

JOIN ์กฐํšŒ SQL

sql
๋ณต์‚ฌํŽธ์ง‘
SELECT
  c.course_id, c.course_name,
  s.section_id, s.section_name,
  l.lecture_name
FROM courses c
LEFT JOIN sections s ON c.course_id = s.course_id
LEFT JOIN lectures l ON s.section_id = l.section_id
ORDER BY c.course_id, s.section_id, l.lecture_id;


7. nginx ์„ค์ •

/etc/nginx/sites-enabled/web

nginx
๋ณต์‚ฌํŽธ์ง‘
upstream tomcat_backend {
  server XXX.XXX.XXX.XX:8080;
  server XXX.XXX.XXX.XX:8080;
}

server {
  listen 80;
  root /var/www/web;

  location / {
    try_files $uri $uri/ =404;
  }

  location /api {
    rewrite ^/api(/.*)$ $1 break;
    proxy_pass http://tomcat_backend;
  }
}

๐Ÿ” systemctl restart nginx


8. ๋งˆ์ง€๋ง‰ ์ ๊ฒ€

ํ•ญ๋ชฉ ํ™•์ธ

insert.jsp๋กœ ๊ฐ’ ์ž…๋ ฅ ์‹œ master DB์— ์ €์žฅ๋จ  
slave DB์—์„œ๋„ ์ฆ‰์‹œ ๋ฐ˜์˜๋˜๋Š”์ง€ ํ™•์ธ (select.jsp)  
back.jsp ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด IP ๋ฒˆ๊ฐˆ์•„ ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธ  

๐Ÿ“Œ ์ „์ฒด ํ๋ฆ„ ์š”์•ฝ

text
๋ณต์‚ฌํŽธ์ง‘
[์‚ฌ์šฉ์ž] -- insert.html
         → [insert.jsp] → [๋งˆ์Šคํ„ฐ DB ์ €์žฅ]

[์‚ฌ์šฉ์ž] -- select.jsp
         → [์Šฌ๋ ˆ์ด๋ธŒ DB ์กฐํšŒ]

→ ๋งˆ์Šคํ„ฐ/์Šฌ๋ ˆ์ด๋ธŒ ๊ฐ„ ๋ ˆํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •์ƒ ๋™์ž‘ ํ™•์ธ
→ Nginx ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ํ™•์ธ (back.jsp IP ๋ฒˆ๊ฐˆ์•„ ๋‚˜์˜ด)

โœ… ์‹ค์Šต ๊ฐœ์š”

  • INDEX: ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ
  • EXPLAIN: SQL ์ฟผ๋ฆฌ๊ฐ€ ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋˜๋Š”์ง€ ๋ณด์—ฌ์คŒ
  • PROFILE: ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ๊ฐ„ ๋ถ„์„ (๊ฐ ๋‹จ๊ณ„๋ณ„ ์†Œ์š” ์‹œ๊ฐ„)

โœ… 1. ํ…Œ์ด๋ธ” ์ƒ์„ฑ ๋ฐ ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…

sql
๋ณต์‚ฌํŽธ์ง‘
-- ๊ธฐ์กด post ํ…Œ์ด๋ธ” ์‚ญ์ œ
DROP TABLE IF EXISTS post;

-- post ํ…Œ์ด๋ธ” ์ƒ์„ฑ
CREATE TABLE post (
    idx INT AUTO_INCREMENT PRIMARY KEY,         -- ๊ฒŒ์‹œ๊ธ€ ID
    writerIdx INT,                               -- ์ž‘์„ฑ์ž ID (member ํ…Œ์ด๋ธ” ์ฐธ์กฐ ๊ฐ€์ •)
    contents VARCHAR(100),                       -- ๊ฒŒ์‹œ๊ธ€ ๋‚ด์šฉ
    createdAt DATETIME                           -- ์ƒ์„ฑ์ผ
);

-- 1000๊ฐœ ๋”๋ฏธ ๋ฐ์ดํ„ฐ ์‚ฝ์ž…
INSERT INTO post (writerIdx, contents, createdAt)
SELECT
    FLOOR(1 + RAND() * 1000),                             -- 1~1000 ์‚ฌ์ด ์ž„์˜์˜ ์ž‘์„ฑ์ž ID
    CONCAT('์ด๊ฒƒ์€ ํ…Œ์ŠคํŠธ ๊ฒŒ์‹œ๊ธ€ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค - ', n),      -- ๋‚ด์šฉ ์˜ˆ์‹œ
    NOW()
FROM (
    WITH RECURSIVE seq AS (
        SELECT 1 AS n
        UNION ALL
        SELECT n + 1 FROM seq WHERE n < 1000
    )
    SELECT * FROM seq
) AS temp;


โœ… 2. ์„ฑ๋Šฅ ๋ถ„์„ ํ™œ์„ฑํ™” (PROFILE)

sql
๋ณต์‚ฌํŽธ์ง‘
-- ์ฟผ๋ฆฌ ํ”„๋กœํŒŒ์ผ๋ง ๊ธฐ๋Šฅ ํ™œ์„ฑํ™”
SET profiling = 1;


โœ… 3. ์ธ๋ฑ์Šค ์—†์ด ์ฟผ๋ฆฌ ์‹คํ–‰ + PROFILE ํ™•์ธ

sql
๋ณต์‚ฌํŽธ์ง‘
-- ์ธ๋ฑ์Šค ์—†๋Š” ์ƒํƒœ์—์„œ ํŠน์ • ์ž‘์„ฑ์ž์˜ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ
SELECT * FROM post WHERE writerIdx = 777;

-- ์ตœ๊ทผ ์‹คํ–‰๋œ ์ฟผ๋ฆฌ ๋ชฉ๋ก ๋ฐ ์‹คํ–‰ ์‹œ๊ฐ„ ํ™•์ธ
SHOW PROFILES;

-- ์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์˜ ์ƒ์„ธ ์‹คํ–‰ ๋‹จ๊ณ„ ์‹œ๊ฐ„ ํ™•์ธ
SHOW PROFILE FOR QUERY 1;


โœ… 4. EXPLAIN์œผ๋กœ ์‹คํ–‰ ๊ณ„ํš ํ™•์ธ (์ธ๋ฑ์Šค ์—†๋Š” ์ƒํƒœ)

sql
๋ณต์‚ฌํŽธ์ง‘
-- EXPLAIN์œผ๋กœ ์‹คํ–‰ ๊ณ„ํš ํ™•์ธ
EXPLAIN SELECT * FROM post WHERE writerIdx = 777;

-- ํ™•์ธ ํฌ์ธํŠธ:
-- type: ALL → ํ…Œ์ด๋ธ” ์ „์ฒด ๊ฒ€์ƒ‰ (๋А๋ฆผ)
-- rows: 1000 → ์˜ˆ์ƒ ์Šค์บ” ํ–‰ ์ˆ˜ ๋งŽ์Œ
-- key: NULL → ์ธ๋ฑ์Šค ๋ฏธ์‚ฌ์šฉ


โœ… 5. ์ธ๋ฑ์Šค ์ƒ์„ฑ

sql
๋ณต์‚ฌํŽธ์ง‘
-- writerIdx ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค ์ƒ์„ฑ
CREATE INDEX idx_writerIdx ON post(writerIdx);


โœ… 6. ์ธ๋ฑ์Šค ์ ์šฉ ํ›„ ์ฟผ๋ฆฌ ์žฌ์‹คํ–‰ + PROFILE ๋น„๊ต

sql
๋ณต์‚ฌํŽธ์ง‘
-- ๋™์ผํ•œ ์ฟผ๋ฆฌ ์žฌ์‹คํ–‰
SELECT * FROM post WHERE writerIdx = 777;

-- ์ƒˆ ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ๊ฐ„ ํ™•์ธ
SHOW PROFILES;

-- ๋‘ ๋ฒˆ์งธ ์ฟผ๋ฆฌ์˜ ์ƒ์„ธ ์‹œ๊ฐ„ ํ™•์ธ
SHOW PROFILE FOR QUERY 2;


โœ… 7. EXPLAIN ์žฌํ™•์ธ (์ธ๋ฑ์Šค ์ ์šฉ ํ›„)

sql
๋ณต์‚ฌํŽธ์ง‘
EXPLAIN SELECT * FROM post WHERE writerIdx = 777;

-- ํ™•์ธ ํฌ์ธํŠธ:
-- type: ref → ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•œ ๊ฒ€์ƒ‰ (๋น ๋ฆ„)
-- key: idx_writerIdx → ์‚ฌ์šฉ๋œ ์ธ๋ฑ์Šค ์ด๋ฆ„
-- rows: ์ ์Œ → ์ ์€ ์ˆ˜์˜ ํ–‰๋งŒ ๊ฒ€์ƒ‰


โœ… ์š”์•ฝ ์ •๋ฆฌ

๊ฐœ๋… ์„ค๋ช…

INDEX ํŠน์ • ์ปฌ๋Ÿผ์— ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ถ”๊ฐ€ (writerIdx์— ์ƒ์„ฑ)
EXPLAIN ์ฟผ๋ฆฌ ์‹คํ–‰ ์ „์— MySQL์ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š”์ง€ ๊ณ„ํš์„ ๋ณด์—ฌ์คŒ
PROFILE ์‹ค์ œ๋กœ ์ฟผ๋ฆฌ๊ฐ€ ์‹คํ–‰๋˜๋ฉด์„œ ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ๊ฑธ๋ฆฐ ์‹œ๊ฐ„ ๋ถ„์„ ๊ฐ€๋Šฅ
  • EXPLAIN→ ์–ด๋–ค ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ• ์ง€, ๋ช‡ ๊ฐœ ํ–‰์„ ์ฝ์„์ง€, ํ…Œ์ด๋ธ”์„ ์–ด๋–ป๊ฒŒ ํƒ์ƒ‰ํ• ์ง€ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • → ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— MySQL์ด ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์ฒ˜๋ฆฌํ•  ๊ณ„ํš์ธ์ง€, ์ฆ‰ ์‹คํ–‰ ๊ณ„ํš์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.
  • PROFILE→ ์ฟผ๋ฆฌ ์‹คํ–‰์˜ ๋ณ‘๋ชฉ ๊ตฌ๊ฐ„์ด๋‚˜ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • → ์ฟผ๋ฆฌ๋ฅผ ์‹ค์ œ ์‹คํ–‰ํ•œ ํ›„์— ๊ฐ ์‹คํ–‰ ๋‹จ๊ณ„๋ณ„๋กœ ์–ผ๋งˆ๋‚˜ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋Š”์ง€ ์ƒ์„ธํ•˜๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ๋ช…๋ น์–ด์ž…๋‹ˆ๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด,

EXPLAIN์€ ๊ณ„ํš์„ ๋ณด์—ฌ์ฃผ๊ณ , PROFILE์€ ์‹คํ–‰ ๊ฒฐ๊ณผ์˜ ์‹œ๊ฐ„ ๋ถ„์„์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

INDEX (์ธ๋ฑ์Šค)

  • ๋ฌด์—‡์ธ๊ฐ€?์ฑ… ๋’ค์— ์žˆ๋Š” ‘์ฐพ์•„๋ณด๊ธฐ’ ๋ชฉ๋ก๊ณผ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ํ…Œ์ด๋ธ”์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ๋„๋ก ๋„์™€์ฃผ๋Š” ํŠน๋ณ„ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
  • ์™œ ํ•„์š”ํ•œ๊ฐ€?
  • ํ…Œ์ด๋ธ”์ด ์ปค์งˆ์ˆ˜๋ก ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š”๋ฐ, ์ธ๋ฑ์Šค๊ฐ€ ์žˆ์œผ๋ฉด ๊ฒ€์ƒ‰ ์†๋„๊ฐ€ ํ›จ์”ฌ ๋นจ๋ผ์ง‘๋‹ˆ๋‹ค.
  • ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜?
  • ํŠน์ • ์ปฌ๋Ÿผ์— ๋Œ€ํ•ด ๋ณ„๋„์˜ ์ •๋ ฌ๋œ ์ž๋ฃŒ๊ตฌ์กฐ(B-ํŠธ๋ฆฌ ๋“ฑ)๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ฒ€์ƒ‰ํ•  ๋•Œ ์ „์ฒด ํ…Œ์ด๋ธ”์„ ํ›‘์ง€ ์•Š๊ณ ๋„ ๋ฐ”๋กœ ์œ„์น˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฃผ์˜์ 
    • ์ธ๋ฑ์Šค๊ฐ€ ๋งŽ์œผ๋ฉด ๋ฐ์ดํ„ฐ ์‚ฝ์ž…/์ˆ˜์ •/์‚ญ์ œ ์‹œ์— ์ธ๋ฑ์Šค๋„ ๊ฐ™์ด ๊ฐฑ์‹ ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
    • ๋ชจ๋“  ์ปฌ๋Ÿผ์— ์ธ๋ฑ์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์€ ์˜คํžˆ๋ ค ์„ฑ๋Šฅ ์ €ํ•˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•œ ์ค„ ์š”์•ฝ

์ธ๋ฑ์Šค๋Š” ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ๋†’์—ฌ์ฃผ๋Š” ‘๋น ๋ฅธ ์ฐพ๊ธฐ’์šฉ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

'Database' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Database 8์ผ์ฐจ  (1) 2025.06.18
Database 6์ผ์ฐจ  (0) 2025.06.16
Database 5์ผ์ฐจ  (2) 2025.06.13
Database 4์ผ์ฐจ  (0) 2025.06.12
Database 3์ผ์ฐจ  (1) 2025.06.11
'Database' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • Database 8์ผ์ฐจ
  • Database 6์ผ์ฐจ
  • Database 5์ผ์ฐจ
  • Database 4์ผ์ฐจ
๊ฐœ๋ฐœ์ž GWANG
๊ฐœ๋ฐœ์ž GWANG
  • ๊ฐœ๋ฐœ์ž GWANG
    GWANG DEVLog
    ๊ฐœ๋ฐœ์ž GWANG
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๐Ÿ˜Ž ์ „์ฒด ์นดํ…Œ๊ณ ๋ฆฌ (21)
      • ํ•œํ™”์‹œ์Šคํ…œ SW ๋ถ€ํŠธ์บ ํ”„ 17๊ธฐ (3)
      • Linux (3)
      • SW๊ณตํ•™ (4)
      • Database (8)
      • ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ  ํ”„๋กœ์ ํŠธ (1)
      • HTML CSS (1)
      • SQL์ˆ˜์—… (0)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ๋งํฌ

    • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
    ๊ฐœ๋ฐœ์ž GWANG
    Database 7์ผ์ฐจ
    ์ƒ๋‹จ์œผ๋กœ

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”