TIL

Node.js 복습 (1) ( prettier, dotenv, MongoDB )

황민도 2024. 7. 3. 21:43

내일배움캠프 스파르타 코딩클럽

 

[ prettier ]

Ctrl + , = settings

default formatter : prettier - code formatter 설정

format on save : 저장시 자동으로 코드 포맷팅

prettier : require config 검색후 체크 ( prettier 설정 파일이 있을 때만 포맷팅을 함)

 

.prettierrc 파일 예시

{
  "singleQuote": true,
  "semi": true,
  "useTabs": false,
  "tabWidth": 2,
  "trailingComma": "all",
  "printWidth": 80,
  "bracketSpacing": true
}

 

- singleQuote: 문자열 입력 시 쌍따옴표(") 대신 따옴표(') 사용

- semi: 코드 끝에 항상 세미콜론 추가

- useTabs:  탭 사용

- tabWidth: 탭을 사용하지 않는다고 설정했을 때 탭을 누르면 추가 할  스페이스 개수

- trailingComma: 객체, 배열 등의 마지막 항목에 콤마(,) 추가

- printWidth: 한 줄에 최대 표시되는 글자수 설정

- bracketSpacing: 괄호 안에 데이터가 있을 때 공백 삽입

 

더 다양한 옵션을 공식 홈페이지( Options · Prettier )를 통해 확인할 수 있다.

 


[ dotenv 라이브러리 ]

 

< app.js >

import express from 'express';
import 'dotenv/config';

const app = express();
const port = process.env.SERVER_PORT

app.get('/', (req, res) => {
  return res.json('hello');
});

app.listen(port, () => {
  console.log(`Server is listening on ${port}`);
});

dotenv 라이브러리리는 .env 파일에 정의된 환경 변수를 Node.js 애플리케이션 의 process.env 객체에 로드하는

역할을 한다. 이를 통해 애플리케이션이 환경 변수에 접근할 수 있게 된다.

 

dotenv 의 작동 원리

1. .env 파일 생성: 프로젝트 루트 디렉토리에 .env 파일을 생성하고 환경 변수를 정의한다.

SERVER_PORT=3000

2. dotenv 라이브러리 사용: ;애플리케이션에서 dotenv 를 불러와 환경 변수를 로드한다.

import 'dotenv/config'; // 이 라인이 .env 파일을 읽고 process.env에 로드합니다

 

dotenv/config 를 import하는 코드는 dotenv 라이브럴리의 설정을 자동으로 불러온다.

이 코드는 .env 파일을 읽고, 그내용에 따라 process.env 객체를 설정한다.

 

경로와 환경 변수 설정

dotenv가 .env 파일을 찾는 기본 경로는 현재 실행 중인 Node.js 프로세스의 작업 디렉토리 이다.

보통 이는 프로젝트의 루트 디렉토리이다.

 

dotenv/config 가 import 되지 않았을 경우

dotenv/config 가 import 되지 않으면 .env 파일에 정의된 환경 변수가

process.env  객체에 로드되지 않는다. 그 결과, 코드에서 환경 변수를 사용하려고 할 때, process.env 객체에서

해당 변수를 찾을 수 없게 된다.

 

예를 들어, 아래와 같이 process.env.SEVER_PORT 값을 가져올 때 문제가 발생할 수 있다.

import express from 'express';
// import 'dotenv/config'; // 이 줄이 누락된 경우

const app = express();
const port = process.env.SERVER_PORT; // undefined가 될 수 있음

app.get('/', (req, res) => {
  return res.json('hello');
});

app.listen(port, () => {
  console.log(`Server is listening on ${port}`); // undefined가 될 수 있음
});

만약 dotenv 설정이 누락되면 process.env.SEVER_PORT가 undefined 가 되고,

서버가 시작되지 않거나, 포트가 잘못 설정되는 등의 문제가 발생할 수 있다.

 


[ MongoDB 관련 ]

 

< schemas. index.js >

import mongoose from 'mongoose';
import 'dotenv/config';
// TODO: .env 파일 사용을 위해서는 여기에 패키지 import가 필요합니다.

const connect = () => {
  mongoose
    .connect(process.env.MONGODB_URL, {
      dbName: process.env.MONGODB_NAME,
    })
    .then(() => console.log('MongoDB 연결에 성공하였습니다.'))
    .catch((err) => console.log(`MongoDB 연결에 실패하였습니다. ${err}`));
};

mongoose.connection.on('error', (err) => {
  console.error('MongoDB 연결 에러', err);
});

export default connect;

 

/*

.catch : 

mongoose.connect() 메서드는 프로미스를 반환한다. 이 프로미스는 MongoDB에 성공적으로 연결되었을 때 resolve되며,

연결에 실패했을 때 reject되는 방식으로 구현되어 있다.

따라서 .then()과 .catch()를 사용하여 성공과 실패를 처리할 수 있다.

 

try-catch 블록을 사용하지 않고 .catch()를 사용하여 에러를 잡아 낼 수 있는 이유는 다음과 같다.

 

1. 프로미스 기반 구현: mongoose.connect()는 내부적으로 프로미스를 사용하여 비동기적으로 MongoDB에

연결을 시도한다. 이 경우, 프로미스 체이닝을 통해 연결 성공 또는 실패를 처리할 수 있다.

 

2. 예외 처리: try-catch 블록은 일반적으로 동기 코드에서 예외를 처리하는 데 사용된다. 비동기 코드에서는

예;외가 발생하면 해당 예외가 비동기적으로 발생한 곳이 아닌 호출 스택의 다른 곳에서 처리될 수 있다.

mongoose.connect()는 비동기 코드이므로 try-catch 블록을 사용하여 직접적으로 에러를 잡아낼 수 없다.

 

3. .catch() 메서드: mongoose.connect()가 반환한 프로미스를 이용하여. catch() 메서드를 사용하여 연결 실패 시

에러를 잡아낼 수 있다. 이는 비동기 코드에서 일반적인 예외 처리 방식이다.

 

따라서 주어진 코드에서는 mongoose.connect()를 호출한 후 .catch() 메서드를 사용하여 MongoDB 연결 실패 시

에러를 적절히 처리하고 있다.

*/