c o d i n g . . ๐Ÿ‰/MySQL

[์ƒํ™œ์ฝ”๋”ฉ] Nodejs๋กœ Database ๋‹ค๋ฃจ๊ธฐ(2)

H J 2021. 7. 20. 14:21

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ MySQL ์ œ์–ดํ•˜๊ธฐ : Node-MySQL

๋จผ์ € node-mysql ์„ค์น˜!


https://github.com/mysqljs/mysql

mysqljs/mysql

A pure node.js JavaScript Client implementing the MySQL protocol. - mysqljs/mysql

github.com

๊นƒํ—™์— ๋ฐฉ๋ฌธ์„ ํ•˜๋ฉด 'MySQL ํ”„๋กœํ† ์ฝœ์„ ๊ตฌํ˜„ํ•˜๋Š” ์ˆœ์ˆ˜ํ•œ node.js JavaScript ํด๋ผ์ด์–ธํŠธ.' ๋ผ๋Š” ๋œป์ด๋ผ๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค

let mysql = require('mysql'); // node-mysql(๊ฐ์ฒด)์„ mysql(๋ณ€์ˆ˜)์— ๋‹ด๊ธฐ let connection = mysql.createConnection({ // node-mysql(๊ฐ์ฒด)์˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ, connection์—์„œ connection ์ •๋ณด๋‹ด๊ณ  ์žˆ์Œ host : 'localhost', // DB๊ฐ€ ์žˆ๋Š” ์ฃผ์†Œ user : 'me', // root password : 'secret', // ์ž์‹ ์ด ์ง€์ •ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ database : 'my_db' // DB ์ด๋ฆ„(o2) }); // ์ด ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌ connection.connect(); // connect connection.query('SELECT 1 + 1 AS solution', function (error, results, fields) { // connection ์„œ๋ฒ„๋ฅผ ๋Œ€์ƒ์œผ๋กœ sql๋ฌธ์„ ์„œ๋ฒ„์—๊ฒŒ ์ „์†ก if (error) throw error; console.log('The solution is: ', results[0].solution); // results = rows }); // ๋ชจ๋“  ์ž‘์—…์ด ๋๋‚˜๋ฉด ๋ชจ๋“ˆ์ด ํ•จ์ˆ˜ ํ˜ธ์ถœ connection.end(); // ์—ฐ๊ฒฐ ๋Š๊ธฐ

๋”๋ณด๊ธฐ

์™€... ๋‚˜ ์ง„์งœ ์ด๋Ÿฌ๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ ์‹คํ–‰ํ•˜๋Š”๋ฐ,,, ๊ณ„์† ์˜ค๋ฅ˜ ๋– ์„œ,,, 3์‹œ๊ฐ„ ๋™์•ˆ ๊ตฌ๊ธ€๋ง ๊ฒ๋‚˜ ํ–ˆ๋‹ค..

๊ทผ๋ฐ ์•Œ๊ณ  ๋ณด๋‹ˆ๊นŒ MySQL์ด 2๊ฐœ๊ฐ€ ๊น”๋ ค์žˆ์–ด์„œ ์ƒ๊ธด ๋ฌธ์ œ์˜€๋‹คใ… ใ… ใ… ใ… ใ… 

์‚ฌ๊ฑด์˜ ๋ฐœ๋‹จ

1. 1์›”์— ์ƒํ™œ์ฝ”๋”ฉ์œผ๋กœ ๊ณต๋ถ€ํ•˜๋ ค๊ณ  bitnami๋ฅผ ๊น”๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ •ํ–ˆ๋‹ค

2. 5์›”์— ํ•™๊ต ๋™์•„๋ฆฌ์—์„œ MySQL ๊ณต๋ถ€ํ•˜๋ ค๊ณ  MySQL์„ ๋”ฐ๋กœ ๊น”์•˜๋‹ค

์ด๋•Œ๋„ (์ด๋•Œ๋Š” ๋ชฐ๋ž์ง€๋งŒ) ์ž๊พธ ํฌํŠธ ๋ฒˆํ˜ธ๊ฐ€ 3306์œผ๋กœ ์„ค์ •์ด ์•ˆ ๋ผ์„œ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ๊น”๊ณ  ์—„์ฒญ ๋ฐ˜๋ณตํ•ด์„œ ์ œ๋Œ€๋กœ ์„ค์น˜ํ•˜๋Š”๋ฐ ์ง„์งœ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋Š”๋ฐ ์ด๋•Œ ์ƒˆ๋กœ์šด (new!!) ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ •ํ–ˆ๋‹ค.. (๊ตฌ๊ธ€๋ง ํ•ด์„œ ๊ฐ•์ œ๋กœ ํฌํŠธ๋ฒˆํ˜ธ 3306 ์‚ฌ์šฉํ•˜๋„๋ก ์„ค์ •ํ•จ)

3. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ์–ด์ œ ์ƒํ™œ์ฝ”๋”ฉ ๊ฐ•์˜๋ฅผ ๋“ฃ๋‹ค๊ฐ€ ์ „์— bitnami๋ฅผ ๊น”์•˜์œผ๋ฉด ์•ˆ ๊น”์•„๋„ ๋œ๋‹ค๊ณ  ํ•ด์„œ (MySQL 2๋ฒˆ ๊น”๋ฉด ๋ฌธ์ œ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์‹ฌ) ์•„~~ ๊ทธ๋•Œ bitnami ๊น”์•„์„œ MySQL๋„ ์ž๋™์œผ๋กœ ๊น”๋ฆฐ ๊ฑฐ์˜€๊ตฌ๋‚˜!! ํ•˜๊ณ  ์•Œ๊ฒŒ ๋๋‹ค..

4. 1๋ฒˆ์—์„œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋Š” ๊ฑธ ์ƒ์ƒ๋„ ๋ชป ํ–ˆ๋‹ค... ๊ทธ๋ž˜๋„ ์ด๋•Œ๊นŒ์ง„ mysql -uroot -p ํ•˜๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅํ•  ๋•Œ 2๋ฒˆ์—์„œ ๋งŒ๋“  ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ–ˆ๋”๋‹ˆ ๋๋‹ค -> ๊ทธ๋ž˜์„œ ๋ฌธ์ œ์—†๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค..

5. ๊ทธ๋Ÿฐ๋ฐ.... ์—ฌ๊ธฐ์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ์ฝ”๋“œ์— ๋น„๋ฐ€๋ฒˆํ˜ธ(2๋ฒˆ)๊นŒ์ง€ ์ž…๋ ฅํ•˜๊ณ  node database_mysql.js๋ฅผ ํ–ˆ๋Š”๋ฐ?!?! ์ž๊พธ๋งŒ,... error: er_access_denied_error: access denied for user 'root'@'localhost' (using password: yes) ์ด ์˜ค๋ฅ˜๊ฐ€ ๋œจ๊ธฐ ์‹œ์ž‘... ๊ทธ๋Ÿฐ๋ฐ ์•„๋ฌด๋ฆฌ ๊ตฌ๊ธ€๋งํ•ด๋„ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฌธ์ œ๋ผ๋Š” ๋ง๋งŒ ๋‚˜์˜ค๊ณ  ๋‚œ ์ผ๋‹จ ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ๋‹ค ์‹œ๋„ํ•ด๋ดค๋‹ค,.. ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ฐ”๊พธ๊ธฐ, UPDATE ๋ญ ์–ด์ฉŒ๊ณ  ์ง„์งœ ์‹œ๋„ํ•ด๋ณธ ๋ฐฉ๋ฒ•๋งŒ ์ตœ์†Œ 10๊ฐœ... ์ง„์งœ ๋‹ต๋‹ตํ•˜๊ณ  ๋จธ๋ฆฌ ๋๊นŒ์ง€ ํ™”๊ฐ€ ๋‚ฌ๋‹ค...

6. ์™€ ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ MySQL installer์— ๋“ค์–ด๊ฐ€์„œ ๋ฌด์Šจ ์„ค์ •์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค๊ธธ๋ž˜ ๊ทธ๊ฑธ ๋”ฐ๋ผ ํ•˜๋‹ค๊ฐ€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ–ˆ๋Š”๋ฐ ๊ฐ‘์ž๊ธฐ!?!? ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ‹€๋ ธ๋‹ค๊ณ  ํ–ˆ๋‹ค.. ๋‚œ ์ด๊ฒŒ ๋ฌด์Šจ ์ผ์ธ๊ฐ€ ์‹ถ์–ด์„œ ๋˜ 20๋ถ„ ๊ฐ€๊นŒ์ด ๋จธ๋ฆฌ๋ฅผ ๊ตด๋ ธ๋‹ค... ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ๊ทธ๋ƒฅ 2๋ฒˆ์—์„œ ์„ค์น˜ํ•œ MySQL์„ ์‚ญ์ œํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค(์™„์ „ํžˆ ์‚ญ์ œํ•˜๋ ค๋ฉด ์‚ญ์ œํ•˜๋Š”๋ฐ๋„ ์‹œ๊ฐ„ ๊ฒ๋‚˜ ์˜ค๋ž˜ ๊ฑธ๋ฆผ ;ใ……;)

7. ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ mysql -uroot -p๋ฅผ ์‹œ๋„ํ–ˆ๋Š”๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ํ‹€๋ ธ๋‹ค๊ณ  ํ–ˆ๋‹ค.... ํ˜ธ์˜ฅ์‹œ๋‚˜.. ํ•˜๊ณ  ๋ฉ”๋ชจ(๋‚ด ๊ณ„์ •๋“ค์ด๋‚˜ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ ์–ด๋†“์€ ๋ฉ”๋ชจ)๋ฅผ ํ™•์ธํ–ˆ๋Š”๋ฐ..? bitnami ๋น„๋ฐ€๋ฒˆํ˜ธ..๋ผ๋Š” ๊ฒŒ ์“ฐ์—ฌ์žˆ๊ธธ๋ž˜.. ใ…‡์—ฅ..? ์„ค๋งˆ,... ํ•˜๊ณ  ์ž…๋ ฅํ•ด๋ดค๋”๋‹ˆ!??!?! ์˜ค์— ์ฅ.... 1๋ฒˆ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ์ด๋‹ค.... ๊ทธ๊ฑธ ์ž…๋ ฅํ–ˆ๋”๋‹ˆ ํ•ด๊ฒฐ... ์ด๊ฒŒ ๋ฌด์Šจ ์ผ์ด์ง€ ์ •๋ง,..??

๋‚˜๋Š” ๋ฉ์ฒญ์ดใ… ใ… ใ… ใ…  ๊ทธ๋ž˜๋„ ๋‹คํ–‰์ด๋‹ค ํ•ด๊ฒฐํ•ด์„œ... ํฌ๊ธฐํ•˜์ง€ ์•Š์€ ๋‚˜ ์นญ์ฐฌํ•ด...

๋‚ด์ผ ๊ตฐ๋Œ€ ํœด๊ฐ€ ๋‚˜์˜ค๋Š” ์นœ๊ตฌ๋ž‘ ์•„์นจ~์ ์‹ฌ์— ์ž ๊น ๋ณด๊ธฐ๋กœ ํ•ด์„œ 10์‹œ์— ์ผ์–ด๋‚˜์•ผ ํ•˜๋Š”๋ฐ ๋ฒŒ์จ 4์‹œ ๋ฐ˜... ๊ทธ๋ž˜... ๊ทธ๋Ÿด ์ˆ˜ ์žˆ์–ด... ๋‚ด์ผ ์นดํŽ˜ ๊ฐ€์„œ ๋งˆ์ € ๊ณต๋ถ€ํ•˜๊ณ  ์˜ฌ๋ ค์•ผ๊ฒ ๋‹คใ… ใ… 

๊ทธ๋ž˜๋„ ์–ด๋Š ์ •๋„ ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐํ•ด์„œ ๋‹คํ–‰์ด๋‹คใ… ใ… ใ… 


์œ„์˜ ์ฝ”๋“œ๋ฅผ ์–ด๋Š ์ •๋„ ์ •๋ฆฌํ•˜๋ฉด์„œ ์“ฐ๋ฉด?!

let mysql = require('mysql'); let conn = mysql.createConnection({ host : 'localhost', user : 'root', password : '๋น„๋ฐ€๋ฒˆํ˜ธ', database : 'o2' }); conn.connect(); let sql = 'SELECT * FROM topic'; conn.query(sql, function(err, rows, fields){ if(err){ console.log(err); } else{ console.log('rows', rows); console.log('fields', fields); } }); conn.end();

์ด๋ ‡๊ฒŒ ์“ธ ์ˆ˜ ์žˆ๋‹ค!!
์—๋Ÿฌ๊ฐ€ ์—†๋‹ค๋ฉด rows์™€ fields๋ฅผ ์ฝ˜์†” ์ฐฝ์— ์ถœ๋ ฅ!



์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ด์šฉ : SELECT

let sql = 'SELECT * FROM topic'; conn.query(sql, function(err, rows, fields){ if(err){ console.log(err); } else{ for(let i=0;i<rows.length; i++){ console.log(rows[i].title); } } });

์ด๋ ‡๊ฒŒ SELECT๋ฅผ ์ด์šฉํ•ด์„œ TABLE์—์„œ data๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค



์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ด์šฉ : INSERT

let sql = 'INSERT INTO topic (title, description, author) VALUES("Nodejs","Nodejs is...","name3")'; conn.query(sql, function(err, rows, fields){ if(err){ console.log(err); } else{ console.log(rows); } });

INSERT๋ฅผ ์ด์šฉํ•ด์„œ TABLE์— data๋ฅผ ๋„ฃ์–ด์ค€๋‹ค

insertId๋Š” id์˜ ๊ฐ’์ด๋‹ค!

let sql = 'INSERT INTO topic (title, description, author) VALUES("Express","Express is...","name4")'; conn.query(sql, function(err, rows, fields){ if(err){ console.log(err); } else{ console.log(rows.insertId); } });

์ƒˆ๋กœ์šด data๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ  insertId๋ฅผ ๋”ฐ๋กœ ์ถœ๋ ฅํ•ด์„œ id ๊ฐ’์„ ์•Œ ์ˆ˜๋„ ์žˆ๋‹ค

