본문 바로가기
JavaScript & TypeScript

Node.js와 Express에서 JSON 처리하기

by 대박플머 2024. 12. 10.

Node.js에서 JSON 처리는 매우 중요한 주제입니다. 많은 웹 애플리케이션에서 JSON을 사용하여 클라이언트와 서버 간의 데이터 교환을 수행하기 때문입니다. 이번 글에서는 JSON의 기본 개념부터 Node.js에서 JSON을 다루는 방법까지 상세하게 다루겠습니다.

 

1. JSON이란?

JSON(JavaScript Object Notation)은 2001년 Douglas Crockford에 의해 개발된 경량의 데이터 교환 형식입니다. XML의 복잡성과 과도한 오버헤드를 해결하기 위해 만들어졌으며, JavaScript의 객체 표기법에서 영감을 받았습니다.

JSON의 주요 장점은 다음과 같습니다:

  1. 간결성: 데이터를 표현하는 방식이 단순하고 직관적입니다.
  2. 가독성: 사람이 읽고 이해하기 쉬운 텍스트 기반 형식입니다.
  3. 언어 독립성: 대부분의 프로그래밍 언어에서 쉽게 파싱하고 생성할 수 있습니다.
  4. 경량성: XML에 비해 데이터 크기가 작아 네트워크 전송에 효율적입니다.
  5. 자기 서술적: 데이터의 구조를 자체적으로 설명합니다.

반면, JSON의 단점도 있습니다:

  1. 주석 지원 부재: 데이터에 대한 설명을 추가할 수 없습니다.
  2. 날짜 형식 미지원: 날짜를 표현하기 위한 표준 형식이 없습니다.
  3. 순환 참조 불가: 객체 간 순환 참조를 표현할 수 없습니다.
  4. 스키마 검증 기능 부재: XML과 달리 내장된 스키마 검증 기능이 없습니다.

이러한 특성으로 인해 JSON은 웹 애플리케이션에서 데이터 교환의 표준으로 자리 잡았으며, RESTful API와 같은 현대적인 웹 서비스에서 널리 사용되고 있습니다.

예시:

{
  "name": "John Doe",
  "age": 30,
  "isStudent": false,
  "skills": ["JavaScript", "Node.js", "React"]
}

2. Node.js에서 JSON 처리 방법

Node.js는 내장된 JSON 객체를 통해 JSON 데이터를 쉽게 처리할 수 있습니다.

2.1 JSON 파싱(JSON 문자열을 객체로 변환)

JSON 문자열을 자바스크립트 객체로 변환하기 위해 JSON.parse() 메서드를 사용합니다.

예시:

const jsonString = '{"name": "Jane", "age": 25}';
const jsonObject = JSON.parse(jsonString);

console.log(jsonObject.name); // Jane
console.log(jsonObject.age);  // 25

2.2 객체를 JSON 문자열로 변환

자바스크립트 객체를 JSON 문자열로 변환하려면 JSON.stringify() 메서드를 사용합니다.

예시:

const user = {
  name: "Jane",
  age: 25
};
const jsonString = JSON.stringify(user);

console.log(jsonString); // '{"name":"Jane","age":25}'

3. 파일에서 JSON 읽기와 쓰기

Node.js에서는 fs(File System) 모듈을 사용하여 JSON 파일을 읽고 쓸 수 있습니다.

3.1 파일에서 JSON 읽기

fs.readFile 메서드를 사용하여 파일의 내용을 읽고, JSON.parse()로 파싱합니다.

const fs = require('fs');

fs.readFile('user.json', 'utf8', (err, data) => {
  if (err) {
    console.error(err);
    return;
  }
  const user = JSON.parse(data);
  console.log(user);
});

3.2 JSON 데이터를 파일에 쓰기

fs.writeFile 메서드를 사용하여 객체를 JSON 문자열로 변환하고 파일에 저장할 수 있습니다.

const fs = require('fs');

const user = {
  name: "Jane",
  age: 25
};

fs.writeFile('user.json', JSON.stringify(user), (err) => {
  if (err) {
    console.error(err);
    return;
  }
  console.log('JSON 파일이 저장되었습니다.');
});

4. HTTP 요청으로 JSON 데이터 처리

Node.js에서 HTTP 서버를 구축하고 클라이언트로부터 JSON 데이터를 처리하는 방법도 중요합니다.

4.1 간단한 HTTP 서버에서 JSON 요청 처리

http 모듈을 사용하여 서버를 만들고 요청으로 전달된 JSON 데이터를 처리할 수 있습니다.

const http = require('http');

const server = http.createServer((req, res) => {
  if (req.method === 'POST' && req.headers['content-type'] === 'application/json') {
    let body = '';

    req.on('data', chunk => {
      body += chunk;
    });

    req.on('end', () => {
      const jsonData = JSON.parse(body);
      console.log(jsonData);

      res.writeHead(200, {'Content-Type': 'application/json'});
      res.end(JSON.stringify({ message: 'Data received' }));
    });
  } else {
    res.writeHead(400, {'Content-Type': 'application/json'});
    res.end(JSON.stringify({ error: 'Invalid request' }));
  }
});

server.listen(3000, () => {
  console.log('Server is listening on port 3000');
});

이 예제는 POST 요청으로 JSON 데이터를 받고, 그 데이터를 콘솔에 출력한 후 응답으로 JSON을 반환하는 간단한 서버입니다.

5. JSON을 다루기 위한 패키지

