node.js database 연결

이동언·2025년 1월 20일

1. 현재 폴더 구조

config 내부에는 mariadb / mongodb 설정파일을 넣으면된다.

2. db.js

import {Sequelize} from "sequelize";

// MariaDB 연결 설정
const sequelize = new Sequelize('gooinprodb', 'gooinprodbuser', 'gooinprodbuser', {
    host: 'localhost',
    port: 13307,
    dialect: 'mariadb',
});

// 연결 테스트
sequelize.authenticate()
    .then(() => {
        console.log('MariaDB에 연결되었습니다.');
    })
    .catch((err) => {
        console.error('데이터베이스 연결 오류:', err);
    });

// 테이블 동기화 (없으면 생성)
sequelize.sync()
    .then(() => {
        console.log('테이블이 동기화되었습니다.');
    })
    .catch((err) => {
        console.error('테이블 동기화 실패:', err);
    });

// 연결 객체와 모델을 다른 파일에서 사용할 수 있도록 export
export { sequelize };

Sequelize는 node.js 환경에서 ORM을 제공하는 라이브러리로 java의 jpa와 비슷한 개념으로 사용된다.

db 연결이 성공하면 터미널 console창에 테이블이 동기화되었다고 확인할수있다.

3. models

models는 spring boot의 domain(entity)와 비슷한 개념으로

import {sequelize} from "../config/db.js";
import {DataTypes} from "sequelize";

//고용인
const Employer = sequelize.define('Employer', {

    eno: {  //pk
        type: DataTypes.BIGINT,
        allowNull: false,
        primaryKey: true,
        autoIncrement: true
    },
    eemail: {   //Employer Email
        type: DataTypes.STRING,
        allowNull: false
    },
    epw: {  //Employer Password
        type: DataTypes.STRING,
        allowNull: false
    },
    ename: {    //Employer Name
        type: DataTypes.STRING,
        allowNull: false
    },
    ebirth: {   //생일
        type: DataTypes.DATE,
        allowNull: true
    },
    egender: {  //성별(true: 남자, false: 여자)
        type: DataTypes.BOOLEAN,
        allowNull: true
    },
    edelete: {  //soft delete flag
        type: DataTypes.BOOLEAN,
        allowNull: false,
        defaultValue: false
    },
    eregdate: { //등록 시간
        type: DataTypes.DATE,
        allowNull: false,
        defaultValue: DataTypes.NOW
    }
}, {
    tableName: 'tbl_employer',  // 실제 테이블 이름을 지정
    timestamps: false            // Sequelize가 자동으로 생성하는 createdAt, updatedAt을 사용하지 않으면 false로 설정
});

export default Employer;

employer(고용인)테이블로 예시들었을때 db 테이블에 들어가는 컬럼요소들을 entity처럼 작성한다.

4. index.js

import Employer from './Employer.js';
import PartTimer from './PartTimer.js';
import WorkLogs from './WorkLogs.js';
import Review from "./Review.js";
import PartTimerDocumentImage from "./PartTimerDocumentImage.js";
import WorkPlace from "./WorkPlace.js";
import Complaints from "./Complaints.js";
import ComplaintsImage from "./ComplaintsImage.js";
import PartTimerImage from "./PartTimerImage.js";
import Qna from "./Qna.js";
import Faq from "./Faq.js";
import EChatroom from "./EChatroom.js";
import JobPostings from './JobPostings.js';
import JobMatchings from './JobMatchings.js';
import JobPostingApplication from "./JobPostingApplication.js";
import JobPostingImage from './JobPostingImage.js';

// 관계 정의

//Employer
Employer.hasMany(WorkLogs, { foreignKey: 'eno' });
Employer.hasMany(Review, { foreignKey: 'eno' });
Employer.hasMany(WorkPlace, { foreignKey: 'eno' });
Employer.hasMany(Complaints, { foreignKey: 'eno' });

