일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 씨쁠쁠
- 파이썬 코딩테스트
- 부스트캠프
- React ssr
- Next/Image 캐싱
- 자바스크립트
- 파이썬
- beautifulsoup
- 자바스크립트 객체
- 코딩테스트
- 브라우저 동작
- 웹크롤링
- 멘션 추천 기능
- 비디오 스트리밍
- c++
- git checkout
- PubSub 패턴
- 네이버 부스트캠프
- 자바 프로젝트
- Next.js
- react
- 스택
- Server Side Rendering
- React.js
- 네이버 부캠
- 파이썬 웹크롤링
- 자바스크립트 컴파일
- 프로그래머스
- 네이버 부스트캠프 멤버십
- Image 컴포넌트
- Today
- Total
코린이의 개발 일지
[Backend] Node.js(express) 프로젝트 설계하기 본문
설계가 가장 어렵다… 몇주간 프로젝트하면서 고군분투 했었는데 이해가 안되더라도 일단 정리해보려 한다.
백엔드 구조 설계고 프론트는 나중에 정리하도록 하겠다.
app.js
시작 부분이다. 별거는 없고 예시 코드를 보자
const loaders = require('./loaders');
const express = require('express');
async function startServer() {
const app = express();
await loaders.init({ expressApp: app });
app.listen(process.env.PORT, err => {
if (err) {
console.log(err);
return;
}
console.log(`Your server is ready !`);
});
}
startServer();
시작점에서 loader를 호출하는 것을 볼 수 있다.
이 파일에는 서버 시작하는 기본 로직만 있다.
loaders
// ---------------------
// loader/index.js
// ---------------------
import expressLoader from './express';
import mongooseLoader from './mongoose';
export default async ({ expressApp }) => {
const mongoConnection = await mongooseLoader();
console.log('MongoDB Intialized');
await expressLoader({ app: expressApp });
console.log('Express Intialized');
}
// ---------------------
// loader/express.js
// ---------------------
import * as express from 'express';
import * as bodyParser from 'body-parser';
import * as cors from 'cors';
export default async ({ app }: { app: express.Application }) => {
app.get('/status', (req, res) => { res.status(200).end(); });
app.head('/status', (req, res) => { res.status(200).end(); });
app.enable('trust proxy');
app.use(cors());
app.use(require('morgan')('dev'));
app.use(bodyParser.urlencoded({ extended: false }));
return app;
})
내가 찾은 예시에서는 시작 프로세스를 모듈별로 분할 했다. (express, mongoose connect)
나는 아직은 express 만 쓸거니까 express 로직만 loader에 넣어주면 될 거 같다.
https://github.com/santiq/bulletproof-nodejs
위 링크에 들어가보면 loaders 폴더 내부에 express.ts에서 api 모듈도 호출한 것을 확인할 수 있다.
그러니까 지금 구조가
app.js → loaders → api
이 순서로 호출하고 있다.
api
프론트엔드에서 데이터 요청할 때 요청 받는 부분이다.
import { Router, Request, Response } from 'express';
import middlewares from '../middlewares';
const route = Router();
export default (app: Router) => {
app.use('/users', route);
route.get('/me', middlewares.isAuth, middlewares.attachCurrentUser, (req: Request, res: Response) => {
return res.json({ user: req.currentUser }).status(200);
});
};
요런 느낌이다.
내부를 보면 middleware랑 route가 구분 되어 있는데, 아직 middleware 공부가 미숙한 관계로 나는 구분하지 않겠다 ㅎㅎㅎㅎ
config
설정파일들, 환경변수들 모음이다.
내부 내용을 보면
import dotenv from 'dotenv';
// Set the NODE_ENV to 'development' by default
process.env.NODE_ENV = process.env.NODE_ENV || 'development';
const envFound = dotenv.config();
if (envFound.error) {
// This error should crash whole process
throw new Error("⚠️ Couldn't find .env file ⚠️");
}
export default {
/**
* Your favorite port
*/
port: parseInt(process.env.PORT, 10),
/**
* That long string from mlab
*/
databaseURL: process.env.MONGODB_URI,
/**
* API configs
*/
api: {
prefix: '/api',
},
};
이런식으로 작성되어 있는데 외부 파일에서
app.use(config.api.prefix, routes());
이런식으로 사용할 수 있는 모양이다.
models
데이터베이스 로직 담아두는 곳 같다
원본 코드를 보면 이 사람은 interface도 따로 만들어서 데이터 거기에 따로 저장하고 interface만 가져다 쓴 느낌인데… 나는 그정도까지는 아직 생각없고
여기에는 schema에서 데이터 꺼내와서 return해주고 service 단에서 필요할 때마다 import 해서 쓰는 느낌으로 가보려고 한다.
services
모든 비즈니스 로직은 여기에!
라고 적혀있어서 대체 비즈니스 로직은 뭘까 한번 찾아봤다.
비즈니스 로직
→ 프로그램의 핵심 로직
→ 데이터가 어떻게 생성되고 저장되고 수정되는지를 정의한 것
그러니까 간단히 말해서 데이터를 생성하고 수정하고 삭제하고 등등의 그냥 기본적이고 핵심적인 로직을 의미하는 거 같다.
service는 한마디로 매니저 느낌? api에 요청이 들어오면 그거에 따라 model에 데이터 꺼내달라고 시키고, model이 데이터 주면 그 데이터 처리해가지고 api에 다시 보내주는 그런 역할이다.
내 나름대로 역할을 간단 요약해본다.
- app.js : 서버 동작시키는 시작점
- api : 프론트엔드로부터 데이터 요청 받는 곳
- config: 환경변수, 설정 파일들
- loader: express import 해와서 동작시키는 곳 ⇒ app.js와 api 사이를 연결해줌.
- model: 데이터베이스랑 직접 맞닿아 있는 곳
- services: 데이터 처리 ⇒ model과 api 연결해줌.
BoilerPlate
링크:
https://github.com/leesunmin1231/express_boilerplate
참고:
https://softwareontheroad.com/ideal-nodejs-project-structure/
https://node-js.tistory.com/22
https://medium.com/@su_bak/term-business-logic이란-6d53c4782d73
https://github.com/santiq/bulletproof-nodejs