내배캠 수업을 듣던 중 , 이번 과제 시작이 서버를 객체화 부터였다
기본에 있던 코드들을 Class에 넣어서 import , export 하는 것.
이전에 쭉 하던 하던 방식들로도 잘 실행이 됐었는데 굳이 하는 이유가 뭘까?
뭐가 더 좋아지는 걸까 ? 하는 의문증으로 이 글을 쓰게 되었다
더 좋은 코드 ?
개발은 혼자하는 것이 아니다
이전 회사에서도 이미 다른 개발자들이 다 짜놓은 코드에서부터 시작을 했는데, 그걸 보는게 좋은 경험이 되었던 것처럼
내가 짠 코드들도 , 다른 사람들이 봤을때 이 사람이 뭘 구현하려고 했는지 명확히 보여아 한다는 것이다
훌륭한 개발자들이 만든 규칙들을 잘 지키는게 그 시작이라고 생각한다
객체화(모듈화) 하면 좋은 점 ?
우선 하단에 이전에 내가 이미 짜놓은 서버 부분과 , 객체화 한 코드를 첨부 된 내용들을 보면
다른 개발자가 봤을때 여기가 라우터구나 , 여기가 미들웨어구나 , 어디서 뭔가를 가져오는구나 파악하기가 더 쉬워진다
또 , 각 기능들을 독립적으로 관리하고 , 필요한 부분들만 조합해서 사용 할 수 있기 때문에 유지보수에도 유리하다
재사용이 쉬워지면 결국은 생산성까지 높아진다.
이제 그걸 어떻게 하는건지 보자.
# 기존의 우다다 코드
//app.js
const express = require("express");
const cookieParser = require("cookie-parser");
const likeRouter = require("./routes/likes.router");
const app = express();
const PORT = 3000;
const router = require("./routes");
app.use(express.json());
app.use(cookieParser());
app.use("/api", router, [likeRouter]);
app.listen(PORT, () => {
console.log(PORT, "포트 번호로 서버가 실행되었습니다.");
});
모두다 const 로 선언해서 사용했다
왜 이렇게 했냐 가 아니고 이렇게 밖에 할 줄 몰랐다
//app.js
import express from "express";
import cookieParser from "cookie-parser";
import routes from "./routes";
export class App {
app = express();
constructor() {
this.setAppSettings();
this.setAppRouter();
}
setAppSettings = () => {
this.app.use(express.json());
this.app.use(express.urlencoded({ extended: false }));
this.app.use(cookieParser());
};
setAppRouter = () => {
// routes
this.app.use("/api", routes, (error, request, response) => {
response.status(400).json({
success: false,
error: error.message,
});
});
};
}
APP을 class 로 선언하고 필요한 부품들을 하위에 작성해주었다.
같은 기능을 하는 코드지만, 각 코드들이 무슨 역할을 하는지 한눈에 들어온다.
그리고 서버 실행은 server.js 로 따로 만들어줬다
//server.js
import dotenv from "dotenv";
import Http from "node:http";
import { ExpressApp } from "./app";
import { sequelize } from "./db";
dotenv.config();
export class Server {
expressApp = new ExpressApp();
constructor() {
// HTTP 서버를 생성하고, expressApp을 사용하여 요청을 처리하도록 설정
this.httpServer = new Http.Server(this.expressApp.app);
}
// 데이터베이스 연결
databaseConnection = () => {
// sequelize 모듈을 사용하여 데이터베이스에 연결
return this.sequelizeAuthenticate().then(this.sequelizeSync);
};
// Sequelize로 데이터베이스에 인증 시도
sequelizeAuthenticate = () => {
// sequelize.authenticate() 메서드를 사용하여 데이터베이스에 인증
return sequelize.authenticate();
};
// Sequelize로 데이터베이스와 모델을 동기화하는 메서드
sequelizeSync = () => {
// sequelize.sync() 메서드를 사용하여 데이터베이스와 모델을 동기화합니다. (alter 옵션을 통해 스키마를 변경합니다.)
// 이 부분이 마이그레이션을 안해도 되는 이유였음
return sequelize.sync({ alter: true });
};
// 서버를 실행하는 메서드입니다.
runServer = async () => {
try {
// 데이터베이스 연결
await this.databaseConnection();
// 서버를 실행하고 클라이언트의 요청을 수신 대기
return this.serverListen();
} catch (e) {
// 에러가 발생하면 에러 핸들러를 호출
return this.serverErrorHandler(e);
}
};
// HTTP 서버를 시작하는 메서드
serverListen = () => {
// .env 파일에서 PORT와 HOST 환경변수 값을 가져옴
const { PORT: port, HOST: host } = process.env;
// HTTP 서버 시작
return this.httpServer.listen(port, () => {
console.log(`Server is running on: http://${host}:${port}`);
});
};
// 서버 실행 에러 처리
serverErrorHandler = (error) => {
console.log("Server run error: ", error.message);
};
}
// 위에서 만들어놓은걸 여기서 할당
const server = new Server();
// 여기서 실행
server.runServer();
server 부분은 모르는 것들이 많아서 하나하나 찾아보고 주석을 달아줬다
앞으로도 많은 프로젝트를 진행할거니 계속 반복학습하면서 익숙해지면 될 것 같다
기존에는 마이그레이션으로 테이블을 생성하고 고칠때 model를 사용했는데
이렇게 하면 굳이 마이그레이션을 안해도 된다.
사실 컬럼이 바뀌면 마이그레이션과 모델을 둘 다 바꿔줘야해서 귀찮았는데 이렇게 해결법을 찾았다
내일은 이 과정중에 났었던 에러에 대해 TIL을 작성해보도록 하겠다 !
'Node.js' 카테고리의 다른 글
node.js) 소셜 로그인 (카카오톡) / 토큰 재발행 , 회원가입 저장 (0) | 2023.09.07 |
---|---|
node.js) 소셜 로그인 (카카오톡) / 토큰 재발행 , 회원가입 저장 (0) | 2023.08.24 |
js)import require 에러 모음집 .... (0) | 2023.07.27 |
node) transaction을 왜 써야할까 ? +에러 해결 (0) | 2023.07.21 |