될때까지

((기업협업2)) node.js 초기 세팅 + mysql연동 + CRUD 중 Create만 본문

프로젝트/wecode : 기업협업

((기업협업2)) node.js 초기 세팅 + mysql연동 + CRUD 중 Create만

랖니 2022. 8. 18. 12:00
728x90

프로젝트 시작할 경로 생성 및 이동

mkdir node-example
cd node-example

 package.json만들기

-> 뒤에 y는 yes로 default값으로 package.json을 만들겠단 이야기

npm init -y

vscode로 열어보면 package.json이 생성됐다

package.json

보면  main에 index.js이 기록되어있는데, node.js 프로젝트의 메인 코드 파일명이 index.js라는 이야기다.

나는 index.js이 현재 존재하지 않으니까 생성해주자.

그다음 프로젝트를 실행하기 위해 필요한 패키지들을 설치하자.

npm install mysql2 express fs cors path --save
npm install -D nodemon

그럼 아래와 같이 package.json에 추가가 되는데 -D를 적어주면 개발디펜던시에 추가가 된다.

nodemon은 서버를 껐다 키지 않아도 자동으로 소스변경사항을 반영해서 서버 재시작해주는 아이라서 -D로 설치했다.

  • -mysql를 썼더니 자꾸 에러가 나서 mysql2로 설치함
  • -express는 nodejs의 프레임워크
  • -fs는 아직 모름
  • -cors는 모름
  • -path도 모름
{
  "name": "example4",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "cors": "^2.8.5",
    "express": "^4.18.1",
    "fs": "^0.0.1-security",
    "mysql2": "^2.3.3",
    "path": "^0.12.7"
  },
  "devDependencies": {
    "nodemon": "^2.0.19"
  }
}

다음 package.json안의 scripts는 npm 명령어 단축키?같은 느낌이다.

나는 npm start명령어로 nodemon을 사용해서 index.js를 실행시킬거기에 아래와 같이 적어줬다.

  "scripts": {
    "start": "nodemon index.js",
    "test": "echo \"Error: no test specified\" && exit 1"
  },

그럼 이제 npm start를 입력하면 index.js를 실행하게되는데 아직 index.js에 아무 내용도 없다. 서버를 구동시키기 위한 코드를 작성해주자.

// index.js

const express = require("express");     // 설치한 express를 불러와 변수에 담음
const cors    = require("cors");
const fs      = require("fs");
const path    = require("path");

const app = express();      // express실행해서 app에 담기

app.use(express.json());
app.use(express.urlencoded({extended:true}));
app.use(cors());

// app.get은 서버에 get요청이 있는 경우 실행됨
// localhost:4000/으로 get요청을 받으면 HELLO NODE를 보여줘라
app.get('/', (req,res) => {
    res.send('HELLO NODE')
})

const port = 4000;             // 사용할 포트 번호
// app.listen는 서버가 실행되는 경우 실행됨
app.listen(port, () => {      
    console.log('서버켜짐');
})

 

클라이언트로부터 받은 http 요청 메시지 형식에서 body를 파싱하기 위해서 옛날에는 body-parser를 썼는데, 지금은 express에 포함이 되있다고 한다. 

  • express.urlencoded() 미들웨어는 x-www-form-urlencoded형태의 데이터를 해석한다.
    • extended:false는 node에 기본 내장된 querystring모듈을 사용한다.
    • extended:true는 qs모듈을 사용한다(추천)
  • express.json() 미들웨어는 JSON형태의 데이터를 해석한다.

그래서 포스트맨으로 테스트할때 x-www-form-urlencoded로 보내야 테스트가 제대로 됐나보다...!

 

* 개념정립미완 => app.use() / app.get() / app.listen()의 차이점 정리하기

- app.use() : 미들웨어 사용

- app.get() : 주소 라우팅

- app.listen() : 서버 가동

으로 이해했다

 

index.js도 작성했으면 이제 서버를 구동시켜보자. package.json에서 start에 대한 실행어를 정의해줬으므로 터미널에서 npm start로 서버 구동이 가능하다.

node로 서버키기

그리고 localhost4000번포트의 /로 들어가보면

내가 작성한 헬로 노드가 제대로 보인다.

 

이제 mysql과 연동을 해보자. 우선 mysql접속을 위한 데이터들은 민감한 정보들이 담겨있기 때문에 dotenv를 사용해서 민감한 정보들을 숨겨주자. dotenv는 환경변수(OS입장에서 해당 프로세스를 실행시키기 위해 참조하는 변수)를 .env파일에 저장해서 process.env로 사용할 수 있게 해주는 패키지다. dotenv 설치하기

npm install dotenv

그리고 .env파일을 만들고 정보들을 적어준다. sql에서 만든 데이터베이스 정보를 적어주면 된다. 

이제 작성한 .env파일을 사용할 파일을 생성하자. config > mysql.js로 생성하겠다.

const dotenv = require("dotenv");     // dotenv 부르기
const mysql  = require("mysql2/promise");   // promise를 적용할 수 있게 mysql2 패키지를 설치했다. mysql2만 호출하면 프로미스 기능 사용 불가함

dotenv.config();    // 현재 디렉토리의 .env파일을 가져올 수 있게끔 세팅

const dbConfig = {
    host    : process.env.DB_HOST,      // .env에 저장된 변수들을 부를 때는 process.env.변수이름
    user    : process.env.DB_USER,
    database: process.env.DB_NAME,
    port    : process.env.DB_PORT,
    password: process.env.DB_PASSWORD
}

const connection = mysql.createPool(dbConfig);    // createPool함수로 pool 생성

