ChatGPT가 알려주는 Node.js 모범 사례 30선 (목표 100선) :: Best Practices
다음은 Node.js 개발을 위한 몇 가지 일반적인 모범 사례입니다:
- 비동기 프로그래밍에는 async/await을 사용하세요.
- try-catch 블록을 사용하여 오류를 적절히 처리하세요.
- 민감한 정보에는 환경 변수를 사용하세요.
- 데이터를 효율적으로 저장하고 검색할 수 있도록 적절한 데이터 구조를 선택하세요.
- 유지보수 가능성을 높이기 위해 모듈을 작고 집중적으로 유지하세요.
- 코드 품질과 일관성을 강화하기 위해 ESLint와 같은 린터를 사용하세요.
- Mocha 또는 Jest와 같은 테스트 프레임워크를 사용하여 코드에 대한 테스트를 작성하세요.
- 종속성을 최신 상태로 유지하고 보안 취약성을 모니터링하세요.
- PM2와 같은 프로세스 관리자를 사용하여 프로덕션 환경에서 Node.js 애플리케이션을 관리하세요.
- 로깅 라이브러리를 사용하여 애플리케이션의 상태에 대한 정보를 기록하세요.
- 가능하면 공식 Node.js 패키지 레지스트리(npm)의 모듈과 종속성을 사용하세요.
- 비차단 I/O를 사용하고 무거운 연산을 작업자 스레드에 위임하여 이벤트 루프를 차단하지 마세요.
- 반복적인 작업을 자동화하려면 Grunt나 Gulp와 같은 작업 실행기를 사용하세요.
- 애플리케이션의 성능을 개선하기 위해 캐싱 전략을 구현하세요.
- Helmet과 같은 보안 미들웨어를 사용하여 애플리케이션을 보호하세요.
- API에 대한 과도한 요청을 방지하기 위해 속도 제한을 구현합니다.
- 데이터 저장을 위해 MongoDB 또는 MySQL과 같은 프로덕션 지원 데이터베이스를 사용합니다.
- 장애 발생 시 애플리케이션이 자동으로 재시작되도록 PM2 또는 영원히와 같은 구성 관리 도구를 사용하세요.
- 특히 민감한 데이터를 전송할 때는 안전한 통신을 위해 HTTPS를 사용하세요.
- 뉴렐릭 또는 데이터독과 같은 도구를 사용해 애플리케이션을 모니터링하여 성능 문제를 파악하고 적시에 해결하세요.
- Git과 같은 버전 제어 소프트웨어를 사용하여 코드베이스의 변경 사항을 관리하고 추적하세요.
- ESLint와 같은 린터를 사용하여 일관된 코딩 스타일을 적용하고 잠재적인 오류를 포착하세요.
- 단위 테스트, 통합 테스트, 엔드투엔드 테스트를 사용하여 코드를 철저하게 테스트하세요. Jest 또는 Mocha와 같은 테스트 프레임워크를 사용하여 테스트를 작성하고 실행하세요.
- 환경 변수를 사용하여 API 키, 비밀번호 및 기타 구성 옵션과 같은 민감한 정보를 저장하세요.
- Webpack이나 Babel과 같은 빌드 도구를 사용하여 코드를 번들로 묶고 프로덕션에 맞게 최적화하세요.
- 코드의 빌드, 테스트 및 배포를 자동화하기 위해 지속적 통합(CI) 및 지속적 배포(CD) 파이프라인을 설정하세요.
- Winston 또는 Bunyan과 같은 로깅 라이브러리를 사용하여 메시지를 로깅하고 애플리케이션의 문제를 진단하세요.
- Sentry 또는 Rollbar와 같은 오류 추적 및 보고 도구를 사용하여 프로덕션 환경의 오류를 모니터링하고 디버그하세요.
- 적절한 오류 처리를 구현하여 오류가 발생하더라도 애플리케이션이 계속 작동할 수 있도록 합니다.
- React 또는 Angular와 같은 프런트엔드 프레임워크를 사용하여 동적이고 반응이 빠른 사용자 인터페이스를 구축하세요.
작성 중...
[ Code ]
1. 비동기 프로그래밍에는 async/await을 사용하세요.
async function fetchData() {
try {
const result = await axios.get('https://some-api.com/data');
console.log(result.data);
} catch (error) {
console.error(error);
}
}
2. try-catch 블록을 사용하여 오류를 적절히 처리하세요.
try {
const data = JSON.parse('invalid json');
} catch (error) {
console.error(error);
}
3. 민감한 정보에는 환경 변수를 사용하세요.
const API_KEY = process.env.API_KEY;
4. 데이터를 효율적으로 저장하고 검색할 수 있도록 적절한 데이터 구조를 선택하세요.
const userData = {};
// Using an object for efficient lookup by id
userData[user.id] = user;
console.log(userData[123]); // { id: 123, name: 'John Doe' }
5. 유지보수 가능성을 높이기 위해 모듈을 작고 집중적으로 유지하세요.
// bad
export function calculateOrderTotal(items, shippingRate) {
// implementation details
}
// good
export function calculateItemsTotal(items) {
// implementation details
}
export function calculateShippingTotal(items, shippingRate) {
// implementation details
}
6. 코드 품질과 일관성을 강화하기 위해 ESLint와 같은 린터를 사용하세요.
// .eslintrc.json
{
"env": {
"browser": true,
"node": true
},
"extends": "eslint:recommended",
"rules": {
"no-console": "off"
}
}
7. Mocha 또는 Jest와 같은 테스트 프레임워크를 사용하여 코드에 대한 테스트를 작성하세요.
const { sum } = require('./math');
describe('sum', () => {
it('should calculate the sum of two numbers', () => {
const result = sum(1, 2);
expect(result).to.equal(3);
});
});
8. 종속성을 최신 상태로 유지하고 보안 취약성을 모니터링하세요.
$ npm install -g ncu
$ ncu
$ ncu -u
$ npm install
9. PM2와 같은 프로세스 관리자를 사용하여 프로덕션 환경에서 Node.js 애플리케이션을 관리하세요.
$ pm2 start app.js
$ pm2 restart app
$ pm2 stop app
$ pm2 logs app
10. 로깅 라이브러리를 사용하여 애플리케이션의 상태에 대한 정보를 기록하세요.
const log = require('winston');
log.info('Application started');
log.error('Error occurred: ', error);
11. 가능하면 공식 Node.js 패키지 레지스트리(npm)의 모듈과 종속성을 사용하세요.
$ npm install express
const express = require('express');
const app = express();
12. 비차단 I/O를 사용하고 무거운 연산을 작업자 스레드에 위임하여 이벤트 루프를 차단하지 마세요.
const { Worker, isMainThread } = require('worker_threads');
if (isMainThread) {
new Worker(__filename);
} else {
// Perform heavy computation in worker thread
}
13. 반복적인 작업을 자동화하려면 Grunt나 Gulp와 같은 작업 실행기를 사용하세요.
// gulpfile.js
const gulp = require('gulp');
gulp.task('default', function() {
console.log('Hello, world!');
});
14. 애플리케이션의 성능을 개선하기 위해 캐싱 전략을 구현하세요.
const cache = new Map();
function getData(key) {
if (cache.has(key)) {
return cache.get(key);
} else {
const data = fetchDataFromApi();
cache.set(key, data);
return data;
}
}
15. Helmet과 같은 보안 미들웨어를 사용하여 애플리케이션을 보호하세요.
const express = require('express');
const helmet = require('helmet');
const app = express();
app.use(helmet());
16. API에 대한 과도한 요청을 방지하기 위해 속도 제한을 구현합니다.
const express = require('express');
const rateLimit = require('express-rate-limit');
const app = express();
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100 // limit each IP to 100 requests per windowMs
});
app.use('/api/', limiter);
17. 데이터 저장을 위해 MongoDB 또는 MySQL과 같은 프로덕션 지원 데이터베이스를 사용합니다.
const mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/test', { useNewUrlParser: true });
const userSchema = new mongoose.Schema({
name: String,
email: String
});
const User = mongoose.model('User', userSchema);
const john = new User({ name: 'John Doe', email: 'john@example.com' });
john.save((error) => {
if (error) {
console.error(error);
} else {
console.log('User saved successfully!');
}
});
18. 장애 발생 시 애플리케이션이 자동으로 재시작되도록 PM2 또는 영원히와 같은 구성 관리 도구를 사용하세요.
$ pm2 start app.js --name "my-app"
$ pm2 restart my-app
$ pm2 stop my-app
$ pm2 delete my-app
19. 특히 민감한 데이터를 전송할 때는 안전한 통신을 위해 HTTPS를 사용하세요.
const express = require('express');
const https = require('https');
const fs = require('fs');
const app = express();
const options = {
key: fs.readFileSync('path/to/key.pem'),
cert: fs.readFileSync('path/to/cert.pem')
};
https.createServer(options, app).listen(443, () => {
console.log('HTTPS server started on port 443');
});
20. 뉴렐릭 또는 데이터독과 같은 도구를 사용해 애플리케이션을 모니터링하여 성능 문제를 파악하고 적시에 해결하세요.
const newrelic = require('newrelic');
app.use(newrelic.middleware.express());
21. Git과 같은 버전 제어 소프트웨어를 사용하여 코드베이스의 변경 사항을 관리하고 추적하세요.
$ git init
$ git add .
$ git commit -m "Initial commit"
22. ESLint와 같은 린터를 사용하여 일관된 코딩 스타일을 적용하고 잠재적인 오류를 포착하세요.
ESLint 설치
$ npm install eslint --save-dev
$ ./node_modules/.bin/eslint --init
.eslintrc.js
module.exports = {
extends: 'eslint:recommended',
parserOptions: {
ecmaVersion: 6,
sourceType: 'module'
},
env: {
node: true,
es6: true
},
rules: {
'no-console': 0,
'indent': [2, 2],
'linebreak-style': [2, 'unix'],
'quotes': [2, 'single'],
'semi': [2, 'always']
}
};
23. 단위 테스트, 통합 테스트, 엔드투엔드 테스트를 사용하여 코드를 철저하게 테스트하세요. Jest 또는 Mocha와 같은 테스트 프레임워크를 사용하여 테스트를 작성하고 실행하세요.
Jest 설치
$ npm install jest --save-dev
테스트 파일
const sum = (a, b) => a + b;
test('adds 1 + 2 to equal 3', () => {
expect(sum(1, 2)).toBe(3);
});
24. 환경 변수를 사용하여 API 키, 비밀번호 및 기타 구성 옵션과 같은 민감한 정보를 저장하세요.
const API_KEY = process.env.API_KEY;
app.get('/', (req, res) => {
res.send(`API Key: ${API_KEY}`);
});
25. Webpack이나 Babel과 같은 빌드 도구를 사용하여 코드를 번들로 묶고 프로덕션에 맞게 최적화하세요.
Webpack 설치
$ npm install webpack webpack-cli --save-dev
$ touch webpack.config.js
webpack.config.js
const path = require('path');
module.exports = {
entry: './src/index.js',
output: {
filename: 'bundle.js',
path: path.resolve(__dirname, 'dist')
}
};
26. 코드의 빌드, 테스트 및 배포를 자동화하기 위해 지속적 통합(CI) 및 지속적 배포(CD) 파이프라인을 설정하세요.
젠킨스 참조
27. Winston 또는 Bunyan과 같은 로깅 라이브러리를 사용하여 메시지를 로깅하고 애플리케이션의 문제를 진단하세요.
app.get('/', (req, res, next) => {
try {
const data = doSomething();
res.send(data);
} catch (err) {
next(err);
}
});
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something went wrong!');
});
28. Sentry 또는 Rollbar와 같은 오류 추적 및 보고 도구를 사용하여 프로덕션 환경의 오류를 모니터링하고 디버그하세요.
Winston 설치
$ npm install winston
사용예
const winston = require('winston');
const logger = winston.createLogger({
level: 'info',
format: winston.format.json(),
transports: [
new winston.transports.File({ filename: 'error.log', level: 'error' }),
new winston.transports.File({ filename: 'combined.log' })
]
});
logger.info('Hello, world!');
logger.error('This is an error');
29. 적절한 오류 처리를 구현하여 오류가 발생하더라도 애플리케이션이 계속 작동할 수 있도록 합니다.
Grunt 설치
$ npm install grunt --save-dev
$ npm install grunt-contrib-watch --save-dev
$ touch Gruntfile.js
Gruntfile.js
module.exports = function (grunt) {
grunt.initConfig({
watch: {
scripts: {
files: ['src/**/*.js'],
tasks: ['build'],
options: {
spawn: false,
},
},
},
});
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.registerTask('default', ['watch']);
};
30. React 또는 Angular와 같은 프런트엔드 프레임워크를 사용하여 동적이고 반응이 빠른 사용자 인터페이스를 구축하세요.
ESLint 설치
$ npm install eslint --save-dev
$ npx eslint --init
.eslintrc.json
{
"env": {
"node": true
},
"extends": "eslint:recommended",
"rules": {
"quotes": [
"error",
"single"
],
"semi": [
"error",
"always"
],
"no-console": [
"off"
]
}
}
작성 중...
2023.02.06 - [IT 인터넷/React Native & JS] - React를 ChatGPT에게 배우다.
2023.02.06 - [IT 인터넷/일반] - Ruby를 ChatGPT로 배우다 :: 루비 언어
2023.02.06 - [IT 인터넷/Python] - Django를 ChatGPT에게 배우다 :: Python
2023.02.06 - [IT 인터넷/Python] - 파이썬을 ChatGPT에게 배우다 :: Python
2023.02.05 - [IT 인터넷/Golang] - Go 언어를 ChatGPT에게 배우다 :: Golang
2023.02.05 - [IT 인터넷/Flutter] - Dart와 Flutter를 ChatGPT에게 배우다.
2023.02.04 - [IT 인터넷/일반] - Rust를 ChatGPT에게 배우다.