ss__jae2
타닥타닥 IT
ss__jae2
전체 방문자
오늘
어제

Github

  • 타닥타닥 IT (179)
    • 웹개발 (86)
      • JAVA (23)
      • DBMS (6)
      • HTML (9)
      • CSS (7)
      • JavaScript (12)
      • JSP (14)
      • Spring (15)
    • FrontEnd (63)
      • HTML (5)
      • CSS (12)
      • JavaScript (16)
      • React.js (14)
      • Node.js (16)
    • API (5)
    • SQLD (21)
      • SQLD (1)
      • 1과목 데이터 모델링의 이해 (11)
      • 2과목 SQL 기본 및 활용 (9)
    • CS Study (4)
      • 네트워크 (4)

공지사항

최근 댓글

최근 글

반응형
hELLO · Designed By 정상우.
ss__jae2

타닥타닥 IT

FrontEnd/Node.js

[Node] 미들웨어, Mysql DB 연결(순수 쿼리문)

2022. 12. 22. 23:02
반응형

1. 미들웨어

미들웨어란?

  • 미들웨어 함수는 req(요청) 객체, res(응답) 객체, 그리고 어플리케이션 요청-응답 사이클 도중 그 다음의 미들웨어 함수에 대한 엑세스 권한을 갖는다.
  • 즉, 미들웨어란 클라이언트에서 요청을 받고 응답을 처리하기 전 중간에 목적에 맞게 처리를 하는 함수라고 생각하면 된다.
  • 그래서 next()라는 함수가 꼭 필요하다. 미들웨어에서 처리를 하고 그 다음 실제 요청을 받는 함수로 넘어가기 위해서는 next() 함수를 사용해야 한다.
  • 예를 들어, 요청이 들어오면 각 요청마다 필요한 로그 같은 것을 응답을 처리하기 전에 중복을 방지하기 위해 미들웨어로 출력한다.(passport, oauth)

미들웨어 예시

// 미들웨어 : 요청이 와서 응답을 하기 전에 들르는 곳
// logger로 req에 reqtime을 넣어줌
// 요청이 들어오면 log를 찍게됨
const moment = require("moment");
const logger = (req, res, next) => {
  req.reqtime = moment().format("YYYY-MM-DD HH:mm:ss.sss");
  console.log(`============> [${req.reqtime}][${req.method}${req.url} call!]`);

  // 콘솔창에 색상을 변경해주는 이스케이브 문자를 추가해보자(마지막엔 원래 상태로)
  console.log(
    "\x1b[32m%s",
    `===========> [${req.reqtime}][${req.method}]${req.url} call!`,
    "\x1b[37m"
  );

  // req.query나 req.body로 데이터가 있을 때 log로 출력해줌
  req.query &&
    Object.keys(req.query).length &&
    console.log(`    ====> request query = `, req.query);
  req.body &&
    Object.keys(req.body).length &&
    console.log(`     ====> request body = `, req.body);

  // 미들웨어를 거치고 그 다음 실제 api로 호출하기 위해 반드시 있어야 됨
  next();
};

app.use(logger);

const api = require("./src/api/index");
app.use("/api", api);

const http = require("http").createServer(app);
http.listen(8080, () => {
  console.log("server listen start : 8080");
});

- 위처럼 실제 요청을 받는 파일로 가기 전에 미들웨어를 선언해준다.

- req, res, next를 매개변수를 갖고 있는 함수를 선언하는데 그 때 req에 들어있는 정보들을 console로 출력해준다.

- 어떤 방식으로, 어떤 url 요청인지 등 원하는 것을 console로 응답을 해주기 전에 출력을 해줄 수 있다.

- 그 뿐만 아니라 요청에서 넘어오는 값(query, body)이 있다면 그 값들도 console로 출력 해줄 수 있다.

- 마지막에 실제 요청을 받는 곳으로 가기 위해 next()를 해줘야 한다.

- 미들웨어를 설정했으면 app.use()를 이용해 미들웨어를 사용하면 된다.

