나의 발자취

[Node.js] 시퀄라이즈를 활용한 게시판 생성, curl 날려서 데이터 주고받기 - POST 본문

Backend

[Node.js] 시퀄라이즈를 활용한 게시판 생성, curl 날려서 데이터 주고받기 - POST

달모드 2024. 10. 15. 16:43

지난 포스팅: 2024.10.15 - [Backend] - [Node.js] ORM 시퀄라이즈(Sequelize)를 활용해서 테이블 만들고 데이터 주고받기

 

[Node.js] ORM 시퀄라이즈(Sequelize)를 활용해서 테이블 만들고 데이터 주고받기

ORM이란?Object-Relational Mapping  대표적인 ORM으로는 Python의 Django, SQLAlchemy가 있다.JS/Node.js에는 Sequelize, TypeORM, Prisma 가 있고Java: JPA(대표적), HibernateGo: GoORMRuby: ActiveRecord  Sequelize ORM Framework 을 사용

wildguess.tistory.com

 

프로젝트 시작

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
});

 

 

코드를 작성하고, 컬을 날려서 잘 되는지 확인해본다.

 

728x90
반응형
Comments