REST API 설계 (1) (feat. express.js)

hsmiK·2024년 3월 19일

공부기록

목록 보기
4/8

💻 REST API

✅ REST

  • REpresentational State Transfer
  • HTTP URL를 활용하여 자원을 명시하고 HTTP Method를 통해 해당 자원의 상태를 주고받는 것을 의미한다
  • 즉 HTTP 규약을 잘 지키는 API

✅ REST API 설계 규칙

  • 대문자를 사용하지 않고 소문자만 사용한다
  • _ 사용하지 않고 - 사용한다
  • 마지막에 / 포함하지 않는다
  • 파일확장자를 포함하지 않는다
  • 동사,행위 등을 포함하지 않는다 (명사 사용)

✅ RESTful API

  • 위의 모든 조건을 충족하는 경우 RESTful 하다라고 할 수 있다
  • REST 원리를 따르며 REST API 설계 규칙을 따른다 = RESTful API

✅ HTTP Method

GET : 조회
POST : 생성
PUT : 전체 수정
PATCH : 수정
DELETE : 삭제

💻 Express.js

" Node.js를 위한 빠르고 개방적인 웹 프레임워크 "

서버 사이드 프레임워크로 Node.js api를 단순화하고 유용한 기능들을 추가하여 서버 구축에 도움을 주는 역할을 한다

express.js 공식홈페이지

✅ 설치

NPM 에 접속하여 express package 확인 후 다음 명령어를 입력하면 설치가 가능하다

// 설치 명령어
npm i express
// 기본 사용 방법
const express = require('express')
const app = express()

app.get('/', function (req, res) {
  res.send('Hello World')
})

app.listen(3000)

✅ JSON

JSON (JavaScript Object Notation)은 자바스크립트 객체 문법으로 구조화된 데이터를 표현하기 위한 문자 기반 표준 포맷이다

일반적으로 서버에서 클라이언트로 데이터를 보낼 때 사용한다

클라이언트가 사용하는 언어와 관계없이 통일된 데이터를 주고 받을 수 있도록 일정한 패턴을 제공한다

결과적으로 클라이언트가 데이터를 자기 방식으로 저장 표기할 수 있도록 한다

💻 API 설계 - GET

위의 JSON 포맷으로 아래 데이터를 표기하고 위의 REST 규칙을 잘 준수한 API를 express.js로 구현 해보자

// express 모듈 불러오기
const express = require('express');
const app = express();
const port = 1234; // 포트넘버 1234로 설정
app.listen(port);
// js 맵 객체 생성
let db = new Map();

// item 1~5 객체 각각 생성
let item1 = {
  itemNum : 1,
  Name : 'Computer',
  price : 1000000
};

let item2 = {
  itemNum : 2,
  name : 'Book',
  price : 10000
};

let item3 = {
  itemNum : 3,
  name : 'Cup',
  price : 3000
};

let item4 = {
  itemNum : 4,
  name : 'Chair',
  price : 200000
};

let item5 = {
  itemNum : 5,
  name : 'Table',
  price : 500000
};


// 객체 db 에 삽입
db.set(1,item1);
db.set(2,item2);
db.set(3,item3);
db.set(4,item4);
db.set(5,item5);
// 개별 아이템 정보 조회 기능 구현
app.get('/items/:id', (req,res) => {
  let {id} = req.params;
  id = parseInt(id);
  // 해당하는 id가 없는 경우 error 메세지 출력
  if(db.get(id)==undefined){
    res.json({
      message : '해당 아이템이 존재하지 않습니다'
    });
  } else {
    // id에 해당하는 정보 출력
    res.json(db.get(id));
  };
});
  • localhost:1234/items/3 URL 입력 시 출력
  • localhost:1234/items/6 URL 입력 시 출력
// 전체 아이템 정보 조회 기능 구현
app.get('/items', (req,res) => {
  // db가 비어있다면 아이템 미출력
  if(db.size==0){
    res.json({
      message : '아이템이 존재하지 않습니다'
    });
  }
  // db에 아이템이 존재한다면 아이템 출력 
  else {
    let items={};
    db.forEach(function(value,key) {
      items[key]=value;
    })
    res.json(items);
  }
});
  • localhost:1234/items URL 입력 시 출력 - 전체 아이템 출력

✅ 트러블슈팅

  1. Error: listen EADDRINUSE: address already in use :::1234

다음 에러 코드는 포트넘버 1234 서버를 이미 다른 프로세서에서 사용 중일 때 출력된다

따라서 1234 포트 넘버를 사용 중인 프로세서를 종료해주어야 사용이 가능하다

// 포트넘버 1234 사용 중인 프로세서 확인
netstat -ano | findstr 1234
// 확인 후 종료
taskkill/pid 32600 /f

다음과 같이 실행한 후 재시도하면 오류 코드가 해결된다

  1. TypeError: Assignment to constant variable
// 아이템 정보를 가저오는 라우트
app.get('/items/:id', (req,res) => {
  const {id} = req.params;
  id = parseInt(id);

  if(db.get(id)==undefined){
    res.json({
      // 해당하는 id가 없는 경우 error 메세지 출력
      message : 'error'
    })
  } else {
    // id에 해당하는 정보 출력
    res.json(db.get(id));
  };
});

처음 이렇게 코드를 작성했다가 다음 오류 코드가 출력되었다

확인해보니 const {id} = req.params; 이 코드에서 오류가 발생했다

이유는 const로 변수를 선언하면 값이 재할당이 되지 않기 때문이다. 즉 const로 변수를 선언한다는 것은 그 변수를 상수로 설정한다는 뜻이다

위 코드에서 'id' 는 요청의 파라미터 값이고 값은 변할 수 있다
예를 들면 /items/1 을 요청했다가 다시 /items/2 를 요청할 수도 있다

따라서 const가 아닌 let으로 변수를 선언해주어야 오류 해결이 가능하다

💻 추가 학습 사항

  • express.js geneator (express 환경을 간단하게 구축해주는 환경) 추가 학습
// 설치 명령어
$ npm install -g express-generator
$ express
  • post patch delete Method 추가 학습
profile
반갑습니다

0개의 댓글