이 블로그는 Web 환경을 이용한 원격 제어 기술에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Raspberry Pi와 Raspberry Pi Pico, ATmega128 보드, Arduino Mega 보드(ATmega2560), WiFi 모듈을 사용 합니다.

mysql-node-js

MySQL - Node.js
MySQL(MariaDB) - Node.js


  • Node.js에서 SQL 사용하기
    • 이 페이지를 이해하는데 필요한 Node.js에 대한 기본 지식과 Node.js를 이용한 Raspberry Pi Webserver에 대한 자료는 "Raspberry Pi 보오드와 node.js를 이용한 원격 제어 " 페이지를 참고하기 바랍니다.

      이 페이지에서는 별도의 설명이 없는 경우 "MySQL(MariaDB) - phpMyAdmin - Database 관리" 페이지에서 만든 choSampleDB1을 사용하여 설명한다.

    • Node.js에서 MySQL(MariaDB) 데이터베이스에 연결하기
      • MySQL(MariaDB)을 사용하기위한 Node.js 드라이버 설치하기
      • Node.js 프로그램에서 MySQL(MariaDB) 데이터베이스 연결하기
      • Node.js 프로그램과 Web 페이지 작성을 위한 폴더 예는 "Node.js를 이용한 Raspberry Pi Webserver" 페이지를 참고 바람.

          아래 프로그램은 Node.js 프로그램에서 MySQL(MariaDB) 데이터베이스에 연결하는 프로그램 예이다.

          
          // Mysql module을 import 한다.
          let mysql = require('mysql');
          // createConnection() Method를 이용하여 Database 연결을 생성한다.
          let connection = mysql.createConnection({
              host: 'localhost',
              // MariaDB는 보안을 위하여 root 이용자는 인터넷 환경에서 연결할 수 없기
              // 때문에 별도 사용자(username)를 만들어 접속하여야 한다.
              user: 'username',
              password: '****',
              database: 'choSampleDB1'
          });
          // connect() Method를 사용하여 Database에 연결한다.
          connection.connect(function(err) {
            if (err) {
              return console.error('error: ' + err.message);
            }
            // 성공적으로 접속된 경우 Console에 아래 메세지가 출력된다.
            console.log('Connected to the MySQL server.');
          });
          
          // end() Method를 사용하여 Database에 연결을 종료한다.
          // end() Method는 연결이 종료되기 전에 남아있는 모든 쿼리가 항상 실행되도록 한다.
          // 연결을 즉시 강제로 종료하려면 destroy() 메소드를 사용한다.
          connection.end(function(err) {
            if (err) {
              return console.log('error:' + err.message);
            }
            // 성공적으로 종료된 경우 Console에 아래 메세지가 출력된다.
            console.log('Close the database connection.');
          });
                  

    • Node.js에서 SQL를 사용하는 예
    • Node.js는 SQL를 사용하여 데이터베이스를 관리(자료의 검색과 관리 등)한다. SQL에 대하여는 "MySQL(MariaDB) - Basic - SQL"에서 설명하였기 때문에 여기서는 Node.js에서 데이터베이스에 연결하여 SELECT 문을 사용하는 예만 설명한다.

      아래 프로그램은 choSampleDB1 데이터베이스에 연결하여 productsTable의 내용을 출력(SELECT 문을 사용)하는 프로그램 예이다.

      • 자주 사용하는 프로그램 모듈을 외부 모듈로 분리하기
      • 데이터베이스 연결에 필요한 정보와 같이 자주 반복적으로 사용되는 프로그램 모듈은 아래 예와 같이 별도 모듈로 작성하여 사용하는 것이 편리하다.

        별도 모듈로 작성된 config.js 예

        
        let config = {
          host    : 'localhost',
          user    : 'username',
          password: '****',
          database: 'choSampleDB1'
        };
        
        module.exports = config;
                

        productsTable의 내용을 출력(SELECT 문을 사용)하는 프로그램 예

        
        let mysql = require('mysql');
        let config = require('./config.js');
        
        let connection = mysql.createConnection(config);
        
        let sql = `SELECT * FROM productsTable`;
        // productsTable의 내용이 results에 Return 된다.
        connection.query(sql, (error, results, fields) => {
          if (error) {
            return console.error(error.message);
          }
        // productsTable(results)을 Console에 출력한다.
          console.log(results);
        });
        
        // end() Method를 사용하여 Database에 연결을 종료한다.
        connection.end(function(err) {
          if (err) {
            return console.log('error:' + err.message);
          }
          console.log('Close the database connection.');
        });
                

        Query의 실행 결과는 RowDataPacket Object의 Array로 results에 Return 된다.

      • Query의 실행 결과(results) 사용하기
        • Object index를 사용하기: 아래와 같이 Index를 사용하면 첫번째(0번째) 열의 productCode가 Consol에 출력된다.
        • console.log(results[0].productCode);

        • JSON.stringify()를 사용하여 JSON 문자열로 변환한 다음 다시 JavaScript Object로 변환하여 사용하기.
        • let resultsJson = JSON.stringify(results); // JSON 문자열로 변환

          let resultsObjJS = JSON.parse(resultsJson); // JavaScript Object로 변환

          console.log('resultsObjJS[0]: ', resultsObjJS[0]); // 첫번째(0번째) 열이 출력된다.


  • Node.js Web 페이지와 MySQL(MariaDB)
    • Node.js 웹서버와 MySQL(MariaDB)을 사용하여 웹 브라우저에서 데이터베이스를 관리하는 예이다.

      웹서버와 MySQL(MariaDB)을 사용하여 웹 브라우저에서 데이터베이스를 관리하는 시스템 구성도

      설명을 위하여 이 페이지에서는 choSampleDB1 테이터베이스를 사용한다.

      Web 환경에서 데이터베이스를 관리하는 예를 설명하기 위하여 이 페이지에서는 고객관리, 제품관리, 제품주문 기능을 포함하고 있는 Web server(salesManagement.js) 프로그램과 각각의 기능을 실행하는 Web page(customersTable.htm, productsTable.htm, order.htm)를 작성하였다.

    • 고객정보 입력 웹 페이지
      • 고객정보 입력 웹 페이지 예

      • 아래 예는 고객 명단(customersTable)을 관리하기 위한 Web page 예 이다.
      • customersTable을 관리하기 위한 Web page 예: customersTable.htm

      • 아래 예는 고객 명단(customersTable)을 관리하기 위한 Web server 예 이다. 이해하기 쉽게하기 위하여 salesManagement.js에서 customersTable 관련 부분만 분리하였다.
      • customersTable을 관리하기 위한 Web server 예: customersTable.js

        참고: 디렉토리 계층 구조를 /node-web/html/ 과 같이 작성하여 node-web 디렉토리에는 .js 파일을 저장하고 html 디렉토리에는 .htm 파일을 저장하여야 한다.

      • 실험하기:
        • 아래 예의 명령으로 웹 서버 프로그램(customersTable.js)을 실행한다.
        • node customersTable.js

        • 아래 예와 같이 chrome web browser를 이용 하여 Web server에 연결하면 customersTable.htm Page가 열린다.
        • http://[RaspberryPi_IP]:2880/

        • 이 폐이지에서 현재 등록되어있는 전화번호를 입력하고 "고객정보 읽기"를 실행하면 데이터베이스에서 고객정보를 자동으로 검색하여 고객정보가 표시된다.
        • 새 고객정보를 입력하고 "고객정보 입력"을 실행하면 새 고객정보가 등록(customersTable에 삽입)된다.
        • 현재 등록되어있는 전화번호를 입력하고 "고객정보 읽기"를 실행하여 데이터베이스에서 고객정보를 자동으로 검색한 다음, 변경이 필요한 데이터를 변경(전화번호는 변경 할 수 없음)하고 "고객정보 갱신"을 실행하면 고객정보가 갱신된다.
        • phpMyAdmin을 이용하여 choSampleDB1 테이터베이스의 내용을 확인한다.
    • 제품정보 입력 웹 페이지
      • 제품정보 입력 웹 페이지 예

      • 아래 예는 제품정보(productsTable)를 관리하기 위한 Web page 예 이다.
      • productsTable을 관리하기 위한 Web page 예: productsTable.htm

      • 아래 예는 고객 명단(customersTable), 제품정보(productsTable), 제품주문(ordersTable, orderdetailsTable)을 관리하기 위한 Web server 예 이다. 이 Web server는 이 예의 전체 Web page를 지원하는 Server로 아래 제품주문을 위한 웹 페이지까지 통합하여 지원한다.
      • customersTable을 관리하기 위한 Web server 예: salesManagement.js

      • 실험하기:
        • 아래 예의 명령으로 웹 서버 프로그램(salesManagement.js)을 실행한다.
        • node salesManagement.js

        • 아래 예와 같이 chrome web browser를 이용 하여 Web server에 연결하면 customersTable.htm Page가 열린다. 이 페이지에서 "제품목록 관리하기" 버튼을 클릭하면 제품정보를 관리하기 위한 웹 페이지가 열린다.
        • http://[RaspberryPi_IP]:2880/

        • 이 폐이지에서 현재 등록되어있는 제품코드를 입력하고 "제품정보 읽기"를 실행하면 데이터베이스에서 제품정보를 자동으로 검색하여 제품 정보가 표시된다.
        • 새 제품정보를 입력하고 "새 제품정보 입력"을 실행하면 새 제품정보가 등록(productsTable에 삽입)된다.
        • 현재 등록되어있는 제품코드를 입력하고 "제품정보 읽기"를 실행하여 데이터베이스에서 제품정보를 자동으로 검색한 다음 변경이 필요한 데이터를 변경(제품코드는 변경 할 수 없음)하고 "제품정보 갱신"을 실행하면 제품정보가 갱신된다.
        • phpMyAdmin을 이용하여 choSampleDB1 테이터베이스의 내용을 확인한다.
    • 제품주문을 위한 웹 페이지
      • 제품주문을 위한 웹 페이지 예

      • 아래 예는 제품주문(ordersTable, orderdetailsTable)을 위한 Web page 예 이다.
      • 제품주문을 위한 Web page 예: order.htm

      • 제품주문을 위한 Web Server는 위 제품정보 입력 웹 Server에 통합되어있다.
      • 실험하기:
        • 아래 예의 명령으로 웹 서버 프로그램(salesManagement.js)을 실행한다.
        • node salesManagement.js

        • 아래 예와 같이 chrome web browser를 이용 하여 Web server에 연결하면 customersTable-py.htm Page가 열린다. 이 페이지에서 "제품 구매하기" 버튼을 클릭하면 제품주문을 위한 웹 페이지가 열린다.
        • http://[RaspberryPi_IP]:2880/

        • 이 폐이지에서 전화번호를 입력하면 데이터베이스에서 고객정보를 자동으로 검색하여 고객 정보가 표시된다.
        • 제품명 리스트 박스에서 제품을 선택하면 제품정보(제품코드, 판매가) 가 자동으로 갱신된다.
        • 주무수량을 입력하면 가격 총계가 자동으로 갱신된다.
        • 주문 내용을 확인하고 "주문하기" 버튼을 클릭하면 주문이 완료된다.
        • phpMyAdmin을 이용하여 choSampleDB1 테이터베이스의 내용을 확인한다.