관리 메뉴

피터의 개발이야기

[Node.js] Node.js 서버 사이드,찍먹하기 본문

DevOps/Node.js

[Node.js] Node.js 서버 사이드,찍먹하기

기록하는 백앤드개발자 2024. 9. 27. 06:22
반응형

ㅁ 들어가며

ㅇ 새로 담당하게 된 프로젝트가 node.js로 구성되어 있다.

ㅇ 빠르게 서버 사이드 공부를 하면서 주요 특징과 기능을 구현해 보았다.

 

ㅁ Node.js란?

Node.js는 2009년 Ryan Dahl에 의해 개발된 오픈 소스 서버 사이드 JavaScript 런타임 환경이다.

ㅇ Chrome V8 JavaScript 엔진을 기반으로 하며, 이벤트 기반, 비동기 I/O 모델을 사용해 가볍고 효율적인 애플리케이션 개발을 가능하게 한다.

 

ㅁ 주요 특징

비동기 I/O

 ㅇ Node.js의 가장 큰 특징 중 하나는 비동기 I/O 처리 방식이다. 이는 블로킹 작업을 기다리지 않고 다음 작업을 수행할 수 있게 해준다. 예를 들어, 파일 읽기나 데이터베이스 쿼리와 같은 I/O 작업을 수행할 때, Node.js는 해당 작업이 완료될 때까지 기다리지 않고 다른 요청을 처리할 수 있다.

이벤트 기반 아키텍처

Node.js는 이벤트 루프를 사용하여 비동기 작업을 관리한다. 이벤트 기반 프로그래밍 모델을 통해 개발자는 콜백 함수를 사용하여 비동기 작업의 완료를 처리할 수 있다.

단일 스레드

Node.js는 기본적으로 단일 스레드 모델을 사용한다. 이는 멀티 스레드 환경에서 발생할 수 있는 복잡성과 오버헤드를 줄이인다.

NPM (Node Package Manager)

Node.js의 강력한 생태계를 지원하는 NPM은 세계 최대의 오픈 소스 라이브러리 생태계다. 개발자들은 NPM을 통해 수많은 패키지와 모듈을 쉽게 설치하고 관리할 수 있다.

 

 

ㅁ Node.js 설치 및 시작하기

Node.js를 시작하려면 먼저 공식 웹사이트에서 설치 파일을 다운로드하고 설치해야 한다. 설치가 완료되면 터미널이나 명령 프롬프트에서 다음 명령어를 실행하여 버전을 확인할 수 있다:

$ node --version
v12.22.12

 

console.log("hello World!!")

ㅇ index.js을 작성하여 간단한 Node.js 프로그램을 만들어 보았다. 

 

// 실행
$ node index.js
hello World!!

ㅇ 터미널에서 node를 실행하였다.

 

ㅁ Express.js: Node.js 웹 애플리케이션 프레임워크

Express.js는 Node.js를 위한 빠르고 간결한 웹 애플리케이션 프레임워크다. RESTful API 구축, 라우팅, 미들웨어 지원 등 웹 애플리케이션 개발에 필요한 다양한 기능을 제공한다.

Express.js를 사용하여 간단한 웹 서버를 만들어보았다.

$ npm install express --save
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN http-test@1.0.0 No description
npm WARN http-test@1.0.0 No repository field.

+ express@4.21.0
added 65 packages from 41 contributors and audited 65 packages in 5.089s

13 packages are looking for funding
  run `npm fund` for details

found 0 vulnerabilities

우선 express 모듈을 설치한다.

 

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World!');
});

