
config 내부에는 mariadb / mongodb 설정파일을 넣으면된다.
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창에 테이블이 동기화되었다고 확인할수있다.

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처럼 작성한다.
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에 추가해주면 된다.
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을 통해서 원하는 경로를 작성하고 원하는 부분을 추출하도록 구조하면 된다.