let sql = 'INSERT INTO topic (title, description, author) VALUES(?, ?, ?)'; let params =['Supervisor', 'Supervisor is...', 'name5']; conn.query(sql,params, function(err, rows, fields){ if(err){ console.log(err); } else{ console.log(rows.insertId); } });

INSERT๋ฅผ ํ•  ๋•Œ ๋ชจ๋“  ๊ฐ’์„ ์ง์ ‘ ์ž…๋ ฅํ•˜์ง€ ์•Š๊ณ  ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด query์˜ 2๋ฒˆ์งธ ์ธ์ž๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ์ž๋™์œผ๋กœ ํ• ๋‹น๋œ๋‹ค!!

ํ˜„์žฌ topic ์ƒํ™ฉ!



์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ด์šฉ : UPDATE

let sql ='UPDATE topic SET title=?, author=? WHERE id=?'; let params = ['NPM', 'new name1',1]; conn.query(sql, params, function(err, rows, fields){ if(err){ console.log(err); } else{ console.log(rows); } })

UPDATE๋ฅผ ์ด์šฉํ•ด์„œ topic ์ค‘ ํ•ด๋‹น id ๊ฐ’์„ ๊ฐ€์ง„ data์˜ title, author๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค

id๋ฅผ 1๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— 1๋ฒˆ์งธ row์˜ ๊ฐ’์ด ๋ณ€ํ–ˆ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค(affectedRows)

ํ˜„์žฌ ์ƒํ™ฉ!



์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ด์šฉ : DELETE

let sql ='DELETE FROM topic WHERE id=?'; let params = [1]; conn.query(sql, params, function(err, rows, fields){ if(err){ console.log(err); } else{ console.log(rows); } })

DELETE๋ฅผ ์ด์šฉํ•ด ์‚ญ์ œํ•˜๋ ค๋Š” data์˜ id ๊ฐ’์„ ๋ฐ›์•„ ์ž…๋ ฅํ•˜๋ฉด ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋‹ค!

๋‚ด๊ฐ€ ์„ค์ •ํ•œ id ๊ฐ’์˜ data๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค(affectedRows)

ํ˜„์žฌ ์ƒํ™ฉ!! 1ํ–‰์ด ์‚ญ์ œ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Œ


๋”๋ณด๊ธฐ

MySQL ๋‚˜๊ฐˆ ๋•Œ ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ ์•„๋‹ˆ ๋ถ„๋ช… cntl + C ํ•˜๋ฉด ๋‚˜๊ฐ€์ง€๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ ์•„๋‹ˆ์–ด์„œ ์—„์ฒญ ์‹œ๋„ํ•˜๋‹ค๊ฐ€.... exit ์ž…๋ ฅํ•˜๋ฉด ์ข…๋ฃŒ๋˜๋Š” ๊ฑฐ์˜€์„œ ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹

exit๋‚˜ quit ์ž…๋ ฅํ•˜๊ธฐ!!


์• ๋“ค ๊ธฐ๋‹ค๋ฆฌ๋‹ค๊ฐ€ ์šฐ๋ฆฌ ์ง‘ ๊ตฌ๊ฒฝ์‹œ์ผœ์ฃผ๊ณ  ์Šค๋ฒ…์™€์„œ ๋ฏผ์ดˆ๋ž‘ ๋ธ”๋ฃจ๋ฒ ๋ฆฌ ์น˜์ฆˆ ์–ด์ฉŒ๊ตฌ ๋จน์—ˆ๋‹ค ^.^

๊ทœํƒ์ด๋Š” ๋‹ค๋ฅธ ๋™๊ธฐ๋“ค์ด๋ž‘ ์ ์‹ฌ ๋จน์œผ๋Ÿฌ ๊ฐ”๊ณ  ์„ฑํ˜„์ด๋Š” ๋ณต๊ท€ํ•˜๋Ÿฌ ๊ฐ”๋‹ค

๋‚˜๋Š” ๊ณต๋ถ€... ใ… 

๊ทธ๋ž˜๋„ ๋‹ค์Œ ์Šคํ„ฐ๋”” ๋•Œ๊นŒ์ง€ ํ•ด์˜ค๊ธฐ๋กœ ํ•œ ๊ฑฐ ๋‹ค ํ•ด์„œ ๋‹ค์Œ ๊ฐ•์˜๋ฅผ ๋“ค์„์ง€ ๋ณต์Šต์„ ํ• ์ง€ ๊ณ ๋ฏผ ์ค‘์ด๋‹ค... ๐Ÿ‰๐Ÿ‰

์ผ๋‹จ ์ด๋ฒˆ ๋ฐฉํ•™ + ํœดํ•™ ๊ณ„ํš ์ข€ ์จ๋ด์•ผ์ง•