app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}`);
});

 

ㅇ 이 코드는 3000번 포트에서 실행되는 간단한 웹 서버를 생성한다.

ㅇ 루트 경로('/')로 접속하면 "Hello World!"라는 메시지를 반환한다.

 

$ node express.js
Server running at http://localhost:3000

ㅇ node start!! 간단하게 웹서비스를 구축하였다.

 

ㅁ Node.js의 비동기 프로그래밍

Node.js의 비동기 프로그래밍은 콜백, Promise, async/await 등 다양한 방식으로 구현할 수 있다.

콜백

콜백은 Node.js에서 가장 기본적인 비동기 처리 방식이다. 예를 들어, 파일을 읽는 비동기 작업은 다음과 같이 구현할 수 있다.

const fs = require('fs');

fs.readFile('example.txt', 'utf8', (err, data) => {
  if (err) {
    console.error('Error reading file:', err);
    return;
  }
  console.log(data);
});

ㅇ example.txt를 만들고 file.js를 실행하여 파일의 내용을 console로 출력해 보았다.

 

Promise

Promise는 비동기 작업의 최종 완료 또는 실패를 나타내는 객체다. 콜백보다 더 깔끔한 코드를 작성할 수 있게 해준다.

const fs = require('fs').promises;

fs.readFile('example.txt', 'utf8')
  .then(data => console.log(data))
  .catch(err => console.error('Error reading file:', err));

ㅇ 위와 같은 로직인데 함수형 코딩으로 처리하였다.

 

Async/Await

Async/Await는 Promise를 기반으로 하는 더 직관적인 비동기 처리 문법이다.

const fs = require('fs').promises;

async function readFile() {
  try {
    const data = await fs.readFile('example.txt', 'utf8');
    console.log(data);
  } catch (err) {
    console.error('Error reading file:', err);
  }
}

console.log('peterica!!');

readFile();

ㅇ 비동기로 처리되기 때문에 peterica가 먼저 출력되고 파일처리는 그 다음에 비동기로 처리된다.

 

ㅁ Node.js와 데이터베이스

Node.js는 다양한 데이터베이스와 쉽게 연동할 수 있다. MongoDB, MySQL, PostgreSQL 등 대부분의 주요 데이터베이스를 지원한다.

예를 들어, MongoDB를 사용하는 간단한 예제를 살펴보자.

 

우선 몽고디비를 빠르게 도커로 설치한다.

$ docker run --name mongodb -p 27017:27017 -d mongodb/mongodb-community-server:latest

 

// db 목록조회
show dbs;
// db 생성
use db1;
// 신규데이터 생성
db.blog.insertOne({name:'Peterica Seo',email:'peterica.se@kakaocorp.com'})

ㅇ 작동 테스트를 위해 실행하였다.

ㅇ db와 collection은 insert시 자동 생성된다.

 

// mongodb 모듈 설치
// 현재 node버젼 v12.22.12에 맞추어 설치
$ npm install mongodb@4.13.0

 

const MongoClient = require('mongodb').MongoClient;
const url = 'mongodb://localhost:27017/db1';

MongoClient.connect(url, (err, client) => {
  if (err) throw err;
  const db = client.db('db1');

  db.collection('users').insertOne({
    name: 'Peterica Seo',
    email: 'peterica.se@kakaocorp.com'
  }, (err, result) => {
    if (err) throw err;
    console.log('User inserted');
    client.close();
  });
});

이 코드는 MongoDB에 연결하고 'users' 컬렉션에 새로운 문서를 삽입한다.

 

$ node mongodb.js
User inserted

ㅇ mongodb.js를 실행하였고, 데이터도 확인하였다.

 

ㅁ RESTful API 개발

Node.js와 Express.js를 사용하면 RESTful API를 쉽게 개발할 수 있다. 다음은 간단한 CRUD(Create, Read, Update, Delete) 작업을 수행하는 API 예제다:

const express = require('express');
const app = express();
app.use(express.json());

let users = [];

// Create
app.post('/users', (req, res) => {
  const user = req.body;
  users.push(user);
  res.status(201).json(user);
});

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

// Update
app.put('/users/:id', (req, res) => {
  const id = parseInt(req.params.id);
  const updatedUser = req.body;
  users[id] = updatedUser;
  res.json(updatedUser);
});

// Delete
app.delete('/users/:id', (req, res) => {
  const id = parseInt(req.params.id);
  users = users.filter((user, index) => index !== id);
  res.status(204).send();
});

app.listen(3000, () => console.log('Server running on port 3000'));

ㅇ 이 API는 사용자 정보를 관리하는 기본적인 CRUD 작업을 수행한다.

 

ㅇ 테스트는 PostMan으로 수행해 보았다.

 

ㅁ 보안 고려사항

Node.js 애플리케이션을 개발할 때는 보안에 특별히 주의를 기울여야 한다. 몇 가지 중요한 보안 고려사항은 다음과 같다:

  1. 입력 검증: 사용자 입력을 항상 검증하고 살균(sanitize)해야 한다.
  2. HTTPS 사용: 중요한 데이터 전송 시 HTTPS를 사용해야 한다.
  3. 의존성 관리: npm audit 명령어를 사용해 취약점이 있는 패키지를 정기적으로 확인하고 업데이트해야 한다.
  4. 환경 변수 사용: 중요한 정보(API 키, 데이터베이스 비밀번호 등)는 환경 변수에 저장해야 한다.
  5. 에러 처리: 상세한 에러 메시지가 클라이언트에게 노출되지 않도록 해야 한다.

 

ㅁ 테스팅

Node.js 애플리케이션의 품질을 보장하기 위해 단위 테스트, 통합 테스트, 엔드-투-엔드 테스트 등 다양한 테스트를 수행해야 한다. Jest, Mocha, Chai 등의 테스팅 프레임워크를 사용할 수 있다.

 

ㅇ 간단한 Jest 테스트 예제

// sum.js
function sum(a, b) {
  return a + b;
}
module.exports = sum;

// sum.test.js
const sum = require('./sum');

test('adds 1 + 2 to equal 3', () => {
  expect(sum(1, 2)).toBe(3);
});

 

// package.json 수정
  "scripts": {
    "test": "jest"
  },

//모듈 설치
$ npm install --save-dev jest

// test 수행
$ npm test

 

ㅁ 마무리

  Node.js는 강력하고 유연한 서버 사이드 JavaScript 환경으로, 웹 애플리케이션, API, 마이크로서비스 등 다양한 백엔드 시스템을 구축하는 데 적합하다. 비동기 I/O, 이벤트 기반 아키텍처, 풍부한 생태계 등의 특징으로 인해 많은 개발자들에게 사랑받고 있다.

Node.js를 효과적으로 사용하기 위해서는 JavaScript에 대한 깊은 이해와 함께 비동기 프로그래밍등 다양한 측면에 대한 지식이 필요하다. Node.js는 계속해서 발전하고 있으며, 새로운 기능과 개선사항이 꾸준히 추가되고 있다.

 

ㅁ 함께 보면 좋은 사이트

Express 공식 홈

30강 블로그 앱 만들기 - 관리자 로그인 | Do it! Node.js 프로그래밍 입문

https://blog.naver.com/rbdud96/221747978442?viewType=pc

 

nodejs를 시작하자

대학교 1학년 부터 지금까지 nodejs를 써왔으면서 한번도 제대로 글을 포스팅 해본적이 없었다. 여느 때와 ...

blog.naver.com

 

반응형
Comments