Node.js & Express.js 정리 (서버생성, DB 연동까지)

jh_leitmotif·2021년 6월 16일
2
post-thumbnail

🧐 Node.js

JavaScript의 프레임워크.

브라우저 뿐이었던 자바스크립트의 런타임 환경이 이 프레임워크가 출현함으로서 해소되었으며 개발자들이 자주 쓰는 환경 중 하나입니다.

	     Stack overflow의 2019년도 설문조사 이미지입니다.

위의 결과가 실질적인 순위를 대변하는 것은 아니지만, 충분히 인기 있는 프레임워크임을 뜻합니다.

다만

'Node.js®는 Chrome V8 JavaScript 엔진으로 빌드된 JavaScript 런타임입니다'

라며 소개가 되고 있듯이, Node.js라는 것은 JavaScript가 작동될 수 있도록 돕는 환경일 뿐입니다.

그러므로 직접 개발자가 서버를 생성해주어야 합니다.

Node의 특징

  1. 단일 쓰레드 모델, Non Blocking I/O
    • Node는 여러가지 작업 요청을 받았을 때 비동기적으로 진행합니다. 예를 들어 A, B라는 순서로 작업이 있다고 했을 때 A가 끝나는 것을 기다리지 않고 B의 작업을 진행시킵니다.
  1. JavaScript
    • 작성 언어가 JavaScript인 덕분에 접근성이 좋습니다.
    • 클라이언트와 서버에서의 언어가 동일합니다.
  1. Event-Driven
    • 사용자가 이벤트를 발생시켰을 때만 작동하는 방식입니다.
    • 자원을 효율적으로 사용할 수 있습니다.
  1. 가볍다
    • 개발이 빠르고 쉽습니다.
    • 입출력이 여러번 발생하는 웹 서비스에 좋습니다.
  1. 다양한 npm 패키지

위와 같은 특성을 고려하면 실시간 처리가 많은 서비스에 유용합니다.
그러므로 반대로, 한 번에 많은 부하가 생기는 작업에는 비효율적입니다.

🧐 Express.js

Express는 Node.js라는 환경에서 웹 어플리케이션을 개발할 수 있도록 하는 프레임워크입니다.

HTTP, Connect 컴포넌트를 기반으로 둡니다. 서버를 만들고, 데이터베이스와 연결하고 어플리케이션을 구동하는 등의 작업을 진행하도록 돕습니다.


🧐 서버 생성 및 DB 연동

📂 Create server

const express = require('express');
const app = express();
const port = 5000;

app.get('/',(req,res)=>res.send('Server Start'));

app.listen(port, ()=>console.log(`Server Start. Port : ${port}`))

/// index.js

위 예제는 간단히 만든 서버 예제입니다.

Express 프레임워크를 불러온 뒤, 5000번 포트를 통해 서버를 열었습니다.

📂 Database connection

강의에서는 MongoDB를 사용한다고 되어있었지만

너무 강의 내용으로만 가면 안된다고 생각하기도 했고,
RDBMS가 아직까진 익숙하다 싶어 MySQL과 연동해보았습니다.

const mysql = require('mysql'); 

module.exports = function () {
    return {
      init: function () {
        return mysql.createConnection({
          host: 'localhost',
          port: '3306',
          user: 'root',
          password: '',
          database: 'TEST_DB'
        })
      },
      
      db_open: function (con) {
        con.connect(function (err) {
          if (err) {
            console.error('mysql connection error :' + err);
          } else {
            console.info('mysql is connected successfully.');
          }
        })
      }
    }
  };
  
/// database.js

index.js 에 한 번에 작성하면 복잡할 것 같아 따로 분리하였습니다.

  • password는 설정되어 있는 상태입니다. 보안을 위해 지웠습니다.
const mysql = require('./database')();

const connection = mysql.init();

mysql.db_open(connection);

connection.query('SELECT * FROM  USERS', 
function (error, results, fields){
    if (error){
        console.log(error);
    }
    console.log(results);
});

실행이 잘 되는지 확인하기 위해 위 코드를 index.js에 삽입합니다.

위와 같이 제가 미리 넣어둔 데이터가 잘 조회되었습니다.


😡 DB 연동 중 발생한 오류

code: 'ER_NOT_SUPPORTED_AUTH_MODE',
errno: 1251,
sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client',
sqlState: '08004',
fatal: true

해석해보기 귀찮아 구글링해보니 다음과 같은 답변을 얻을 수 있었습니다.

상기 링크의 댓글에서 해결책을 찾을 수 있었습니다.

MySQL Installer에서 MySQL Server reconfigure 기능의 Authentication 설정을 Legacy로 변경하여 해결되었습니다.

8버전에 대해 발생하는 오류인 것 같은데, 우선 학습을 위해 이 방식을 사용하지만 결국 최신버전을 지속적으로 사용할 것을 고려하여 이후에 다른 방식을 생각해야 할 것 같습니다.

여담으로 connection.query에 에러를 확인할 수 있도록 해둔 덕분에 빠르게 해결할 수 있었고, 예외 처리의 중요성을 다시금 깨닫습니다.


거의 모든 것들이 이미 공개된 것들이 많습니다.

단순히 index.js에 바로 connection하도록 할 수 있긴 하지만

모듈화를 실천하기 위해 따로 작성하는 쪽으로 진행했습니다.

코드에 비밀번호가 하드코딩되어 있는 것이 내내 불편했는데, 우선 목표인 로그인 구현을 해두고 어떻게 할지 스스로 생각할 예정입니다.

profile
Define the undefined.

0개의 댓글