Nodejs

 

인프런 :  https://www.inflearn.com/course/web2-node-js-mysql#

 

생활 코딩 :  https://opentutorials.org/module/3560/21175

 

유튜브 목록 : https://www.youtube.com/playlist?list=PLuHgQVnccGMAicFFRh8vFFFtLLlNojWUh

 

소스 :  https://github.com/web-n/node.js-mysql

https://github.com/web-n/node.js-mysql/releases/tag/1

 

 

준비 및 사용방법

 

1. 수업 소개

 

 

실습 코드

이 수업은 WEB2 - Node.js과 DATABASE2 - MySQL을 기반으로 하고 있습니다. 이를 위한 실습코드가 필요합니다. 아래 주소에 준비해 두었습니다.

 

 

 

 

 

2. 실습 준비

 

 

Mysql

CREATE database opentutorials;

CREATE USER `opentutorials`@`localhost` identified by '1111';

GRANT ALL  privileges on opentutorials.* to `opentutorials`@`localhost` ;

 

 
CREATE TABLE `author` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(20) NOT NULL,
  `profile` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
);
 
--
-- Dumping data for table `author`
--
 
INSERT INTO `author` VALUES (1,'egoing','developer');
INSERT INTO `author` VALUES (2,'duru','database administrator');
INSERT INTO `author` VALUES (3,'taeho','data scientist, developer');
 
--
-- Table structure for table `topic`
--
 
