본문 바로가기

Web/Node.js & Nest.js

Node Mybatis 연결

파일 구성은 아래와 같다

 

lib/db가 데이터베이스 연결, 이외에 redis와 express-session도 연결할 예정이다

 

1. lib/db

mysql2 라이브러리를 설치해야한다.

mysql 기본 포트는 3306이다

npm install mysql2

var mysql = require('mysql2');
var db = mysql.createConnection({
    host: '',
    user: '',
    password: '',
    database: '',
    port: 3306
});

db.connect(function(err) {
    if (err) {
        console.error('데이터베이스 연결 오류:', err.stack);
        return;
    }
    console.log('데이터베이스에 연결되었습니다. 연결 ID:', db.threadId);
});

module.exports = db;

 

2. lib/express-session

express-session 라이브러리를 설치해야된다

npm install express-session

var options = {  
    host: '',
    user: '',
    password: '',
    database: '',
    port: 3306,
    
    clearExpired : true ,             // 만료된 세션 자동 확인 및 지우기 여부
    checkExpirationInterval: 10000,   // 만료된 세션이 지워지는 빈도 (milliseconds)
    expiration: 1000*60*60*2,         // 유효한 세션의 최대 기간 2시간으로 설정 (milliseconds) 
  };
  
  module.exports = options;

 

3. lib/redis

redis 라이브러리를 설치해야된다.

redis 기본 포트는 6379이다

npm install redis

var redis = require('redis');

var redisClient = redis.createClient({
   url: `redis://:비번@연결서버IP:6379`,
   legacyMode: true, // 반드시 설정 !!
});
redisClient.on('connect', () => {
   console.info('Redis connected!');
});
redisClient.on('error', (err) => {
   console.error('Redis Client Error', err);
});
redisClient.connect().then(); // redis v4 연결 (비동기)
var redisCli = redisClient.v4;

module.exports = redisCli;

 

4. server.js

const express = require('express');
const session = require('express-session');
const path = require('path');
const cors = require('cors'); 
const sessionOption = require('./lib/sessionOption');
const bodyParser = require("body-parser");
var http = require('http');
require('dotenv').config();

const corsOptions = {
    origin: process.env.FRONT_URL,
    methods: ['GET', 'POST', 'OPTIONS', 'DELETE', 'PUT'],
    allowedHeaders: ['Authorization', 'Content-Type'],
    credentials: true,
    optionsSuccessStatus: 200
};

const app = express();
const port = 3001;

// 정적 파일 제공 (React 앱)
app.use(express.static(path.join(__dirname, '/build')));

// 미들웨어
app.use(bodyParser.json({ limit: '100mb' }));
app.use(bodyParser.urlencoded({ extended: true, limit: '100mb' }));
app.use(cors(corsOptions));
app.options('*', cors(corsOptions));

// 세션 설정
const MySQLStore = require('express-mysql-session')(session);
const sessionStore = new MySQLStore(sessionOption);
app.use(session({  
    secure: false,	
    key: '쿠키 이름',
    secret: '',
    store: sessionStore,
    resave: false,
    saveUninitialized: false,
    cookie: {
        maxAge: 1000*60*60*2,
        secure: false,
        httpOnly: true,
        sameSite: 'lax',
    }
}));

app.get('/', (req, res) => {
    res.redirect(process.env.FRONT_URL);
});

// 기본 경로로 정적 파일 제공 (React 앱)
app.get('/', (req, res) => { 
    res.sendFile(path.join(__dirname, '/build/index.html'));
});

var appServer = http.createServer(app);

appServer.listen(port,() => {
    console.log(`Example app listening at http://localhost:${port}`);
});

 

위 4번 코드에 대해 설명하자면

app.use(bodyParser.json({ limit: '100mb' }));
app.use(bodyParser.urlencoded({ extended: true, limit: '100mb' }));
app.use(cors(corsOptions));
app.options('*', cors(corsOptions));

리액트와의 연동을 위해 cors 정책에 대해 설정한 것이다.

const corsOptions = {
origin: process.env.FRONT_URL,
methods: ['GET', 'POST', 'OPTIONS', 'DELETE', 'PUT'],
allowedHeaders: ['Authorization', 'Content-Type'],
credentials: true,
optionsSuccessStatus: 200
};

express-session을 사용하려면 credentials을 허용해야한다.

리눅스 배포 시 cors정책에 대한 추가적인 설정을 해야하는데, 따로 게시물을 정리해 올릴 생각이다.

 

 

참고 URL : https://sirius7.tistory.com/101