module.exports = connection;     // 밖에서 가져다 쓸 수 있게 connection을 내보내준다.

 

* 미확립된 개념 :  createpool?????? 

->createPool은 db(mysql) 접근이 다 끝났을 때 연결을 끊지 않고 열어둠으로써 이전의 연결을 재사용한다. 그래서 MYSQL서버에 연결하는 시간을 줄여주는게 효과적이라고 한다. 대충 좋은 거 같음

*오 ㅐmysql2를 사용하는지?

 

여기까지하면 내 mysql과 연동이 끝났다. 아직 노드를 사용해서 DB 컬럼값을 생성하는 방법은 공부중이다.. 일단 mysql workbench에서테스트 테이블을 생성하고 CRUD중 C부터 도전해보자.

nodetest db에 users라는 테이블을 만들었고 컬럼을 생성한 뒤에 user 정보들을 넣었다.

내가 현재 하고 싶은 건, post메소드로 localhost:4000/users로 들어오면 user 객체를 생성하고 싶다. 그러기 위해서는 경로를 열어주는 라우터가 필요하고 기능을 담당할 컨트롤러가 필요하다. 먼저 라우터부터 작업하자

1차 url을 index.js에서 열어준다.

// index.js

const express = require("express");     // 설치한 express를 불러와 변수에 담음
const cors    = require("cors");
const fs      = require("fs");
const path    = require("path");

const app = express();      // express실행해서 app에 담기

app.use(express.json());
app.use(express.urlencoded({extended:true}));
app.use(cors());

// app.get은 서버에 get요청이 있는 경우 실행됨
// localhost:4000/으로 get요청을 받으면 HELLO NODE를 보여줘라
app.get('/', (req,res) => {
    res.send('HELLO NODE')
})

// ***** 추가된 코드
// localhost:4000/users로 들어오면 routes폴더의 userRouter로 보내겠다
app.use('/users', require('./routes/userRouter'))


const port = 4000;             // 사용할 포트 번호
// app.listen는 서버가 실행되는 경우 실행됨
app.listen(port, () => {      
    console.log('서버켜짐');
})

/users로 들어오면 routes의 userRouter로 보내고있는데 아직 해당 파일이 없으니 생성해주자.

//routes > userRouter.js

const router = require("express").Router();
const db     = require("../config/mysql");

router.post("/", async(req, res, next) => {
    try {
        const sql = 
        `
        insert into users (user_id, name, age) values (${req.body.user_id}, '${req.body.name}', ${req.body.age});
        `
        await db.query(sql)
        return res.status(200).json({message:"success"});
    } catch(e) {
        console.log(e.message);
    }
});

module.exports = router;

근데 라우터에서 쿼리도 작성하는데 이게 맞나...? 분리해야할것같은데 일단 넘어가고

 

npm start를 입력하고 테스트하기 위해 postman으로 post요청을 보냈는데 에러가 발생했다.

어제는 mac@였는데 오늘은 root@로 뜬 에러

.env파일에서 내가 작성한 정보가 mysql 접속 정보와 일치하는 지 다시 확인해봤다. 비밀번호를 잘못 입력했었음..!! ^^ 다시 수정하고 포스트맨으로 재 테스트 해보니까 

success가 뜨고, DB에서 보면

생성한 6번 user가 잘 들어간 걸 볼 수 있다!

 

 

참고자료

 

https://www.a-mean-blog.com/ko/blog/Node-JS-%EC%B2%AB%EA%B1%B8%EC%9D%8C/Hello-World/Express%EB%A1%9C-%EC%84%9C%EB%B2%84-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0

https://kirkim.github.io/javascript/2021/10/16/body_parser.html

 

[NodeJs] express.json()과 express.urlencoded()의 차이점 알아보기

1️⃣ 사용이유 (1) .json()과 .urlencoded()를 사용하지 않을 때

kirkim.github.io

https://velog.io/@reveloper-1311/DB-Node.js%EC%97%90%EC%84%9C-%ED%99%98%EA%B2%BD%EB%B3%80%EC%88%98-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0dotenv

 

[DB] 환경변수 사용하기 1 - dotenv

프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들의 모임 위키피디아환경변수는 OS입장에서 해당 프로세스를 실행시키기 위하여 참조하는 변수이다.우리가 컴퓨터로 하는 모

velog.io

https://webaura.tistory.com/entry/NodeJS-Mysql-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0-Mysql-createPool

 

[NodeJS] Mysql 연결하기 [Mysql createPool]

Mysql 모듈 설치 아래 명령어를 통해 mysql 을 설치해줍니다. yarn add mysql   Mysql 모듈 사용하기 설치를 하셨다면, 새로운 js 파일을 만들어 require 시켜줍니다. // pool.js const mysql = require('mysql'..

webaura.tistory.com

https://holywater-jeong.github.io/2018/06/08/node-mysql-async-await

 

Node.js에서 mysql을 async/await으로 작성하기

Node.js로 코드를 작성하다보면 분명히 한 번 이상은 겪게 되는 비동기 코드 문제. 일명 Callback Hell이라고 불리우는 코드 구조를 본다면 진짜 지옥의 구렁텅이로 빠져드는 것만 같다. 다행히도 여

holywater-jeong.github.io

https://github.com/sidorares/node-mysql2#using-promise-wrapper

 

GitHub - sidorares/node-mysql2: fast mysqljs/mysql compatible mysql driver for node.js

:zap: fast mysqljs/mysql compatible mysql driver for node.js - GitHub - sidorares/node-mysql2: fast mysqljs/mysql compatible mysql driver for node.js

github.com

https://brownbears.tistory.com/289

 

728x90