CREATE TABLE `topic` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(30) NOT NULL,
  `description` text,
  `created` datetime NOT NULL,
  `author_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
);
 
--
-- Dumping data for table `topic`
--
 
INSERT INTO `topic` VALUES (1,'MySQL','MySQL is...','2022-10-01 12:10:11',1);
INSERT INTO `topic` VALUES (2,'Oracle','Oracle is ...','2022-10-03 13:01:10',1);
INSERT INTO `topic` VALUES (3,'SQL Server','SQL Server is ...','2022-10-20 11:01:10',2);
INSERT INTO `topic` VALUES (4,'PostgreSQL','PostgreSQL is ...','2022-10-23 01:03:03',3);
INSERT INTO `topic` VALUES (5,'MongoDB','MongoDB is ...','2022-10-30 12:31:03',1);

 

 

 

 

nodemon 모듈

Node.js 개발 시 자바 스크립트 파일들을 수정 할때마다 매번 ctrl+c를 통해 node를 종료 후 다시 실행해줘야 하는 번거로움 이 있었습니다.
하지만 파일들을 모니터링하고 있다가 수정될 경우 자동으로 서버를 재실행시켜주는 스크립트 모니터링 유틸리티 nodemon를 이용하면 번거로움이 상당히 줄어듭니다

 

nodemon 설치

npm 1.0Visit Website이상을 사용할 경우 nodemon은 커맨드라인에서 명령어를 사용할 것이기 때문에 -g 옵션을 붙혀서 글로벌로 설치를 합니다.

$ npm install nodemon -g

 

package.json 간편 설정

간편하게 npm start 명령어로도 nodemon을 실행시킬수 있습니다.

package.json 파일에 다음과 같이 script색션에 등록하면 됩니다.

 

  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "dev": "nodemon ./main.js"
  },

 

실행

$ npm run dev

 

 

 

 

 

3. Node.js MySQL 모듈의 기본 사용방법

 

mysql  설치
 

$npm i mysql

 

nodejs/mysql.js

var mysql = require('mysql');
// 비밀번호는 별도의 파일로 분리해서 버전관리에 포함시키지 않아야 합니다. 
var connection = mysql.createConnection({
    host: 'localhost',
    user: 'opentutorials',
    password: '1111',
    database: 'opentutorials'
});

connection.connect();

connection.query('SELECT * FROM topic', function (error, results, fields) {
    if (error) {
        console.log(error);
    }
    console.log('The solution is :', results);
});

connection.end();

 

 

 

 

 

4. ER ACCESS DENIED ERROR 오류 처리

 

 

 

 

 

 

My SQL로 구현

 

5. My SQL로 홈페이지 구현 1

 

소스코드

main.js (변경사항)

 

~
var mysql = require('mysql');
var db = mysql.createConnection({
  host: 'localhost',
  user: 'opentutorials',
  password: '1111',
  database: 'opentutorials'
});
db.connect();
~


  if (pathname === '/') {
    if (queryData.id === undefined) {
      // fs.readdir('./data', function (error, filelist) {
      //   var title = 'Welcome';
      //   var description = 'Hello, Node.js';
      //   var list = template.list(filelist);
      //   var html = template.HTML(title, list,
      //     `<h2>${title}</h2>${description}`,
      //     `<a href="/create">create</a>`
      //   );
      //   response.writeHead(200);
      //   response.end(html);
      // });


      db.query("SELeCT * FROM topic", function (error, topics) {
        console.log(topics);
        response.writeHead(200);
        response.end("success");
      });


    }



~

 

 

 

 

 

6. My SQL로 홈페이지 구현 2

 

소스코드

main.js (변경사항)

 

main.js

~
      db.query("SELeCT * FROM topic", function (error, topics) {
        console.log(topics);

        var title = 'Welcome';
        var description = 'Hello, Node.js';

        var list = template.list(topics);
        var html = template.HTML(title, list,
          `<h2>${title}</h2>${description}`,
          `<a href="/create">create</a>`
        );

        response.writeHead(200);
        response.end(html);
      });
~

 

lib/template.js

, list: function (topics) {
    var list = '<ul>';
    var i = 0;
    while (i < topics.length) {
      list = list + `<li><a href="/?id=${topics[i].id}">${topics[i].title}</a></li>`;
      i = i + 1;
    }
    list = list + '</ul>';
    return list;
  }

 

 

 

 

 

 

7. My SQL로 상세보기 구현

 

소스코드

main.js (변경사항)

~



      db.query("SELECT * FROM topic", function (error, topics) {
        if (error) throw error;


        db.query(`SELECT * FROM topic WHERE id=?`, [queryData.id], function (error2, topic) {
          if (error2) throw error2;

          console.log("topic : ", topic);

          var title = topic[0].title;
          var description = topic[0].description;
          var list = template.list(topics);


          var html = template.HTML(title, list,
            `<h2>${title}</h2>${description}`,
            ` <a href="/create">create</a>
                <a href="/update?id=${queryData.id}">update</a>
                <form action="delete_process" method="post">
                  <input type="hidden" name="id" value="${queryData.id}">
                  <input type="submit" value="delete">
                </form>`

          );

          response.writeHead(200);
          response.end(html);
        });


      });




    }




 } else if (pathname === '/create') {

 

 

 

 

 

 

 

 

8. My SQL로 글생성 기능 구현

 

소스코드

main.js (변경사항)

 

  } else if (pathname === '/create_process') {



    var body = '';
    request.on('data', function (data) {
      body = body + data;
    });

    request.on('end', function () {
      var post = qs.parse(body);


      db.query(`INSERT INTO topic (title, description, created, author_id)  VALUES(?, ?, NOW(), ?)`,
        [post.title, post.description, 1], function (error, result) {
          if (error) throw error;  //등록 처리된 아이디 값 가져오기 insertId
          response.writeHead(302, { Location: `/?id=${result.insertId}` });
          response.end();

        });


    });



  } 

 

 

 

 

 

 

 

9.My SQL로 글수정 기능 구현 1

 

소스코드 main.js (변경사항)

  } else if (pathname === '/update') {
    db.query("select * from topic", function (erro, topics) {
      if (erro) throw erro;

      db.query(`SELECT * FROM topic WHERE id=?`, [queryData.id], function (error2, topic) {
        if (error2) throw error2;
        var list = template.list(topics);
        var html = template.HTML(topic[0].title, list,
          `
                <form action="/update_process" method="post">
                  <input type="hidden" name="id" value="${topic[0].id}">
          <p><input type="text" name="title" placeholder="title" value="${topic[0].title}"></p>
          <p>
          <textarea name="description" placeholder="description">${topic[0].description}</textarea>
                  </p>
      <p>
        <input type="submit">
      </p>
                </form>
      `,
          `<a href="/create" > create</a> <a href="/update?id=${topic[0].id}">update</a>`
        );
        response.writeHead(200);
        response.end(html);
      });

    });

  } else if (pathname === '/update_process') {

 

 

 

 

 

 

10.My SQL로 글수정 기능 구현 2

소스코드 main.js (변경사항)

  } else if (pathname === '/update_process') {
    var body = '';
    request.on('data', function (data) {
      body = body + data;
    });
    request.on('end', function () {
      var post = qs.parse(body);


      db.query(`UPDATE topic SET title=?, description=?, author_id=? WHERE id=?`,
        [post.title, post.description, 1, post.id], function (error, result) {
          if (error) throw error;
          response.writeHead(302, { Location: `/?id=${post.id}` });
          response.end();
        });



    });
  }

 

 

 

 

 

 

11.My SQL로 글 삭제 기능 구현

 

소스코드

main.js (변경사항)

 

  } else if (pathname === '/delete_process') {
    var body = '';
    request.on('data', function (data) {
      body = body + data;
    });
    request.on('end', function () {
      var post = qs.parse(body);
      db.query("delete from topic where id=?", [post.id], function (error, result) {
        if (error) throw error;
        response.writeHead(302, { Location: `/ ` });
        response.end();
      });

    });
  } else {

 

 

 

 

 

 

 

My SQL join을 이용해서 구현

 

 

12.My SQL join을 이용해서 상세보기 구현

main.js (변경사항)

    } else {

      db.query("SELECT * FROM topic", function (error, topics) {
        if (error) throw error;

        db.query(`SELECT * FROM topic LEFT JOIN author  ON topic.author_id=author.id  WHERE topic.id=?`, [queryData.id], function (error2, topic) {
          if (error2) throw error2;

          console.log("topic : ", topic);

          var title = topic[0].title;
          var description = topic[0].description;
          var list = template.list(topics);

          var html = template.HTML(title, list,
            `<h2>${title}</h2>
            ${description}
            <p>by ${topic[0].name}</p>
            `,
            ` <a href="/create">create</a>
                <a href="/update?id=${queryData.id}">update</a>
                <form action="delete_process" method="post">
                  <input type="hidden" name="id" value="${queryData.id}">
                  <input type="submit" value="delete">
                </form>`

          );

          response.writeHead(200);
          response.end(html);
        });


      });

    }


  } else if (pathname === '/create') {

 

 

 

 

 

 

 

 

13.My SQL join을 이용해서 글 생성 구현

 

소스코드

변경사항 main.js

 

 } else if (pathname === '/create') {
    db.query("SELECT * FROM topic ", function (error, topics) {
      db.query("SELECT * FROM author ", function (error2, authors) {

        var title = 'create';
        var list = template.list(topics);
        var html = template.HTML(title, list, `
        <form action = "/create_process" method = "post" >
            <p><input type="text" name="title" placeholder="title"></p>
            <p>
              <textarea name="description" placeholder="description"></textarea>
            </p>
            <p>
             ${template.authorSelect(authors)}
            </p>
            <p>
              <input type="submit">
            </p>
          </form >
  `, '');
        response.writeHead(200);
        response.end(html);

      });

    });


  } else if (pathname === '/create_process') {



    var body = '';
    request.on('data', function (data) {
      body = body + data;
    });

    request.on('end', function () {
      var post = qs.parse(body);


      db.query(`INSERT INTO topic(title, description, created, author_id)  VALUES(?, ?, NOW(), ?)`,
        [post.title, post.description, post.author], function (error, result) {
          if (error) throw error;  //등록 처리된 아이디 값 가져오기 insertId
          response.writeHead(302, { Location: `/? id = ${result.insertId} ` });
          response.end();

        });


    });



  } else if (pathname === '/update') {

 

lib/template.js

  }, authorSelect: function (authors) {
    var tag = authors.map(author => (
      ` <option value="${author.id}">${author.name}</option>`
    ));

    return `<select name="author"> ${tag} </select>`;

  }

 

 

 

 

 

 

 

 

 

14.My SQL join을 이용해서 글 수정 구현

 

 

 

 } else if (pathname === '/update') {
    db.query("select * from topic", function (erro, topics) {
      if (erro) throw erro;

      db.query(`SELECT * FROM topic WHERE id =? `, [queryData.id], function (error2, topic) {
        db.query("SELECT * FROM author ", function (error2, authors) {
          if (error2) throw error2;
          var list = template.list(topics);
          var html = template.HTML(topic[0].title, list,
            `
        <form action = "/update_process" method = "post" >
          <input type="hidden" name="id" value="${topic[0].id}">
            <p><input type="text" name="title" placeholder="title" value="${topic[0].title}"></p>
            <p>
              <textarea name="description" placeholder="description">${topic[0].description}</textarea>
            </p>
           <p>
             ${template.authorSelect(authors, topic[0].author_id)}
            </p>
            <p>
              <input type="submit">
            </p>
          </form>
      `,
            `<a href = "/create" > create</a > <a href="/update?id=${topic[0].id}">update</a>`
          );
          response.writeHead(200);
          response.end(html);
        });
      });

    });

  } else if (pathname === '/update_process') {
    var body = '';
    request.on('data', function (data) {
      body = body + data;
    });
    request.on('end', function () {
      var post = qs.parse(body);


      db.query(`UPDATE topic SET title =?, description =?, author_id =? WHERE id =? `,
        [post.title, post.description, post.author, post.id], function (error, result) {
          if (error) throw error;
          response.writeHead(302, { Location: `/? id = ${post.id} ` });
          response.end();
        });



    });
  }

 

lib/template.js

  }, authorSelect: function (authors, author_id) {

    var tag = authors.map(author => (
      ` <option value="${author.id}" ${author.id === author_id ? 'selected' : ''}  >${author.name}</option>`
    ));

    return `<select name="author"> ${tag} </select>`;

  }

 

 

 

 

 

 

 

 

 

 

 

Node.js 정리정돈

 

 

15.수업의 정상

 

 

 

16.Node.js의 DB 설정정보 정리정돈

 

 

소스코드

변경사항 main.js

 

var db = require("./lib/db");





 

./lib/db.js

var mysql = require('mysql');
var db = mysql.createConnection({
    host: 'localhost',
    user: 'opentutorials',
    password: '1111',
    database: 'opentutorials'
});
db.connect();

module.exports = db;

 

 

 

 

 

 

17.Node.js 코드의 정리정돈 (topic) -1

 

소스코드

변경사항  

 

 var topic = require("./lib/topic");


   if (queryData.id === undefined) {

      topic.home(response);

    } else {

 

 

lib/topic.js

var template = require('./template.js');
var db = require("./db");

exports.home = function (response) {

    db.query("SELECT * FROM topic", function (error, topics) {
        var title = 'Welcome';
        var description = 'Hello, Node.js';
        var list = template.list(topics);
        var html = template.HTML(title, list,
            `<h2>${title}</h2>${description}`,
            `<a href="/create">create</a>`
        );

        response.writeHead(200);
        response.end(html);
    });

}

 

 

 

 

 

 

 

18.Node.js 코드의 정리정돈 (topic) -2

 

소스코드

변경사항  

 

  var pathname = url.parse(_url, true).pathname;
  if (pathname === '/') {
    if (queryData.id === undefined) {
      topic.home(request, response);

    } else {
      topic.page(request, response);
    }

  } else if (pathname === '/create') {
    topic.create(request, response);


  } else if (pathname === '/create_process') {
    topic.create_process(request, response);


  } else if (pathname === '/update') {

 

lib/topic.js

var url = require('url');
var qs = require('querystring');
var template = require('./template.js');
var db = require("./db");

exports.home = function (request, response) {

    db.query("SELECT * FROM topic", function (error, topics) {
        var title = 'Welcome';
        var description = 'Hello, Node.js';
        var list = template.list(topics);
        var html = template.HTML(title, list,
            `<h2>${title}</h2>${description}`,
            `<a href="/create">create</a>`
        );

        response.writeHead(200);
        response.end(html);
    });

}


exports.page = function (request, response) {

    var _url = request.url;
    var queryData = url.parse(_url, true).query;

    db.query("SELECT * FROM topic", function (error, topics) {
        if (error) throw error;

        db.query(`SELECT * FROM topic LEFT JOIN author  ON topic.author_id=author.id  WHERE topic.id=?`, [queryData.id], function (error2, topic) {
            if (error2) throw error2;

            console.log("topic : ", topic);

            var title = topic[0].title;
            var description = topic[0].description;
            var list = template.list(topics);

            var html = template.HTML(title, list,
                `<h2>${title}</h2>
            ${description}
            <p>by ${topic[0].name}</p>
            `,
                ` <a href="/create">create</a>
                <a href="/update?id=${queryData.id}">update</a>
                <form action="delete_process" method="post">
                  <input type="hidden" name="id" value="${queryData.id}">
                  <input type="submit" value="delete">
                </form>`

            );

            response.writeHead(200);
            response.end(html);
        });


    });
}



exports.create = function (request, response) {

    db.query("SELECT * FROM topic ", function (error, topics) {
        db.query("SELECT * FROM author ", function (error2, authors) {

            var title = 'create';
            var list = template.list(topics);
            var html = template.HTML(title, list, `
        <form action = "/create_process" method = "post" >
            <p><input type="text" name="title" placeholder="title"></p>
            <p>
              <textarea name="description" placeholder="description"></textarea>
            </p>
            <p>
             ${template.authorSelect(authors)}
            </p>
            <p>
              <input type="submit">
            </p>
          </form >
  `, '');
            response.writeHead(200);
            response.end(html);

        });

    });
}


exports.create_process = function (request, response) {


    var body = '';
    request.on('data', function (data) {
        body = body + data;
    });

    request.on('end', function () {
        var post = qs.parse(body);


        db.query(`INSERT INTO topic(title, description, created, author_id)  VALUES(?, ?, NOW(), ?)`,
            [post.title, post.description, post.author], function (error, result) {
                if (error) throw error;  //등록 처리된 아이디 값 가져오기 insertId
                response.writeHead(302, { Location: `/? id = ${result.insertId} ` });
                response.end();

            });


    });

}

 

 

 

 

 

 

 

19.Node.js 코드의 정리정돈 (topic) -3

 

소스코드

변경사항

 

main.js

var http = require('http');
var url = require('url');
var topic = require("./lib/topic");


var app = http.createServer(function (request, response) {
  var _url = request.url;
  var queryData = url.parse(_url, true).query;
  var pathname = url.parse(_url, true).pathname;
  if (pathname === '/') {
    if (queryData.id === undefined) {
      topic.home(request, response);
    } else {
      topic.page(request, response);
    }

  } else if (pathname === '/create') {
    topic.create(request, response);

  } else if (pathname === '/create_process') {
    topic.create_process(request, response);

  } else if (pathname === '/update') {
    topic.update(request, response);

  } else if (pathname === '/update_process') {
    topic.update_process(request, response);

  } else if (pathname === '/delete_process') {
    topic.delete_process(request, response);

  } else {
    response.writeHead(404);
    response.end('Not found');
  }
});
app.listen(3000);

 

lib/topic.js

var url = require('url');
var qs = require('querystring');
var template = require('./template.js');
var db = require("./db");

exports.home = function (request, response) {

    db.query("SELECT * FROM topic", function (error, topics) {
        var title = 'Welcome';
        var description = 'Hello, Node.js';
        var list = template.list(topics);
        var html = template.HTML(title, list,
            `<h2>${title}</h2>${description}`,
            `<a href="/create">create</a>`
        );

        response.writeHead(200);
        response.end(html);
    });

}


exports.page = function (request, response) {

    var _url = request.url;
    var queryData = url.parse(_url, true).query;

    db.query("SELECT * FROM topic", function (error, topics) {
        if (error) throw error;

        db.query(`SELECT * FROM topic LEFT JOIN author  ON topic.author_id=author.id  WHERE topic.id=?`, [queryData.id], function (error2, topic) {
            if (error2) throw error2;

            console.log("topic : ", topic);

            var title = topic[0].title;
            var description = topic[0].description;
            var list = template.list(topics);

            var html = template.HTML(title, list,
                `<h2>${title}</h2>
            ${description}
            <p>by ${topic[0].name}</p>
            `,
                ` <a href="/create">create</a>
                <a href="/update?id=${queryData.id}">update</a>
                <form action="delete_process" method="post">
                  <input type="hidden" name="id" value="${queryData.id}">
                  <input type="submit" value="delete">
                </form>`

            );

            response.writeHead(200);
            response.end(html);
        });


    });
}



exports.create = function (request, response) {

    db.query("SELECT * FROM topic ", function (error, topics) {
        db.query("SELECT * FROM author ", function (error2, authors) {

            var title = 'create';
            var list = template.list(topics);
            var html = template.HTML(title, list, `
        <form action = "/create_process" method = "post" >
            <p><input type="text" name="title" placeholder="title"></p>
            <p>
              <textarea name="description" placeholder="description"></textarea>
            </p>
            <p>
             ${template.authorSelect(authors)}
            </p>
            <p>
              <input type="submit">
            </p>
          </form >
  `, '');
            response.writeHead(200);
            response.end(html);

        });

    });
}


exports.create_process = function (request, response) {
    var body = '';
    request.on('data', function (data) {
        body = body + data;
    });

    request.on('end', function () {
        var post = qs.parse(body);
        db.query(`INSERT INTO topic(title, description, created, author_id)  VALUES(?, ?, NOW(), ?)`,
            [post.title, post.description, post.author], function (error, result) {
                if (error) throw error;  //등록 처리된 아이디 값 가져오기 insertId
                response.writeHead(302, { Location: `/? id = ${result.insertId} ` });
                response.end();

            });
    });
}

exports.update = function (request, response) {
    var _url = request.url;
    var queryData = url.parse(_url, true).query;
    db.query("select * from topic", function (erro, topics) {
        if (erro) throw erro;

        db.query(`SELECT * FROM topic WHERE id =? `, [queryData.id], function (error2, topic) {
            db.query("SELECT * FROM author ", function (error2, authors) {
                if (error2) throw error2;
                var list = template.list(topics);
                var html = template.HTML(topic[0].title, list,
                    `
        <form action = "/update_process" method = "post" >
          <input type="hidden" name="id" value="${topic[0].id}">
            <p><input type="text" name="title" placeholder="title" value="${topic[0].title}"></p>
            <p>
              <textarea name="description" placeholder="description">${topic[0].description}</textarea>
            </p>
           <p>
             ${template.authorSelect(authors, topic[0].author_id)}
            </p>
            <p>
              <input type="submit">
            </p>
          </form>
      `,
                    `<a href = "/create" > create</a > <a href="/update?id=${topic[0].id}">update</a>`
                );
                response.writeHead(200);
                response.end(html);
            });
        });

    });
}


exports.update_process = function (request, response) {
    var body = '';
    request.on('data', function (data) {
        body = body + data;
    });
    request.on('end', function () {
        var post = qs.parse(body);


        db.query(`UPDATE topic SET title =?, description =?, author_id =? WHERE id =? `,
            [post.title, post.description, post.author, post.id], function (error, result) {
                if (error) throw error;
                response.writeHead(302, { Location: `/? id = ${post.id} ` });
                response.end();
            });



    });
}

exports.delete_process = function (request, response) {
    var body = '';
    request.on('data', function (data) {
        body = body + data;
    });
    request.on('end', function () {
        var post = qs.parse(body);
        db.query("delete from topic where id=?", [post.id], function (error, result) {
            if (error) throw error;
            response.writeHead(302, { Location: `/ ` });
            response.end();
        });

    });
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

about author

PHRASE

Level 60  라이트

굶주리는 자는 어떤 음식이라도 기꺼이 먹게 되고 목마른 자는 어떤 마실 것이라도 기꺼지 마신다. 백성은 난세(亂世) 후에는 평화를 바라고 있으니 정치는 오히려 하기가 쉬운 것이다. 당 태종(唐 太宗) 때 위징(魏徵)이 한 말. -십팔사략

댓글 ( 4)

댓글 남기기

작성