나의 발자취
[Node.js] 시퀄라이즈를 활용한 게시판 생성, curl 날려서 데이터 주고받기 - POST 본문
지난 포스팅: 2024.10.15 - [Backend] - [Node.js] ORM 시퀄라이즈(Sequelize)를 활용해서 테이블 만들고 데이터 주고받기
프로젝트 시작
npm init -y
npm i express nodemon sqlite3 sequelize sequelize-cli
npx sequelize init
* npx: node package executor로, 패키지를 실행할 때의 명령어~
위 명령어 실행 후 app.js 파일 생성, 노드몬 정보 맞추기
그러면 아래와 같이 파일들이 막 생긴당
config.json을 열어서 보면 기본 dialect가 "mysql"인것을 볼 수 있다.
development, test, production 안에 내용을 다 지운다.
- dev: 개발할때의 환경이라 오류가 나도 문제가 없다.
- test: 테스터들의 환경
- production: 실제 배포할때의 환경
그리고 아래와 같이 입력해준다.
index.js
models > index.js 파일을 열어본다.
아래에 post.js에서 정의한 Post 모델이 여기서 호출된다.
이제 이 파일을 하나씩 뜯어볼거다~~
'use strict'; // 자바스크립트 문법을 엄격하게 검열하는 모드이다. 꼼꼼하게 검사를 해라
const fs = require('fs'); // 모델 파일들을 불러올 때
const path = require('path');
const Sequelize = require('sequelize');
const process = require('process');
const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development'; // 노드의 env에 설정된 환경이기 때문에, ".env" 파일을 만들어서 정의를 해주면 되고, 만약 해당 파일이 없을 경우 'development' 환경을 따르라는 말
const config = require(__dirname + '/../config/config.json')[env]; // config.json의 "develpment"안의 환경을 사용한다
const db = {}; // db 객체
let sequelize;
if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else {
sequelize = new Sequelize(config.database, config.username, config.password, config);
}
fs
.readdirSync(__dirname)
.filter(file => {
return (
file.indexOf('.') !== 0 &&
file !== basename &&
file.slice(-3) === '.js' &&
file.indexOf('.test.js') === -1
);
})
.forEach(file => {
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes);
db[model.name] = model; // 모델을 위에서 생성한 db 객체에 추가
});
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) {
db[modelName].associate(db); // 1:1 ? 1:N? 관계를 정의한대로 데이터가 db에 담긴다.
}
});
db.sequelize = sequelize;
db.Sequelize = Sequelize;
module.exports = db;
이해가 조금 부족한 것 같아서 챗선생의 힘을 빌린다 ^^
'use strict'; // 엄격 모드 시작
const fs = require('fs'); // 파일 시스템 모듈 가져오기
const path = require('path'); // 경로 모듈 가져오기
const Sequelize = require('sequelize'); // Sequelize ORM 가져오기
const process = require('process'); // 프로세스 정보 가져오기
const basename = path.basename(__filename); // 현재 파일의 이름 가져오기
const env = process.env.NODE_ENV || 'development'; // 환경 변수 설정 (기본값: 'development')
const config = require(__dirname + '/../config/config.json')[env]; // 환경에 맞는 DB 설정 가져오기
const db = {}; // 데이터베이스 모델을 저장할 객체 초기화
let sequelize; // Sequelize 인스턴스 변수 선언
if (config.use_env_variable) { // 환경 변수를 사용할 경우
sequelize = new Sequelize(process.env[config.use_env_variable], config); // 환경 변수로 Sequelize 인스턴스 생성
} else { // 환경 변수를 사용하지 않을 경우
sequelize = new Sequelize(config.database, config.username, config.password, config); // 설정 파일 정보로 Sequelize 인스턴스 생성
}
// 현재 디렉토리의 모든 파일을 읽고 모델 파일을 가져오기
fs
.readdirSync(__dirname) // 현재 디렉토리의 파일 목록 읽기
.filter(file => { // 조건에 맞는 파일 필터링
return (
file.indexOf('.') !== 0 && // 숨김 파일 제외
file !== basename && // 현재 파일 제외
file.slice(-3) === '.js' && // .js 파일만 포함
file.indexOf('.test.js') === -1 // 테스트 파일 제외
);
})
.forEach(file => { // 필터링된 각 파일에 대해
const model = require(path.join(__dirname, file))(sequelize, Sequelize.DataTypes); // 모델 로드 및 초기화
db[model.name] = model; // 모델을 db 객체에 추가
});
// 각 모델의 관계 설정
Object.keys(db).forEach(modelName => {
if (db[modelName].associate) { // associate 메서드가 존재할 경우
db[modelName].associate(db); // 관계 설정 호출
}
});
db.sequelize = sequelize; // sequelize 인스턴스 추가
db.Sequelize = Sequelize; // Sequelize 클래스 추가
module.exports = db; // db 객체를 모듈로 내보내기
post.js
이제 models > post.js를 만들어준다. 잠깐 설명!
- post.js는 데이터베이스의 Post 모델을 정의하는 파일이고, index.js는 여러 모델을 초기화하고 관리하는 파일이다.
- index.js에서 post.js를 호출하여 Post 모델을 불러오고, 이를 db 객체에 등록함으로써 애플리케이션 내에서 모델을 쉽게 사용할 수 있게 연결된다.
- post.js에서 마지막에 Post 모델을 반환하여, 다른 파일에서 이 모델을 사용할 수 있게 한다.
const { Sequelize } = require(".");
module.exports = (sequelize, DataTypes) => {
/** create table Post(
* id INTEGER primary key autoincrement,
* title TEXT not null,
* )
*
*
**/
const Post = sequelize.define("Post", {
id: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true,
},
title: {
type: DataTypes.STRING,
allowNull: false,
},
content: DataTypes.STRING,
author: DataTypes.STRING(50),
}, {
tableName: "Board" // optional. 없을 시 Post로 생성
});
return Post;
};
app.js를 만들어준다.
그리고 노드몬 실행-
아래처럼 데이터베이스 파일이 생성되면 성공이다.
app.js
이제 기본 틀을 만들어주고, 구현을 해본다.
POST
const express = require("express");
const path = require("path");
const models = require("./models");
const app = express();
const PORT = 3000;
app.post("/posts", (req, res) => {
const { title, content, author } = req.body;
res.status(201).json({ id: result.lastInsertRowid, title: title, content: content });
});
app.listen(PORT, () => {
console.log(`Server listening on ${PORT}...`);
models.sequelize
.sync({ force: false })
.then(() => {
console.log(`DB connected`);
})
.catch((err) => {
console.error(`DB error: ${err}`);
process.exit();
}); // 서버 내렸다 올라갈때마다 테이블 새로 생성되면 열받으니까 force: false
});
코드를 작성하고, 컬을 날려서 잘 되는지 확인해본다.
'Backend' 카테고리의 다른 글
[Node.js] 시퀄라이저 - 댓글 기능 구현하기 (1) | 2024.10.16 |
---|---|
[Node.js] 시퀄라이즈를 활용한 게시판 생성, curl 날려서 데이터 주고받기 - GET, PUT, DELETE (0) | 2024.10.16 |
[Node.js] ORM 시퀄라이즈(Sequelize)를 활용해서 테이블 만들고 데이터 주고받기 (0) | 2024.10.15 |
[Node.js] GraphQL Schema 설계, mutation 타입 (0) | 2024.10.15 |
GraphQL 특징, node js로 GraphQL 구현 및 쿼리 날려보기 ⭐️ (0) | 2024.10.15 |
Comments