청소 플랫폼 만들기 (2)

김민준·2023년 8월 17일
0
  1. 지속적인 문제 발생과 해결
  2. MVC 패턴

공부하며 느낀 점
참조한 사이트

1. 지속적인 문제 발생과 해결

이어짐

프로젝트 뼈대 완료
계속해서 api와 erd를 수정하고, 결국 라이브 쉐어와 화상채팅을 해가면서 프로젝트의 뼈대를 완성했다.

생각지 못한 문제
TypeError: Class constructor Company cannot be invoked without 'new'
app.js 자체는 작동하지만 API 요청을 하면 자꾸 <모델명>이라는 클래스를 new로 정의해야한다는 오류가 떴다.

어디가 문제인지 몰라서 여기저기 들쑤시고 다녔다.

결국 router레이어를 모아둔 폴더의 index.js에서 문제를 발견했다.

const express = require('express');
const router = express.Router();

const userRouter = require('./user.router');
const companyRouter = require('./company.router');
const offerRouter = require('./offer.router');
const reservationRouter = require('./reservation.router');
const reviewRouter = require('./review.router');

각각 모델들을 각각의 라우터에서 불러올때 해당 오류가 발생하였고 계속 건드려본 결과 models의 index.js에서 문제가 생기고 있었다.

'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';
const config = require(__dirname + '/../config/config.js')[env];
const 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 modelDefiner = require(path.join(__dirname, file));
    const model = modelDefiner.initiate(sequelize);
    db[model.name] = model;
  });

Object.keys(db).forEach((modelName) => {
  if (db[modelName].associate) {
    db[modelName].associate(db);
  }
});

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

model들의 목록은 가져왔지만 거기서 내용물을 가져오지 못하는 문제였다.

해결 :
1. 모델마다 라우터가 있고, 라우터는 컨트롤러에서 클래스를 가져오지못했다. 컨트롤러는 서비스에서, 서비스는 레포에서... 가져오지 못했다.
그 이유는 아예 빈 파일만 뼈대로 만들어 뒀기 때문이었고 아래와같은 깡통 클래스만 선언해서 해결했다,

const { Review } = require('../0models');

class ReviewRepository {}

module.exports = ReviewRepository;

또다시 문제가 생겼는데 이번에는 매서드를 설정하지 않아서 생기는 문제였다. 매서드까지 깡통으로 만들면 시간이 너무 오래 걸리므로 아래와같이 주석처리해서 오류만 안뜨게 만들었다. 개발을 하면서 저절로 해결될 문제고, 해결은 순식간이라서 좋았다.

// router.get('/me', usersController.referUser);

모델 참조 오류

db[model.name] = model; 라는 오류가 떴다.

class User extends Sequelize.Model {
  static initiate(sequelize) {
    // User.init(
    return super.init(
    );
  }

위와같이 <모델명>.initreturn super.init(으로 고치니 참조 문제가 해결되었다.

2. MVC 패턴

  1. MVC에 대해 조사한 것

MVC : Model View Controller
Model : 데이터와 비즈니스 로직을 관리 (포함해야할 데이터를 정의)
View : 레이아웃과 화면을 처리 (앱의 데이터를 보여주는 방식을 정의)
Controller : 명령을 모델과 뷰 부분으로 라우팅 (사용자에게 받은 입력에 대한 응답으로 모델, 뷰를 업데이트하는 로직을 포함)

  1. 팀원들이 조사한것과 합친 것

먼저 디자인 패턴이란 자주 발생하는 문제를 해결하는 일련의 솔루션들을 정형화하고 문서화한 것이다.
MVC 패턴은 이 디자인 패턴 중 하나이며 Model-View-Controller의 약자이다.
MVC 패턴은 모델, 뷰, 컨트롤러로 나뉜다.
모델은 데이터와 비즈니스 로직을 담당한다. 데이터의 상태와 조작 방법을 정의하며, 데이터의 변경이 발생하면 이를 통지하여 뷰와 컨트롤러에게 업데이트 사항을 알린다. 모델은 DB와의 상호 작용을 담당하며, 응용프로그램의 핵심 로직이 위치하는 곳이다.
뷰는 데이터의 시작적인 표현과 사용자와의 상호작용을 담당한다. 웹의 디자인과 레이아웃을 구성하며, 모델의 데이터를 가시적으로 표현하여 사용자에게 제공한다. HTML, CSS, JavaScript를 사용하여 웹 페이지를 구성하는 작업이 이루어진다.
컨트롤러는 모델과 뷰 사이의 중개자 역할을 수행한다. 사용자의 입력을 받아 해당하는 작업을 수행하고, 이를 바탕으로 모델의 데이터를 업데이트하거나 뷰의 표시를 변경한다. 컨트롤러는 사용자의 요청을 해석하고 이에 대한 처리를 결정하는 역할을 수행한다.
MVC 패턴은 웹을 더 구조적으로 개발할 수 있도록 도와주며, 각 항목 간의 의존성을 낮추어 유지보수와 확장성을 향상시킨다.

공부하며 느낀 점

참조한 사이트

MVC

[개발자 면접준비]#1. MVC패턴이란

profile
node 개발자

0개의 댓글

관련 채용 정보