Node.js는 내장된 JSON 객체를 통해 기본적인 처리 기능을 제공하지만, 더 복잡한 작업을 위해 외부 라이브러리를 사용할 수 있습니다.

5.1 ajv (JSON 스키마 유효성 검사)

ajv는 JSON 스키마를 통해 데이터의 유효성을 검사하는 라이브러리입니다.

설치:

npm install ajv

사용 예시:

const Ajv = require('ajv');
const ajv = new Ajv();

const schema = {
  type: 'object',
  properties: {
    name: { type: 'string' },
    age: { type: 'number' }
  },
  required: ['name', 'age'],
  additionalProperties: false
};

const validate = ajv.compile(schema);
const valid = validate({ name: "John", age: 30 });

if (valid) {
  console.log('유효한 데이터입니다.');
} else {
  console.error('유효하지 않은 데이터입니다:', validate.errors);
}

6. JSON 관련 모범 사례

  1. 유효성 검사: JSON 데이터를 수신하거나 저장하기 전에 항상 유효성 검사를 수행하세요.
  2. 예외 처리: JSON.parse()JSON.stringify()를 사용할 때 예외 처리를 추가하여 에러 발생 시 앱이 중단되지 않도록 해야 합니다.
  3. 보안: 외부에서 받은 JSON 데이터를 신뢰하지 말고 항상 검증하세요. 의도하지 않은 데이터 구조를 통해 보안 위협이 발생할 수 있습니다.

예외 처리 예시:

try {
  const data = JSON.parse(invalidJsonString);
} catch (error) {
  console.error('JSON 파싱 오류:', error);
}

7. Express에서 JSON 처리하기

Express는 express.json() 미들웨어를 통해 요청 본문의 JSON 데이터를 자동으로 파싱할 수 있습니다. 이를 통해 클라이언트에서 전송된 JSON 데이터를 서버에서 바로 사용할 수 있게 됩니다.

7.1 Express 설정 및 JSON 파싱

아래 예제는 간단한 Express 서버를 설정하고 POST 요청으로 전송된 JSON 데이터를 처리하는 방법을 보여줍니다.

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

// JSON 파싱을 위한 미들웨어 추가
app.use(express.json());

app.post('/user', (req, res) => {
  const userData = req.body; // 클라이언트가 전송한 JSON 데이터
  console.log(userData);

  res.json({
    message: '데이터가 성공적으로 수신되었습니다.',
    receivedData: userData
  });
});

app.listen(port, () => {
  console.log(`서버가 http://localhost:${port}에서 실행 중입니다.`);
});
  • app.use(express.json()): 이 미들웨어는 요청 본문의 Content-Typeapplication/json인 경우 JSON 데이터를 자동으로 파싱하여 req.body에 할당합니다.
  • /user 경로로 POST 요청을 보낼 때 JSON 데이터를 전송하면, 서버에서 해당 데이터를 수신하고 처리할 수 있습니다.

7.2 JSON 데이터 유효성 검사

Express에서 JSON 데이터를 받을 때 유효성을 검사하는 것이 중요합니다. 이를 위해 ajv 라이브러리와 같은 유효성 검사 라이브러리를 활용할 수 있습니다.

먼저 ajv를 설치합니다.

npm install ajv

이후, 아래와 같이 유효성 검사를 적용할 수 있습니다.

const Ajv = require('ajv');
const ajv = new Ajv();

// JSON 스키마 정의
const userSchema = {
  type: 'object',
  properties: {
    name: { type: 'string' },
    age: { type: 'number' }
  },
  required: ['name', 'age'],
  additionalProperties: false
};

const validate = ajv.compile(userSchema);

app.post('/user', (req, res) => {
  const userData = req.body;
  const isValid = validate(userData);

  if (!isValid) {
    return res.status(400).json({
      message: '유효하지 않은 데이터입니다.',
      errors: validate.errors
    });
  }

  res.json({
    message: '데이터가 성공적으로 수신되었습니다.',
    receivedData: userData
  });
});
  • ajv를 이용해 JSON 데이터의 유효성을 검사합니다.
  • 스키마를 정의하여 JSON 데이터의 형식이 맞는지 확인하고, 유효하지 않을 경우 오류 메시지를 반환합니다.

7.3 JSON 데이터의 응답

Express에서 JSON 데이터를 응답으로 전송하는 것도 매우 간단합니다. res.json() 메서드를 사용하면 객체를 JSON으로 자동 변환하여 클라이언트에게 전송합니다.

예시:

app.get('/user', (req, res) => {
  const user = {
    name: 'John Doe',
    age: 30
  };

  res.json(user);
});
  • res.json()은 전달된 객체를 JSON 문자열로 변환하여 Content-Type: application/json 헤더와 함께 응답합니다.

마무리

Express에서 JSON 데이터를 처리하는 것은 express.json() 미들웨어를 통해 매우 간단하게 구현할 수 있습니다. 이를 활용하여 클라이언트와 서버 간의 JSON 데이터 교환을 효율적으로 처리할 수 있습니다. JSON 데이터의 유효성 검증을 위한 추가적인 라이브러리 사용도 고려하여 더 안전하고 신뢰성 있는 API를 구축할 수 있습니다.

Node.js의 기본 JSON 처리 방법과 함께 Express에서 JSON 데이터를 처리하는 방법까지 잘 이해하면, 다양한 상황에서 JSON을 효과적으로 다룰 수 있을 것입니다.