- 그럼 요청이 들어오게 되면 미들웨어를 들러 console를 출력하고 응답을 하게 된다.

2. MySQL DB연결(순수 쿼리문)

연결 방법 및 순서

  • Mysql 모듈 설치
    - npm i mysql;
  • Mysql 모듈 설치 연동
    - const mysql = require('mysql');
  • Mysql 접속 설정 정보
    - const conn = {
          host: '127.0.0.1',
          port: '3306',
          user: 'root',
          password: '1234qwer',
          database: 'facebook'
    };
  • Mysql 모듈 기본 사용법
    // 1. DB 커넥션 생성
    let connection = mysql.createConnection(conn);

    // 2. DB 접속 시작
    connection.connect();

    // 3. DB 쿼리 작성(추가, 수정, 삭제 등)
    connection.query('쿼리문', 콜백함수);
     
    // 4. DB 접속 종료 
    connection.end();

연결 예시 및 사용

const mysql = require("mysql");

const conn = {
  host: "127.0.0.1",
  port: "3310",
  user: "root",
  password: "1234qwer",
  database: "facebook",
};

const Maria = {};

Maria["findUser"] = (params) => {
  return new Promise((resolve, reject) => {
    // 1. DB 커넥션 생성
    const connection = mysql.createConnection(conn);

    // 2. DB 접속 시작
    connection.connect();

    // 3. DB 쿼리(사용자 검색)
    const { userid, password } = params;
    const sql =
      "select * from users where " +
      `userid="${userid}" and password="${password}";`;
    console.log(sql);

    connection.query(sql, (err, results) => {
      if (err) {
        console.trace(err);
        reject();
      } else {
        // 4. DB 연결 종료
        connection.end();
        resolve(results);
      }
    });
  });
};

module.exports = Maria;

- Maria라는 모듈에 하나씩 추가해서 사용하는 것인데 findUser라는 것을 추가해서 사용

- 프로미스를 생성하고 return 하는 함수를 사용

- 먼저 위에서 DB 설정을 한 conn을 이용해 DB 커넥션을 생성하고 DB 접속을 시작한다.

- connection.query(쿼리문, 콜백함수)로 err는 에러, result 성공했을 때 결과를 받아온다.

- console로 결과를 반환하고 err이면 reject()로 반환하고 성공이면 resolve(result)로 결과를 반환한다.

- 그 다음 DB를 종료시켜준다.

// /api/login POST 데이터를 전달 받는다.
router.post("/login", async (req, res) => {
  const { userid, password } = req.body;

  const results = await mysql.findUser(req.body);
  console.log(results);

  if (results && results.length > 0) {
    res.send({ result: "success" });
  } else {
    res.send({ result: "fail" });
  }
});

- 실제 서버에서 mysql을 연결하고 설정한 것을 require을 받아 추가한 findUser를 실행시키는데 await와 async를 사용한다.

- 반환한 promise 앞에 await를 붙이고 await를 붙인 위 함수에 async를 붙여주면 된다.

- 미들웨어로 인해 위에 3줄이 출력이 되었다.

- mysql을 설정하는 파일에 있는 connection.query에서 나온 결과를 콘솔에 찍는 것과 콜백함수를 실행시키는 과정에서 콘솔에 결과를 찍는 것 두개가 콘솔에 결과로 나온다.

반응형
저작자표시 (새창열림)

'FrontEnd > Node.js' 카테고리의 다른 글

[Node] Sequelize 사용과 DB 연결, 회원가입 예시  (0) 2022.12.17
[Node] Project - Header, Home  (0) 2022.12.06
[Node] Project - Identify, DeleteUser  (0) 2022.12.03
[Node] Project - Login, Regist  (0) 2022.12.01
[Node] Project 구성  (0) 2022.12.01
    'FrontEnd/Node.js' 카테고리의 다른 글
    • [Node] Sequelize 사용과 DB 연결, 회원가입 예시
    • [Node] Project - Header, Home
    • [Node] Project - Identify, DeleteUser
    • [Node] Project - Login, Regist
    ss__jae2
    ss__jae2

    티스토리툴바