//PartTImer
PartTimer.hasMany(WorkLogs, { foreignKey: 'pno' });
PartTimer.hasMany(Review, { foreignKey: 'pno' });
PartTimer.hasMany(PartTimerDocumentImage, { foreignKey: 'pno' });
PartTimer.hasMany(Complaints, { foreignKey: 'pno' });
PartTimer.hasMany(PartTimerImage, { foreignKey: 'pno' });

//WorkLogs
WorkLogs.belongsTo(Employer, { foreignKey: 'eno' });
WorkLogs.belongsTo(PartTimer, { foreignKey: 'pno' });

//Review
Review.belongsTo(Employer, { foreignKey: 'eno' });
Review.belongsTo(PartTimer, { foreignKey: 'pno' });

//PartTimerDocumentImage
PartTimerDocumentImage.belongsTo(PartTimer, { foreignKey: 'pno' });

//WorkPlace
WorkPlace.belongsTo(Employer, { foreignKey: 'eno' });

// JobPostings
JobPostings.belongsTo(Employer, { foreignKey: 'eno' });
JobPostings.hasMany(JobMatchings, { foreignKey: 'jpno' });

// JobMatchings
JobMatchings.belongsTo(JobPostings, { foreignKey: 'jpno' });
JobMatchings.belongsTo(PartTimer, { foreignKey: 'ptno' });

// JobPostingApplication
JobPostingApplication.belongsTo(JobPostings, { foreignKey: 'jpno' });
JobPostingApplication.belongsTo(PartTimer, { foreignKey: 'ptno' });

// JobPostingImage
JobPostingImage.belongsTo(JobPostings, { foreignKey: 'jpno' });
JobPostingImage.belongsTo(Employer, { foreignKey: 'eno' });

//Complaints
Complaints.hasMany(ComplaintsImage, { foreignKey: 'cno' });
Complaints.belongsTo(Employer, { foreignKey: 'eno' });
Complaints.belongsTo(PartTimer, { foreignKey: 'pno' });

//ComplaintsImage
ComplaintsImage.belongsTo(Complaints, { foreignKey: 'cno' });

//partTimerImage
PartTimerImage.belongsTo(PartTimer, { foreignKey: 'pno' });

//QNA
Qna.belongsTo(Employer, { foreignKey: 'eno' });
Qna.belongsTo(PartTimer, { foreignKey: 'pno' });


const models = {
    Employer,
    PartTimer,
    WorkLogs,
    Review,
    PartTimerDocumentImage,
    WorkPlace,
    JobPostings,
    JobMatchings,
    JobPostingApplication,
    JobPostingImage,
    Qna,
    Faq,
    EChatroom,
    Complaints,
    ComplaintsImage,
    PartTimerImage,
}

export default models;

index.js 는 fk를 설정이 가능하다.

만약 Employer의 pno값을 review테이블에서 manyToOne으로 사용하려면

Employer.hasMany(Review, { foreignKey: 'eno' });
Review.belongsTo(Employer, { foreignKey: 'eno' });

이렇게 짝을 맞춰서 작성해주고, models에 추가해주면 된다.

5. server.js

import express from 'express';
import models from './models/index.js';

const { Employer, Faq } = models;

const app = express();
const PORT = 3000;

// '/employers' 경로로 Employer 데이터 조회
app.get('/employers', async (req, res) => {
    try {
        const employers = await Employer.findAll();
        res.json(employers);  // 조회된 데이터를 JSON 형식으로 반환
    } catch (err) {
        console.error('Employer 조회 실패:', err);
        res.status(500).send('서버 오류');
    }
});

app.get('/', (req, res) => {
    res.send('Hello, Node.js!');
});

app.listen(PORT, () => {
    console.log(`Server is running on http://localhost:${PORT}`);
});

server.js에서는 jpa처럼 db mapper역할을 하는데, 이전의 index의 값을 사용하려면
models에 추가를 하고, app.get을 통해서 원하는 경로를 작성하고 원하는 부분을 추출하도록 구조하면 된다.

0개의 댓글